decocms 4.278.4 → 4.278.5
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-DfFE6Es-.js → AlertCircle-d0P556G4.js} +1 -1
- package/dist/client/assets/{AreaChart-CANmdxCS.js → AreaChart-CzFUG37n.js} +1 -1
- package/dist/client/assets/{ArrowLeft-C33fglFn.js → ArrowLeft-DDNXnaLT.js} +1 -1
- package/dist/client/assets/{ArrowUp-COKpRPBd.js → ArrowUp-D5yytQnx.js} +1 -1
- package/dist/client/assets/{Check-CCmZiW5p.js → Check-DUrfO6FE.js} +1 -1
- package/dist/client/assets/{CheckCircle-kztBIWXX.js → CheckCircle-p4iGNxQ2.js} +1 -1
- package/dist/client/assets/{ChevronDown-Cxn7ZtQ2.js → ChevronDown-Ca5QZ0Qx.js} +1 -1
- package/dist/client/assets/{ChevronRight-DOQXpaBD.js → ChevronRight-CX7GjCcR.js} +1 -1
- package/dist/client/assets/{ChevronSelectorVertical-ZBkPJ7jk.js → ChevronSelectorVertical-DwrTJdKd.js} +1 -1
- package/dist/client/assets/{ChevronUp-CqFOoxLh.js → ChevronUp-D5MwLH5U.js} +1 -1
- package/dist/client/assets/{Copy01-B0F8k-kQ.js → Copy01-Bng_taT0.js} +1 -1
- package/dist/client/assets/{CreditCard01-CSvxwGhV.js → CreditCard01-SOyh1jvm.js} +1 -1
- package/dist/client/assets/{DotsVertical-BexGJ7nH.js → DotsVertical-Czk0fAw4.js} +1 -1
- package/dist/client/assets/{Download01-D3_xFR2_.js → Download01-Bvs1EP6j.js} +1 -1
- package/dist/client/assets/{Eye-_sdkp0QD.js → Eye-F1cmz6fm.js} +1 -1
- package/dist/client/assets/{FilterLines-kwG3Ja0u.js → FilterLines-CBZHGpbH.js} +1 -1
- package/dist/client/assets/{Globe01-L38zDWSb.js → Globe01-DvOQlXmP.js} +1 -1
- package/dist/client/assets/{Globe04-CDwgHLwb.js → Globe04-WHCKW_N4.js} +1 -1
- package/dist/client/assets/{HardDrive-DHvu1c5Z.js → HardDrive-B2cwYBPL.js} +1 -1
- package/dist/client/assets/{Key01-3oYr8UFi.js → Key01-D7P02SKe.js} +1 -1
- package/dist/client/assets/{LinkExternal01-CN9IXAcj.js → LinkExternal01-XDCSPquq.js} +1 -1
- package/dist/client/assets/{LockUnlocked01-vXo5w-gx.js → LockUnlocked01-BeLyGjsB.js} +1 -1
- package/dist/client/assets/{LogOut01-B3b6usop.js → LogOut01-CiiRqEra.js} +1 -1
- package/dist/client/assets/{Monitor01-BGlVg-0A.js → Monitor01-ClVpCjIs.js} +1 -1
- package/dist/client/assets/{Palette-DsZJkD5K.js → Palette-GLQj5meX.js} +1 -1
- package/dist/client/assets/{Play-DsASfwqd.js → Play-DrJd9Kpw.js} +1 -1
- package/dist/client/assets/{Plus-DvdXY0Is.js → Plus-BsbFC_BU.js} +1 -1
- package/dist/client/assets/{SearchLg-BnZm-ZF2.js → SearchLg-zA4IjLLq.js} +1 -1
- package/dist/client/assets/{SearchMd-CITZ7cFI.js → SearchMd-DhRh2OzZ.js} +1 -1
- package/dist/client/assets/{Settings02-AcY5OeSR.js → Settings02-DuBcOJBY.js} +1 -1
- package/dist/client/assets/{Share07-DKdlZUCJ.js → Share07-DXzWJkiC.js} +1 -1
- package/dist/client/assets/{Shield01-CNfl0Wvq.js → Shield01-CqhKYZ2p.js} +1 -1
- package/dist/client/assets/{Stars01-Cxls6RX9.js → Stars01-BR0HBSL0.js} +1 -1
- package/dist/client/assets/{Stars02-COEwl97b.js → Stars02-DMQ7oAZR.js} +1 -1
- package/dist/client/assets/{Sun-YYd6VxOf.js → Sun-DS7wVCkS.js} +1 -1
- package/dist/client/assets/{SwitchHorizontal01-BhPVnkd8.js → SwitchHorizontal01-Benj6KHo.js} +1 -1
- package/dist/client/assets/{Tool01-DFHThZZd.js → Tool01-C4AchPuG.js} +1 -1
- package/dist/client/assets/{Tool02-89yKiQv8.js → Tool02-B8DcSwk7.js} +1 -1
- package/dist/client/assets/{Trash01-DMH00izD.js → Trash01-DwOegRUA.js} +1 -1
- package/dist/client/assets/{TrendUp01-Bb53eubn.js → TrendUp01-Iyhwalyr.js} +1 -1
- package/dist/client/assets/{Upload01-B9VJ_5xh.js → Upload01-C6xH5Mi_.js} +1 -1
- package/dist/client/assets/{User01-B_Pu52Lk.js → User01-NFHqLK_9.js} +1 -1
- package/dist/client/assets/{UserSquare-TgXepBVi.js → UserSquare-BD41RNT2.js} +1 -1
- package/dist/client/assets/{Users01-Tf1C8K9i.js → Users01-BTyH798v.js} +1 -1
- package/dist/client/assets/{Users03-Dv5XG-lH.js → Users03-BXhMQVM_.js} +1 -1
- package/dist/client/assets/{XCircle-Ck08Ifel.js → XCircle-B44kFYT2.js} +1 -1
- package/dist/client/assets/{XClose-h9SGAJV3.js → XClose-202c-jez.js} +1 -1
- package/dist/client/assets/{YAxis-OgkqzVxM.js → YAxis-Bes8xG-r.js} +1 -1
- package/dist/client/assets/{Zap-CZUbPQtW.js → Zap-BH3s015k.js} +1 -1
- package/dist/client/assets/{ZapSquare-CxnAhqdS.js → ZapSquare-4HqzTr7W.js} +1 -1
- package/dist/client/assets/{access-gate-DJbHHt85.js → access-gate-DrUTEDMQ.js} +1 -1
- package/dist/client/assets/{agent-icon-GXppXIpj.js → agent-icon-CtfANkPW.js} +1 -1
- package/dist/client/assets/{agents-list-CxtrMCRM.js → agents-list-HW9yWL5x.js} +1 -1
- package/dist/client/assets/{ai-providers-BLlJ3RBV.js → ai-providers-vhavjrTh.js} +1 -1
- package/dist/client/assets/{alert-dialog-CZDeFSfw.js → alert-dialog-mcii_JAT.js} +1 -1
- package/dist/client/assets/{alert-BzrIjl9L.js → alert-t-AYH28J.js} +1 -1
- package/dist/client/assets/{api-keys-IFsRmnJa.js → api-keys-ekScLupv.js} +1 -1
- package/dist/client/assets/{app-editor-DYYW7c8Q.js → app-editor-Qe_f1ha_.js} +1 -1
- package/dist/client/assets/{auth-P7g2VajE.js → auth-BT-YETux.js} +1 -1
- package/dist/client/assets/{auth-catchall-Dng6yJhn.js → auth-catchall-BHCq0ZXv.js} +1 -1
- package/dist/client/assets/{auth-entry-DkX3iPX4.js → auth-entry-kDSYLdsT.js} +1 -1
- package/dist/client/assets/{auth-split-layout-CIuNnohI.js → auth-split-layout-DfRfcWDv.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-Dm6WETsF.js → authenticate-and-persist-oauth-Db2zgJ7g.js} +1 -1
- package/dist/client/assets/{automation-list-row-CmtR0qRT.js → automation-list-row-CuDR--Ol.js} +1 -1
- package/dist/client/assets/{automation-runs-CkJnXK_o.js → automation-runs-FKt7ra6_.js} +1 -1
- package/dist/client/assets/{automations-DJzYvK7w.js → automations-B-VJIxpW.js} +1 -1
- package/dist/client/assets/{avatar-DXVR4jwZ.js → avatar-EGd_BabQ.js} +1 -1
- package/dist/client/assets/{badge-B74tx_TY.js → badge-DkRXaIGM.js} +1 -1
- package/dist/client/assets/{block-document-DF32ZmZA.js → block-document-Bav54uy7.js} +1 -1
- package/dist/client/assets/{buckets-B1II4uWc.js → buckets-C-7NzwnE.js} +1 -1
- package/dist/client/assets/{bulk-category-panel-UPMkMrXw.js → bulk-category-panel-D4uVMP8J.js} +1 -1
- package/dist/client/assets/{capability-load-error--Pr_rF_i.js → capability-load-error-BO003eMo.js} +1 -1
- package/dist/client/assets/{cards-DO_SLrNr.js → cards-DfCm8Dfq.js} +1 -1
- package/dist/client/assets/{category-editor-lzq3jjK7.js → category-editor-DyRfQS1c.js} +1 -1
- package/dist/client/assets/{chart-Cnnt7O9X.js → chart-CamCfGxe.js} +1 -1
- package/dist/client/assets/{chat-context-amWbuNW6.js → chat-context-GMK3XW6m.js} +1 -1
- package/dist/client/assets/{checkbox-BXvFTMpY.js → checkbox-Dqullfmc.js} +1 -1
- package/dist/client/assets/{choose-editor-D2XuoPft.js → choose-editor-Ddtb9j1h.js} +1 -1
- package/dist/client/assets/{cli-auth-success-Ca7XJoJf.js → cli-auth-success-D65Qs0yM.js} +1 -1
- package/dist/client/assets/{collection-detail-CWYGGuoX.js → collection-detail-BQEcYUTT.js} +1 -1
- package/dist/client/assets/{collection-display-button-prsrGFYG.js → collection-display-button-BRiaj2KT.js} +1 -1
- package/dist/client/assets/{collection-search-DWnHRx3B.js → collection-search-BE731Jl8.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-CAo12qJ2.js → collection-table-wrapper-BZVkqkle.js} +1 -1
- package/dist/client/assets/{collection-tabs-Bndu1d5Z.js → collection-tabs-DnS-jbie.js} +1 -1
- package/dist/client/assets/{command-4Vd-P348.js → command-BEan4oyi.js} +1 -1
- package/dist/client/assets/{commerce-onboarding-axAYbTFw.js → commerce-onboarding-Bg333p8l.js} +1 -1
- package/dist/client/assets/{connect-CMe3fw3z.js → connect-kFZ4uBEc.js} +1 -1
- package/dist/client/assets/{connection-D327p6nq.js → connection-D7tuzhD7.js} +1 -1
- package/dist/client/assets/{connection-card-CvzgfzXe.js → connection-card-B9aaxsO5.js} +1 -1
- package/dist/client/assets/{connection-detail-gb7PfuND.js → connection-detail-DVkta_Og.js} +1 -1
- package/dist/client/assets/{connection-form-helpers-_2vKVQBz.js → connection-form-helpers-DU9iCQsl.js} +1 -1
- package/dist/client/assets/{connections-CI97F2dz.js → connections-CKhvlJY_.js} +1 -1
- package/dist/client/assets/{decopilot-sse-pool-D0iaAH1L.js → decopilot-sse-pool-P49z94jh.js} +1 -1
- package/dist/client/assets/{dialog-BkipwoDS.js → dialog-C9AMpg31.js} +1 -1
- package/dist/client/assets/{domain-settings-CZQBprz1.js → domain-settings-B79wePW4.js} +1 -1
- package/dist/client/assets/{drawer-Cxn-9hNu.js → drawer-CKXIxBTF.js} +1 -1
- package/dist/client/assets/{dropdown-menu-DH3vTkpv.js → dropdown-menu-BR7hJVus.js} +1 -1
- package/dist/client/assets/{empty-state-D4quvhvm.js → empty-state-CDOnlLRy.js} +1 -1
- package/dist/client/assets/{extract-connection-data-D0j-7nxe.js → extract-connection-data-CZxz_z27.js} +1 -1
- package/dist/client/assets/{file-explorer-nuwqZUdL.js → file-explorer-BMet4mDI.js} +1 -1
- package/dist/client/assets/{file-type-icon-BWGCDFeS.js → file-type-icon-DR7LmcnJ.js} +1 -1
- package/dist/client/assets/{form-_SoAxhrI.js → form-C9rMFmjT.js} +1 -1
- package/dist/client/assets/{general-B5f-fdZQ.js → general-D8lPZiYi.js} +1 -1
- package/dist/client/assets/{github-repo-picker-DDKOPJhQ.js → github-repo-picker-vR00RnJu.js} +1 -1
- package/dist/client/assets/{hooks-C3cCIlD5.js → hooks-CIDnHA2F.js} +2 -2
- package/dist/client/assets/{index-BIhC4I0A.js → index-Bihs7sb-.js} +1 -1
- package/dist/client/assets/{index-i7BgmHnf.js → index-C3enf8Yg.js} +3 -3
- package/dist/client/assets/{index-zxFAA-g1.js → index-COJmK30a.js} +1 -1
- package/dist/client/assets/{index-MSNGIbVC.js → index-DEKGnAdl.js} +1 -1
- package/dist/client/assets/{index-D8hvTP3q.js → index-DTMIxvlv.js} +1 -1
- package/dist/client/assets/{index-BSvH6_Zl.js → index-DTbaOulI.js} +1 -1
- package/dist/client/assets/{index-CYg12GoM.js → index-Da016G34.js} +5 -5
- package/dist/client/assets/{index-B_kYA2wU.js → index-DajWNr61.js} +1 -1
- package/dist/client/assets/{index-BYoQ22B6.js → index-DfhAtsLv.js} +1 -1
- package/dist/client/assets/{index-ehuKzYr7.js → index-SdJngfPO.js} +1 -1
- package/dist/client/assets/{index-redirect-DwMX97z3.js → index-redirect-D3ygKGiU.js} +1 -1
- package/dist/client/assets/{infra-billing-Deo8kk43.js → infra-billing-DnVemwh3.js} +1 -1
- package/dist/client/assets/{input-DKbTDQqT.js → input-MEzrwBhL.js} +1 -1
- package/dist/client/assets/{integration-icon-DvK0mMUg.js → integration-icon-CNwpmqbh.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-DH7zOyoe.js → invite-member-dialog-CrYZSk7S.js} +1 -1
- package/dist/client/assets/{label-3gJJeKHL.js → label-B4588N4-.js} +1 -1
- package/dist/client/assets/{layout-COPq4v3J.js → layout-43NkWPEr.js} +1 -1
- package/dist/client/assets/{login-DsWiWEUs.js → login-DZ6VvblM.js} +1 -1
- package/dist/client/assets/{mcp-oauth-BALc9IF5.js → mcp-oauth-BPKDNwe_.js} +1 -1
- package/dist/client/assets/{members-ekStfRi1.js → members-D0rmMUys.js} +1 -1
- package/dist/client/assets/{monaco-editor-BVGilmKC.js → monaco-editor-CjB2yPh0.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-DVMqyhPq.js → monitoring-stats-row-ChAOh4sr.js} +1 -1
- package/dist/client/assets/{multi-select-iU5A9RE-.js → multi-select-DudiQXyh.js} +1 -1
- package/dist/client/assets/{oauth-callback-CuJYH9k0.js → oauth-callback-CB7_3iCZ.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-hOBcM0sm.js → oauth-callback-ai-provider-7gJWI4N9.js} +1 -1
- package/dist/client/assets/{onboarding-BJQuJvBG.js → onboarding-Db_z8fTJ.js} +1 -1
- package/dist/client/assets/{org-layout-BBgvIhb1.js → org-layout-CpT9w52w.js} +1 -1
- package/dist/client/assets/{organization-choice-B3t24x7j.js → organization-choice-DEuf-VR4.js} +1 -1
- package/dist/client/assets/{orgs-yLSpSsOO.js → orgs-7TBr4Hgn.js} +1 -1
- package/dist/client/assets/{page-seo-form-BquOE1TW.js → page-seo-form-DkZEgvnX.js} +1 -1
- package/dist/client/assets/{popover-Ctud97oP.js → popover-Bb9Ij_pk.js} +1 -1
- package/dist/client/assets/{post-calendar-xhKrZ_eo.js → post-calendar-De_J2x_K.js} +1 -1
- package/dist/client/assets/{post-editor-C9rG6mtk.js → post-editor-ZhDEOe1n.js} +1 -1
- package/dist/client/assets/{primitives-nN-8Ohhy.js → primitives-DjHJt8Ng.js} +1 -1
- package/dist/client/assets/{profile-DxYq2DLi.js → profile-CyB6R9R3.js} +1 -1
- package/dist/client/assets/{project-app-view-Ivm1QSCM.js → project-app-view-xZOMG_8O.js} +1 -1
- package/dist/client/assets/{prompts-DLjEcr22.js → prompts-eHDkwdjp.js} +1 -1
- package/dist/client/assets/record-editor-CrCkHbb0.js +1 -0
- package/dist/client/assets/{redirect-editor-ryRJu8Xm.js → redirect-editor-B7CZ5oip.js} +1 -1
- package/dist/client/assets/registry-CU9PxVCM.js +2 -0
- package/dist/client/assets/{registry-layout-C5DROEYW.js → registry-layout-B0JNwEwR.js} +1 -1
- package/dist/client/assets/{reports-kFnaqTk2.js → reports-BPrJ0ioa.js} +1 -1
- package/dist/client/assets/{require-capability-W_3o0pop.js → require-capability-BaerWfRL.js} +1 -1
- package/dist/client/assets/{required-auth-layout-CQAVlhpd.js → required-auth-layout-B4OUDR9C.js} +1 -1
- package/dist/client/assets/{reset-password-Ckr4fIsZ.js → reset-password-Hr0bE5yK.js} +1 -1
- package/dist/client/assets/{review-settings-BCFJtG9L.js → review-settings-B6mSpO2L.js} +1 -1
- package/dist/client/assets/{roles-CLHkV_dR.js → roles-l1qj4y9H.js} +1 -1
- package/dist/client/assets/{search-input-CLQjsjgz.js → search-input-C-V9DfYK.js} +1 -1
- package/dist/client/assets/{secrets-xQTLTywE.js → secrets-BqWMsjf8.js} +1 -1
- package/dist/client/assets/{sections-editor-D_v4Zx41.js → sections-editor-Djpe7K_r.js} +1 -1
- package/dist/client/assets/{select-DZ5jRX2m.js → select-DKcLm0TE.js} +1 -1
- package/dist/client/assets/{select-model-VtbPLBn3.js → select-model-Cbv72OmQ.js} +1 -1
- package/dist/client/assets/{self-tool-result-DDO4JkD7.js → self-tool-result-OXwsoTv0.js} +1 -1
- package/dist/client/assets/{seo-editor-B9O-e5Jr.js → seo-editor-n6TusAOR.js} +1 -1
- package/dist/client/assets/{settings-layout-DJklyLwN.js → settings-layout-C0ZJ6296.js} +1 -1
- package/dist/client/assets/{shell-controls-JQQrYDZJ.js → shell-controls-BTijWfhD.js} +1 -1
- package/dist/client/assets/{shell-layout-BzTXHl4r.js → shell-layout-D9mdkJOL.js} +1 -1
- package/dist/client/assets/{spinner-C8vMfHgd.js → spinner-CQ6MXl7M.js} +1 -1
- package/dist/client/assets/{sso-D60o5Cz2.js → sso-B-fedkqf.js} +1 -1
- package/dist/client/assets/{store-AEPjfGWn.js → store-Cq_qRMgr.js} +1 -1
- package/dist/client/assets/store-registry-DLTQIJRj.js +2 -0
- package/dist/client/assets/{switch-DdNnAMKn.js → switch-CarPOfHW.js} +1 -1
- package/dist/client/assets/{synced-repos-Dt7bkh8a.js → synced-repos-dF29JHS5.js} +1 -1
- package/dist/client/assets/{tab-id-Cx8DDoGD.js → tab-id-B1ryM3J1.js} +1 -1
- package/dist/client/assets/{table-BgZC7ZiL.js → table-MxDBt0Tl.js} +1 -1
- package/dist/client/assets/{tabs-YQ2Im0eZ.js → tabs-DxAX0PCA.js} +1 -1
- package/dist/client/assets/{tasks-DrjU4G4y.js → tasks-BptQr61J.js} +1 -1
- package/dist/client/assets/{textarea-DX1uNZAA.js → textarea-TwEc45VN.js} +1 -1
- package/dist/client/assets/{toggle-group-RUkZS1w5.js → toggle-group-ChcpYi9A.js} +1 -1
- package/dist/client/assets/{toolbar-DuEwfAg5.js → toolbar-CV9snPXz.js} +1 -1
- package/dist/client/assets/{track-DAMALRWq.js → track-CSCO_8QI.js} +1 -1
- package/dist/client/assets/{types-ywfblMhJ.js → types-BE5g4oCg.js} +1 -1
- package/dist/client/assets/{use-ai-providers-Bz5NIrnv.js → use-ai-providers-CDU63xLb.js} +1 -1
- package/dist/client/assets/{use-api-keys-wZxvCd_g.js → use-api-keys-BqFlBozZ.js} +1 -1
- package/dist/client/assets/{use-automations-ChRcQ8sJ.js → use-automations-Di8AwVje.js} +1 -1
- package/dist/client/assets/{use-autosave-CFDxCyAU.js → use-autosave-Cva5kIVm.js} +1 -1
- package/dist/client/assets/{use-clock-tick-uvIK9zxW.js → use-clock-tick-ia9gJzzX.js} +1 -1
- package/dist/client/assets/{use-commerce-diagnostic-DDxupUH-.js → use-commerce-diagnostic-iNeW7Lhs.js} +1 -1
- package/dist/client/assets/{use-connection-CqNwaqjB.js → use-connection-Bzl7mC0a.js} +1 -1
- package/dist/client/assets/{use-copy-C_ITP2w0.js → use-copy-DqTjs1wv.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-BPm-XtmL.js → use-create-virtual-mcp-DxudGwvw.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-t-AKKkL2.js → use-debounced-autosave-BGbJ6lix.js} +1 -1
- package/dist/client/assets/{use-debounced-value-B5i9a8MI.js → use-debounced-value-Bk0873vs.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-BdjkPT5k.js → use-decopilot-events-BSYrw5J1.js} +1 -1
- package/dist/client/assets/{use-delete-connection-BxOF9ID5.js → use-delete-connection-C-es-l1K.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-C8NV1uM5.js → use-deployment-admin-CZOxPgks.js} +1 -1
- package/dist/client/assets/{use-file-configs-DOVIMFy4.js → use-file-configs-CjoKSfYq.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-Dg7gJRtA.js → use-infinite-scroll-BBcy1SF5.js} +1 -1
- package/dist/client/assets/{use-join-requests-B8D-U_Ot.js → use-join-requests-7wy1fnsZ.js} +1 -1
- package/dist/client/assets/{use-mcp-auth-status-BZvnfUbh.js → use-mcp-auth-status-C8TN1TKE.js} +1 -1
- package/dist/client/assets/{use-mcp-client-COL3iztV.js → use-mcp-client-BLVHmSwJ.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-DJkrd0uR.js → use-mcp-tools-LKZZrxUi.js} +1 -1
- package/dist/client/assets/{use-members-CAOHLini.js → use-members-B84JbtZ-.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-DHPM9Tq5.js → use-navigate-to-agent-mZLxfM6e.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-BbndTmRD.js → use-org-auth-client-D4mei6He.js} +1 -1
- package/dist/client/assets/{use-org-repo-syncs-Bgqc-76q.js → use-org-repo-syncs-Bfo1j01N.js} +1 -1
- package/dist/client/assets/{use-org-sso-BMLlHQBD.js → use-org-sso-CziVVdp_.js} +1 -1
- package/dist/client/assets/{use-organization-roles-CtsRD6rz.js → use-organization-roles-Ch72_FrE.js} +1 -1
- package/dist/client/assets/{use-organization-settings-DL1E01gZ.js → use-organization-settings-BvXc7O-R.js} +1 -1
- package/dist/client/assets/{use-registry-connections-BDAR63kI.js → use-registry-connections-KyWY2MCa.js} +1 -1
- package/dist/client/assets/{use-secrets-D6Vp_B1o.js → use-secrets-Dt8vHDh9.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-CMEyAlnc.js → use-section-preview-base-C11l-Rjn.js} +1 -1
- package/dist/client/assets/{use-status-sounds-CNN3yY4g.js → use-status-sounds-DVVEVyLz.js} +1 -1
- package/dist/client/assets/{use-tags-D8LKu8OM.js → use-tags-DrT9mRvM.js} +1 -1
- package/dist/client/assets/{use-task-board-items-FayZqwaX.js → use-task-board-items-Dqpd0Nku.js} +1 -1
- package/dist/client/assets/{use-view-mode-iVndLiLY.js → use-view-mode-uGQVa15s.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-BXk0NorZ.js → use-virtual-mcp-CY5kjh9a.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-DsZZ4Eti.js +1 -0
- package/dist/client/assets/useSuspenseInfiniteQuery-DJGvrRyT.js +1 -0
- package/dist/client/assets/{users-DbuIDSwW.js → users-B9RFyFRQ.js} +1 -1
- package/dist/client/assets/{variant-calendar-BPDGzK_d.js → variant-calendar--gumAysQ.js} +1 -1
- package/dist/client/assets/{view-mode-toggle-BARjyj4P.js → view-mode-toggle-DoVoKwkF.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/cli.js +3 -3
- package/dist/server/server.js +3 -3
- package/package.json +1 -1
- package/dist/client/assets/record-editor-GJHq8lC-.js +0 -1
- package/dist/client/assets/registry-DjMX8Y5G.js +0 -2
- package/dist/client/assets/store-registry-BLx5WSem.js +0 -2
- package/dist/client/assets/useInfiniteQuery-CfIVv9W9.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-2aHmeoxo.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -1351,7 +1351,7 @@ Guidelines:
|
|
|
1351
1351
|
}
|
|
1352
1352
|
return { consoleLogs, errors, evaluateResult };
|
|
1353
1353
|
}
|
|
1354
|
-
`,O=await FC("Browserless function call",`${JC}/function?token=${encodeURIComponent(F)}`,{method:"POST",headers:{"Content-Type":"application/javascript"},body:B});if(!O.ok)return{success:!1,error:O.error,url:H.url};let L=O.response;if(!L.ok){let z=await L.text().catch(()=>"Unknown error");return{success:!1,error:`Browserless function call failed (${L.status}): ${z}`,url:H.url}}let w=await L.json().catch(async()=>{return{error:`Browserless returned non-JSON response: ${(await L.text().catch(()=>"")).slice(0,200)}`}}),E=JSON.stringify(w,null,2);X.set(K.toolCallId,E);let j=JX(E);if(!("error"in w)&&j>VO&&Q){let z=`inspect-pages/${crypto.randomUUID()}.json`;return await Q.put(z,new TextEncoder().encode(E),{contentType:"application/json"}),{success:!0,uri:ZQ(z),preview:GJ(E),url:H.url,tokenCount:j,consoleLogCount:w.consoleLogs?.length??0,errorCount:w.errors?.length??0,hasEvaluateResult:w.evaluateResult!=null}}return{success:!("error"in w),...w,url:H.url,tokenCount:j}}finally{$.write({type:"data-tool-metadata",id:K.toolCallId,data:{latencyMs:performance.now()-W}})}}})}function DK$($){let{writer:Z,toolOutputMap:X,objectStorage:Q,pendingImages:Y,imageTool:G}=$,J={user_ask:WD0,todo_write:FD0,propose_plan:ND0,read_tool_output:YD0({toolOutputMap:X})};if(G)J.generate_image=gn("generate_image",yn,OD0(Z,{...G,objectStorage:Q}),null);if(process.env.BROWSERLESS_TOKEN){if(J.scrape_url=OK$(Z,{toolOutputMap:X,objectStorage:Q,kind:"scrape"}),J.inspect_page=OK$(Z,{toolOutputMap:X,objectStorage:Q,kind:"inspect"}),Y)J.take_screenshot=DD0(Z,{objectStorage:Q,toolOutputMap:X,pendingImages:Y})}return J}var LK$=D(()=>{D4();an0();sn0();en0();d3();ED0();dy();py();Xt0()});async function jD0($,Z,X){let Q=await $.findById(Z,X);if(!Q||Q.organization_id!==X)throw Error(`Virtual MCP not found: ${Z}`);return Q}function un($,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>Ft0}function KJ($,Z=Date.now()){let X=$.status;if(X==="in_progress"&&un($,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 Ft0=1800000;var Ht0,cn;var zD0=D(()=>{Ht0=["in_progress","requires_action","failed","completed"],cn=["ended_after_delivery","superseded"]});import{z as q$}from"zod";var wK$,ON4,EK$,kW,jK$,zK$;var HC=D(()=>{zD0();fy();wK$=q$.object({id:q$.string().describe("Unique message ID"),thread_id:q$.string().describe("ID of the parent thread"),metadata:q$.unknown().optional().describe("Optional message metadata"),parts:q$.array(q$.record(q$.string(),q$.unknown())).describe("Message content parts (AI SDK UIMessagePart format)"),role:q$.enum(["user","assistant","system"]).describe("Message role"),created_at:q$.string().datetime().describe("Timestamp of creation"),updated_at:q$.string().datetime().describe("Timestamp of last update")}),ON4=q$.object({toolName:q$.string().describe("Fully qualified tool name"),appId:q$.string().describe("App ID that owns the tool"),args:q$.record(q$.string(),q$.unknown()).describe("Arguments used when expanding the tool"),expandedAt:q$.string().datetime().describe("When the tool was expanded")}),EK$=q$.object({expanded_tools:q$.array(ON4).optional(),read_only:q$.boolean().optional().describe("The thread takes no further input (an autonomous run the user cannot continue)"),runtime:q$.enum(Tn0).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(q$.unknown()),kW=q$.object({id:q$.string().describe("Unique thread ID"),organization_id:q$.string().describe("Organization this thread belongs to"),title:q$.string().describe("Thread title"),description:q$.string().nullable().describe("Thread description"),created_at:q$.string().datetime().describe("Timestamp of creation"),updated_at:q$.string().datetime().describe("Timestamp of last update"),hidden:q$.boolean().optional().describe("Whether the thread is hidden"),status:q$.enum([...Ht0,"expired"]).describe("Thread execution status. 'expired' is virtual -- computed at read time for stale in_progress threads"),created_by:q$.string().describe("User ID who created the thread"),updated_by:q$.string().optional().describe("User ID who last updated the thread"),virtual_mcp_id:q$.string().optional().describe("Virtual MCP (agent) this thread was initiated with"),trigger_id:q$.string().nullable().optional().describe("Automation trigger that created this thread; null/absent for human-initiated threads."),branch:q$.string().nullable().optional().describe("Git branch this thread is pinned to (GitHub-linked vms only)"),harness_id:q$.string().nullable().optional().describe("Pinned on first message; selects which harness runs the thread (e.g. 'claude-code', 'codex', 'decopilot')."),metadata:EK$.optional().describe("Free-form per-thread UI state (e.g. expanded_tools)"),run_config:q$.record(q$.string(),q$.unknown()).nullable().optional().describe("Persisted run configuration (contains agent and model info)")}),jK$=q$.object({id:q$.string().optional().describe("Optional custom ID for the thread"),title:q$.string().optional().describe("Thread title"),description:q$.string().nullish().describe("Thread description"),virtual_mcp_id:q$.string().describe("Virtual MCP (agent) this thread is bound to"),branch:q$.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:q$.enum(Tn0).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').")}),zK$=q$.object({title:q$.string().optional().describe("New thread title"),description:q$.string().nullish().describe("New thread description"),hidden:q$.boolean().optional().describe("Whether the thread is hidden"),status:q$.enum(Ht0).optional().describe("New thread status (user-set override). 'expired' is a computed virtual status and cannot be set directly."),metadata:EK$.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:q$.string().min(1).nullish().describe("New git branch for this thread"),virtual_mcp_id:q$.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 rY}from"zod";var DN4,LN4,NC;var Nt0=D(()=>{mG();k0();HC();DN4=R3.extend({where:rY.object({created_by:rY.string().optional(),trigger_ids:rY.array(rY.string()).max(1000).optional(),virtual_mcp_id:rY.string().optional(),hidden:rY.boolean().optional(),has_trigger:rY.boolean().optional()}).optional(),startDate:rY.string().datetime().optional().describe("Filter threads updated at or after this ISO timestamp"),endDate:rY.string().datetime().optional().describe("Filter threads updated at or before this ISO timestamp"),search:rY.string().optional().describe("Full-text search on thread title (case-insensitive)"),status:rY.string().optional().describe("Filter by thread status (e.g. completed, failed, in_progress)"),userId:rY.string().optional().describe("Filter by the user who created the thread"),agentId:rY.string().optional().describe("Filter by agent (connection or virtual MCP) ID")}),LN4=AH(kW),NC=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:DN4,outputSchema:LN4,handler:async($,Z)=>{await Z.access.check();let X=Z.auth.user?.id;if(!X)throw Error("User ID required to list threads");t(Z);let Q=$.offset??0,Y=$.limit??100,G=$.where?.trigger_ids,J=$.where?.virtual_mcp_id,K=$.userId??($.where?.created_by==="me"?X:$.where?.created_by),{threads:W,total:F}=G?.length?await Z.storage.threads.listByTriggerIds(G,{limit:Y,offset:Q}):await Z.storage.threads.list(K,{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:W.map((U)=>KJ(U,N)),totalCount:F,hasMore:H}}})});var wN4,UC;var Ut0=D(()=>{mG();k0();HC();wN4=Jp(kW),UC=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:Gp,outputSchema:wN4,handler:async($,Z)=>{r(Z),t(Z),await Z.access.check();let X=await Z.storage.threads.get($.id);if(!X)return{item:null};return{item:KJ(X)}}})});import{z as EN4}from"zod";function PK$($){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=PK$(Z);if(X)return X}return null}var jN4,zN4,BC;var Bt0=D(()=>{mG();k0();HC();jN4=R3.extend({thread_id:EN4.string().optional().describe("ID of the thread to list messages for (required)")}),zN4=AH(wK$),BC=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:jN4,outputSchema:zN4,handler:async($,Z)=>{t(Z),await Z.access.check();let X=$.thread_id??PK$($.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:K,total:W}=await Z.storage.threads.listMessages(X,{limit:Y,offset:Q,sort:G}),F=Q+Y<W;return{items:K,totalCount:W,hasMore:F}}})});function AK$($){return{search_threads:I$({description:NC.description,inputSchema:$0(NC.inputSchema),execute:(Z)=>NC.execute(Z,$)}),get_thread:I$({description:UC.description,inputSchema:$0(UC.inputSchema),execute:(Z)=>UC.execute(Z,$)}),list_thread_messages:I$({description:BC.description,inputSchema:$0(BC.inputSchema),execute:(Z)=>BC.execute(Z,$)})}}var TK$=D(()=>{D4();Nt0();Ut0();Bt0()});function Lt0($){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 Ot0($){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 wt0{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(!Lt0(Y))continue;let G=`${$.id}#${Q}`;if(this.emitted.has(G))continue;let J=this.seqFor(G),K=this.row($.id,$.role,J,Ot0(Y),Dt0(Y));this.partKeyByRowId.set(K.id,G),X.push(K)}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),K=this.row($.id,$.role,J,Ot0(Y),Dt0(Y));this.partKeyByRowId.set(K.id,G),X.push(K)}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(!Lt0(J))continue;let K=`${$.id}#${G}`,W=this.seqFor(K),F=this.row($.id,$.role,W,Ot0(J),Dt0(J));this.partKeyByRowId.set(F.id,K),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: ${RK$(Z)}`});this.partKeyByRowId.set(G.id,X),Q.push(G)}return[...Q,...this.markFinished($,"assistant")]}}function RK$($){if($.length<=PD0)return $;let Z=$.length-PD0;return`${$.slice(0,PD0)}\u2026 [truncated ${Z} characters]`}function Dt0($){let Z=$.errorText;if(typeof Z!=="string"||Z.length<=PD0)return $;return{...$,errorText:RK$(Z)}}var PD0=8000;class KX{ctx;builder;constructor($){this.ctx=$;this.builder=new wt0($)}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 fO=()=>{};async function AD0($,Z,X,Q){let Y=Z.organizationId,G=await hZ($,"smart"),J=X.virtual_mcp_id??Hw(Y),K={id:Q.messageId,role:"user",parts:[{type:"text",text:Q.prompt}]};await new KX({storage:$.storage.threads.messageParts(),orgId:Y,threadId:X.id,runId:X.id}).emitRequestMessage(K),await rH({threadId:X.id,source:"background-tool",request:{messages:[K],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:{...dO0(Z),...Q.runClass?{[hy]:Q.runClass}:{}}}},{workflowID:Q.workflowID})}var Et0=D(()=>{Vn();fO();nH();aH();uy();_8()});var TD0,IK$="notification.created";var RD0=D(()=>{TD0=["created","commented","mentioned","status_changed","assignee_changed","review_requested","review_approved","review_changes_requested","merge_failed"]});class kK${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>=MK$)return console.warn(`[SSEHub] Total connection limit reached (${MK$})`),null;let Z=this.listeners.get($.organizationId);if(!Z)Z=new Map,this.listeners.set($.organizationId,Z);if(Z.size>=qK$)return console.warn(`[SSEHub] Per-org connection limit reached for ${$.organizationId} (${qK$})`),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&&!PN4(Z.type,Q.typePatterns))continue;try{Q.push(Z)}catch{this.remove($,Q.id)}}}}function PN4($,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 qK$=50,MK$=500,C5;var ln=D(()=>{I6();C5=new kK$;w$.createObservableGauge("sse_hub.connections",{description:"Active SSE listeners held by this pod",unit:"{connections}"}).addCallback(($)=>$.observe(C5.count))});function AN4($){return $.replace(/[^a-zA-Z]/g,"").toUpperCase().slice(0,4)||"TASK"}function VK$($,Z){if(Z==null)return null;return`${AN4($)}-${String(Z).padStart(2,"0")}`}var SK$=()=>{};function jt0($){return $.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function RN4($,Z){let X=$.taskKeySeq===null?null:VK$($.orgSlug,$.taskKeySeq),Q=jt0($.actorName??"The agent"),Y=jt0($.taskTitle),G=X?`${jt0(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} ${TN4[$.type]} ${J}</p>`}function CK$($,Z){let X=$.length===1?"1 update on your tasks":`${$.length} updates on your tasks`;return{subject:X,html:z3({preheader:X,heading:X,body:$.map((Q)=>RN4(Q,Z)).join(`
|
|
1354
|
+
`,O=await FC("Browserless function call",`${JC}/function?token=${encodeURIComponent(F)}`,{method:"POST",headers:{"Content-Type":"application/javascript"},body:B});if(!O.ok)return{success:!1,error:O.error,url:H.url};let L=O.response;if(!L.ok){let z=await L.text().catch(()=>"Unknown error");return{success:!1,error:`Browserless function call failed (${L.status}): ${z}`,url:H.url}}let w=await L.json().catch(async()=>{return{error:`Browserless returned non-JSON response: ${(await L.text().catch(()=>"")).slice(0,200)}`}}),E=JSON.stringify(w,null,2);X.set(K.toolCallId,E);let j=JX(E);if(!("error"in w)&&j>VO&&Q){let z=`inspect-pages/${crypto.randomUUID()}.json`;return await Q.put(z,new TextEncoder().encode(E),{contentType:"application/json"}),{success:!0,uri:ZQ(z),preview:GJ(E),url:H.url,tokenCount:j,consoleLogCount:w.consoleLogs?.length??0,errorCount:w.errors?.length??0,hasEvaluateResult:w.evaluateResult!=null}}return{success:!("error"in w),...w,url:H.url,tokenCount:j}}finally{$.write({type:"data-tool-metadata",id:K.toolCallId,data:{latencyMs:performance.now()-W}})}}})}function DK$($){let{writer:Z,toolOutputMap:X,objectStorage:Q,pendingImages:Y,imageTool:G}=$,J={user_ask:WD0,todo_write:FD0,propose_plan:ND0,read_tool_output:YD0({toolOutputMap:X})};if(G)J.generate_image=gn("generate_image",yn,OD0(Z,{...G,objectStorage:Q}),null);if(process.env.BROWSERLESS_TOKEN){if(J.scrape_url=OK$(Z,{toolOutputMap:X,objectStorage:Q,kind:"scrape"}),J.inspect_page=OK$(Z,{toolOutputMap:X,objectStorage:Q,kind:"inspect"}),Y)J.take_screenshot=DD0(Z,{objectStorage:Q,toolOutputMap:X,pendingImages:Y})}return J}var LK$=D(()=>{D4();an0();sn0();en0();d3();ED0();dy();py();Xt0()});async function jD0($,Z,X){let Q=await $.findById(Z,X);if(!Q||Q.organization_id!==X)throw Error(`Virtual MCP not found: ${Z}`);return Q}function un($,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>Ft0}function KJ($,Z=Date.now()){let X=$.status;if(X==="in_progress"&&un($,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 Ft0=1800000;var Ht0,cn;var zD0=D(()=>{Ht0=["in_progress","requires_action","failed","completed"],cn=["ended_after_delivery","superseded"]});import{z as q$}from"zod";var wK$,ON4,EK$,kW,jK$,zK$;var HC=D(()=>{zD0();fy();wK$=q$.object({id:q$.string().describe("Unique message ID"),thread_id:q$.string().describe("ID of the parent thread"),metadata:q$.unknown().optional().describe("Optional message metadata"),parts:q$.array(q$.record(q$.string(),q$.unknown())).describe("Message content parts (AI SDK UIMessagePart format)"),role:q$.enum(["user","assistant","system"]).describe("Message role"),created_at:q$.string().datetime().describe("Timestamp of creation"),updated_at:q$.string().datetime().describe("Timestamp of last update")}),ON4=q$.object({toolName:q$.string().describe("Fully qualified tool name"),appId:q$.string().describe("App ID that owns the tool"),args:q$.record(q$.string(),q$.unknown()).describe("Arguments used when expanding the tool"),expandedAt:q$.string().datetime().describe("When the tool was expanded")}),EK$=q$.object({expanded_tools:q$.array(ON4).optional(),read_only:q$.boolean().optional().describe("The thread takes no further input (an autonomous run the user cannot continue)"),runtime:q$.enum(Tn0).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(q$.unknown()),kW=q$.object({id:q$.string().describe("Unique thread ID"),organization_id:q$.string().describe("Organization this thread belongs to"),title:q$.string().describe("Thread title"),description:q$.string().nullable().describe("Thread description"),created_at:q$.string().datetime().describe("Timestamp of creation"),updated_at:q$.string().datetime().describe("Timestamp of last update"),hidden:q$.boolean().optional().describe("Whether the thread is hidden"),status:q$.enum([...Ht0,"expired"]).describe("Thread execution status. 'expired' is virtual -- computed at read time for stale in_progress threads"),created_by:q$.string().describe("User ID who created the thread"),updated_by:q$.string().optional().describe("User ID who last updated the thread"),virtual_mcp_id:q$.string().optional().describe("Virtual MCP (agent) this thread was initiated with"),trigger_id:q$.string().nullable().optional().describe("Automation trigger that created this thread; null/absent for human-initiated threads."),branch:q$.string().nullable().optional().describe("Git branch this thread is pinned to (GitHub-linked vms only)"),harness_id:q$.string().nullable().optional().describe("Pinned on first message; selects which harness runs the thread (e.g. 'claude-code', 'codex', 'decopilot')."),metadata:EK$.optional().describe("Free-form per-thread UI state (e.g. expanded_tools)"),run_config:q$.record(q$.string(),q$.unknown()).nullable().optional().describe("Persisted run configuration (contains agent and model info)")}),jK$=q$.object({id:q$.string().optional().describe("Optional custom ID for the thread"),title:q$.string().optional().describe("Thread title"),description:q$.string().nullish().describe("Thread description"),virtual_mcp_id:q$.string().describe("Virtual MCP (agent) this thread is bound to"),branch:q$.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:q$.enum(Tn0).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').")}),zK$=q$.object({title:q$.string().optional().describe("New thread title"),description:q$.string().nullish().describe("New thread description"),hidden:q$.boolean().optional().describe("Whether the thread is hidden"),status:q$.enum(Ht0).optional().describe("New thread status (user-set override). 'expired' is a computed virtual status and cannot be set directly."),metadata:EK$.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:q$.string().min(1).nullish().describe("New git branch for this thread"),virtual_mcp_id:q$.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 rY}from"zod";var DN4,LN4,NC;var Nt0=D(()=>{mG();k0();HC();DN4=R3.extend({where:rY.object({created_by:rY.string().optional(),trigger_ids:rY.array(rY.string()).max(1000).optional(),virtual_mcp_id:rY.string().optional(),hidden:rY.boolean().optional(),has_trigger:rY.boolean().optional()}).optional(),startDate:rY.string().datetime().optional().describe("Filter threads updated at or after this ISO timestamp"),endDate:rY.string().datetime().optional().describe("Filter threads updated at or before this ISO timestamp"),search:rY.string().optional().describe("Full-text search on thread title (case-insensitive)"),status:rY.string().optional().describe("Filter by thread status (e.g. completed, failed, in_progress)"),userId:rY.string().optional().describe("Filter by the user who created the thread"),agentId:rY.string().optional().describe("Filter by agent (connection or virtual MCP) ID")}),LN4=AH(kW),NC=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:DN4,outputSchema:LN4,handler:async($,Z)=>{await Z.access.check();let X=Z.auth.user?.id;if(!X)throw Error("User ID required to list threads");t(Z);let Q=$.offset??0,Y=$.limit??100,G=$.where?.trigger_ids,J=$.where?.virtual_mcp_id,K=$.userId??($.where?.created_by==="me"?X:$.where?.created_by),{threads:W,total:F}=G?.length?await Z.storage.threads.listByTriggerIds(G,{limit:Y,offset:Q}):await Z.storage.threads.list(K,{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:W.map((U)=>KJ(U,N)),totalCount:F,hasMore:H}}})});var wN4,UC;var Ut0=D(()=>{mG();k0();HC();wN4=Jp(kW),UC=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:Gp,outputSchema:wN4,handler:async($,Z)=>{r(Z),t(Z),await Z.access.check();let X=await Z.storage.threads.get($.id);if(!X)return{item:null};return{item:KJ(X)}}})});import{z as EN4}from"zod";function PK$($){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=PK$(Z);if(X)return X}return null}var jN4,zN4,BC;var Bt0=D(()=>{mG();k0();HC();jN4=R3.extend({thread_id:EN4.string().optional().describe("ID of the thread to list messages for (required)")}),zN4=AH(wK$),BC=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:jN4,outputSchema:zN4,handler:async($,Z)=>{t(Z),await Z.access.check();let X=$.thread_id??PK$($.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:K,total:W}=await Z.storage.threads.listMessages(X,{limit:Y,offset:Q,sort:G}),F=Q+Y<W;return{items:K,totalCount:W,hasMore:F}}})});function AK$($){return{search_threads:I$({description:NC.description,inputSchema:$0(NC.inputSchema),execute:(Z)=>NC.execute(Z,$)}),get_thread:I$({description:UC.description,inputSchema:$0(UC.inputSchema),execute:(Z)=>UC.execute(Z,$)}),list_thread_messages:I$({description:BC.description,inputSchema:$0(BC.inputSchema),execute:(Z)=>BC.execute(Z,$)})}}var TK$=D(()=>{D4();Nt0();Ut0();Bt0()});function Lt0($){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 Ot0($){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 wt0{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(!Lt0(Y))continue;let G=`${$.id}#${Q}`;if(this.emitted.has(G))continue;let J=this.seqFor(G),K=this.row($.id,$.role,J,Ot0(Y),Dt0(Y));this.partKeyByRowId.set(K.id,G),X.push(K)}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),K=this.row($.id,$.role,J,Ot0(Y),Dt0(Y));this.partKeyByRowId.set(K.id,G),X.push(K)}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(!Lt0(J))continue;let K=`${$.id}#${G}`,W=this.seqFor(K),F=this.row($.id,$.role,W,Ot0(J),Dt0(J));this.partKeyByRowId.set(F.id,K),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: ${RK$(Z)}`});this.partKeyByRowId.set(G.id,X),Q.push(G)}return[...Q,...this.markFinished($,"assistant")]}}function RK$($){if($.length<=PD0)return $;let Z=$.length-PD0;return`${$.slice(0,PD0)}\u2026 [truncated ${Z} characters]`}function Dt0($){let Z=$.errorText;if(typeof Z!=="string"||Z.length<=PD0)return $;return{...$,errorText:RK$(Z)}}var PD0=8000;class KX{ctx;builder;constructor($){this.ctx=$;this.builder=new wt0($)}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 fO=()=>{};async function AD0($,Z,X,Q){let Y=Z.organizationId,G=await hZ($,"smart"),J=X.virtual_mcp_id??Hw(Y),K={id:Q.messageId,role:"user",parts:[{type:"text",text:Q.prompt}],metadata:{created_at:new Date().toISOString()}};await new KX({storage:$.storage.threads.messageParts(),orgId:Y,threadId:X.id,runId:X.id}).emitRequestMessage(K),await rH({threadId:X.id,source:"background-tool",request:{messages:[K],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:{...dO0(Z),...Q.runClass?{[hy]:Q.runClass}:{}}}},{workflowID:Q.workflowID})}var Et0=D(()=>{Vn();fO();nH();aH();uy();_8()});var TD0,IK$="notification.created";var RD0=D(()=>{TD0=["created","commented","mentioned","status_changed","assignee_changed","review_requested","review_approved","review_changes_requested","merge_failed"]});class kK${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>=MK$)return console.warn(`[SSEHub] Total connection limit reached (${MK$})`),null;let Z=this.listeners.get($.organizationId);if(!Z)Z=new Map,this.listeners.set($.organizationId,Z);if(Z.size>=qK$)return console.warn(`[SSEHub] Per-org connection limit reached for ${$.organizationId} (${qK$})`),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&&!PN4(Z.type,Q.typePatterns))continue;try{Q.push(Z)}catch{this.remove($,Q.id)}}}}function PN4($,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 qK$=50,MK$=500,C5;var ln=D(()=>{I6();C5=new kK$;w$.createObservableGauge("sse_hub.connections",{description:"Active SSE listeners held by this pod",unit:"{connections}"}).addCallback(($)=>$.observe(C5.count))});function AN4($){return $.replace(/[^a-zA-Z]/g,"").toUpperCase().slice(0,4)||"TASK"}function VK$($,Z){if(Z==null)return null;return`${AN4($)}-${String(Z).padStart(2,"0")}`}var SK$=()=>{};function jt0($){return $.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function RN4($,Z){let X=$.taskKeySeq===null?null:VK$($.orgSlug,$.taskKeySeq),Q=jt0($.actorName??"The agent"),Y=jt0($.taskTitle),G=X?`${jt0(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} ${TN4[$.type]} ${J}</p>`}function CK$($,Z){let X=$.length===1?"1 update on your tasks":`${$.length} updates on your tasks`;return{subject:X,html:z3({preheader:X,heading:X,body:$.map((Q)=>RN4(Q,Z)).join(`
|
|
1355
1355
|
`),footnote:"You received this because you follow these tasks. Open a task and use Unfollow to stop."})}}var TN4;var _K$=D(()=>{SK$();TN4={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 dn}from"zod";var ty;var ID0=D(()=>{ty=dn.object({taskTitle:dn.string(),taskKeySeq:dn.number().int().nullable(),actorName:dn.string().nullable(),actorImage:dn.string().nullable()})});import{DBOS as VW,SchedulerMode as IN4}from"@dbos-inc/dbos-sdk";function vK$($){At0=$}function Rt0(){if(!At0)throw Error("[notifications] runtime not initialized \u2014 setNotificationDigestRuntime() must run before the workflow fires");return At0}function fK$(){return Rt0().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(kN4)}function bK$($){return $.map((Z)=>{let X=ty.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 SN4($){return bK$(await fK$().where("n.user_id","=",$).execute())}async function CN4($){return bK$(await fK$().where("n.created_at","<",$).execute())}async function _N4($){if($.length===0)return new Set;let Z=await Rt0().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 vN4($){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 It0(){let $=wH().auth,Z=$.emailProviders??[],X=$.inviteEmailProviderId?j3(Z,$.inviteEmailProviderId):Z[0];return X?E3(X):null}async function fN4($){let Z=It0();if(!Z)throw Error("no email provider configured");let{subject:X,html:Q}=CK$($,e5());await Z({to:$[0].email,subject:X,html:Q})}async function bN4($){await Rt0().db.deleteFrom("notifications").where("created_at","<",$).execute()}async function xK$($,Z){if($.length===0)return;let X=await VW.runStep(()=>_N4($.map((Y)=>Y.id)),{name:`claimForEmail:${Z}`}),Q=$.filter((Y)=>X.has(Y.id));if(Q.length===0)return;await VW.runStep(()=>fN4(Q),{name:`sendDigest:${Z}`})}async function xN4($,Z){let X=Z-Date.now();if(X>0)await VW.sleep(X);if(!It0())return;let Q=await VW.runStep(()=>SN4($),{name:"loadPendingForUser"});try{await xK$(Q,$)}catch(Y){console.warn(`[notifications] digest for ${$} failed:`,Y instanceof Error?Y.message:Y)}}async function yN4($,Z){let X=new Date($.getTime()-Pt0-MN4),Q=It0()?await VW.runStep(()=>CN4(X),{name:"loadOrphanedNotifications"}):[];for(let Y of vN4(Q)){let G=Y[0].userId;try{await xK$(Y,G)}catch(J){console.warn(`[notifications] sweep digest for ${G} failed:`,J instanceof Error?J.message:J)}}if($.getUTCMinutes()<2)await VW.runStep(()=>bN4(new Date($.getTime()-VN4)),{name:"pruneOldNotifications"})}function yK$($){if(!Tt0)return;let Z=Math.floor(Date.now()/Pt0),X=(Z+1)*Pt0;VW.startWorkflow(Tt0,{workflowID:`notif-digest:${$}:${Z}`})($,X).catch((Q)=>{console.debug("[notifications] digest enqueue skipped:",Q instanceof Error?Q.message:Q)})}function gK$(){if(zt0)return;Tt0=VW.registerWorkflow(xN4,{name:"notificationUserDigestWorkflow"}),zt0=VW.registerWorkflow(yN4,{name:"notificationDigestWorkflow"}),VW.registerScheduled(zt0,{name:"notificationDigestWorkflow",crontab:qN4,mode:IN4.ExactlyOncePerIntervalWhenActive})}var qN4="*/2 * * * *",Pt0=30000,MN4=60000,kN4=500,VN4=2592000000,At0=null,zt0=null,Tt0=null;var qt0=D(()=>{k50();$9();_x();_K$();ID0()});async function gN4($,Z){return await $.selectFrom("task_board_items").select(["organization_id","title","key_seq"]).where("id","=",Z).executeTakeFirst()}async function hN4($,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 oy($){let{db:Z,taskBoardItemId:X,type:Q,actorId:Y}=$;try{let G=[],J=await gN4(Z,X);if(!J)return;let K=async(W)=>{let F=[...new Set($.alsoSubscribe?.filter((L)=>!!L))];if(F.length>0)await W.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 W.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 hN4(W,Y),O=ty.parse({taskTitle:J.title,taskKeySeq:J.key_seq??null,actorName:B.name,actorImage:B.image});await W.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?K(Z):Z.transaction().execute(K));for(let W of G)yK$(W),C5.emit(J.organization_id,{id:crypto.randomUUID(),type:IK$,source:"notifications",subject:W,time:new Date().toISOString()})}catch(G){console.error("[notifications] fan-out failed",G)}}var qD0=D(()=>{VZ();RD0();ln();qt0();ID0()});import{sql as bO}from"kysely";function cN4($){return uN4.has($)?$:null}function MD0($){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 hK$($){if($&&typeof $==="object"&&!Array.isArray($)){let Z=$.text;if(typeof Z==="string"&&Z.trim())return Z.trim()}return null}function Mt0($,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&&mn.has(Q.status)))return!1;return X.some((Q)=>Q.status==="completed")}function mN4($){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 iN4($){if($===null||$===void 0)return null;let Z=typeof $==="number"?$:Number($);return Number.isFinite(Z)?Z:null}function pN4($,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 XQ{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??qd0,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:bO`(
|
|
1356
1356
|
select coalesce(min(sort_order), 0) - 1
|
|
1357
1357
|
from task_board_items
|
|
@@ -1495,7 +1495,7 @@ ${Z}
|
|
|
1495
1495
|
|
|
1496
1496
|
Use this to continue with the user's request \u2014 do NOT call subtask again for this.`:`The background subtask you started completed but produced no usable output${X==="length"?" (it hit its step limit)":""}. Continue with the user's request without calling subtask again for this.`;return{models:Q,reactionNudge:G}}}};iO.registerWorkflow(WP4,{name:"backgroundToolWorkflow"})});async function FP4($,Z,X){let Q=await Wg({kind:X.kind,ctx:$,organization:Z,virtualMcp:X.virtualMcp,mcpClient:X.mcpClient,provider:X.provider,models:X.models,messages:X.messages,abortSignal:X.abortSignal,temperature:X.temperature,planMode:X.planMode,isDecopilot:X.isDecopilot,systemAgentInstructions:X.systemAgentInstructions,currentThreadId:X.currentThreadId,user:X.user,userContext:X.userContext,codingWorkspace:X.codingWorkspace,writer:X.writer,subtaskParams:{provider:X.provider,organization:Z,models:X.models,codingWorkspace:X.codingWorkspace},prepareStep:X.prepareStep,onStepFinish:X.onStepFinish,passthroughClient:X.passthroughClient,connectionsData:X.connectionsData,extraTools:X.extraTools,toolOutputMap:X.toolOutputMap,additionalSystemMessages:X.additionalSystemMessages,activeToolNames:X.activeToolNames,stepLimit:X.stepLimit});return{result:Q.result,error:Q.error,span:Q.span,assembledSystemMessages:Q.assembledSystemMessages}}function yU$($){let{ctx:Z,organization:X,modelRuntime:Q,sideChannel:Y,cleanup:G}=$,J=qU$(Z,Y.writer),K=RU$(Z);return{toolRuntime:{buildEnvironmentTools:async({input:H,onChildUsage:N})=>{let U=Ng(H),B=QD0(),O=[],{resolveArgs:L,onToolCalled:w,onPrOpened:E}=FL0(Z,H.threadId),j=await jU$(H,Z,{writer:Y.writer,toolOutputMap:B,pendingImages:O,threadId:H.threadId,resolveArgs:L,onToolCalled:w,onPrOpened:E,mcpForAgent:async(A,P)=>{let I=U.virtualMcp,k=null;if(I.id&&H.user.id&&I9(I.metadata)[H.user.id])k=await bC(Z,I.id,H.user.id,U.branch??void 0).catch(()=>null);return tH(I,Z,P?.superUser??!1,{listTimeoutMs:P?.listTimeoutMs,includeSkillsCatalog:!0,additionalConnections:k?[k]:[]})},provider:Q.thinking.provider,imageProvider:Q.image?.provider??Q.thinking.provider,webSearchProvider:Q.webSearch?.provider??Q.thinking.provider,deepResearchProvider:Q.deepResearch?.provider??Q.thinking.provider,backgroundDispatcher:xU$({threadId:H.threadId,orgId:H.organizationId,userId:H.user.id,agentId:H.agent.id,temperature:H.temperature,toolApprovalLevel:H.toolApprovalLevel,branch:U.branch??null,runMetadata:Z.metadata.runMetadata}),htmlArtifactBuffer:K,onChildUsage:N}),z={tools:j.tools,passthroughTools:j.passthroughTools,builtInTools:j.builtInTools,connectionsBlockTools:j.connectionsBlockTools,toolAnnotations:j.toolAnnotations,connectionTitleMap:j.connectionTitleMap,serverInstructions:j.serverInstructions,passthroughClient:j.passthroughClient,toolOutputMap:B,writer:Y.writer,pendingImages:O,sideChunks:Y.stream,closeSideChunks:Y.close,onStepFinish:async()=>{await K.flush(),await J.sweep()},close:j.close};return G.close=j.close,z},runEngine:(H)=>FP4(Z,X,H)},telemetry:{recordLlmCall:(H)=>DU$({ctx:Z,...H}),monitorLlmCall:(H)=>BU$({ctx:Z,...H,requestId:Z.metadata.requestId,userAgent:Z.metadata.userAgent??null})}}}var gU$=D(()=>{OU$();LU$();ly();RL0();mQ();zU$();bo0();IU$();MU$();d3();HL0();Dg();Ug()});async function*hU$($,Z){let X=Ng(Z),Q=WU$({models:Z.models,modelSources:X.modelSources},zL0),Y=$.organization;if(!Y)throw Error("[decopilot] an organization-scoped Studio context is required");let G=PL0(),J={},K=yU$({ctx:$,organization:Y,modelRuntime:Q,sideChannel:G,cleanup:J});try{yield*FU$({input:Z,modelRuntime:Q,toolRuntime:K.toolRuntime,telemetry:K.telemetry,kind:"main"})}finally{G.close(),await J.close?.().catch(()=>{})}}var uU$=D(()=>{wr0();HU$();Ug();gU$()});function pO($,Z){return`error-${$}:${Z}`}class cU${thread;organization_id;storage;defaultWindowSize;constructor($){this.thread=$.thread,this.organization_id=$.thread.organization_id,this.storage=$.storage,this.defaultWindowSize=$.defaultWindowSize??50}async loadHistory($){let Z=$??this.defaultWindowSize,{chronological:X,isWindowed:Q}=this.thread.message_storage_version===2?await this.loadWindowedFromParts(Z):await this.loadWindowedFromMessages(Z),Y=X.find((W)=>W.role!=="system");if(!Y||Y.role==="user")return X;let G=Y,J=Q?"[Context: earlier turns in this conversation were truncated. The messages below continue the thread \u2014 pick up from there.]":"[Context: this thread opens with your message \u2014 you spoke first to greet the user, and the user has not spoken before it. Their reply follows.]";return[{id:`${this.thread.id}-msg-prefix`,thread_id:this.thread.id,role:"user",parts:[{type:"text",text:J}],metadata:void 0,created_at:G.created_at,updated_at:G.updated_at},...X]}async loadWindowedFromMessages($){let{messages:Z,total:X}=await this.storage.listMessages(this.thread.id,{limit:$,sort:"desc"});return{chronological:[...Z].reverse(),isWindowed:X>Z.length}}async loadWindowedFromParts($){let{messages:Z,total:X}=await this.storage.messageParts().loadWindow(this.thread.id,{limit:$,excludeSubtasks:!0});return{chronological:Z.map((Y)=>({id:Y.id,thread_id:this.thread.id,role:Y.role,parts:Y.parts,metadata:Y.metadata??void 0,created_at:Y.created_at,updated_at:Y.created_at})),isWindowed:X>Z.length}}}async function CL0($,Z){let{thread_id:X,defaultWindowSize:Q}=Z;if(!X)throw Error("createMemory: thread_id is required");let Y=await $.get(X);if(!Y)throw Error(`Thread not found: ${X}`);return new cU$({thread:Y,storage:$,defaultWindowSize:Q})}function HP4($,Z){let X=$.filter((G)=>G.parts&&G.parts.length>0),Q=X.findIndex((G)=>G.id===Z.id);return Q>=0?[...X.slice(0,Q),Z]:[...X,Z]}async function NP4($){return[...$.systemMessages,...HP4($.history,$.userMessage)]}async function lU$($){let Z=$.isSubagent?[]:await(await CL0($.ctx.storage.threads,{thread_id:$.threadId,organization_id:$.ctx.organization?.id??"",userId:$.ctx.auth.user?.id??"",defaultWindowSize:$.windowSize??JJ})).loadHistory($.windowSize??JJ),X=await NP4({history:Z,userMessage:$.userMessage,systemMessages:$.systemMessages});return WL0(X,$.ctx)}var dU$=D(()=>{CO();Kg()});function br0($){let Z=new Map;for(let Q of $){let Y=Z.get(Q.message_id);if(Y)Y.push(Q);else Z.set(Q.message_id,[Q])}let X=[];for(let[Q,Y]of Z){let G=[...Y].sort((K,W)=>K.seq-W.seq),J=G[0];X.push({id:Q,role:J.role,parts:G.filter((K)=>K.kind!=="finish").map((K)=>K.payload&&typeof K.payload==="object"&&!Array.isArray(K.payload)?{...K.payload,created_at:K.created_at}:K.payload),created_at:J.created_at,status:G.some((K)=>K.kind==="finish")?"complete":"in_progress",metadata:G.find((K)=>K.kind==="finish")?.metadata??null})}return X.sort((Q,Y)=>Q.created_at<Y.created_at?-1:Q.created_at>Y.created_at?1:0),X}function _L0($){return{id:$.id,role:$.role,parts:$.parts,metadata:$.metadata??void 0}}var xr0=()=>{};function mU$($,Z){let X=$.thinking.capabilities;if(!((X?.vision??!1)||(X?.file??!1))){if(Z.some((G)=>G.parts?.some((J)=>J.type==="file")))throw new $$(400,{message:"This model does not support file uploads. Please change the model and try again."})}}var iU$=D(()=>{w3()});function UP4($){return{type:"data-user-message",data:$}}function pU$($){if(!$||typeof $!=="object")return!1;return $.type==="data-user-message"}async function nU$($,Z,X){if(!$)return;try{await $.publishRawChunk(Z,UP4(X))}catch{}}class wt{intervalMs;emitFn;sleepFn;controller=null;stopped=!1;constructor($){this.intervalMs=$.intervalMs??BP4,this.emitFn=$.emit,this.sleepFn=$.sleepFn??L$}arm(){if(this.stopped)return;this.controller?.abort();let $=new AbortController;this.controller=$,this.wait($.signal)}async wait($){try{await this.sleepFn(this.intervalMs,{signal:$})}catch{return}if(this.stopped||$.aborted)return;try{await this.emitFn()}catch{this.stop();return}if(!this.stopped&&!$.aborted)this.arm()}stop(){if(this.stopped)return;this.stopped=!0,this.controller?.abort(),this.controller=null}}function tU$($=Date.now){return{type:"data-liveness",data:{t:$()},transient:!0}}var BP4=30000;var yr0=D(()=>{K4()});function OP4($=Date.now){return tU$($)}async function*oU$($,Z={}){let X=()=>OP4(Z.now),Q=null,Y=new wt({intervalMs:Z.intervalMs,sleepFn:Z.sleepFn,emit:()=>Q?.()}),G=$[Symbol.asyncIterator](),J=G.next();try{Y.arm();while(!0){let K=new Promise((F)=>{Q=()=>F("heartbeat")}),W=await Promise.race([J.then((F)=>({kind:"chunk",r:F})),K.then((F)=>({kind:F}))]);if(Q=null,W.kind==="heartbeat"){yield X();continue}if(Y.arm(),W.r.done)return;yield W.r.value,J=G.next()}}finally{Y.stop(),await G.return?.(void 0).catch(()=>{})}}var rU$=D(()=>{yr0()});function DP4($){if(!$)return;if(!("models"in $))return;return $.models??void 0}function aU$($,Z){if(!$)return!0;if($.includes("*:*"))return!0;return $.some((X)=>X.startsWith(`${Z}:`))}function a3($,Z,X){if(!$)return!0;return $.includes("*:*")||$.includes(`${Z}:*`)||$.includes(`${Z}:${X}`)}function vL0($,Z){if($===void 0)return Z;let X=Z;if(X.image&&!a3($,X.image.credentialId,X.image.id)){let{image:Q,...Y}=X;X=Y}if(X.webSearch&&!a3($,X.webSearch.credentialId,X.webSearch.id)){let{webSearch:Q,...Y}=X;X=Y}if(X.deepResearch&&!a3($,X.deepResearch.credentialId,X.deepResearch.id)){let{deepResearch:Q,...Y}=X;X=Y}return X}function sU$($){if(!$)return{allowAll:!0,models:{}};if($.includes("*:*"))return{allowAll:!0,models:{}};let Z={};for(let X of $){let Q=X.indexOf(":");if(Q===-1)continue;let Y=X.slice(0,Q),G=X.slice(Q+1);if(!Z[Y])Z[Y]=[];Z[Y].push(G)}return{allowAll:!1,models:Z}}function LP4($){if($.some((X)=>X===void 0))return;let Z=new Set;for(let X of $)for(let Q of X??[])Z.add(Q);return[...Z]}async function s3($,Z,X){if(!X||n7(X))return;let Q=X.split(","),Y=await $.selectFrom("organizationRole").select(["role","permission"]).where("organizationId","=",Z).where("role","in",Q).execute(),G=new Map(Y.map((K)=>[K.role,K.permission])),J=Q.map((K)=>{let W=G.get(K);if(!W)return;try{let F=JSON.parse(W);return DP4(F)}catch{return console.error(`[model-permissions] Failed to parse permissions for role: ${K}`),[]}});return LP4(J)}var Lg=D(()=>{VQ()});function wg($,Z){let X=$.capabilities?{...$.capabilities.vision!==void 0?{vision:$.capabilities.vision}:{},...$.capabilities.text!==void 0?{text:$.capabilities.text}:{},...$.capabilities.reasoning!==void 0?{reasoning:$.capabilities.reasoning}:{}}:void 0;return{id:$.id,...$.title!==void 0?{title:$.title}:{},...$.provider!==void 0?{provider:$.provider}:{},credentialId:Z,...$.limits?{limits:$.limits}:{},...X&&Object.keys(X).length>0?{capabilities:X}:{}}}function eU$($){let Z=$.credentialId,X=wg($.thinking,Z);return{thinking:{...X,title:X.title??X.id},...$.fast?{fast:wg($.fast,Z)}:{},...$.smart?{smart:wg($.smart,Z)}:{},...$.image?{image:wg($.image,$.image.credentialId??Z)}:{},...$.webSearch?{webSearch:wg($.webSearch,$.webSearch.credentialId??Z)}:{},...$.deepResearch?{deepResearch:wg($.deepResearch,$.deepResearch.credentialId??Z)}:{}}}function wP4($,Z=[]){if($==="stop")return"completed";if($==="tool-calls"){let X=Z.some((Y)=>Y.type==="tool-user_ask"&&Y.state==="input-available"),Q=Z.some((Y)=>Y.state==="approval-requested");return X||Q?"requires_action":"completed"}return"failed"}function fL0($,Z=[]){if($==null)return"completed";return wP4($,Z)}function gr0(){return b0().podName}var $B$=D(()=>{R$()});function EP4($){let Z=null;return new ReadableStream({async pull(X){try{Z??=$().getReader();let{done:Q,value:Y}=await Z.read();if(Q)X.close();else X.enqueue(Y)}catch(Q){X.error(Q)}},async cancel(X){await Z?.cancel(X)}},{highWaterMark:0})}function jP4($){let Z=$.startSeq??0;async function*X(){for await(let Q of $.chunks)yield{seq:++Z,chunk:Q}}return new ReadableStream({async start(Q){try{let Y=await $.loadOriginalMessages?.();await kL0({runId:$.runId,fenceToken:$.fenceToken,chunks:X(),errorMessageId:$.errorMessageId,originalMessages:Y,...$.initialAckSeq!==void 0?{initialAckSeq:$.initialAckSeq}:{},...$.onPublished?{onPublished:$.onPublished}:{}},{streamBuffer:$.streamBuffer,hooks:$.hooks,title:$.title}),Q.close()}catch(Y){Q.error(Y)}}})}async function zP4($,Z,X,Q,Y){let{keyInfo:G,apiKey:J}=await $.storage.aiProviderKeys.resolve(X,Z),K=DJ$(lo0({providerId:G.providerId,apiKey:J,modelId:Q}),Y);if(K.providerId==="openrouter"||K.providerId==="deco")return{...K,extraHeaders:{...K.extraHeaders,"HTTP-Referer":"https://studio.decocms.com","X-Title":"deco"}};return K}function Et($){if(!QB$.includes($))throw Error(`hosted dispatch requires one of ${QB$.join(", ")}; got ${JSON.stringify($)}`)}function YB$($){return!("messages"in $)}function GB$($,Z){if(!$.taskId)throw Error("buildDurableDispatchInput: taskId is required");let X=$.messages.filter((Q)=>Q.role==="system").flatMap((Q)=>Q.parts).filter((Q)=>Q.type==="text"&&typeof Q.text==="string").map((Q)=>Q.text).join(`
|
|
1497
1497
|
|
|
1498
|
-
`).trim();return{models:$.models,agent:$.agent,temperature:$.temperature,toolApprovalLevel:$.toolApprovalLevel,...$.toolAllowlist!==void 0?{toolAllowlist:$.toolAllowlist}:{},...$.maxAgentSteps!==void 0?{maxAgentSteps:$.maxAgentSteps}:{},...$.isSubagent!==void 0?{isSubagent:$.isSubagent}:{},...$.subtaskJobId!==void 0?{subtaskJobId:$.subtaskJobId}:{},...$.resumedFromBackground!==void 0?{resumedFromBackground:$.resumedFromBackground}:{},mode:$.mode,...$.windowSize!==void 0?{windowSize:$.windowSize}:{},...$.triggerId!==void 0?{triggerId:$.triggerId}:{},...$.runMetadata!==void 0?{runMetadata:$.runMetadata}:{},branch:Z.branch??$.branch??null,harnessId:$.harnessId,organizationId:$.organizationId,userId:$.userId,taskId:$.taskId,messageId:Z.messageId,...Z.runFenceToken!==void 0?{runFenceToken:Z.runFenceToken}:{},...$.isResume!==void 0?{isResume:$.isResume}:{},...X?{systemContext:X}:{}}}function PP4($,Z){let X=$.find((Q)=>Q.id===Z);if(!X)throw new MW("empty_request",`Persisted request message missing for messageId=${Z}`);if(X.role==="system")throw new MW("empty_request",`Persisted message ${Z} has role=system; expected non-system request message`);return X}function AP4($){let Z=$.models;return{"decopilot.agent.id":$.agent.id,"decopilot.model.id":Z.thinking.id,"decopilot.credential.id":Z.credentialId,"decopilot.organization.id":$.organizationId,"decopilot.user.id":$.userId,"decopilot.thread.id":$.taskId??""}}async function JB$($,Z,X){return kX1("decopilot.dispatchRunAndWait",async(Q)=>{let{taskId:Y,uiStream:G,registrySignal:J}=await IP4($,Z,X,Q),K=X.streamBuffer,W=K?await K.createTailStream(Y,$.abortSignal,{deliverPolicy:"new",closeOnDone:!0}):null;if(K&&W){let F=K.pump(G,Y,J,$.organizationId);F.catch(()=>{});let H=W.getReader();try{while(!0){let{done:N}=await H.read();if(N)break}}finally{H.releaseLock()}await F}else{if(K)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"producer-fallback-no-pump",taskId:Y,hasTail:!!W,note:"createTailStream returned null \u2014 draining producer stream directly; projector persistence depends on streamBuffer publish health"}));let F=G.getReader();try{while(!0){let{done:H}=await F.read();if(H)break}}finally{F.releaseLock()}}return{taskId:Y}},AP4($))}async function TP4($,Z,X,Q){let[Y,G,J]=await Promise.all([$.storage.threads.list(Q,{limit:9,agentId:X}).catch(()=>null),$.storage.interests.getForAgent(Z,X,Q).catch(()=>null),$.storage.virtualMcps.list(Z).catch(()=>null)]),K={};if(Y&&Y.total>0)K.recentThreads={total:Y.total,threads:Y.threads.map((W)=>({id:W.id,title:W.title,updated_at:W.updated_at}))};if(G&&G.interests.length>0)K.interests=G.interests.map((W)=>({title:W.title,summary:W.summary}));if(J)K.agents=J.map((W)=>({id:W.id,name:W.title,description:W.description,status:W.status}));return K}async function RP4({virtualMcp:$,agentId:Z,organizationId:X,ctx:Q}){return B90({virtualMcp:$,agentId:Z,organizationId:X,ctx:Q})}async function IP4($,Z,X,Q){let{runRegistry:Y,streamBuffer:G}=X;Et($.harnessId);let J=$.harnessId;if(!YB$($))$={...$,messages:$.messages.map((F)=>F.id?F:{...F,id:vn()})};let K=!1,W;try{let F=$.models;Q.setAttribute("decopilot.harnessId",J),Q.setAttribute("decopilot.dispatchTarget.sandboxProviderKind","agent-sandbox");let H=RC(J),N=eU$(F),U=await s3(Z.db,$.organizationId,Z.organization?.role??Z.auth.user?.role);if(!a3(U,N.thinking.credentialId,N.thinking.id))throw new MW("model_not_allowed","Model not allowed for your role");N=vL0(U,N);let B=$.windowSize??JJ;if(!$.taskId)throw Error("dispatchRunAndWait: taskId is required");if(H)await eY({streamBuffer:G,harnessId:J,taskId:$.taskId,stage:Yt[0]});let O=await OJ$(Z,$.organizationId,Z.metadata?.runMetadata),L=(C0)=>C0?zP4(Z,$.organizationId,C0.credentialId,C0.id,O):Promise.resolve(void 0),[w,E,j,z,A,P,I,k,M]=await Promise.all([Z.storage.virtualMcps.findById($.agent.id,$.organizationId),L(N.thinking),L(N.fast),L(N.smart),L(N.image),L(N.webSearch),L(N.deepResearch),CL0(Z.storage.threads,{organization_id:$.organizationId,thread_id:$.taskId,userId:$.userId,defaultWindowSize:B}),TP4(Z,$.organizationId,$.agent.id,$.userId)]);if(H)await eY({streamBuffer:G,harnessId:J,taskId:$.taskId,stage:Yt[1]});let S=E?{thinking:E,...j?{fast:j}:{},...z?{smart:z}:{},...A?{image:A}:{},...P?{webSearch:P}:{},...I?{deepResearch:I}:{}}:void 0,m=E?zL0(E):null;if(W=k.thread.id,Z.metadata.threadId=k.thread.id,Q.setAttribute("decopilot.thread.id",k.thread.id),k.thread.created_by!==$.userId)throw new MW("not_thread_owner","You are not allowed to write to this thread because you are not the owner");if(m?.asyncResearch){let C0=[["thinking",N.thinking.id]];if(N.fast)C0.push(["fast",N.fast.id]);if(N.smart)C0.push(["smart",N.smart.id]);if(N.image)C0.push(["image",N.image.id]);for(let[i0,n]of C0)if(m.asyncResearch.canHandle(n))throw Error(`Model "${n}" can only be used as a Deep Research model. It is not usable as the ${i0} model \u2014 set it in the Deep Research slot instead.`)}let b=k.thread.message_storage_version===2?new KX({storage:Z.storage.threads.messageParts(),orgId:$.organizationId,threadId:k.thread.id,runId:k.thread.id}):null;if(!w)throw new MW("agent_not_found","Agent not found");let i=await RP4({virtualMcp:w,agentId:$.agent.id,organizationId:$.organizationId,ctx:Z});if($.isResume)await Y.execute({type:"RESUME",taskId:k.thread.id,orgId:$.organizationId,userId:$.userId,abortController:new AbortController,podId:gr0()});else await Y.execute({type:"START",taskId:k.thread.id,orgId:$.organizationId,userId:$.userId,abortController:new AbortController,podId:gr0(),runConfig:{models:$.models,agent:$.agent,temperature:$.temperature,toolApprovalLevel:$.toolApprovalLevel,mode:$.mode,windowSize:$.windowSize,triggerId:$.triggerId},messageId:$.messageId});K=!0,await Z.storage.threads.clearCancelRequested(k.thread.id);let c=$.runFenceToken,a=Y.getAbortSignal(k.thread.id);if(!a)throw await Y.execute({type:"FINISH",taskId:k.thread.id,threadStatus:"failed"}),Error("Run was cancelled immediately after starting");if($.abortSignal){let C0=$.abortSignal;if(C0.aborted)await Y.execute({type:"CANCEL",taskId:k.thread.id});else C0.addEventListener("abort",()=>{Y.execute({type:"CANCEL",taskId:k.thread.id}).catch(()=>{})},{once:!0})}let U0=Fg(J),E0=U0?await Z.storage.threads.getAckedSeq(k.thread.id):0;if(E0>0)console.log("[dispatch] resuming a sandbox-hosted turn",{runId:k.thread.id,fromSeq:E0});if(E0===0)G?.purge(k.thread.id);let s=[],o,z0;if(YB$($)){if(z0=await k.loadHistory(B),o=PP4(z0,$.messageId),$.systemContext)s=[{id:`system-${$.messageId}`,role:"system",parts:[{type:"text",text:$.systemContext}]}]}else{s=$.messages.filter((i0)=>i0.role==="system");let C0=$.messages.find((i0)=>i0.role!=="system");if(o=C0?(await KL0([C0],Z,{threadId:k.thread.id})).find((i0)=>i0.role!=="system"):void 0,!$.isResume){if(!o)throw new MW("empty_request","No user message found in input \u2014 expected at least one non-system message");if(b)await b.emitUserMessage(o).catch((i0)=>{console.error("[decopilot:stream] v2 user-message emit failed",i0)})}}if(o)await nU$(G,k.thread.id,o);let X0=[],P0=Date.now(),g0=o?(await WL0([o],Z))[0]:void 0;if(!g0||!o)throw new MW("empty_request","No user message found in input \u2014 expected at least one non-system message");mU$($.models,[g0]);let R0=await lU$({ctx:Z,threadId:k.thread.id,userMessage:o,windowSize:B,isSubagent:$.isSubagent===!0,systemMessages:s}),Y0={url:"",headers:{},expiresAt:0},O0=void 0,L0=void 0,I0={cwd:null},Z0=$.agent.instructions??(typeof i.metadata?.instructions==="string"?i.metadata.instructions:void 0),Q0={taskId:$.taskId,isSubagent:$.isSubagent,subtaskJobId:$.subtaskJobId,resumedFromBackground:$.resumedFromBackground,virtualMcp:i,branch:$.branch,messages:R0,modelSources:S,mcpSource:O0,objectStorageSource:L0,userContext:M},q0={threadId:k.thread.id,userMessage:g0,harness:{sessionId:void 0},workspace:I0,models:N,mcp:Y0,mode:$.mode,temperature:$.temperature,toolApprovalLevel:$.toolApprovalLevel,toolAllowlist:$.toolAllowlist??null,maxAgentSteps:$.maxAgentSteps,user:{id:$.userId,email:Z.auth.user?.email??""},organizationId:$.organizationId,agent:{id:$.agent.id,instructions:Z0,...$.agent.disallowedTools?{disallowedTools:$.agent.disallowedTools}:{}},currentThreadTitle:k.thread.title};if(H)await eY({streamBuffer:G,harnessId:J,taskId:$.taskId,stage:Yt[2]});let W0=U0?await Z.storage.claudeSubscriptions.findLiveToken($.userId).catch((C0)=>{return console.warn("[dispatch] claude subscription lookup failed",C0),null}):null,N0=async function*(){let C0={...q0,signal:a};if(Ar0(C0,Q0),H)await eY({streamBuffer:G,harnessId:J,taskId:k.thread.id,stage:Yt[3]});yield*U0?new co0({ctx:Z,virtualMcpId:i.id,streamBuffer:G,interactive:Boolean(i.metadata?.githubRepo?.url),...E0>0?{resume:{reason:"the Studio process driving the previous attempt stopped"}}:{},branch:await mZ0(Z,{threadId:k.thread.id,agentRepo:i.metadata?.githubRepo,runBranch:$.branch}),credential:W0?{providerId:EJ$,apiKey:W0}:E?{providerId:E.providerId,apiKey:E.apiKey,...E.baseUrl?{baseUrl:E.baseUrl}:{}}:null}).dispatch(C0):hU$(Z,C0)},E1=EP4(()=>jP4({runId:k.thread.id,fenceToken:c,streamBuffer:G??{publishRawChunk:async()=>!1,publishDone:async()=>!1},chunks:oU$(N0()),...U0?{startSeq:E0,initialAckSeq:E0,onPublished:(C0)=>Z.storage.threads.bumpAckedSeq(k.thread.id,c,C0)}:{},errorMessageId:pO(k.thread.id,c),loadOriginalMessages:b?async()=>(await Z.storage.threads.messageParts().loadWindow(k.thread.id,{limit:1})).messages.map(_L0):void 0,title:{currentThreadTitle:k.thread.title,threadId:k.thread.id,persistTitle:async(C0,i0)=>{await Z.storage.threads.update(C0,{title:i0})}},hooks:{onStep:()=>{let C0=Y.dispatch({type:"STEP_DONE",taskId:k.thread.id});X0.push(Y.react(C0).catch((i0)=>{console.error("[decopilot:stream] onStepFinish reactor failed",i0)}))},onFinish:async(C0,i0)=>{let n=X0.length,v0=performance.now();if(await Promise.allSettled(X0),ZB$.record(performance.now()-v0,{phase:"settle"}),a.aborted)return;await L$(0);let $1=XB$?dD():null,q1=performance.now(),S0=fL0(i0,C0?.parts);await Y.execute({type:"FINISH",taskId:k.thread.id,threadStatus:S0});let g1=performance.now()-q1;if(ZB$.record(g1,{phase:"save"}),XB$&&$1){let W8=dD()??$1,Y6=-1;try{Y6=JSON.stringify(C0)?.length??-1}catch{}console.warn(JSON.stringify({msg:"decopilot-finish-trace",threadId:k.thread.id,pendingOps:n,saveMs:Math.round(g1),parts:C0?.parts?.length??0,messageBytes:Y6,rssDelta:W8.rss-$1.rss,heapUsedDelta:W8.heapUsed-$1.heapUsed,externalDelta:W8.external-$1.external}))}},onError:(C0)=>{if(a.aborted){y1.capture({distinctId:$.userId,event:"chat_message_aborted",groups:{organization:$.organizationId},properties:{organization_id:$.organizationId,thread_id:k.thread.id,agent_id:$.agent.id,model_id:N.thinking.id,mode:$.mode,duration_ms:Date.now()-P0,is_resume:$.isResume??!1}});return}if(Gt(C0)){console.log(`[decopilot] attempt superseded by a newer dispatch; leaving the terminal to it thread=${k.thread.id}`);return}console.error("[decopilot] stream error:",l3(C0)),Y.execute({type:"FINISH",taskId:k.thread.id,threadStatus:"failed",errorText:l3(C0)}).catch((i0)=>{console.error("[decopilot:stream] onError reactor failed",i0)})}}}));return{taskId:k.thread.id,uiStream:E1,registrySignal:a}}catch(F){if(K&&W)Y.execute({type:"FINISH",taskId:W,threadStatus:"failed",errorText:l3(F)}).catch((H)=>{console.error("[decopilot:stream] catch-block reactor failed",H)});throw F}}var ZB$,XB$,QB$;var bL0=D(()=>{Vn();vn0();C4();pO0();NL0();f3();yx();NH$();uU$();Ug();wr0();CO();dU$();fO();xr0();Kg();iU$();IC();_r0();rU$();Lg();I6();$B$();K4();ZB$=w$.createHistogram("decopilot.finish.duration",{description:"Wall time of onFinish flush segments, tagged by phase",unit:"ms"}),XB$=process.env.DECOPILOT_FINISH_TRACE==="1";QB$=["decopilot","claude-code"]});function KB$(){return crypto.randomUUID()}function WB$($){return YH$($)||pU$($)}async function qP4($){let Z=$.getReader();try{while(!0){let{done:X}=await Z.read();if(X)break}}finally{Z.releaseLock()}}function MP4($,Z){let X=$.getReader(),Q=!1,Y=()=>{if(Q)return;Q=!0,X.releaseLock()};return new ReadableStream({async pull(G){try{let{done:J,value:K}=await X.read();if(J)Y(),G.close();else G.enqueue(K)}catch(J){Z(J),Y(),G.error(J)}},async cancel(G){await X.cancel(G),Y()}})}async function FB$($){if(!$.chunks&&!$.chunkStream)throw Error("projectChunks requires chunks or chunkStream");let Z=null,X=!1,Q=void 0,Y={inputTokens:0,outputTokens:0,totalTokens:0},G=[],J=null,K=(O)=>{if(J===null)J=O;throw O},W=$.chunks?async function*(){try{for await(let O of $.chunks){if(WB$(O))continue;yield O}}catch(O){throw Z=O,O}}():void 0,F=$.chunkStream?MP4($.chunkStream,(O)=>{Z=O}).pipeThrough(new TransformStream({transform(O,L){if(!WB$(O))L.enqueue(O)}})):void 0,H={emitStepParts:(O)=>$.persistence.emitStepParts(O).catch(K),emitFinal:(O)=>$.persistence.emitFinal(O).catch(K),emitError:(O,L)=>$.persistence.emitError(O,L).catch(K)},{uiStream:N,whenComplete:U}=ML0({chunks:W,chunkStream:F,originalMessages:$.originalMessages??[],title:$.title?{currentThreadTitle:$.title.currentThreadTitle,threadId:$.title.threadId,persistTitle:$.title.persistTitle}:{currentThreadTitle:void 0,threadId:"projector",persistTitle:async()=>{}},persistence:H,sanitizeErrorText:$.sanitizeErrorText,errorMessageId:$.errorMessageId,generateMessageId:$.generateMessageId,hooks:{onUsage:(O)=>{Y={inputTokens:O.inputTokens,outputTokens:O.outputTokens,totalTokens:O.totalTokens}},onError:()=>{X=!0},onFinish:(O,L)=>{Q=L,G=Array.isArray(O.parts)?O.parts.filter((w)=>w!=null&&typeof w==="object"&&("type"in w)):[]}}});if(await qP4(N).catch(()=>{}),await U,J!==null)throw J;if(Z!==null)throw Z;return{failed:X&&Q===void 0,finishReason:Q,usage:Y,finalParts:G}}var HB$=D(()=>{Cr0();IC()});function kP4($){if(/[.*>\s]/.test($))throw Error("Invalid NATS subject token")}function nO($){return kP4($),`decopilot.stream.${$}`}function NB$($){let Z=`${$.runId}:${$.fenceToken}:${$.seq}`;return $.fragmentIndex===void 0?Z:`${Z}:frag:${$.fragmentIndex}`}function VP4($){return`${$.runId}:${$.fenceToken}:done:${$.finalSeq}`}function UB$($){if(!$)return null;let Z=Number($);return Number.isInteger(Z)&&Z>0?Z:null}function SP4($){if(!$)return null;let Z=Number($);return Number.isInteger(Z)&&Z>=0?Z:null}function CP4($){if(!$)return null;let Z=$.split(":"),[X,Q,Y,G,J]=Z;if(!X||!Q||!Y)return null;if(Y==="done"){let W=UB$(G);return Z.length===4&&W!==null?{kind:"done",runId:X,fenceToken:Q,finalSeq:W}:null}let K=UB$(Y);if(K===null)return null;if(Z.length===3)return{kind:"chunk",runId:X,fenceToken:Q,seq:K,fragmentIndex:null};if(Z.length===5&&G==="frag"){let W=SP4(J);return W===null?null:{kind:"chunk",runId:X,fenceToken:Q,seq:K,fragmentIndex:W}}return null}function cr0($,Z){let X=nO(Z.runId),Q=ur0.encode(JSON.stringify({p:$}));if(Q.length>33554432)throw RangeError(`stream chunk is ${Q.length} bytes; maximum is 33554432`);if(Q.length<=786432)return[{subject:X,data:Q,msgId:Z.dedup?NB$({runId:Z.runId,...Z.dedup}):void 0}];let Y=Math.ceil(Q.length/786432),G=[];for(let J=0;J<Y;J++)G.push({subject:X,data:Q.slice(J*786432,(J+1)*786432),headers:{["Dp-Frag-Idx"]:String(J),["Dp-Frag-Total"]:String(Y)},msgId:Z.dedup?NB$({runId:Z.runId,...Z.dedup,fragmentIndex:J}):void 0});return G}function BB$($){return{subject:nO($.runId),data:ur0.encode(JSON.stringify({done:!0,finalSeq:$.finalSeq})),msgId:VP4($)}}function OB$($){return{subject:nO($),data:ur0.encode(JSON.stringify({done:!0}))}}function _P4($){let Z=$.reduce((Y,G)=>Y+(G?.length??0),0),X=new Uint8Array(Z),Q=0;for(let Y of $){if(!Y)continue;X.set(Y,Q),Q+=Y.length}return X}function xL0(){let $=null;return new TransformStream({transform(Z,X){let Q=Z.headers?.get("Dp-Frag-Total");if(!Q){X.enqueue(Z);return}let Y=Number(Q),G=Number(Z.headers?.get("Dp-Frag-Idx")??"0");if(G===0)$={total:Y,received:0,parts:Array(Y)};else if(!$||$.total!==Y)return;if(!$.parts[G])$.received++;if($.parts[G]=Z.data,$.received<$.total)return;let J=_P4($.parts);$=null,X.enqueue({subject:Z.subject,data:J,headers:Z.headers})}})}function vP4($){return typeof $==="number"&&Number.isInteger($)&&$>0}function bP4($){let Z=CP4($.headers?.get("Nats-Msg-Id")||void 0),X;try{X=JSON.parse(fP4.decode($.data))}catch{return null}if(!X||typeof X!=="object")return null;let Q=X;if(Q.done===!0)return{kind:"done",runId:Z?.kind==="done"?Z.runId:null,fenceToken:Z?.kind==="done"?Z.fenceToken:null,envelopeFinalSeq:vP4(Q.finalSeq)?Q.finalSeq:null,msgIdFinalSeq:Z?.kind==="done"?Z.finalSeq:null};if("p"in Q)return{kind:"chunk",seq:Z?.kind==="chunk"?Z.seq:null,runId:Z?.kind==="chunk"?Z.runId:null,fenceToken:Z?.kind==="chunk"?Z.fenceToken:null,chunk:Q.p};return null}function yL0(){return new TransformStream({transform($,Z){let X=bP4($);if(X)Z.enqueue(X)}})}var hr0="decopilot.stream",ur0,fP4;var DB$=D(()=>{ur0=new TextEncoder;fP4=new TextDecoder});var gL0=D(()=>{DB$()});var YN="DECOPILOT_STREAMS";var lr0=D(()=>{gL0()});function Eg($){if(!($ instanceof Error))return!1;if($.name==="TimeoutError")return!0;return/timeout|no responders|503|not enabled|is offline/i.test($.message)}function LB$($,Z){return new TransformStream({transform(X,Q){if(X.runId!==$||X.fenceToken!==Z)return;Q.enqueue(X)}})}function wB$(){let $=1;return new TransformStream({transform(Z,X){if(Z.kind==="done"){X.enqueue(Z);return}if(Z.seq===null){X.error(Error("projector chunk missing seq"));return}if(Z.seq<$)return;if(Z.seq>$){X.error(new jt($,Z.seq));return}$++,X.enqueue(Z)}})}function EB$($){let Z=$.getReader(),X=!1,Q=0,Y=()=>{if(X)return;X=!0,Z.releaseLock()};return new ReadableStream({async pull(G){for(;;){let{done:J,value:K}=await Z.read();if(J){await Z.cancel(),Y(),G.error(Error("reader stopped before done"));return}let W=K;if(W.kind==="done"){if(!(W.envelopeFinalSeq!=null&&W.envelopeFinalSeq===W.msgIdFinalSeq))continue;if(W.envelopeFinalSeq!==Q){await Z.cancel(),Y(),G.error(new jt(Q+1,null));return}await Z.cancel(),Y(),G.close();return}Q=W.seq??Q,G.enqueue(W.chunk);return}},async cancel(G){await Z.cancel(G),Y()}})}function xP4($){if(Symbol.asyncIterator in $)return $[Symbol.asyncIterator]();let Z=$[Symbol.iterator]();return{next:async()=>Z.next(),return:async(X)=>Z.return?Z.return(X):{done:!0,value:X}}}function uL0($){let Z=xP4($.messages),X=$.idleTimeoutMs,Q=!1,Y=(G)=>{if(Q)return;Q=!0,Z.return?.(G).catch(()=>{}),$.onCancel?.()};return new ReadableStream({async pull(G){if(X===void 0){let{done:H,value:N}=await Z.next();if(H){G.close();return}G.enqueue(N);return}let J=new AbortController,K=Z.next().then((H)=>{return J.abort(),H}),W=L$(X,{signal:J.signal}).then(()=>"idle").catch(()=>"cancelled"),F=await Promise.race([K,W]);if(F==="idle"){G.error(new hL0(X));return}if(F==="cancelled")return;if(F.done){G.close();return}G.enqueue(F.value)},async cancel(G){Y(G)}})}var hL0,jt;var cL0=D(()=>{K4();hL0=class hL0 extends Error{idleTimeoutMs;constructor($){super("producer produced no output before timeout");this.idleTimeoutMs=$;this.name="StreamIdleTimeoutError"}};jt=class jt extends Error{expectedSeq;gotSeq;constructor($,Z){super(Z===null?`missing seq ${$} (stream ended at the fenced done)`:`missing seq ${$} (next delivered is ${Z})`);this.expectedSeq=$;this.gotSeq=Z;this.name="StreamGapError"}}});function yP4($){let X=uL0({messages:$.messages,idleTimeoutMs:$.idleTimeoutMs,onCancel:$.onDone}).pipeThrough(xL0()).pipeThrough(yL0()).pipeThrough(LB$($.runId,$.fenceToken)).pipeThrough(wB$());return EB$(X)}async function zB$($){let Z=await y6(async()=>{return(await $.js.consumers.get(YN,{filter_subjects:nO($.runId),deliver_policy:jB$.DeliverPolicy.All})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:Eg});async function*X(){try{for await(let Q of Z)yield{subject:Q.subject,data:Q.data,headers:Q.headers}}finally{Z.stop()}}return yP4({messages:X(),runId:$.runId,fenceToken:$.fenceToken,idleTimeoutMs:$.idleTimeoutMs,onDone:()=>Z.stop()})}var jB$;var PB$=D(()=>{K4();lr0();cL0();gL0();jB$=V(XL(),1)});async function gP4($){let X=($.requestMessageId?await $.messageParts.maxCreatedAtMsForMessage($.runId,$.requestMessageId):null)??await $.messageParts.maxCreatedAtMsForRun($.runId);return new KX({storage:$.messageParts,orgId:$.orgId,threadId:$.runId,runId:$.runId,baseTimeMs:(X??Date.now())+1})}async function AB$($){let Z=await gP4($),X=$.replaceFinal?(Q)=>Z.replaceFinal(Q):(Q)=>Z.emitFinal(Q);return{emitStepParts:(Q)=>Z.emitStepParts(Q),emitFinal:X,emitError:(Q,Y)=>Z.emitError(Q,Y)}}var TB$=D(()=>{fO()});function lL0($,Z){uP4().add(1,{"org.id":Z??"unknown"})}var hP4=($)=>{let Z;return()=>Z??=$()},uP4;var RB$=D(()=>{I6();uP4=hP4(()=>w$.createCounter("decopilot.projector.poison_runs",{description:"Number of decopilot runs that exhausted retries and were sent to the DLQ",unit:"{runs}"}))});class dr0{intervalMs;lastBumpMs=new Map;constructor($=3000){this.intervalMs=$}shouldBump($,Z=Date.now()){let X=this.lastBumpMs.get($);if(X!==void 0&&Z-X<this.intervalMs)return!1;return this.lastBumpMs.set($,Z),!0}clear($){this.lastBumpMs.delete($)}}function IB$($,Z,X,Q){return $.pipeThrough(new TransformStream({transform(Y,G){if(X.shouldBump(Z))Q();G.enqueue(Y)},flush(){X.clear(Z)}}))}function cP4($){return`liveness: no stream events for ${Math.round($/60000)}m`}function ir0($){return $.runFenceToken!==null&&$.runFenceToken!==$.fenceToken}function MB$($){mr0=$}function kB$(){if(!mr0)throw Error("[projector-workflow] runtime not initialized \u2014 setProjectorWorkflowRuntime() must run before workflows fire");return mr0}function VB$(){return kB$()}async function SB$($,Z,X){let Q=kB$(),Y=Q.getJetStream();if(!Y)throw Error("JetStream unavailable");let G=(await Q.messageParts.loadWindow($.runId,{limit:500})).messages.map(_L0);return{chunkCount:0,attempts:1,outcome:await FB$({chunkStream:IB$(await zB$({js:Y,runId:$.runId,fenceToken:$.fenceToken,idleTimeoutMs:$.idleTimeoutMs}),$.runId,lP4,()=>{Q.bumpProgress({runId:$.runId,orgId:Z}).catch(()=>{})}),persistence:await AB$({messageParts:Q.messageParts,orgId:Z,runId:$.runId,requestMessageId:$.messageId,replaceFinal:!0}),originalMessages:G,errorMessageId:pO($.runId,$.fenceToken),title:{threadId:$.runId,currentThreadTitle:X,persistTitle:async(K,W)=>{await Q.persistTitle($.runId,Z,W),await Q.onTitleUpdated({runId:$.runId,orgId:Z,title:W})}}})}}async function qB$($,Z,X){let Q=await $.resolveRun(Z).catch(()=>null);return Q!==null&&Q.runFenceToken===X&&["completed","failed","requires_action"].includes(Q.status)}async function CB$($,Z,X){let Q=await dP4($,Z);if("skip"in Q)return;let Y=Q.row.orgId,G=Q.row.createdBy??$.runId,J=Q.row.title;try{let{outcome:K}=await X($,Y,J),W=K?.failed?"failed":fL0(K?.finishReason,K?.finalParts);if(W==="failed"){let F=K?.finishReason?`harness reported an error: ${K.finishReason}`:"harness reported an error";if(lL0($.runId,Y),await Z.markRunFailed($.runId,Y,F,"harness"))await Z.recordFailed({runId:$.runId,orgId:Y,distinctId:G,reason:F,kind:"harness"})}else if(W==="requires_action")await Z.markRunRequiresAction($.runId,Y),await Z.clearSynthesizedError($.runId,$.fenceToken);else{if(await Z.completeRunIfNotCompleted($.runId,Y))await Z.recordCompleted({runId:$.runId,orgId:Y,distinctId:G,usage:K?.usage??{inputTokens:0,outputTokens:0,totalTokens:0}});await Z.clearSynthesizedError($.runId,$.fenceToken)}await Z.purgeRun($.runId,$.fenceToken)}catch(K){if(K instanceof jt){if(await qB$(Z,$.runId,$.fenceToken)){await Z.clearSynthesizedError($.runId,$.fenceToken),await Z.purgeRun($.runId,$.fenceToken);return}let U=`stream truncated before projection could replay it: ${K.message}`;if(lL0($.runId,Y),await Z.markRunFailed($.runId,Y,U,"projection"))await Z.recordFailed({runId:$.runId,orgId:Y,distinctId:G,reason:U,kind:"projection"});await Z.purgeRun($.runId,$.fenceToken);return}let W=K instanceof hL0;if(W&&await qB$(Z,$.runId,$.fenceToken)){await Z.purgeRun($.runId,$.fenceToken);return}let F=W?cP4(K.idleTimeoutMs):K instanceof Error?K.message:String(K),H=W?"liveness":"projection";if(lL0($.runId,Y),await Z.markRunFailed($.runId,Y,F,H))await Z.recordFailed({runId:$.runId,orgId:Y,distinctId:G,reason:F,kind:H});if(W)await Z.clearSynthesizedError($.runId,$.fenceToken);throw K}}async function dP4($,Z){let X=await Z.resolveRun($.runId);if(!X)return{skip:"missing"};if(ir0({status:X.status,runFenceToken:X.runFenceToken,fenceToken:$.fenceToken}))return{skip:"stale",row:X};if(X.version!==2)return{skip:"legacy-v1",row:X};return{row:X}}var mr0=null,lP4;var pr0=D(()=>{HB$();PB$();cL0();TB$();RB$();xr0();lP4=new dr0});function _B$($,Z){switch($.type){case"START":{let X={type:"RUN_STARTED",taskId:$.taskId,orgId:$.orgId,userId:$.userId,abortController:$.abortController,runConfig:$.runConfig,podId:$.podId,messageId:$.messageId};if(Z?.status.tag==="running")return[{type:"PREVIOUS_RUN_ABORTED",taskId:$.taskId,orgId:Z.orgId},X];return[X]}case"STEP_DONE":{if(Z?.status.tag!=="running")return[];return[{type:"STEP_COMPLETED",taskId:$.taskId,orgId:Z.orgId,stepCount:Z.status.stepCount+1}]}case"FINISH":{if(Z==null||Z.status.tag!=="running")return[];let{stepCount:X}=Z.status;if($.threadStatus==="completed")return[{type:"RUN_COMPLETED",taskId:$.taskId,orgId:Z.orgId,stepCount:X}];if($.threadStatus==="requires_action")return[{type:"RUN_REQUIRES_ACTION",taskId:$.taskId,orgId:Z.orgId,stepCount:X}];return[{type:"RUN_FAILED",taskId:$.taskId,orgId:Z.orgId,reason:"error",errorText:$.errorText??null}]}case"CANCEL":{if(Z?.status.tag!=="running")return[];return[{type:"RUN_FAILED",taskId:$.taskId,orgId:Z.orgId,reason:"cancelled"}]}case"RESUME":{if(Z?.status.tag==="running")return[];return[{type:"RUN_RESUMED",taskId:$.taskId,orgId:$.orgId,userId:$.userId,abortController:$.abortController,podId:$.podId}]}case"FORCE_FAIL":{if($.reason==="ghost")return[{type:"RUN_FAILED",taskId:$.taskId,orgId:Z?.orgId??$.orgId,reason:$.reason,expectedFenceToken:$.expectedFenceToken??null}];if(Z?.status.tag!=="running")return[];return[{type:"RUN_FAILED",taskId:$.taskId,orgId:Z.orgId,reason:$.reason}]}}}function vB$($,Z,X=new Date){switch(Z.type){case"RUN_STARTED":return{taskId:Z.taskId,orgId:Z.orgId,userId:Z.userId,status:{tag:"running",abortController:Z.abortController,stepCount:0,startedAt:X}};case"RUN_RESUMED":return{taskId:Z.taskId,orgId:Z.orgId,userId:Z.userId,status:{tag:"running",abortController:Z.abortController,stepCount:0,startedAt:X}};case"STEP_COMPLETED":if($?.status.tag!=="running")return $;return{...$,status:{...$.status,stepCount:Z.stepCount}};case"RUN_COMPLETED":return;case"RUN_REQUIRES_ACTION":return;case"RUN_FAILED":return;case"PREVIOUS_RUN_ABORTED":return}}function fB$($){if(!$?.trim())return{...zt};for(let{kind:Z,reason:X,match:Q}of mP4)if(Q.test($))return{kind:Z,reason:X};return{...zt}}var mP4,zt;var bB$=D(()=>{mP4=[{kind:"credits",reason:"Run stopped: the organization is out of AI credits",match:/\[CREDITS\]|requires more credits|\b402\b/i},{kind:"sandbox_unreachable",reason:"Run stopped: its sandbox became unreachable mid-run",match:/\[SANDBOX_UNREACHABLE\]|sandbox stream broke/i},{kind:"cancelled",reason:"Run cancelled before it finished",match:/^\s*(error:\s*)?cancelled\b|run cancelled/i},{kind:"overloaded",reason:"Run stopped: the model provider was overloaded or rate-limited",match:/\boverloaded\b|\brate.?limit|\b429\b/i},{kind:"context_length",reason:"Run stopped: the conversation exceeded the model's context window",match:/context (length|window)|too many tokens|maximum context/i},{kind:"model_error",reason:"Run stopped: the model provider rejected the request",match:/\bAPI Error\b|\b5\d{2}\b.*provider|provider returned/i}],zt={kind:"error",reason:"Run ended with an error \u2014 see the run's messages"}});function nP4($,Z){if($!=="error")return pP4[$];let{kind:X,reason:Q}=fB$(Z);return{failure_reason:Q,failure_kind:X}}async function xB$($,Z,X,Q){let{storage:Y,sseHub:G}=Q,J=await Y.get($,Z);G.emit(Z,gK($,X,{virtualMcpId:J?.virtual_mcp_id??void 0,createdBy:J?.created_by,triggerId:J?.trigger_id,title:J?.title,branch:J?.branch??null,harnessId:J?.harness_id??void 0,createdAt:J?.created_at,updatedAt:J?.updated_at})),G.emit(Z,j80($,X))}async function tP4($,Z){let{storage:X,sseHub:Q}=Z;switch($.type){case"RUN_STARTED":{await X.update($.taskId,$.orgId,{status:"in_progress",run_config:$.runConfig??null,run_started_at:new Date().toISOString(),last_progress_at:null,failure_reason:null,failure_kind:null});let Y=await X.get($.taskId,$.orgId);Q.emit($.orgId,gK($.taskId,"in_progress",{virtualMcpId:Y?.virtual_mcp_id??void 0,createdBy:Y?.created_by,triggerId:Y?.trigger_id,title:Y?.title,branch:Y?.branch??null,harnessId:Y?.harness_id??void 0,createdAt:Y?.created_at,updatedAt:Y?.updated_at,messageId:$.messageId}));return}case"RUN_RESUMED":{await X.update($.taskId,$.orgId,{status:"in_progress",run_started_at:new Date().toISOString(),last_progress_at:null,failure_reason:null,failure_kind:null});let Y=await X.get($.taskId,$.orgId);Q.emit($.orgId,gK($.taskId,"in_progress",{virtualMcpId:Y?.virtual_mcp_id??void 0,createdBy:Y?.created_by,triggerId:Y?.trigger_id,title:Y?.title,branch:Y?.branch??null,harnessId:Y?.harness_id??void 0,createdAt:Y?.created_at,updatedAt:Y?.updated_at}));return}case"STEP_COMPLETED":Q.emit($.orgId,Lb0($.taskId,$.stepCount));return;case"RUN_COMPLETED":await xB$($.taskId,$.orgId,"completed",Z);return;case"RUN_REQUIRES_ACTION":await xB$($.taskId,$.orgId,"requires_action",Z);return;case"RUN_FAILED":{if($.reason==="ghost"){if(!await X.forceFailIfInProgress($.taskId,$.orgId,$.expectedFenceToken))return;await X.update($.taskId,$.orgId,{run_config:null,run_started_at:null})}else{if(!await X.forceFailIfInProgress($.taskId,$.orgId))return;await X.update($.taskId,$.orgId,{run_config:null,run_started_at:null,...nP4($.reason,$.errorText)})}let Y=await X.get($.taskId,$.orgId);Q.emit($.orgId,gK($.taskId,"failed",{virtualMcpId:Y?.virtual_mcp_id??void 0,createdBy:Y?.created_by,triggerId:Y?.trigger_id,title:Y?.title,branch:Y?.branch??null,harnessId:Y?.harness_id??void 0,createdAt:Y?.created_at,updatedAt:Y?.updated_at})),Q.emit($.orgId,j80($.taskId,"failed")),await Z.onThreadFinished?.($.taskId,$.orgId).catch((G)=>console.error("[run-reactor] thread-finish hook failed",G));return}case"PREVIOUS_RUN_ABORTED":return}}async function yB$($,Z){for(let{event:X}of $)await tP4(X,Z)}var iP4="Run stalled \u2014 no progress within the idle timeout window",pP4;var gB$=D(()=>{_8();bB$();pP4={reaped:{failure_reason:iP4,failure_kind:"stall"},cancelled:{failure_reason:"Run cancelled before it finished",failure_kind:"cancelled"},error:{failure_reason:zt.reason,failure_kind:zt.kind}}});function hB$($){return $.now-$.lastProgressAt>$.idleTimeoutMs}function uB$($){return Math.max($.persistedLastProgressAt??Number.NEGATIVE_INFINITY,$.currentRunStartedAt)}class tr0{deps;clock;states=new Map;reaperTimer=null;constructor($,Z=()=>new Date){this.deps=$;this.clock=Z;this.reaperTimer=setInterval(()=>{this.reapStaleRuns().catch((X)=>{console.error("[RunRegistry] Reaper sweep failed",X)})},oP4)}async execute($){let Z=this.dispatch($);return await this.react(Z),Z}dispatch($){let Z=this.states.get($.taskId),X=_B$($,Z),Q=[];for(let Y of X){let G=this.states.get(Y.taskId);if(Y.type==="PREVIOUS_RUN_ABORTED"||Y.type==="RUN_FAILED"){if(G?.status.tag==="running")G.status.abortController.abort()}let J=vB$(G,Y,this.clock());if(J===void 0)this.states.delete(Y.taskId);else this.states.set(Y.taskId,J);if(Q.push({event:Y,state:J}),rP4.has(Y.type))cB$().add(1,{"org.id":Y.orgId});else if(aP4.has(Y.type)&&G?.status.tag==="running")cB$().add(-1,{"org.id":Y.orgId})}return Q}react($){return yB$($,this.deps)}getAbortSignal($){let Z=this.states.get($);if(Z?.status.tag==="running")return Z.status.abortController.signal;return null}isRunning($){return this.states.get($)?.status.tag==="running"}async stopAll(){for(let[,$]of this.states)if($.status.tag==="running")$.status.abortController.abort();this.states.clear()}dispose(){if(this.reaperTimer)clearInterval(this.reaperTimer),this.reaperTimer=null}async reapStaleRuns(){let $=this.clock().getTime(),Z=[...this.states].filter(([,X])=>X.status.tag==="running");for(let[X,Q]of Z){if(this.states.get(X)?.status.tag!=="running")continue;let G;try{let K=await this.deps.storage.getProgress(X,Q.orgId);G=uB$({persistedLastProgressAt:K?.lastProgressAt??null,currentRunStartedAt:Q.status.startedAt.getTime()})}catch(K){console.warn(`[RunRegistry] Reaper progress read failed for ${X}; skipping`,K);continue}if(!hB$({lastProgressAt:G,now:$,idleTimeoutMs:dL0}))continue;let J=await this.deps.storage.get(X,Q.orgId).catch(()=>null);if(J&&J.status!=="in_progress"){let K=this.states.get(X);if(K?.status.tag==="running")K.status.abortController.abort();this.states.delete(X);continue}console.warn(`[RunRegistry] Reaping stuck run for thread ${X} (idle > ${dL0/60000}m) ...`),sP4().add(1,{"org.id":Q.orgId,reason:"idle_timeout"}),await this.execute({type:"FORCE_FAIL",taskId:X,reason:"reaped"}).catch((K)=>{console.error("[RunRegistry] Reaper execute failed",K)})}}}var oP4=300000,nr0,dL0,rP4,aP4,lB$=($)=>{let Z;return()=>Z??=$()},cB$,sP4;var or0=D(()=>{gB$();I6();nr0=Number(process.env.RUN_IDLE_TIMEOUT_MS),dL0=Number.isFinite(nr0)&&nr0>0?nr0:600000,rP4=new Set(["RUN_STARTED","RUN_RESUMED"]),aP4=new Set(["RUN_COMPLETED","RUN_FAILED","RUN_REQUIRES_ACTION","PREVIOUS_RUN_ABORTED"]),cB$=lB$(()=>w$.createUpDownCounter("decopilot.stream.inflight",{description:"Number of in-flight decopilot stream requests",unit:"{requests}"})),sP4=lB$(()=>w$.createCounter("decopilot.run.reaped",{description:"Number of decopilot runs force-failed by the progress-based reaper",unit:"{runs}"}))});async function dB$($){let{runId:Z}=$,X=VB$(),Q=await X.resolveRun(Z),Y=$.fenceToken??Q?.runFenceToken;if(!Q||Q.version!==2||Y==null)return;if(ir0({status:Q.status,runFenceToken:Q.runFenceToken,fenceToken:Y}))return;if(!X.getJetStream())throw Error("JetStream unavailable for consume step");await CB$({runId:Z,fenceToken:Y,messageId:$.messageId,idleTimeoutMs:$.idleTimeoutMs??dL0},X,SB$)}var mB$=D(()=>{pr0();or0()});import{DBOS as xC}from"@dbos-inc/dbos-sdk";function ar0($){rr0=$}function sr0(){if(!rr0)throw Error("[hostedHarness] runtime not initialized \u2014 setHostedHarnessRuntime() must run before workflows fire");return rr0}async function eP4($,Z){let X=sr0(),{request:Q}=$,Y=Z??await X.studioContextFactory(Q.organizationId,Q.userId);if(!Y)throw Error("user membership lost mid-dispatch");if(Q.runMetadata)Y.metadata.runMetadata=Q.runMetadata;let G=new AbortController;iB$().add(1);try{if(Zg(Y,"in_progress",$.threadId),!Q.runMetadata?.taskBoardItemId)tW$(Y,$.threadId);await X.dispatchRunFn({...Q,abortSignal:G.signal},Y,X.deps)}finally{iB$().add(-1)}}function pB$($,Z){let X=sr0(),Q=Z?.isQueued??XA4,Y=new wt({intervalMs:Z?.intervalMs,sleepFn:Z?.sleepFn,emit:async()=>{if(await Q($)){await ZA4(X,$);return}Y.stop()}});return Y.arm(),()=>Y.stop()}async function XA4($){try{return(await xC.getWorkflowStatus(er0($.runId,$.fenceToken)))?.status==="ENQUEUED"}catch(Z){return console.error(`[hostedHarness] could not read child status for run=${$.runId} fence=${$.fenceToken}`,Z),!0}}function QA4($,Z,X,Q=1){let Y=X instanceof Error?X.message:String(X);return{messageId:pO($,Z),errorChunk:{type:"error",errorText:Y},seq:Q,finalSeq:Q}}function YA4($){if(!($ instanceof Error))return;let Z=$.lastAckSeq;return typeof Z==="number"?Z+1:void 0}async function GA4($,Z){let X=sr0(),{streamBuffer:Q}=X.deps,{messageId:Y,errorChunk:G,seq:J,finalSeq:K}=QA4($.runId,$.fenceToken,Z,YA4(Z));if(!Q){console.error(`[hostedHarness] no streamBuffer configured; dropping terminal error for run=${$.runId} fence=${$.fenceToken} messageId=${Y}`);return}if(!await Q.publishRawChunk($.runId,G,{fenceToken:$.fenceToken,seq:J})){console.error(`[hostedHarness] failed to publish terminal error chunk for run=${$.runId} fence=${$.fenceToken} messageId=${Y}`);return}await Q.publishDone($.runId,$.fenceToken,K)}async function JA4($){try{await xC.runStep(()=>eP4($),{name:"runHostedHarness",retriesAllowed:!1})}catch(Z){if(Gt(Z)){console.log(`[hostedHarness] attempt superseded by a newer dispatch; leaving the terminal to it run=${$.runId} fence=${$.fenceToken}`);return}await xC.runStep(()=>GA4($,Z),{name:"publishHostedHarnessFailure",retriesAllowed:!0}).catch((X)=>{console.error(`[hostedHarness] could not publish terminal error for run=${$.runId} fence=${$.fenceToken}`,X)})}}function er0($,Z){return`decopilot-hosted:${$}:${Z}`}async function nB$($){return{workflowID:(await xC.startWorkflow(KA4,{workflowID:er0($.runId,$.fenceToken),queueName:Fg($.request.harnessId)?zF:jF,enqueueOptions:{priority:mO0($.request.runMetadata)}})($)).workflowID}}async function yC($,Z){await xC.cancelWorkflow(er0($,Z))}var rr0=null,$A4,iB$=()=>$A4??=w$.createUpDownCounter("hosted_runs.active",{description:"Hosted agent-loop runs executing on this pod",unit:"{runs}"}),ZA4=($,Z)=>eY({streamBuffer:$.deps.streamBuffer,harnessId:Z.request.harnessId,taskId:Z.runId,stage:"waiting-capacity"}),KA4;var $a0=D(()=>{yr0();IC();NL0();I6();uy();w5();KA4=xC.registerWorkflow(JA4,{name:"hostedHarnessWorkflow",maxRecoveryAttempts:1000})});import{DBOS as jg}from"@dbos-inc/dbos-sdk";function Qa0($){Et($)}function Ya0($){Za0=$}function WA4(){if(!Za0)throw Error("[threadGate] runtime not initialized \u2014 setThreadGateRuntime() must run before workflows fire");return Za0}function FA4($,Z=KB$){let X=$.runFenceToken;if(X)return{runFenceToken:X,claimedRequest:{...$,runFenceToken:X},shouldPersistFence:!1};let Q=Z();return{runFenceToken:Q,claimedRequest:{...$,runFenceToken:Q},shouldPersistFence:!0}}async function HA4($){let Z=WA4(),{request:X}=$,Q=X.taskId??$.threadId;if(RC(X.harnessId))await eY({streamBuffer:Z.deps.streamBuffer,harnessId:X.harnessId,taskId:Q,stage:"starting-run"});let Y=await Z.studioContextFactory(X.organizationId,X.userId);if(!Y)throw Error("user membership lost mid-dispatch");Qa0(X.harnessId);let G=X.taskId??$.threadId,{runFenceToken:J,claimedRequest:K,shouldPersistFence:W}=FA4(X);if(W)await Y.storage.threads.setRunFence(G,J);return{runFenceToken:J,hostedEnqueue:{runId:Q,fenceToken:J,threadId:$.threadId,request:K}}}async function NA4($){if($.source!=="user-message")return;let{request:Z}=$;y1.capture({distinctId:Z.userId,event:"chat_message_started",groups:{organization:Z.organizationId},properties:{organization_id:Z.organizationId,agent_id:Z.agent,mode:Z.mode,thread_id:Z.taskId??$.threadId,credential_id:Z.models.credentialId}})}async function UA4($,Z){if($.source!=="user-message")return;let{request:X}=$;y1.capture({distinctId:X.userId,event:"chat_message_failed",groups:{organization:X.organizationId},properties:{organization_id:X.organizationId,thread_id:X.taskId??$.threadId,agent_id:X.agent,model_id:X.models.thinking.id,mode:X.mode,error_category:"setup",error_message:Z}})}async function mL0($){Qa0($.request.harnessId),await jg.runStep(()=>NA4($),{name:"trackMessageStarted"});let Z;try{Z=await jg.runStep(()=>HA4($),{name:"dispatchRunAndWait",retriesAllowed:!0}),await nB$(Z.hostedEnqueue)}catch(G){let J=G instanceof Error?G.message:String(G);throw await jg.runStep(()=>UA4($,J),{name:"trackMessageFailed"}),G}let X=$.request.taskId??$.threadId,Q="messages"in $.request?void 0:$.request.messageId,Y=pB$(Z.hostedEnqueue);try{await jg.runStep(()=>dB$({runId:X,fenceToken:Z.runFenceToken,messageId:Q}),{name:"consumeRunProjection"})}finally{Y()}return{taskId:$.request.taskId??$.threadId}}async function BA4($){return mL0($)}async function rH($,Z){return Qa0($.request.harnessId),{workflowID:(await jg.startWorkflow(OA4,{queueName:fJ,enqueueOptions:{queuePartitionKey:$.threadId,priority:mO0($.request.runMetadata)},workflowID:Z?.workflowID})($)).workflowID}}var Xa0=1,Za0=null,OA4;var tB$=D(()=>{bL0();C4();IC();mB$();uy();$a0();OA4=jg.registerWorkflow(BA4,{name:"threadGateWorkflow",maxRecoveryAttempts:1000})});var aH=D(()=>{tB$();$a0()});async function rn($,Z,X){let Q=Z.organizationId,Y=Z.assignedBy??Z.createdBy,G=X.harnessId??"decopilot",J=await hZ($,"smart"),K=Hw(Q),W=await $.storage.threads.create({...X.fence?{id:X.fence.threadId}:{},organization_id:Q,title:X.title,status:"in_progress",virtual_mcp_id:K,message_storage_version:2,harness_id:G,created_by:Y,metadata:{runtime:"sandbox"}});if(!W.isNew)return{threadId:W.id,isNew:!1};let F={...W.metadata??{},...X.pinnedRef?{pinnedRef:X.pinnedRef}:{},...X.repo?{githubRepo:{url:X.repo.url,owner:X.repo.owner,name:X.repo.name,installationId:X.repo.installationId,connectionId:X.repo.connectionId}}:{}},H=X.pinnedRef?X.pinnedRef:X.repo?bH(W.id,X.repo.connectionId):Fg(G)?bH(W.id):null;await $.storage.threads.update(W.id,{metadata:F,...H?{branch:H}:{},updated_by:Y}),await $.storage.taskBoard.linkThread(Z.id,W.id,Q);let N={id:crypto.randomUUID(),role:"user",parts:[{type:"text",text:X.prompt}]};return await new KX({storage:$.storage.threads.messageParts(),orgId:Q,threadId:W.id,runId:W.id}).emitRequestMessage(N),await rH({threadId:W.id,source:"background-tool",request:{messages:[N],models:{credentialId:J.credentialId,thinking:{id:J.modelId,title:J.modelMeta.title}},agent:{id:K,...X.agent??{}},temperature:X.temperature,toolApprovalLevel:"auto",mode:"default",organizationId:Q,userId:Y,harnessId:G,...X.repo?{}:H?{branch:H}:{},taskId:W.id,runMetadata:{...dO0(Z),[hy]:X.runClass??"new_task",...X.modelClass&&X.modelClass!=="default"?{[iO0]:X.modelClass}:{}}}},X.fence?{workflowID:X.fence.workflowID}:void 0),{threadId:W.id,isNew:!0}}var Lo0=D(()=>{Vn();uy();nH();aH();fO();_8();f3();NL0();pO0()});async function hO($,Z,X){if(Z.assigneeId!==Z8)return;await p3($,Z,X).catch((Q)=>{if(Q instanceof s7)throw Q;console.error("[task-board] Super Agent enqueue failed",Q)})}function DA4($,Z){return["You've been assigned this task. Complete it.","","You are running AUTONOMOUSLY \u2014 no human is watching this run, so drive it "+"to completion on your own. Use `user_ask` ONLY for a genuine, unresolvable blocker a human must clear (a missing credential/secret, or "+"a decision so ambiguous you truly cannot proceed) \u2014 that should be rare. "+"Do not ask for confirmation of a reasonable choice; make it and move on.","",`Title: ${$.title}`,$.description?`
|
|
1498
|
+
`).trim();return{models:$.models,agent:$.agent,temperature:$.temperature,toolApprovalLevel:$.toolApprovalLevel,...$.toolAllowlist!==void 0?{toolAllowlist:$.toolAllowlist}:{},...$.maxAgentSteps!==void 0?{maxAgentSteps:$.maxAgentSteps}:{},...$.isSubagent!==void 0?{isSubagent:$.isSubagent}:{},...$.subtaskJobId!==void 0?{subtaskJobId:$.subtaskJobId}:{},...$.resumedFromBackground!==void 0?{resumedFromBackground:$.resumedFromBackground}:{},mode:$.mode,...$.windowSize!==void 0?{windowSize:$.windowSize}:{},...$.triggerId!==void 0?{triggerId:$.triggerId}:{},...$.runMetadata!==void 0?{runMetadata:$.runMetadata}:{},branch:Z.branch??$.branch??null,harnessId:$.harnessId,organizationId:$.organizationId,userId:$.userId,taskId:$.taskId,messageId:Z.messageId,...Z.runFenceToken!==void 0?{runFenceToken:Z.runFenceToken}:{},...$.isResume!==void 0?{isResume:$.isResume}:{},...X?{systemContext:X}:{}}}function PP4($,Z){let X=$.find((Q)=>Q.id===Z);if(!X)throw new MW("empty_request",`Persisted request message missing for messageId=${Z}`);if(X.role==="system")throw new MW("empty_request",`Persisted message ${Z} has role=system; expected non-system request message`);return X}function AP4($){let Z=$.models;return{"decopilot.agent.id":$.agent.id,"decopilot.model.id":Z.thinking.id,"decopilot.credential.id":Z.credentialId,"decopilot.organization.id":$.organizationId,"decopilot.user.id":$.userId,"decopilot.thread.id":$.taskId??""}}async function JB$($,Z,X){return kX1("decopilot.dispatchRunAndWait",async(Q)=>{let{taskId:Y,uiStream:G,registrySignal:J}=await IP4($,Z,X,Q),K=X.streamBuffer,W=K?await K.createTailStream(Y,$.abortSignal,{deliverPolicy:"new",closeOnDone:!0}):null;if(K&&W){let F=K.pump(G,Y,J,$.organizationId);F.catch(()=>{});let H=W.getReader();try{while(!0){let{done:N}=await H.read();if(N)break}}finally{H.releaseLock()}await F}else{if(K)console.warn(JSON.stringify({msg:"decopilot-stream-diag",event:"producer-fallback-no-pump",taskId:Y,hasTail:!!W,note:"createTailStream returned null \u2014 draining producer stream directly; projector persistence depends on streamBuffer publish health"}));let F=G.getReader();try{while(!0){let{done:H}=await F.read();if(H)break}}finally{F.releaseLock()}}return{taskId:Y}},AP4($))}async function TP4($,Z,X,Q){let[Y,G,J]=await Promise.all([$.storage.threads.list(Q,{limit:9,agentId:X}).catch(()=>null),$.storage.interests.getForAgent(Z,X,Q).catch(()=>null),$.storage.virtualMcps.list(Z).catch(()=>null)]),K={};if(Y&&Y.total>0)K.recentThreads={total:Y.total,threads:Y.threads.map((W)=>({id:W.id,title:W.title,updated_at:W.updated_at}))};if(G&&G.interests.length>0)K.interests=G.interests.map((W)=>({title:W.title,summary:W.summary}));if(J)K.agents=J.map((W)=>({id:W.id,name:W.title,description:W.description,status:W.status}));return K}async function RP4({virtualMcp:$,agentId:Z,organizationId:X,ctx:Q}){return B90({virtualMcp:$,agentId:Z,organizationId:X,ctx:Q})}async function IP4($,Z,X,Q){let{runRegistry:Y,streamBuffer:G}=X;Et($.harnessId);let J=$.harnessId;if(!YB$($))$={...$,messages:$.messages.map((F)=>F.id?F:{...F,id:vn()})};let K=!1,W;try{let F=$.models;Q.setAttribute("decopilot.harnessId",J),Q.setAttribute("decopilot.dispatchTarget.sandboxProviderKind","agent-sandbox");let H=RC(J),N=eU$(F),U=await s3(Z.db,$.organizationId,Z.organization?.role??Z.auth.user?.role);if(!a3(U,N.thinking.credentialId,N.thinking.id))throw new MW("model_not_allowed","Model not allowed for your role");N=vL0(U,N);let B=$.windowSize??JJ;if(!$.taskId)throw Error("dispatchRunAndWait: taskId is required");if(H)await eY({streamBuffer:G,harnessId:J,taskId:$.taskId,stage:Yt[0]});let O=await OJ$(Z,$.organizationId,Z.metadata?.runMetadata),L=(C0)=>C0?zP4(Z,$.organizationId,C0.credentialId,C0.id,O):Promise.resolve(void 0),[w,E,j,z,A,P,I,k,M]=await Promise.all([Z.storage.virtualMcps.findById($.agent.id,$.organizationId),L(N.thinking),L(N.fast),L(N.smart),L(N.image),L(N.webSearch),L(N.deepResearch),CL0(Z.storage.threads,{organization_id:$.organizationId,thread_id:$.taskId,userId:$.userId,defaultWindowSize:B}),TP4(Z,$.organizationId,$.agent.id,$.userId)]);if(H)await eY({streamBuffer:G,harnessId:J,taskId:$.taskId,stage:Yt[1]});let S=E?{thinking:E,...j?{fast:j}:{},...z?{smart:z}:{},...A?{image:A}:{},...P?{webSearch:P}:{},...I?{deepResearch:I}:{}}:void 0,m=E?zL0(E):null;if(W=k.thread.id,Z.metadata.threadId=k.thread.id,Q.setAttribute("decopilot.thread.id",k.thread.id),k.thread.created_by!==$.userId)throw new MW("not_thread_owner","You are not allowed to write to this thread because you are not the owner");if(m?.asyncResearch){let C0=[["thinking",N.thinking.id]];if(N.fast)C0.push(["fast",N.fast.id]);if(N.smart)C0.push(["smart",N.smart.id]);if(N.image)C0.push(["image",N.image.id]);for(let[i0,n]of C0)if(m.asyncResearch.canHandle(n))throw Error(`Model "${n}" can only be used as a Deep Research model. It is not usable as the ${i0} model \u2014 set it in the Deep Research slot instead.`)}let b=k.thread.message_storage_version===2?new KX({storage:Z.storage.threads.messageParts(),orgId:$.organizationId,threadId:k.thread.id,runId:k.thread.id}):null;if(!w)throw new MW("agent_not_found","Agent not found");let i=await RP4({virtualMcp:w,agentId:$.agent.id,organizationId:$.organizationId,ctx:Z});if($.isResume)await Y.execute({type:"RESUME",taskId:k.thread.id,orgId:$.organizationId,userId:$.userId,abortController:new AbortController,podId:gr0()});else await Y.execute({type:"START",taskId:k.thread.id,orgId:$.organizationId,userId:$.userId,abortController:new AbortController,podId:gr0(),runConfig:{models:$.models,agent:$.agent,temperature:$.temperature,toolApprovalLevel:$.toolApprovalLevel,mode:$.mode,windowSize:$.windowSize,triggerId:$.triggerId},messageId:$.messageId});K=!0,await Z.storage.threads.clearCancelRequested(k.thread.id);let c=$.runFenceToken,a=Y.getAbortSignal(k.thread.id);if(!a)throw await Y.execute({type:"FINISH",taskId:k.thread.id,threadStatus:"failed"}),Error("Run was cancelled immediately after starting");if($.abortSignal){let C0=$.abortSignal;if(C0.aborted)await Y.execute({type:"CANCEL",taskId:k.thread.id});else C0.addEventListener("abort",()=>{Y.execute({type:"CANCEL",taskId:k.thread.id}).catch(()=>{})},{once:!0})}let U0=Fg(J),E0=U0?await Z.storage.threads.getAckedSeq(k.thread.id):0;if(E0>0)console.log("[dispatch] resuming a sandbox-hosted turn",{runId:k.thread.id,fromSeq:E0});if(E0===0)G?.purge(k.thread.id);let s=[],o,z0;if(YB$($)){if(z0=await k.loadHistory(B),o=PP4(z0,$.messageId),$.systemContext)s=[{id:`system-${$.messageId}`,role:"system",parts:[{type:"text",text:$.systemContext}]}]}else{s=$.messages.filter((i0)=>i0.role==="system");let C0=$.messages.find((i0)=>i0.role!=="system");if(o=C0?(await KL0([C0],Z,{threadId:k.thread.id})).find((i0)=>i0.role!=="system"):void 0,!$.isResume){if(!o)throw new MW("empty_request","No user message found in input \u2014 expected at least one non-system message");if(b)await b.emitUserMessage(o).catch((i0)=>{console.error("[decopilot:stream] v2 user-message emit failed",i0)})}}if(o)await nU$(G,k.thread.id,o);let X0=[],P0=Date.now(),g0=o?(await WL0([o],Z))[0]:void 0;if(!g0||!o)throw new MW("empty_request","No user message found in input \u2014 expected at least one non-system message");mU$($.models,[g0]);let R0=await lU$({ctx:Z,threadId:k.thread.id,userMessage:o,windowSize:B,isSubagent:$.isSubagent===!0,systemMessages:s}),Y0={url:"",headers:{},expiresAt:0},O0=void 0,L0=void 0,I0={cwd:null},Z0=$.agent.instructions??(typeof i.metadata?.instructions==="string"?i.metadata.instructions:void 0),Q0={taskId:$.taskId,isSubagent:$.isSubagent,subtaskJobId:$.subtaskJobId,resumedFromBackground:$.resumedFromBackground,virtualMcp:i,branch:$.branch,messages:R0,modelSources:S,mcpSource:O0,objectStorageSource:L0,userContext:M},q0={threadId:k.thread.id,userMessage:g0,harness:{sessionId:void 0},workspace:I0,models:N,mcp:Y0,mode:$.mode,temperature:$.temperature,toolApprovalLevel:$.toolApprovalLevel,toolAllowlist:$.toolAllowlist??null,maxAgentSteps:$.maxAgentSteps,user:{id:$.userId,email:Z.auth.user?.email??""},organizationId:$.organizationId,agent:{id:$.agent.id,instructions:Z0,...$.agent.disallowedTools?{disallowedTools:$.agent.disallowedTools}:{}},currentThreadTitle:k.thread.title};if(H)await eY({streamBuffer:G,harnessId:J,taskId:$.taskId,stage:Yt[2]});let W0=U0?await Z.storage.claudeSubscriptions.findLiveToken($.userId).catch((C0)=>{return console.warn("[dispatch] claude subscription lookup failed",C0),null}):null,N0=async function*(){let C0={...q0,signal:a};if(Ar0(C0,Q0),H)await eY({streamBuffer:G,harnessId:J,taskId:k.thread.id,stage:Yt[3]});yield*U0?new co0({ctx:Z,virtualMcpId:i.id,streamBuffer:G,interactive:Boolean(i.metadata?.githubRepo?.url),...E0>0?{resume:{reason:"the Studio process driving the previous attempt stopped"}}:{},branch:await mZ0(Z,{threadId:k.thread.id,agentRepo:i.metadata?.githubRepo,runBranch:$.branch}),credential:W0?{providerId:EJ$,apiKey:W0}:E?{providerId:E.providerId,apiKey:E.apiKey,...E.baseUrl?{baseUrl:E.baseUrl}:{}}:null}).dispatch(C0):hU$(Z,C0)},E1=EP4(()=>jP4({runId:k.thread.id,fenceToken:c,streamBuffer:G??{publishRawChunk:async()=>!1,publishDone:async()=>!1},chunks:oU$(N0()),...U0?{startSeq:E0,initialAckSeq:E0,onPublished:(C0)=>Z.storage.threads.bumpAckedSeq(k.thread.id,c,C0)}:{},errorMessageId:pO(k.thread.id,c),loadOriginalMessages:b?async()=>(await Z.storage.threads.messageParts().loadWindow(k.thread.id,{limit:1})).messages.map(_L0):void 0,title:{currentThreadTitle:k.thread.title,threadId:k.thread.id,persistTitle:async(C0,i0)=>{await Z.storage.threads.update(C0,{title:i0})}},hooks:{onStep:()=>{let C0=Y.dispatch({type:"STEP_DONE",taskId:k.thread.id});X0.push(Y.react(C0).catch((i0)=>{console.error("[decopilot:stream] onStepFinish reactor failed",i0)}))},onFinish:async(C0,i0)=>{let n=X0.length,v0=performance.now();if(await Promise.allSettled(X0),ZB$.record(performance.now()-v0,{phase:"settle"}),a.aborted)return;await L$(0);let $1=XB$?dD():null,q1=performance.now(),S0=fL0(i0,C0?.parts);await Y.execute({type:"FINISH",taskId:k.thread.id,threadStatus:S0});let g1=performance.now()-q1;if(ZB$.record(g1,{phase:"save"}),XB$&&$1){let W8=dD()??$1,Y6=-1;try{Y6=JSON.stringify(C0)?.length??-1}catch{}console.warn(JSON.stringify({msg:"decopilot-finish-trace",threadId:k.thread.id,pendingOps:n,saveMs:Math.round(g1),parts:C0?.parts?.length??0,messageBytes:Y6,rssDelta:W8.rss-$1.rss,heapUsedDelta:W8.heapUsed-$1.heapUsed,externalDelta:W8.external-$1.external}))}},onError:(C0)=>{if(a.aborted){y1.capture({distinctId:$.userId,event:"chat_message_aborted",groups:{organization:$.organizationId},properties:{organization_id:$.organizationId,thread_id:k.thread.id,agent_id:$.agent.id,model_id:N.thinking.id,mode:$.mode,duration_ms:Date.now()-P0,is_resume:$.isResume??!1}});return}if(Gt(C0)){console.log(`[decopilot] attempt superseded by a newer dispatch; leaving the terminal to it thread=${k.thread.id}`);return}console.error("[decopilot] stream error:",l3(C0)),Y.execute({type:"FINISH",taskId:k.thread.id,threadStatus:"failed",errorText:l3(C0)}).catch((i0)=>{console.error("[decopilot:stream] onError reactor failed",i0)})}}}));return{taskId:k.thread.id,uiStream:E1,registrySignal:a}}catch(F){if(K&&W)Y.execute({type:"FINISH",taskId:W,threadStatus:"failed",errorText:l3(F)}).catch((H)=>{console.error("[decopilot:stream] catch-block reactor failed",H)});throw F}}var ZB$,XB$,QB$;var bL0=D(()=>{Vn();vn0();C4();pO0();NL0();f3();yx();NH$();uU$();Ug();wr0();CO();dU$();fO();xr0();Kg();iU$();IC();_r0();rU$();Lg();I6();$B$();K4();ZB$=w$.createHistogram("decopilot.finish.duration",{description:"Wall time of onFinish flush segments, tagged by phase",unit:"ms"}),XB$=process.env.DECOPILOT_FINISH_TRACE==="1";QB$=["decopilot","claude-code"]});function KB$(){return crypto.randomUUID()}function WB$($){return YH$($)||pU$($)}async function qP4($){let Z=$.getReader();try{while(!0){let{done:X}=await Z.read();if(X)break}}finally{Z.releaseLock()}}function MP4($,Z){let X=$.getReader(),Q=!1,Y=()=>{if(Q)return;Q=!0,X.releaseLock()};return new ReadableStream({async pull(G){try{let{done:J,value:K}=await X.read();if(J)Y(),G.close();else G.enqueue(K)}catch(J){Z(J),Y(),G.error(J)}},async cancel(G){await X.cancel(G),Y()}})}async function FB$($){if(!$.chunks&&!$.chunkStream)throw Error("projectChunks requires chunks or chunkStream");let Z=null,X=!1,Q=void 0,Y={inputTokens:0,outputTokens:0,totalTokens:0},G=[],J=null,K=(O)=>{if(J===null)J=O;throw O},W=$.chunks?async function*(){try{for await(let O of $.chunks){if(WB$(O))continue;yield O}}catch(O){throw Z=O,O}}():void 0,F=$.chunkStream?MP4($.chunkStream,(O)=>{Z=O}).pipeThrough(new TransformStream({transform(O,L){if(!WB$(O))L.enqueue(O)}})):void 0,H={emitStepParts:(O)=>$.persistence.emitStepParts(O).catch(K),emitFinal:(O)=>$.persistence.emitFinal(O).catch(K),emitError:(O,L)=>$.persistence.emitError(O,L).catch(K)},{uiStream:N,whenComplete:U}=ML0({chunks:W,chunkStream:F,originalMessages:$.originalMessages??[],title:$.title?{currentThreadTitle:$.title.currentThreadTitle,threadId:$.title.threadId,persistTitle:$.title.persistTitle}:{currentThreadTitle:void 0,threadId:"projector",persistTitle:async()=>{}},persistence:H,sanitizeErrorText:$.sanitizeErrorText,errorMessageId:$.errorMessageId,generateMessageId:$.generateMessageId,hooks:{onUsage:(O)=>{Y={inputTokens:O.inputTokens,outputTokens:O.outputTokens,totalTokens:O.totalTokens}},onError:()=>{X=!0},onFinish:(O,L)=>{Q=L,G=Array.isArray(O.parts)?O.parts.filter((w)=>w!=null&&typeof w==="object"&&("type"in w)):[]}}});if(await qP4(N).catch(()=>{}),await U,J!==null)throw J;if(Z!==null)throw Z;return{failed:X&&Q===void 0,finishReason:Q,usage:Y,finalParts:G}}var HB$=D(()=>{Cr0();IC()});function kP4($){if(/[.*>\s]/.test($))throw Error("Invalid NATS subject token")}function nO($){return kP4($),`decopilot.stream.${$}`}function NB$($){let Z=`${$.runId}:${$.fenceToken}:${$.seq}`;return $.fragmentIndex===void 0?Z:`${Z}:frag:${$.fragmentIndex}`}function VP4($){return`${$.runId}:${$.fenceToken}:done:${$.finalSeq}`}function UB$($){if(!$)return null;let Z=Number($);return Number.isInteger(Z)&&Z>0?Z:null}function SP4($){if(!$)return null;let Z=Number($);return Number.isInteger(Z)&&Z>=0?Z:null}function CP4($){if(!$)return null;let Z=$.split(":"),[X,Q,Y,G,J]=Z;if(!X||!Q||!Y)return null;if(Y==="done"){let W=UB$(G);return Z.length===4&&W!==null?{kind:"done",runId:X,fenceToken:Q,finalSeq:W}:null}let K=UB$(Y);if(K===null)return null;if(Z.length===3)return{kind:"chunk",runId:X,fenceToken:Q,seq:K,fragmentIndex:null};if(Z.length===5&&G==="frag"){let W=SP4(J);return W===null?null:{kind:"chunk",runId:X,fenceToken:Q,seq:K,fragmentIndex:W}}return null}function cr0($,Z){let X=nO(Z.runId),Q=ur0.encode(JSON.stringify({p:$}));if(Q.length>33554432)throw RangeError(`stream chunk is ${Q.length} bytes; maximum is 33554432`);if(Q.length<=786432)return[{subject:X,data:Q,msgId:Z.dedup?NB$({runId:Z.runId,...Z.dedup}):void 0}];let Y=Math.ceil(Q.length/786432),G=[];for(let J=0;J<Y;J++)G.push({subject:X,data:Q.slice(J*786432,(J+1)*786432),headers:{["Dp-Frag-Idx"]:String(J),["Dp-Frag-Total"]:String(Y)},msgId:Z.dedup?NB$({runId:Z.runId,...Z.dedup,fragmentIndex:J}):void 0});return G}function BB$($){return{subject:nO($.runId),data:ur0.encode(JSON.stringify({done:!0,finalSeq:$.finalSeq})),msgId:VP4($)}}function OB$($){return{subject:nO($),data:ur0.encode(JSON.stringify({done:!0}))}}function _P4($){let Z=$.reduce((Y,G)=>Y+(G?.length??0),0),X=new Uint8Array(Z),Q=0;for(let Y of $){if(!Y)continue;X.set(Y,Q),Q+=Y.length}return X}function xL0(){let $=null;return new TransformStream({transform(Z,X){let Q=Z.headers?.get("Dp-Frag-Total");if(!Q){X.enqueue(Z);return}let Y=Number(Q),G=Number(Z.headers?.get("Dp-Frag-Idx")??"0");if(G===0)$={total:Y,received:0,parts:Array(Y)};else if(!$||$.total!==Y)return;if(!$.parts[G])$.received++;if($.parts[G]=Z.data,$.received<$.total)return;let J=_P4($.parts);$=null,X.enqueue({subject:Z.subject,data:J,headers:Z.headers})}})}function vP4($){return typeof $==="number"&&Number.isInteger($)&&$>0}function bP4($){let Z=CP4($.headers?.get("Nats-Msg-Id")||void 0),X;try{X=JSON.parse(fP4.decode($.data))}catch{return null}if(!X||typeof X!=="object")return null;let Q=X;if(Q.done===!0)return{kind:"done",runId:Z?.kind==="done"?Z.runId:null,fenceToken:Z?.kind==="done"?Z.fenceToken:null,envelopeFinalSeq:vP4(Q.finalSeq)?Q.finalSeq:null,msgIdFinalSeq:Z?.kind==="done"?Z.finalSeq:null};if("p"in Q)return{kind:"chunk",seq:Z?.kind==="chunk"?Z.seq:null,runId:Z?.kind==="chunk"?Z.runId:null,fenceToken:Z?.kind==="chunk"?Z.fenceToken:null,chunk:Q.p};return null}function yL0(){return new TransformStream({transform($,Z){let X=bP4($);if(X)Z.enqueue(X)}})}var hr0="decopilot.stream",ur0,fP4;var DB$=D(()=>{ur0=new TextEncoder;fP4=new TextDecoder});var gL0=D(()=>{DB$()});var YN="DECOPILOT_STREAMS";var lr0=D(()=>{gL0()});function Eg($){if(!($ instanceof Error))return!1;if($.name==="TimeoutError")return!0;return/timeout|no responders|503|not enabled|is offline/i.test($.message)}function LB$($,Z){return new TransformStream({transform(X,Q){if(X.runId!==$||X.fenceToken!==Z)return;Q.enqueue(X)}})}function wB$(){let $=1;return new TransformStream({transform(Z,X){if(Z.kind==="done"){X.enqueue(Z);return}if(Z.seq===null){X.error(Error("projector chunk missing seq"));return}if(Z.seq<$)return;if(Z.seq>$){X.error(new jt($,Z.seq));return}$++,X.enqueue(Z)}})}function EB$($){let Z=$.getReader(),X=!1,Q=0,Y=()=>{if(X)return;X=!0,Z.releaseLock()};return new ReadableStream({async pull(G){for(;;){let{done:J,value:K}=await Z.read();if(J){await Z.cancel(),Y(),G.error(Error("reader stopped before done"));return}let W=K;if(W.kind==="done"){if(!(W.envelopeFinalSeq!=null&&W.envelopeFinalSeq===W.msgIdFinalSeq))continue;if(W.envelopeFinalSeq!==Q){await Z.cancel(),Y(),G.error(new jt(Q+1,null));return}await Z.cancel(),Y(),G.close();return}Q=W.seq??Q,G.enqueue(W.chunk);return}},async cancel(G){await Z.cancel(G),Y()}})}function xP4($){if(Symbol.asyncIterator in $)return $[Symbol.asyncIterator]();let Z=$[Symbol.iterator]();return{next:async()=>Z.next(),return:async(X)=>Z.return?Z.return(X):{done:!0,value:X}}}function uL0($){let Z=xP4($.messages),X=$.idleTimeoutMs,Q=!1,Y=(G)=>{if(Q)return;Q=!0,Z.return?.(G).catch(()=>{}),$.onCancel?.()};return new ReadableStream({async pull(G){if(X===void 0){let{done:H,value:N}=await Z.next();if(H){G.close();return}G.enqueue(N);return}let J=new AbortController,K=Z.next().then((H)=>{return J.abort(),H}),W=L$(X,{signal:J.signal}).then(()=>"idle").catch(()=>"cancelled"),F=await Promise.race([K,W]);if(F==="idle"){G.error(new hL0(X));return}if(F==="cancelled")return;if(F.done){G.close();return}G.enqueue(F.value)},async cancel(G){Y(G)}})}var hL0,jt;var cL0=D(()=>{K4();hL0=class hL0 extends Error{idleTimeoutMs;constructor($){super("producer produced no output before timeout");this.idleTimeoutMs=$;this.name="StreamIdleTimeoutError"}};jt=class jt extends Error{expectedSeq;gotSeq;constructor($,Z){super(Z===null?`missing seq ${$} (stream ended at the fenced done)`:`missing seq ${$} (next delivered is ${Z})`);this.expectedSeq=$;this.gotSeq=Z;this.name="StreamGapError"}}});function yP4($){let X=uL0({messages:$.messages,idleTimeoutMs:$.idleTimeoutMs,onCancel:$.onDone}).pipeThrough(xL0()).pipeThrough(yL0()).pipeThrough(LB$($.runId,$.fenceToken)).pipeThrough(wB$());return EB$(X)}async function zB$($){let Z=await y6(async()=>{return(await $.js.consumers.get(YN,{filter_subjects:nO($.runId),deliver_policy:jB$.DeliverPolicy.All})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:Eg});async function*X(){try{for await(let Q of Z)yield{subject:Q.subject,data:Q.data,headers:Q.headers}}finally{Z.stop()}}return yP4({messages:X(),runId:$.runId,fenceToken:$.fenceToken,idleTimeoutMs:$.idleTimeoutMs,onDone:()=>Z.stop()})}var jB$;var PB$=D(()=>{K4();lr0();cL0();gL0();jB$=V(XL(),1)});async function gP4($){let X=($.requestMessageId?await $.messageParts.maxCreatedAtMsForMessage($.runId,$.requestMessageId):null)??await $.messageParts.maxCreatedAtMsForRun($.runId);return new KX({storage:$.messageParts,orgId:$.orgId,threadId:$.runId,runId:$.runId,baseTimeMs:(X??Date.now())+1})}async function AB$($){let Z=await gP4($),X=$.replaceFinal?(Q)=>Z.replaceFinal(Q):(Q)=>Z.emitFinal(Q);return{emitStepParts:(Q)=>Z.emitStepParts(Q),emitFinal:X,emitError:(Q,Y)=>Z.emitError(Q,Y)}}var TB$=D(()=>{fO()});function lL0($,Z){uP4().add(1,{"org.id":Z??"unknown"})}var hP4=($)=>{let Z;return()=>Z??=$()},uP4;var RB$=D(()=>{I6();uP4=hP4(()=>w$.createCounter("decopilot.projector.poison_runs",{description:"Number of decopilot runs that exhausted retries and were sent to the DLQ",unit:"{runs}"}))});class dr0{intervalMs;lastBumpMs=new Map;constructor($=3000){this.intervalMs=$}shouldBump($,Z=Date.now()){let X=this.lastBumpMs.get($);if(X!==void 0&&Z-X<this.intervalMs)return!1;return this.lastBumpMs.set($,Z),!0}clear($){this.lastBumpMs.delete($)}}function IB$($,Z,X,Q){return $.pipeThrough(new TransformStream({transform(Y,G){if(X.shouldBump(Z))Q();G.enqueue(Y)},flush(){X.clear(Z)}}))}function cP4($){return`liveness: no stream events for ${Math.round($/60000)}m`}function ir0($){return $.runFenceToken!==null&&$.runFenceToken!==$.fenceToken}function MB$($){mr0=$}function kB$(){if(!mr0)throw Error("[projector-workflow] runtime not initialized \u2014 setProjectorWorkflowRuntime() must run before workflows fire");return mr0}function VB$(){return kB$()}async function SB$($,Z,X){let Q=kB$(),Y=Q.getJetStream();if(!Y)throw Error("JetStream unavailable");let G=(await Q.messageParts.loadWindow($.runId,{limit:500})).messages.map(_L0);return{chunkCount:0,attempts:1,outcome:await FB$({chunkStream:IB$(await zB$({js:Y,runId:$.runId,fenceToken:$.fenceToken,idleTimeoutMs:$.idleTimeoutMs}),$.runId,lP4,()=>{Q.bumpProgress({runId:$.runId,orgId:Z}).catch(()=>{})}),persistence:await AB$({messageParts:Q.messageParts,orgId:Z,runId:$.runId,requestMessageId:$.messageId,replaceFinal:!0}),originalMessages:G,errorMessageId:pO($.runId,$.fenceToken),title:{threadId:$.runId,currentThreadTitle:X,persistTitle:async(K,W)=>{await Q.persistTitle($.runId,Z,W),await Q.onTitleUpdated({runId:$.runId,orgId:Z,title:W})}}})}}async function qB$($,Z,X){let Q=await $.resolveRun(Z).catch(()=>null);return Q!==null&&Q.runFenceToken===X&&["completed","failed","requires_action"].includes(Q.status)}async function CB$($,Z,X){let Q=await dP4($,Z);if("skip"in Q)return;let Y=Q.row.orgId,G=Q.row.createdBy??$.runId,J=Q.row.title;try{let{outcome:K}=await X($,Y,J),W=K?.failed?"failed":fL0(K?.finishReason,K?.finalParts);if(W==="failed"){let F=K?.finishReason?`harness reported an error: ${K.finishReason}`:"harness reported an error";if(lL0($.runId,Y),await Z.markRunFailed($.runId,Y,F,"harness"))await Z.recordFailed({runId:$.runId,orgId:Y,distinctId:G,reason:F,kind:"harness"})}else if(W==="requires_action")await Z.markRunRequiresAction($.runId,Y),await Z.clearSynthesizedError($.runId,$.fenceToken);else{if(await Z.completeRunIfNotCompleted($.runId,Y))await Z.recordCompleted({runId:$.runId,orgId:Y,distinctId:G,usage:K?.usage??{inputTokens:0,outputTokens:0,totalTokens:0}});await Z.clearSynthesizedError($.runId,$.fenceToken)}await Z.purgeRun($.runId,$.fenceToken)}catch(K){if(K instanceof jt){if(await qB$(Z,$.runId,$.fenceToken)){await Z.clearSynthesizedError($.runId,$.fenceToken),await Z.purgeRun($.runId,$.fenceToken);return}let U=`stream truncated before projection could replay it: ${K.message}`;if(lL0($.runId,Y),await Z.markRunFailed($.runId,Y,U,"projection"))await Z.recordFailed({runId:$.runId,orgId:Y,distinctId:G,reason:U,kind:"projection"});await Z.purgeRun($.runId,$.fenceToken);return}let W=K instanceof hL0;if(W&&await qB$(Z,$.runId,$.fenceToken)){await Z.purgeRun($.runId,$.fenceToken);return}let F=W?cP4(K.idleTimeoutMs):K instanceof Error?K.message:String(K),H=W?"liveness":"projection";if(lL0($.runId,Y),await Z.markRunFailed($.runId,Y,F,H))await Z.recordFailed({runId:$.runId,orgId:Y,distinctId:G,reason:F,kind:H});if(W)await Z.clearSynthesizedError($.runId,$.fenceToken);throw K}}async function dP4($,Z){let X=await Z.resolveRun($.runId);if(!X)return{skip:"missing"};if(ir0({status:X.status,runFenceToken:X.runFenceToken,fenceToken:$.fenceToken}))return{skip:"stale",row:X};if(X.version!==2)return{skip:"legacy-v1",row:X};return{row:X}}var mr0=null,lP4;var pr0=D(()=>{HB$();PB$();cL0();TB$();RB$();xr0();lP4=new dr0});function _B$($,Z){switch($.type){case"START":{let X={type:"RUN_STARTED",taskId:$.taskId,orgId:$.orgId,userId:$.userId,abortController:$.abortController,runConfig:$.runConfig,podId:$.podId,messageId:$.messageId};if(Z?.status.tag==="running")return[{type:"PREVIOUS_RUN_ABORTED",taskId:$.taskId,orgId:Z.orgId},X];return[X]}case"STEP_DONE":{if(Z?.status.tag!=="running")return[];return[{type:"STEP_COMPLETED",taskId:$.taskId,orgId:Z.orgId,stepCount:Z.status.stepCount+1}]}case"FINISH":{if(Z==null||Z.status.tag!=="running")return[];let{stepCount:X}=Z.status;if($.threadStatus==="completed")return[{type:"RUN_COMPLETED",taskId:$.taskId,orgId:Z.orgId,stepCount:X}];if($.threadStatus==="requires_action")return[{type:"RUN_REQUIRES_ACTION",taskId:$.taskId,orgId:Z.orgId,stepCount:X}];return[{type:"RUN_FAILED",taskId:$.taskId,orgId:Z.orgId,reason:"error",errorText:$.errorText??null}]}case"CANCEL":{if(Z?.status.tag!=="running")return[];return[{type:"RUN_FAILED",taskId:$.taskId,orgId:Z.orgId,reason:"cancelled"}]}case"RESUME":{if(Z?.status.tag==="running")return[];return[{type:"RUN_RESUMED",taskId:$.taskId,orgId:$.orgId,userId:$.userId,abortController:$.abortController,podId:$.podId}]}case"FORCE_FAIL":{if($.reason==="ghost")return[{type:"RUN_FAILED",taskId:$.taskId,orgId:Z?.orgId??$.orgId,reason:$.reason,expectedFenceToken:$.expectedFenceToken??null}];if(Z?.status.tag!=="running")return[];return[{type:"RUN_FAILED",taskId:$.taskId,orgId:Z.orgId,reason:$.reason}]}}}function vB$($,Z,X=new Date){switch(Z.type){case"RUN_STARTED":return{taskId:Z.taskId,orgId:Z.orgId,userId:Z.userId,status:{tag:"running",abortController:Z.abortController,stepCount:0,startedAt:X}};case"RUN_RESUMED":return{taskId:Z.taskId,orgId:Z.orgId,userId:Z.userId,status:{tag:"running",abortController:Z.abortController,stepCount:0,startedAt:X}};case"STEP_COMPLETED":if($?.status.tag!=="running")return $;return{...$,status:{...$.status,stepCount:Z.stepCount}};case"RUN_COMPLETED":return;case"RUN_REQUIRES_ACTION":return;case"RUN_FAILED":return;case"PREVIOUS_RUN_ABORTED":return}}function fB$($){if(!$?.trim())return{...zt};for(let{kind:Z,reason:X,match:Q}of mP4)if(Q.test($))return{kind:Z,reason:X};return{...zt}}var mP4,zt;var bB$=D(()=>{mP4=[{kind:"credits",reason:"Run stopped: the organization is out of AI credits",match:/\[CREDITS\]|requires more credits|\b402\b/i},{kind:"sandbox_unreachable",reason:"Run stopped: its sandbox became unreachable mid-run",match:/\[SANDBOX_UNREACHABLE\]|sandbox stream broke/i},{kind:"cancelled",reason:"Run cancelled before it finished",match:/^\s*(error:\s*)?cancelled\b|run cancelled/i},{kind:"overloaded",reason:"Run stopped: the model provider was overloaded or rate-limited",match:/\boverloaded\b|\brate.?limit|\b429\b/i},{kind:"context_length",reason:"Run stopped: the conversation exceeded the model's context window",match:/context (length|window)|too many tokens|maximum context/i},{kind:"model_error",reason:"Run stopped: the model provider rejected the request",match:/\bAPI Error\b|\b5\d{2}\b.*provider|provider returned/i}],zt={kind:"error",reason:"Run ended with an error \u2014 see the run's messages"}});function nP4($,Z){if($!=="error")return pP4[$];let{kind:X,reason:Q}=fB$(Z);return{failure_reason:Q,failure_kind:X}}async function xB$($,Z,X,Q){let{storage:Y,sseHub:G}=Q,J=await Y.get($,Z);G.emit(Z,gK($,X,{virtualMcpId:J?.virtual_mcp_id??void 0,createdBy:J?.created_by,triggerId:J?.trigger_id,title:J?.title,branch:J?.branch??null,harnessId:J?.harness_id??void 0,createdAt:J?.created_at,updatedAt:J?.updated_at})),G.emit(Z,j80($,X))}async function tP4($,Z){let{storage:X,sseHub:Q}=Z;switch($.type){case"RUN_STARTED":{await X.update($.taskId,$.orgId,{status:"in_progress",run_config:$.runConfig??null,run_started_at:new Date().toISOString(),last_progress_at:null,failure_reason:null,failure_kind:null});let Y=await X.get($.taskId,$.orgId);Q.emit($.orgId,gK($.taskId,"in_progress",{virtualMcpId:Y?.virtual_mcp_id??void 0,createdBy:Y?.created_by,triggerId:Y?.trigger_id,title:Y?.title,branch:Y?.branch??null,harnessId:Y?.harness_id??void 0,createdAt:Y?.created_at,updatedAt:Y?.updated_at,messageId:$.messageId}));return}case"RUN_RESUMED":{await X.update($.taskId,$.orgId,{status:"in_progress",run_started_at:new Date().toISOString(),last_progress_at:null,failure_reason:null,failure_kind:null});let Y=await X.get($.taskId,$.orgId);Q.emit($.orgId,gK($.taskId,"in_progress",{virtualMcpId:Y?.virtual_mcp_id??void 0,createdBy:Y?.created_by,triggerId:Y?.trigger_id,title:Y?.title,branch:Y?.branch??null,harnessId:Y?.harness_id??void 0,createdAt:Y?.created_at,updatedAt:Y?.updated_at}));return}case"STEP_COMPLETED":Q.emit($.orgId,Lb0($.taskId,$.stepCount));return;case"RUN_COMPLETED":await xB$($.taskId,$.orgId,"completed",Z);return;case"RUN_REQUIRES_ACTION":await xB$($.taskId,$.orgId,"requires_action",Z);return;case"RUN_FAILED":{if($.reason==="ghost"){if(!await X.forceFailIfInProgress($.taskId,$.orgId,$.expectedFenceToken))return;await X.update($.taskId,$.orgId,{run_config:null,run_started_at:null})}else{if(!await X.forceFailIfInProgress($.taskId,$.orgId))return;await X.update($.taskId,$.orgId,{run_config:null,run_started_at:null,...nP4($.reason,$.errorText)})}let Y=await X.get($.taskId,$.orgId);Q.emit($.orgId,gK($.taskId,"failed",{virtualMcpId:Y?.virtual_mcp_id??void 0,createdBy:Y?.created_by,triggerId:Y?.trigger_id,title:Y?.title,branch:Y?.branch??null,harnessId:Y?.harness_id??void 0,createdAt:Y?.created_at,updatedAt:Y?.updated_at})),Q.emit($.orgId,j80($.taskId,"failed")),await Z.onThreadFinished?.($.taskId,$.orgId).catch((G)=>console.error("[run-reactor] thread-finish hook failed",G));return}case"PREVIOUS_RUN_ABORTED":return}}async function yB$($,Z){for(let{event:X}of $)await tP4(X,Z)}var iP4="Run stalled \u2014 no progress within the idle timeout window",pP4;var gB$=D(()=>{_8();bB$();pP4={reaped:{failure_reason:iP4,failure_kind:"stall"},cancelled:{failure_reason:"Run cancelled before it finished",failure_kind:"cancelled"},error:{failure_reason:zt.reason,failure_kind:zt.kind}}});function hB$($){return $.now-$.lastProgressAt>$.idleTimeoutMs}function uB$($){return Math.max($.persistedLastProgressAt??Number.NEGATIVE_INFINITY,$.currentRunStartedAt)}class tr0{deps;clock;states=new Map;reaperTimer=null;constructor($,Z=()=>new Date){this.deps=$;this.clock=Z;this.reaperTimer=setInterval(()=>{this.reapStaleRuns().catch((X)=>{console.error("[RunRegistry] Reaper sweep failed",X)})},oP4)}async execute($){let Z=this.dispatch($);return await this.react(Z),Z}dispatch($){let Z=this.states.get($.taskId),X=_B$($,Z),Q=[];for(let Y of X){let G=this.states.get(Y.taskId);if(Y.type==="PREVIOUS_RUN_ABORTED"||Y.type==="RUN_FAILED"){if(G?.status.tag==="running")G.status.abortController.abort()}let J=vB$(G,Y,this.clock());if(J===void 0)this.states.delete(Y.taskId);else this.states.set(Y.taskId,J);if(Q.push({event:Y,state:J}),rP4.has(Y.type))cB$().add(1,{"org.id":Y.orgId});else if(aP4.has(Y.type)&&G?.status.tag==="running")cB$().add(-1,{"org.id":Y.orgId})}return Q}react($){return yB$($,this.deps)}getAbortSignal($){let Z=this.states.get($);if(Z?.status.tag==="running")return Z.status.abortController.signal;return null}isRunning($){return this.states.get($)?.status.tag==="running"}async stopAll(){for(let[,$]of this.states)if($.status.tag==="running")$.status.abortController.abort();this.states.clear()}dispose(){if(this.reaperTimer)clearInterval(this.reaperTimer),this.reaperTimer=null}async reapStaleRuns(){let $=this.clock().getTime(),Z=[...this.states].filter(([,X])=>X.status.tag==="running");for(let[X,Q]of Z){if(this.states.get(X)?.status.tag!=="running")continue;let G;try{let K=await this.deps.storage.getProgress(X,Q.orgId);G=uB$({persistedLastProgressAt:K?.lastProgressAt??null,currentRunStartedAt:Q.status.startedAt.getTime()})}catch(K){console.warn(`[RunRegistry] Reaper progress read failed for ${X}; skipping`,K);continue}if(!hB$({lastProgressAt:G,now:$,idleTimeoutMs:dL0}))continue;let J=await this.deps.storage.get(X,Q.orgId).catch(()=>null);if(J&&J.status!=="in_progress"){let K=this.states.get(X);if(K?.status.tag==="running")K.status.abortController.abort();this.states.delete(X);continue}console.warn(`[RunRegistry] Reaping stuck run for thread ${X} (idle > ${dL0/60000}m) ...`),sP4().add(1,{"org.id":Q.orgId,reason:"idle_timeout"}),await this.execute({type:"FORCE_FAIL",taskId:X,reason:"reaped"}).catch((K)=>{console.error("[RunRegistry] Reaper execute failed",K)})}}}var oP4=300000,nr0,dL0,rP4,aP4,lB$=($)=>{let Z;return()=>Z??=$()},cB$,sP4;var or0=D(()=>{gB$();I6();nr0=Number(process.env.RUN_IDLE_TIMEOUT_MS),dL0=Number.isFinite(nr0)&&nr0>0?nr0:600000,rP4=new Set(["RUN_STARTED","RUN_RESUMED"]),aP4=new Set(["RUN_COMPLETED","RUN_FAILED","RUN_REQUIRES_ACTION","PREVIOUS_RUN_ABORTED"]),cB$=lB$(()=>w$.createUpDownCounter("decopilot.stream.inflight",{description:"Number of in-flight decopilot stream requests",unit:"{requests}"})),sP4=lB$(()=>w$.createCounter("decopilot.run.reaped",{description:"Number of decopilot runs force-failed by the progress-based reaper",unit:"{runs}"}))});async function dB$($){let{runId:Z}=$,X=VB$(),Q=await X.resolveRun(Z),Y=$.fenceToken??Q?.runFenceToken;if(!Q||Q.version!==2||Y==null)return;if(ir0({status:Q.status,runFenceToken:Q.runFenceToken,fenceToken:Y}))return;if(!X.getJetStream())throw Error("JetStream unavailable for consume step");await CB$({runId:Z,fenceToken:Y,messageId:$.messageId,idleTimeoutMs:$.idleTimeoutMs??dL0},X,SB$)}var mB$=D(()=>{pr0();or0()});import{DBOS as xC}from"@dbos-inc/dbos-sdk";function ar0($){rr0=$}function sr0(){if(!rr0)throw Error("[hostedHarness] runtime not initialized \u2014 setHostedHarnessRuntime() must run before workflows fire");return rr0}async function eP4($,Z){let X=sr0(),{request:Q}=$,Y=Z??await X.studioContextFactory(Q.organizationId,Q.userId);if(!Y)throw Error("user membership lost mid-dispatch");if(Q.runMetadata)Y.metadata.runMetadata=Q.runMetadata;let G=new AbortController;iB$().add(1);try{if(Zg(Y,"in_progress",$.threadId),!Q.runMetadata?.taskBoardItemId)tW$(Y,$.threadId);await X.dispatchRunFn({...Q,abortSignal:G.signal},Y,X.deps)}finally{iB$().add(-1)}}function pB$($,Z){let X=sr0(),Q=Z?.isQueued??XA4,Y=new wt({intervalMs:Z?.intervalMs,sleepFn:Z?.sleepFn,emit:async()=>{if(await Q($)){await ZA4(X,$);return}Y.stop()}});return Y.arm(),()=>Y.stop()}async function XA4($){try{return(await xC.getWorkflowStatus(er0($.runId,$.fenceToken)))?.status==="ENQUEUED"}catch(Z){return console.error(`[hostedHarness] could not read child status for run=${$.runId} fence=${$.fenceToken}`,Z),!0}}function QA4($,Z,X,Q=1){let Y=X instanceof Error?X.message:String(X);return{messageId:pO($,Z),errorChunk:{type:"error",errorText:Y},seq:Q,finalSeq:Q}}function YA4($){if(!($ instanceof Error))return;let Z=$.lastAckSeq;return typeof Z==="number"?Z+1:void 0}async function GA4($,Z){let X=sr0(),{streamBuffer:Q}=X.deps,{messageId:Y,errorChunk:G,seq:J,finalSeq:K}=QA4($.runId,$.fenceToken,Z,YA4(Z));if(!Q){console.error(`[hostedHarness] no streamBuffer configured; dropping terminal error for run=${$.runId} fence=${$.fenceToken} messageId=${Y}`);return}if(!await Q.publishRawChunk($.runId,G,{fenceToken:$.fenceToken,seq:J})){console.error(`[hostedHarness] failed to publish terminal error chunk for run=${$.runId} fence=${$.fenceToken} messageId=${Y}`);return}await Q.publishDone($.runId,$.fenceToken,K)}async function JA4($){try{await xC.runStep(()=>eP4($),{name:"runHostedHarness",retriesAllowed:!1})}catch(Z){if(Gt(Z)){console.log(`[hostedHarness] attempt superseded by a newer dispatch; leaving the terminal to it run=${$.runId} fence=${$.fenceToken}`);return}await xC.runStep(()=>GA4($,Z),{name:"publishHostedHarnessFailure",retriesAllowed:!0}).catch((X)=>{console.error(`[hostedHarness] could not publish terminal error for run=${$.runId} fence=${$.fenceToken}`,X)})}}function er0($,Z){return`decopilot-hosted:${$}:${Z}`}async function nB$($){return{workflowID:(await xC.startWorkflow(KA4,{workflowID:er0($.runId,$.fenceToken),queueName:Fg($.request.harnessId)?zF:jF,enqueueOptions:{priority:mO0($.request.runMetadata)}})($)).workflowID}}async function yC($,Z){await xC.cancelWorkflow(er0($,Z))}var rr0=null,$A4,iB$=()=>$A4??=w$.createUpDownCounter("hosted_runs.active",{description:"Hosted agent-loop runs executing on this pod",unit:"{runs}"}),ZA4=($,Z)=>eY({streamBuffer:$.deps.streamBuffer,harnessId:Z.request.harnessId,taskId:Z.runId,stage:"waiting-capacity"}),KA4;var $a0=D(()=>{yr0();IC();NL0();I6();uy();w5();KA4=xC.registerWorkflow(JA4,{name:"hostedHarnessWorkflow",maxRecoveryAttempts:1000})});import{DBOS as jg}from"@dbos-inc/dbos-sdk";function Qa0($){Et($)}function Ya0($){Za0=$}function WA4(){if(!Za0)throw Error("[threadGate] runtime not initialized \u2014 setThreadGateRuntime() must run before workflows fire");return Za0}function FA4($,Z=KB$){let X=$.runFenceToken;if(X)return{runFenceToken:X,claimedRequest:{...$,runFenceToken:X},shouldPersistFence:!1};let Q=Z();return{runFenceToken:Q,claimedRequest:{...$,runFenceToken:Q},shouldPersistFence:!0}}async function HA4($){let Z=WA4(),{request:X}=$,Q=X.taskId??$.threadId;if(RC(X.harnessId))await eY({streamBuffer:Z.deps.streamBuffer,harnessId:X.harnessId,taskId:Q,stage:"starting-run"});let Y=await Z.studioContextFactory(X.organizationId,X.userId);if(!Y)throw Error("user membership lost mid-dispatch");Qa0(X.harnessId);let G=X.taskId??$.threadId,{runFenceToken:J,claimedRequest:K,shouldPersistFence:W}=FA4(X);if(W)await Y.storage.threads.setRunFence(G,J);return{runFenceToken:J,hostedEnqueue:{runId:Q,fenceToken:J,threadId:$.threadId,request:K}}}async function NA4($){if($.source!=="user-message")return;let{request:Z}=$;y1.capture({distinctId:Z.userId,event:"chat_message_started",groups:{organization:Z.organizationId},properties:{organization_id:Z.organizationId,agent_id:Z.agent,mode:Z.mode,thread_id:Z.taskId??$.threadId,credential_id:Z.models.credentialId}})}async function UA4($,Z){if($.source!=="user-message")return;let{request:X}=$;y1.capture({distinctId:X.userId,event:"chat_message_failed",groups:{organization:X.organizationId},properties:{organization_id:X.organizationId,thread_id:X.taskId??$.threadId,agent_id:X.agent,model_id:X.models.thinking.id,mode:X.mode,error_category:"setup",error_message:Z}})}async function mL0($){Qa0($.request.harnessId),await jg.runStep(()=>NA4($),{name:"trackMessageStarted"});let Z;try{Z=await jg.runStep(()=>HA4($),{name:"dispatchRunAndWait",retriesAllowed:!0}),await nB$(Z.hostedEnqueue)}catch(G){let J=G instanceof Error?G.message:String(G);throw await jg.runStep(()=>UA4($,J),{name:"trackMessageFailed"}),G}let X=$.request.taskId??$.threadId,Q="messages"in $.request?void 0:$.request.messageId,Y=pB$(Z.hostedEnqueue);try{await jg.runStep(()=>dB$({runId:X,fenceToken:Z.runFenceToken,messageId:Q}),{name:"consumeRunProjection"})}finally{Y()}return{taskId:$.request.taskId??$.threadId}}async function BA4($){return mL0($)}async function rH($,Z){return Qa0($.request.harnessId),{workflowID:(await jg.startWorkflow(OA4,{queueName:fJ,enqueueOptions:{queuePartitionKey:$.threadId,priority:mO0($.request.runMetadata)},workflowID:Z?.workflowID})($)).workflowID}}var Xa0=1,Za0=null,OA4;var tB$=D(()=>{bL0();C4();IC();mB$();uy();$a0();OA4=jg.registerWorkflow(BA4,{name:"threadGateWorkflow",maxRecoveryAttempts:1000})});var aH=D(()=>{tB$();$a0()});async function rn($,Z,X){let Q=Z.organizationId,Y=Z.assignedBy??Z.createdBy,G=X.harnessId??"decopilot",J=await hZ($,"smart"),K=Hw(Q),W=await $.storage.threads.create({...X.fence?{id:X.fence.threadId}:{},organization_id:Q,title:X.title,status:"in_progress",virtual_mcp_id:K,message_storage_version:2,harness_id:G,created_by:Y,metadata:{runtime:"sandbox"}});if(!W.isNew)return{threadId:W.id,isNew:!1};let F={...W.metadata??{},...X.pinnedRef?{pinnedRef:X.pinnedRef}:{},...X.repo?{githubRepo:{url:X.repo.url,owner:X.repo.owner,name:X.repo.name,installationId:X.repo.installationId,connectionId:X.repo.connectionId}}:{}},H=X.pinnedRef?X.pinnedRef:X.repo?bH(W.id,X.repo.connectionId):Fg(G)?bH(W.id):null;await $.storage.threads.update(W.id,{metadata:F,...H?{branch:H}:{},updated_by:Y}),await $.storage.taskBoard.linkThread(Z.id,W.id,Q);let N={id:crypto.randomUUID(),role:"user",parts:[{type:"text",text:X.prompt}],metadata:{created_at:new Date().toISOString()}};return await new KX({storage:$.storage.threads.messageParts(),orgId:Q,threadId:W.id,runId:W.id}).emitRequestMessage(N),await rH({threadId:W.id,source:"background-tool",request:{messages:[N],models:{credentialId:J.credentialId,thinking:{id:J.modelId,title:J.modelMeta.title}},agent:{id:K,...X.agent??{}},temperature:X.temperature,toolApprovalLevel:"auto",mode:"default",organizationId:Q,userId:Y,harnessId:G,...X.repo?{}:H?{branch:H}:{},taskId:W.id,runMetadata:{...dO0(Z),[hy]:X.runClass??"new_task",...X.modelClass&&X.modelClass!=="default"?{[iO0]:X.modelClass}:{}}}},X.fence?{workflowID:X.fence.workflowID}:void 0),{threadId:W.id,isNew:!0}}var Lo0=D(()=>{Vn();uy();nH();aH();fO();_8();f3();NL0();pO0()});async function hO($,Z,X){if(Z.assigneeId!==Z8)return;await p3($,Z,X).catch((Q)=>{if(Q instanceof s7)throw Q;console.error("[task-board] Super Agent enqueue failed",Q)})}function DA4($,Z){return["You've been assigned this task. Complete it.","","You are running AUTONOMOUSLY \u2014 no human is watching this run, so drive it "+"to completion on your own. Use `user_ask` ONLY for a genuine, unresolvable blocker a human must clear (a missing credential/secret, or "+"a decision so ambiguous you truly cannot proceed) \u2014 that should be rare. "+"Do not ask for confirmation of a reasonable choice; make it and move on.","",`Title: ${$.title}`,$.description?`
|
|
1499
1499
|
Description:
|
|
1500
1500
|
${$.description}
|
|
1501
1501
|
`:"",Z?.resolveConflict&&Z.pr?[`Your pull request #${Z.pr.number} (${Z.pr.url}) is approved but can't be merged \u2014 it has a MERGE CONFLICT with its base branch.`,`Load the repo, CHECK OUT that PR's branch (e.g. \`gh pr checkout ${Z.pr.number}\`), then merge (or rebase) the base branch into it and resolve the conflicts, and push to update the SAME pull request \u2014 do NOT open a new one or start a new branch. Resolve conflicts by preserving BOTH sides' intent; never blindly discard either side. Change only what resolving the conflict requires.`,""].join(`
|
|
@@ -2887,7 +2887,7 @@ Respond with the structured verdict and a short reason.`,wc$;var jc$=D(()=>{D4()
|
|
|
2887
2887
|
${G.join(`
|
|
2888
2888
|
`)}`:Y}function zH6($){let Z=new Set;for(let X of $)for(let Q of X.split(`
|
|
2889
2889
|
`)){let Y=Q.trim();if(/^Co-authored-by:\s/i.test(Y))Z.add(Y)}return[...Z]}var $l$=200,NH6=12,BH6,DH6=300,$71=3;var Z71=D(()=>{_D();rA0();BH6={aheadBy:0,behindBy:0,files:[]}});function AH6($){if(!$||$.includes(".."))return!1;return PH6.test($)}function Xl$($){let Z=typeof $.__resolveType==="string"?$.__resolveType:null;if(!Z||!AH6(Z))return null;let{__resolveType:X,...Q}=$;return{resolveType:Z,payload:Q}}function Ql$($,Z){return`${$.replace(/\/+$/,"")}/deco/invoke/${Z}`}var PH6;var Yl$=D(()=>{PH6=/^[\w./@-]+$/});function Zs($,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 Gl$($,Z,X,Q){if(!Q.connectionId)throw new e_("Push requires a connected GitHub account. Connect mcp-github for this project and restart the sandbox.");let Y=$.organization?.id;if(!Y)throw new e_(G9);await DO({ctx:$,connectionId:Q.connectionId,organizationId:Y,forceRefresh:!0,onLegacyMintError:(H)=>{let N=H instanceof Error?H.message:G9;throw new e_(N)}});let{cloneUrl:G,gitUserName:J,gitUserEmail:K}=await PW(Q.connectionId,Q.owner,Q.name,$.db,$.vault).catch((H)=>{let{code:N,message:U}=Z5$(H instanceof Error?H.message:String(H));throw N?new e_(U):H}),W=vu($),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:K}},...W?{operator:W}:{}})});if(!F.ok){let H=await OO(F,TH6).catch(()=>F.statusText);throw Error(`Failed to refresh sandbox git credentials (${F.status}): ${H}`)}}var TH6=10485760,e_;var X71=D(()=>{$J();hA0();ap();Xi0();Ly();e_=class e_ extends Error{constructor($){super($);this.name="GitPushAuthError"}}});function IH6($){let Z=$.startsWith("thread:")?$.slice(7):$;if(!Z||Z.length>255||Z.includes("..")||Z.startsWith("/")||Z.endsWith("/")||Z.endsWith(".lock")||!RH6.test(Z))throw Error(`Invalid branch name: ${$}`)}function $v($){return AbortSignal.any([$.req.raw.signal,AbortSignal.timeout(MH6)])}async function VH6($,Z){let X=$.var.studioContext,Q=sG(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,K=QC(J?.metadata?.runtime);if(K)return K;let W=CO0(Z.virtualMcpMetadata),F=W==="cms"?await yZ1(X,{claimName:Z.claimName}):"alive",H=W==="cms"&&F!=="alive"?"cms":"sandbox",N=!!J&&(F==="gone"||F==="alive"&&W==="cms");if(N&&J)qn(X,J.id,H);if(W==="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 SH6($){let Z=$.get("vmClaim");if(Z.runner)return Z.runner;try{return await $Q($.var.studioContext)}catch{return null}}function Zv($){let{runner:Z}=$.get("vmClaim");if(!Z)return $.json({error:"No sandbox runner configured"},503);return Z}async function gu($){let{virtualMcpMetadata:Z,connectionIds:X}=$.get("vmClaim"),Q=$.var.studioContext,Y=Zs(Z,X);if(!Y)throw new u4(404,"AUTH","repo","Project has no GitHub repository");let G=t(Q);return uA0(Q,G.id,Y)}function Q71($,Z){if(Z instanceof iP0)return $.json({error:Z.message},429,{...z5,...Z.retryAfterMs===null?{}:{"Retry-After":String(Math.ceil(Z.retryAfterMs/1000))}});if(Z instanceof u4){let Q=Z.status===404?404:Z.status===409||Z.status===422?409:502;return $.json({error:Z.message},Q,z5)}let X=Z instanceof Error?Z.message:String(Z);return $.json({error:X},502,z5)}async function Wl$($,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 Fl$($){try{let Z=await gu($),X=await aA0(Z,$.get("vmClaim").branch);return $.json(X,200,z5)}catch(Z){return Q71($,Z)}}function Xs($,Z){let Q=($T0.get($)??Promise.resolve()).catch(()=>{}).then(Z),Y=Q.catch(()=>{});return $T0.set($,Y),Y.finally(()=>{if($T0.get($)===Y)$T0.delete($)}),Q}async function pZ($,Z,X){if(!X?.runner&&$.get("vmClaim").runtime==="cms")return $.json({error:"sandbox not found: this session is sandbox-less"},404,z5);let Q=X?.runner??Zv($);if(Q instanceof Response)return Q;let{claimName:Y,userId:G,projectRef:J}=$.get("vmClaim"),K=X?.method??"POST",W=null,F=new Headers;if(X?.jsonBody!==void 0)W=X.jsonBody,F.set("content-type","application/json");else if(X?.forwardJsonBody)W=await $.req.text(),F.set("content-type","application/json");let H=X?.signal,N={method:K,headers:F,body:W,...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",...z5}})}}let O=await B.text(),L=X?.redactRepoDir?CH6(O):O,w=B.headers.get("content-type")??"application/json";return new Response(L,{status:B.status,headers:{"content-type":w,...z5}})};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 CH6($){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 ZT0($,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 K=`Daemon error (${G.status})`;try{K=JSON.parse(J).error??K}catch{}throw Error(K)}return JSON.parse(J)}function _H6($){return Hl$.includes($)}var RH6,Jl$=524288,qH6=65536,MH6=1e4,Kl$=2000,kH6,$T0,z5,Hl$,Nl$=()=>{let $=new H1;$.use("/:virtualMcpId/:branch/*",kH6),$.post("/:virtualMcpId/:branch/write",(X)=>pZ(X,"/_sandbox/write",{forwardJsonBody:!0,signal:$v(X)})),$.post("/:virtualMcpId/:branch/unlink",(X)=>pZ(X,"/_sandbox/unlink",{forwardJsonBody:!0,signal:$v(X)})),$.post("/:virtualMcpId/:branch/mkdir",(X)=>pZ(X,"/_sandbox/mkdir",{forwardJsonBody:!0,signal:$v(X)})),$.post("/:virtualMcpId/:branch/rename",(X)=>pZ(X,"/_sandbox/rename",{forwardJsonBody:!0,signal:$v(X)})),$.post("/:virtualMcpId/:branch/read",(X)=>pZ(X,"/_sandbox/read",{forwardJsonBody:!0,signal:$v(X)})),$.post("/:virtualMcpId/:branch/glob",(X)=>pZ(X,"/_sandbox/glob",{forwardJsonBody:!0,signal:$v(X)})),$.post("/:virtualMcpId/:branch/grep",(X)=>pZ(X,"/_sandbox/grep",{forwardJsonBody:!0,signal:$v(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 pZ(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 pZ(X,`/_sandbox/exec/${encodeURIComponent(Q)}/kill`)}),$.get("/:virtualMcpId/:branch/config",(X)=>pZ(X,"/_sandbox/config",{method:"GET",map404to410:!0,redactRepoDir:!0})),$.put("/:virtualMcpId/:branch/config",(X)=>pZ(X,"/_sandbox/config",{method:"PUT",forwardJsonBody:!0,map404to410:!0})),$.post("/:virtualMcpId/:branch/setup/:step",async(X)=>{let Q=X.req.param("step");if(!Q||!_H6(Q))return X.json({error:`step must be one of: ${Hl$.join(", ")}`},400);let Y=X.get("vmClaim"),G=await yZ1(X.var.studioContext,{claimName:Y.claimName})==="gone"?null:await SH6(X);if(!G)return X.json({error:"sandbox not found: nothing is running at this ref"},404,z5);if(Q==="start"){let J=t(X.var.studioContext),K=Oy(Y.virtualMcpMetadata);try{await nZ0({ctx:X.var.studioContext,runner:G,handle:Y.claimName,orgId:J.id,userId:Y.callerUserId,entries:K})}catch(W){let F=W instanceof Error?W.message:String(W);return X.json({error:`Failed to push env to daemon: ${F}`},502)}}return pZ(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 fN(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 Nc$(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 Fl$(X);return Z(X)});let Z=(X)=>pZ(X,"/_sandbox/git/status",{method:"GET",map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(Kl$)])});return $.post("/:virtualMcpId/:branch/git/status",(X)=>{if(X.get("vmClaim").runtime==="cms")return Fl$(X);return pZ(X,"/_sandbox/git/status",{map404to410:!0,signal:AbortSignal.any([X.req.raw.signal,AbortSignal.timeout(Kl$)])})}),$.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 gu(X),J=await sA0(G,Q.branch,Y.base);return X.json(J,200,z5)}catch(Y){return Q71(X,Y)}return pZ(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,z5);let Q=Zv(X);if(Q instanceof Response)return Q;let{claimName:Y,virtualMcpMetadata:G,connectionIds:J}=X.get("vmClaim"),K=X.var.studioContext;return Xs(Y,async()=>{try{await gZ1(K,Q,Y);let W=Zs(G,J);if(W)await Gl$(K,Q,Y,W)}catch(W){if(W instanceof e_)return X.json({error:W.message},403,z5);let F=W instanceof Error?W.message:String(W);return X.json({error:F},502,z5)}return pZ(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 Xs(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,z5);try{let J=await gu(X);return await Zl$(J,Q.branch,G),X.json({ok:!0},200,z5)}catch(J){let K=J instanceof u4&&J.status===409?409:502,W=J instanceof Error?J.message:String(J);return X.json({error:W},K,z5)}});return Xs(Q.claimName,()=>pZ(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 Xs(Q.claimName,async()=>{try{let K=await X.req.json().catch(()=>({})),W=await gu(X),F=K.base??await W.getDefaultBranch();return await eA0(W,Q.branch,F),X.json({ok:!0},200,z5)}catch(K){return Q71(X,K)}});let Y=Zv(X);if(Y instanceof Response)return Y;let{claimName:G}=X.get("vmClaim"),J=X.var.studioContext;return Xs(G,async()=>{try{await gZ1(J,Y,G)}catch(K){let W=K instanceof Error?K.message:String(K);return X.json({error:W},502,z5)}return pZ(X,"/_sandbox/git/rebase",{forwardJsonBody:!0,map404to410:!0})})}),$.post("/:virtualMcpId/:branch/git/suggest-commit",p5({maxSize:Jl$,onError:(X)=>X.json({error:"Payload too large"},413,z5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let F=Zv(X);if(F instanceof Response)return F;Y=F}let{claimName:G,userId:J,projectRef:K}=Q,W=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]=cZ1(H)&&U?[H,N]:Y?await Promise.all([ZT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:K}),ZT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:K})]):await(async()=>{let w=await gu(X);return Promise.all([aA0(w,Q.branch),sA0(w,Q.branch)])})(),L=await Lc$(W,B,O);return X.json(L,200,z5)}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,z5);return X.json({error:H},502,z5)}}),$.post("/:virtualMcpId/:branch/git/judge-review",p5({maxSize:Jl$,onError:(X)=>X.json({error:"Payload too large"},413,z5)}),async(X)=>{let Q=X.get("vmClaim"),Y=null;if(Q.runtime!=="cms"){let F=Zv(X);if(F instanceof Response)return F;Y=F}let{claimName:G,userId:J,projectRef:K}=Q,W=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]=cZ1(H)&&U?[H,N]:Y?await Promise.all([ZT0(Y,G,"/_sandbox/git/status","GET",{userId:J,projectRef:K}),ZT0(Y,G,"/_sandbox/git/diff","GET",{userId:J,projectRef:K})]):await(async()=>{let w=await gu(X);return Promise.all([aA0(w,Q.branch),sA0(w,Q.branch)])})(),L=await Ec$(W,B,O,typeof F.language==="string"?F.language:void 0);return X.json(L,200,z5)}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,z5);return X.json({error:H},502,z5)}}),$.get("/:virtualMcpId/:branch/preview-fetch",async(X)=>{let Q=Zv(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 K=J.replace(/\/+$/,"");return Wl$(X,`${K}${G}`)}),$.post("/:virtualMcpId/:branch/preview-invoke",p5({maxSize:qH6,onError:(X)=>X.json({error:"Payload too large"},413)}),async(X)=>{let Q=Zv(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 K=Xl$(J);if(!K)return X.json({error:"Invalid or missing __resolveType"},400);let W=Ql$(G,K.resolveType);return Wl$(X,W,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(K.payload),signal:AbortSignal.timeout(30000)})}),$};var Ul$=D(()=>{U8();NF();_u();xZ1();pp();Wc$();f3();fy();Fc$();h3();Hc$();Uc$();em0();op();mZ1();jc$();pZ1();_D();Z71();Yl$();X71();RH6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;kH6=gA0(async($,Z)=>{let X=$.var.studioContext;try{r(X)}catch{return $.json({error:"Unauthorized"},401)}let Q=o0(X);if(!Q)return $.json({error:"Unauthorized"},401);let Y;try{Y=t(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{IH6(J)}catch(L){let w=L instanceof Error?L.message:String(L);return $.json({error:w},400)}let K=await X.storage.virtualMcps.findById(G);if(!K||K.organization_id!==Y.id)return $.json({error:"Virtual MCP not found"},404);let W=mp({orgId:Y.id,virtualMcpId:G,branch:J}),F=await nm0(X,J),H=tm0(F,Q),N=Kc$({userId:H,projectRef:W}),U=K.metadata??null,B=await VH6($,{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:W,virtualMcpMetadata:U,connectionIds:K.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:W,virtualMcpMetadata:U,connectionIds:K.connections?.map((L)=>L.connection_id)??[],runtime:B}),Z()});$T0=new Map;z5={"Cache-Control":"no-store, no-cache, must-revalidate",Pragma:"no-cache"};Hl$=["clone","install","start"]});function Bl$($,Z,X){let Q=Y71.get($);if(!Q)Q={pending:null,running:!1},Y71.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,K]of Object.entries(X.set??{}))Y.set.set(J,K),Y.del.delete(J);for(let J of X.delete??[])Y.del.add(J),Y.set.delete(J);let G=new Promise((J,K)=>{Y.resolvers.push(J),Y.rejecters.push(K)});if(!Q.running)fH6($,Q);return G}async function fH6($,Z){Z.running=!0;try{while(Z.pending){let X=Z.pending;Z.pending=null;try{let Q=await bH6(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)Y71.delete($)}}async function bH6($){let{client:Z,branch:X,packagePath:Q}=$.deps;for(let Y=0;;Y++){let G=await yu(Z,X),J=await Z.getCommitTreeSha(G),K=await Z.getTreeRecursive(J),W=sZ1(K,Q),F=[],H=new Map(W.map((O)=>[O.path,{stem:O.stem,sha:O.sha}]));for(let[O,L]of $.set){let w=eZ1(W,O),E=`${JSON.stringify(L,null,2)}
|
|
2890
|
-
`,j=await Z.createBlob(E);await ac$(Z.owner,Z.repo,j,E);let z=w[0]??`${oA0(Q)}/${nZ1(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 eZ1(W,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(K.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}=aa(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:xH6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof u4&&O.status===422)||Y>=vH6-1)throw O;await L$(oZ(2000,200,Y,2,0.5))}}}function xH6($){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 cm0(Q,$.deps.coAuthor)}var vH6=3,Y71;var Ol$=D(()=>{IO0();lA0();K4();_D();rA0();Y71=new Map});import{createHmac as Dl$,randomBytes as yH6,timingSafeEqual as gH6}from"crypto";function Ll$(){if(XT0)return XT0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return XT0=$?Buffer.from($):yH6(32),XT0}function G71($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+hH6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Dl$("sha256",Ll$()).update(Q).digest("base64url");return`${Q}.${Y}`}function wl$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Dl$("sha256",Ll$()).update(Q).digest("base64url"));if(Y.length!==G.length||!gH6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"base64url").toString())}catch{return!1}let K=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>=K}var hH6=21600000,XT0=null;var El$=D(()=>{R$()});import{z as hu}from"zod";function cH6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&uH6.test($)}function Tl$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Qs($){let Z=$.get("decofileScope");return uA0($.var.studioContext,Z.organizationId,Z.githubRepo)}function Ys($,Z){if(Z instanceof u4){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 Rl$(){let $=new H1;return $.use("/:virtualMcpId/:branch",Al$),$.use("/:virtualMcpId/:branch/*",Al$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Qs(Z),Y=await sc$(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=G71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Tl$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return Ys(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 Qs(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 Ys(Z,Y)}}),$.patch("/:virtualMcpId/:branch",dH6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=mH6.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{cA0(J)}catch(K){let W=K instanceof Error?K.message:String(K);return Z.json({error:W},400)}for(let[J,K]of Object.entries(G.set??{}))if(typeof K!=="object"||K===null||Array.isArray(K))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await Qs(Z),K=await Bl$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:vu(Q)},G),W=G71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:K,token:W,apiHost:Tl$(Z)})}catch(J){return Ys(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Qs(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(K){if(!(K instanceof u4&&K.status===409))throw K;await eA0(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 u4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof u4&&J.status===405){let W=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:W.number,url:W.html_url})}throw J}}catch(Q){return Ys(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Qs(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});try{let{aheadBy:G,behindBy:J}=await Q.compare(Y,X.branch);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J})}catch(G){if(G instanceof u4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});throw G}}catch(Q){return Ys(Z,Q)}}),$}var uH6,jl$=500,zl$=1048576,Pl$=1024,lH6=8388608,dH6,mH6,Al$;var Il$=D(()=>{lA0();U8();NF();xZ1();hA0();X71();pZ1();Ol$();El$();Z71();_D();rA0();uH6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;dH6=p5({maxSize:lH6,onError:($)=>$.json({error:"Payload too large"},413)}),mH6=hu.object({set:hu.record(hu.string(),hu.unknown()).optional(),delete:hu.array(hu.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)<=jl$,{message:`Patch cannot touch more than ${jl$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=zl$),{message:`Each block must be at most ${zl$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Pl$),{message:`Each block key must be at most ${Pl$} characters`}),Al$=gA0(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(!cH6(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||!wl$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let K=await X.storage.virtualMcps.findById(Y);if(!K||K.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let W=K.metadata??null;if(!SO0(W))return $.json({error:"Project has no preview server configured"},404);let H=K.connections?.map((B)=>B.connection_id)??[],N=Zs(W,H);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=W?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var ql$=($)=>{let Z=new H1;if(Z.use("*",d_),Z.route("/",ZA0()),Z.route("/",ly$()),Z.route("/",tu$()),Z.route("/",iu$()),Z.route("/",bA0()),Z.route("/tools",Zc$()),Z.route("/",su$()),Z.route("/",Ru$({kvStorage:$.kvStorage})),Z.route("/",Au$()),Z.route("/fs",gu$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Nl$()),Z.route("/decofile",Rl$()),Z.route("/",lu$()),Z.route("/deco-sites",QA0()),Z.route("/sso",oP0()),Z.route("/",xA0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",fy$()),$.mountDevAssets)Z.route("/dev-assets",YA0({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("/",Zb$()),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",uu$()),Z.route("/mcp",Jw0()),Z.route("/mcp/self",fA0()),Z.route("/mcp",Fw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Ml$=D(()=>{U8();Y91();by$();W91();GA0();Ta();X91();Tu$();Iu$();hu$();Ct();r51();Hw0();VZ1();cu$();du$();pu$();ou$();eu$();CZ1();Xc$();_Z1();Kw0();Ul$();Il$()});function iH6($){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 pH6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},kl$=()=>{let $=new H1;return $.use("*",pH6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await iZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:iH6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Vl$=D(()=>{U8();R$();$P0()});import{z as M1}from"zod";function LF($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function XN6($){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 QN6($,Z,X){try{return JSON.parse($)}catch{throw new _l$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function YN6($){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:QN6(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 GN6($){let Z=$.map((X)=>{let Q=X.function.parameters?lY(X.function.parameters):lY({type:"object",properties:{}});return[X.function.name,I$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function JN6($){if(!$)return;return{openai:{response_format:$}}}function KN6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Sl$($,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 Cl$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var nH6=256,tH6,oH6,rH6,aH6,sH6,eH6,$N6,ZN6,_l$,vl$,fl$;var bl$=D(()=>{D4();U8();_u();ON();tH6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),oH6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),rH6=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(oH6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),aH6=M1.object({type:M1.literal("text")}),sH6=M1.object({type:M1.literal("json_object")}),eH6=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()})}),$N6=M1.union([aH6,sH6,eH6]),ZN6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(rH6),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(tH6).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:$N6.optional(),user:M1.string().optional()});_l$=class _l$ extends Error{constructor($){super($);this.name="MessageConversionError"}};vl$=new H1;vl$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(LF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(LF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(LF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=ZN6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(LF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=XN6(G.model);if(!J)return $.json(LF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:K}=J,{modelId:W}=J;if(!K){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>oL(j.providerId));if(!E)return $.json(LF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);K=E.id}let F;try{F=await Z.aiProviders.activate(K,Z.organization.id)}catch{return $.json(LF(`AI provider credential not found or inaccessible: ${K}`,"invalid_request_error","model"),404)}let H=F.aiSdk.languageModel(W),N=YN6(G.messages),U=G.tools?GN6(G.tools):void 0,B=JN6(G.response_format),O=KN6(),L=Math.floor(Date.now()/1000);if(G.stream)return fN($,async(w)=>{let E=Sl$(H,N,U,G,B,$.req.raw.signal);try{let j=FO(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>=nH6)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:Cl$(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=Sl$(H,N,U,G,B,$.req.raw.signal),E=await KO(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:Cl$(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(LF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(LF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(LF(Y.message,"server_error"),500)}});fl$=vl$});function WN6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function xl$(){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(!nG(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(),K=[];for(let F of J){if(!F.slug||F7(F))continue;let H=await X.storage.virtualMcps.list(F.id);for(let N of H){if(fs1(N)!==G)continue;if(!WN6(N.metadata))continue;K.push({orgSlug:F.slug,orgName:F.name??F.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let W={matches:K};return Z.json(W)}),$}var yl$=D(()=>{U8();tB()});var hl$;var gl$=D(()=>{hl$={name:"decocms",version:"4.278.4",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 NN6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??HN6}}var ul$,HN6="https://ph.studio.decocms.com",cl$;var ll$=D(()=>{U8();k50();TC();$9();R$();c51();gl$();ul$=new H1;ul$.get("/",($)=>{let Z={version:hl$.version,theme:Qi1(),...wH().logo&&{logo:wH().logo},...$N()&&{internalUrl:fC1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:ix$(),posthog:NN6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:Us()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});cl$=ul$});function uu($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function J71($){return(uu($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function ml$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(uu($))}&sz=${Z}`}function dl$($,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 il$($){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.`,K=Y?.trim()?dl$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):dl$(`How does ${X} really perform? ${J}`,200);return{title:G,description:K}}import{z as l0}from"zod";var Xv,UN6,BN6,ON6,DN6,pl$;var nl$=D(()=>{Xv=l0.enum(["good","bad","neutral"]),UN6=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:Xv.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.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 $})),BN6=l0.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},l0.array(UN6)),ON6={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},DN6=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:Xv.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:Xv.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:Xv.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:Xv.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(BN6).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:Xv.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:Xv.optional()})).min(1)})]),pl$=l0.object({...ON6,template:DN6})});function QT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=pl$.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 K71=D(()=>{nl$()});import{join as tl$}from"path";async function wN6($){try{let Z=await fetch(`${GW({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(LN6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=QT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((K)=>K.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||J71($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function BG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function EN6($,Z){let X=uu($),Q=Z?.brand?.trim()||J71(X),Y=ml$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:K,description:W}=il$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),F=`${J}/og.png`,H=`${Q} commerce report by decocms`;return[`<title>${BG(K)}</title>`,`<meta name="description" content="${BG(W)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${BG(K)}" />`,`<meta property="og:description" content="${BG(W)}" />`,`<meta property="og:url" content="${BG(J)}" />`,`<meta property="og:image" content="${BG(F)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${BG(H)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${BG(K)}" />`,`<meta name="twitter:description" content="${BG(W)}" />`,`<meta name="twitter:image" content="${BG(F)}" />`,`<meta name="twitter:image:alt" content="${BG(H)}" />`,`<link rel="canonical" href="${BG(J)}" />`,`<link rel="icon" href="${BG(Y)}" sizes="any" />`].join(`
|
|
2890
|
+
`,j=await Z.createBlob(E);await ac$(Z.owner,Z.repo,j,E);let z=w[0]??`${oA0(Q)}/${nZ1(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 eZ1(W,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(K.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}=aa(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:xH6($),treeSha:U,parentShas:[G]});try{return await Z.updateRef(X,B),B}catch(O){if(!(O instanceof u4&&O.status===422)||Y>=vH6-1)throw O;await L$(oZ(2000,200,Y,2,0.5))}}}function xH6($){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 cm0(Q,$.deps.coAuthor)}var vH6=3,Y71;var Ol$=D(()=>{IO0();lA0();K4();_D();rA0();Y71=new Map});import{createHmac as Dl$,randomBytes as yH6,timingSafeEqual as gH6}from"crypto";function Ll$(){if(XT0)return XT0;let $;try{let Z=b0();$=Z.studioJwtSecret??Z.betterAuthSecret}catch{$=void 0}return XT0=$?Buffer.from($):yH6(32),XT0}function G71($){let Z=$.nowMs??Date.now(),X={o:$.organizationId,m:$.virtualMcpId,b:$.branch,e:Math.floor((Z+hH6)/1000)},Q=Buffer.from(JSON.stringify(X)).toString("base64url"),Y=Dl$("sha256",Ll$()).update(Q).digest("base64url");return`${Q}.${Y}`}function wl$($,Z){let X=$.indexOf(".");if(X<0)return!1;let Q=$.slice(0,X),Y=Buffer.from($.slice(X+1)),G=Buffer.from(Dl$("sha256",Ll$()).update(Q).digest("base64url"));if(Y.length!==G.length||!gH6(Y,G))return!1;let J;try{J=JSON.parse(Buffer.from(Q,"base64url").toString())}catch{return!1}let K=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>=K}var hH6=21600000,XT0=null;var El$=D(()=>{R$()});import{z as hu}from"zod";function cH6($){return $.length>0&&$.length<=255&&!$.includes("..")&&!$.endsWith("/")&&!$.endsWith(".lock")&&uH6.test($)}function Tl$($){return $.req.header("x-forwarded-host")??new URL($.req.url).host}async function Qs($){let Z=$.get("decofileScope");return uA0($.var.studioContext,Z.organizationId,Z.githubRepo)}function Ys($,Z){if(Z instanceof u4){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 Rl$(){let $=new H1;return $.use("/:virtualMcpId/:branch",Al$),$.use("/:virtualMcpId/:branch/*",Al$),$.get("/:virtualMcpId/:branch",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Qs(Z),Y=await sc$(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=G71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.body(`{"version":${JSON.stringify(Y.sha)},"token":${JSON.stringify(J)},"apiHost":${JSON.stringify(Tl$(Z))},"decofile":${Y.decofile}}`,200,{...G,"content-type":"application/json"})}catch(Q){return Ys(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 Qs(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 Ys(Z,Y)}}),$.patch("/:virtualMcpId/:branch",dH6,async(Z)=>{let X=Z.get("decofileScope"),Q=Z.var.studioContext,Y=mH6.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{cA0(J)}catch(K){let W=K instanceof Error?K.message:String(K);return Z.json({error:W},400)}for(let[J,K]of Object.entries(G.set??{}))if(typeof K!=="object"||K===null||Array.isArray(K))return Z.json({error:`Block "${J}" must be a JSON object`},400);try{let J=await Qs(Z),K=await Bl$(`${X.organizationId}/${X.virtualMcpId}/${X.branch}`,{client:J,branch:X.branch,packagePath:X.packagePath,coAuthor:vu(Q)},G),W=G71({organizationId:X.organizationId,virtualMcpId:X.virtualMcpId,branch:X.branch});return Z.json({version:K,token:W,apiHost:Tl$(Z)})}catch(J){return Ys(Z,J)}}),$.post("/:virtualMcpId/:branch/publish",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Qs(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(K){if(!(K instanceof u4&&K.status===409))throw K;await eA0(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 u4&&J.status===409)return Z.json({error:"merge-conflict"},409);if(J instanceof u4&&J.status===405){let W=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:W.number,url:W.html_url})}throw J}}catch(Q){return Ys(Z,Q)}}),$.get("/:virtualMcpId/:branch/status",async(Z)=>{let X=Z.get("decofileScope");try{let Q=await Qs(Z),Y=await Q.getDefaultBranch();if(Y===X.branch)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});try{let{aheadBy:G,behindBy:J}=await Q.compare(Y,X.branch);return Z.json({baseBranch:Y,aheadBy:G,behindBy:J})}catch(G){if(G instanceof u4&&G.status===404)return Z.json({baseBranch:Y,aheadBy:0,behindBy:0});throw G}}catch(Q){return Ys(Z,Q)}}),$}var uH6,jl$=500,zl$=1048576,Pl$=1024,lH6=8388608,dH6,mH6,Al$;var Il$=D(()=>{lA0();U8();NF();xZ1();hA0();X71();pZ1();Ol$();El$();Z71();_D();rA0();uH6=/^[a-zA-Z0-9][a-zA-Z0-9/._-]*$/;dH6=p5({maxSize:lH6,onError:($)=>$.json({error:"Payload too large"},413)}),mH6=hu.object({set:hu.record(hu.string(),hu.unknown()).optional(),delete:hu.array(hu.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)<=jl$,{message:`Patch cannot touch more than ${jl$} blocks`}).refine(($)=>Object.values($.set??{}).every((Z)=>JSON.stringify(Z).length<=zl$),{message:`Each block must be at most ${zl$} bytes`}).refine(($)=>[...Object.keys($.set??{}),...$.delete??[]].every((Z)=>Z.length<=Pl$),{message:`Each block key must be at most ${Pl$} characters`}),Al$=gA0(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(!cH6(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||!wl$(B,{organizationId:Q.id,virtualMcpId:Y,branch:G}))return $.json({error:"Unauthorized"},401)}let K=await X.storage.virtualMcps.findById(Y);if(!K||K.organization_id!==Q.id)return $.json({error:"Virtual MCP not found"},404);let W=K.metadata??null;if(!SO0(W))return $.json({error:"Project has no preview server configured"},404);let H=K.connections?.map((B)=>B.connection_id)??[],N=Zs(W,H);if(!N)return $.json({error:"Project has no GitHub repository"},404);let U=W?.runtime;return $.set("decofileScope",{organizationId:Q.id,virtualMcpId:Y,branch:G,packagePath:U?.path?.replace(/^\/+|\/+$/g,"")||null,githubRepo:N,userId:J}),Z()})});var ql$=($)=>{let Z=new H1;if(Z.use("*",d_),Z.route("/",ZA0()),Z.route("/",ly$()),Z.route("/",tu$()),Z.route("/",iu$()),Z.route("/",bA0()),Z.route("/tools",Zc$()),Z.route("/",su$()),Z.route("/",Ru$({kvStorage:$.kvStorage})),Z.route("/",Au$()),Z.route("/fs",gu$({getConnection:$.getNatsConnection})),Z.route("/sandbox",Nl$()),Z.route("/decofile",Rl$()),Z.route("/",lu$()),Z.route("/deco-sites",QA0()),Z.route("/sso",oP0()),Z.route("/",xA0({tokenStorage:$.tokenStorage,automationEventDispatcher:$.automationEventDispatcher})),Z.route("/webhooks",fy$()),$.mountDevAssets)Z.route("/dev-assets",YA0({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("/",Zb$()),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",uu$()),Z.route("/mcp",Jw0()),Z.route("/mcp/self",fA0()),Z.route("/mcp",Fw0()),Z.all("/oauth-proxy/:connectionId/*",$.oauthProxyHandler),Z.get("/watch",$.watchHandler),Z};var Ml$=D(()=>{U8();Y91();by$();W91();GA0();Ta();X91();Tu$();Iu$();hu$();Ct();r51();Hw0();VZ1();cu$();du$();pu$();ou$();eu$();CZ1();Xc$();_Z1();Kw0();Ul$();Il$()});function iH6($){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 pH6=async($,Z)=>{if(!$.get("studioContext").auth.user?.id)return $.json({error:"Unauthorized"},401);return Z()},kl$=()=>{let $=new H1;return $.use("*",pH6),$.get("/",async(Z)=>{let X=b0(),Q=X.decoSupabaseUrl,Y=X.decoSupabaseServiceKey;if(!Q||!Y)return Z.json({apps:[]});try{let G=await iZ(Q,Y,"apps?select=name,title,description,logo,category,vendors(alias,url)");return Z.json({apps:iH6(G)})}catch(G){return console.error("[deco-apps] GET error:",G),Z.json({error:"Failed to fetch apps"},502)}}),$};var Vl$=D(()=>{U8();R$();$P0()});import{z as M1}from"zod";function LF($,Z="invalid_request_error",X=null,Q=null){return{error:{message:$,type:Z,param:X,code:Q}}}function XN6($){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 QN6($,Z,X){try{return JSON.parse($)}catch{throw new _l$(`Invalid JSON in tool call arguments for function '${X}' (tool_call_id: ${Z}): ${$}`)}}function YN6($){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:QN6(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 GN6($){let Z=$.map((X)=>{let Q=X.function.parameters?lY(X.function.parameters):lY({type:"object",properties:{}});return[X.function.name,I$({description:X.function.description,inputSchema:Q})]});return Object.fromEntries(Z)}function JN6($){if(!$)return;return{openai:{response_format:$}}}function KN6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}function Sl$($,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 Cl$($){if($==="tool-calls")return"tool_calls";if($==="length")return"length";return"stop"}var nH6=256,tH6,oH6,rH6,aH6,sH6,eH6,$N6,ZN6,_l$,vl$,fl$;var bl$=D(()=>{D4();U8();_u();ON();tH6=M1.object({type:M1.literal("function"),function:M1.object({name:M1.string(),description:M1.string().optional(),parameters:M1.record(M1.string(),M1.unknown()).optional()})}),oH6=M1.object({id:M1.string(),type:M1.literal("function"),function:M1.object({name:M1.string(),arguments:M1.string()})}),rH6=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(oH6).optional()}),M1.object({role:M1.literal("tool"),content:M1.string(),tool_call_id:M1.string()})]),aH6=M1.object({type:M1.literal("text")}),sH6=M1.object({type:M1.literal("json_object")}),eH6=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()})}),$N6=M1.union([aH6,sH6,eH6]),ZN6=M1.object({model:M1.string().describe("Format: 'model_id' or 'credential_id:model_id'"),messages:M1.array(rH6),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(tH6).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:$N6.optional(),user:M1.string().optional()});_l$=class _l$ extends Error{constructor($){super($);this.name="MessageConversionError"}};vl$=new H1;vl$.post("/:org/v1/chat/completions",async($)=>{let Z=$.get("studioContext"),X=$.req.param("org");try{if(!Z.auth.apiKey?.id)return $.json(LF("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Z.organization)return $.json(LF("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Z.organization.slug??Z.organization.id)!==X)return $.json(LF("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let Q=await $.req.json(),Y=ZN6.safeParse(Q);if(!Y.success){let w=Y.error.issues[0]??{message:"Invalid request",path:[]};return $.json(LF(`Invalid request: ${w.message}`,"invalid_request_error",w.path.length>0?w.path.join("."):null),400)}let G=Y.data,J=XN6(G.model);if(!J)return $.json(LF("Invalid model format. Expected 'model_id' or 'credential_id:model_id' (e.g., 'claude-sonnet-4-6' or 'key_abc123:claude-sonnet-4-6')","invalid_request_error","model"),400);let{credentialId:K}=J,{modelId:W}=J;if(!K){let E=(await Z.storage.aiProviderKeys.list({organizationId:Z.organization.id})).find((j)=>oL(j.providerId));if(!E)return $.json(LF("No AI provider credentials configured for this organization. Add a credential in settings or specify one explicitly via 'credential_id:model_id'.","invalid_request_error","model"),400);K=E.id}let F;try{F=await Z.aiProviders.activate(K,Z.organization.id)}catch{return $.json(LF(`AI provider credential not found or inaccessible: ${K}`,"invalid_request_error","model"),404)}let H=F.aiSdk.languageModel(W),N=YN6(G.messages),U=G.tools?GN6(G.tools):void 0,B=JN6(G.response_format),O=KN6(),L=Math.floor(Date.now()/1000);if(G.stream)return fN($,async(w)=>{let E=Sl$(H,N,U,G,B,$.req.raw.signal);try{let j=FO(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>=nH6)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:Cl$(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=Sl$(H,N,U,G,B,$.req.raw.signal),E=await KO(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:Cl$(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(LF("Request aborted","invalid_request_error"),400);if(Y.name==="MessageConversionError")return $.json(LF(Y.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",Y.message,Y.stack),$.json(LF(Y.message,"server_error"),500)}});fl$=vl$});function WN6($){if(typeof $!=="object"||$===null)return!1;let X=$.githubRepo?.url;return typeof X==="string"&&X.length>0}function xl$(){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(!nG(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(),K=[];for(let F of J){if(!F.slug||F7(F))continue;let H=await X.storage.virtualMcps.list(F.id);for(let N of H){if(fs1(N)!==G)continue;if(!WN6(N.metadata))continue;K.push({orgSlug:F.slug,orgName:F.name??F.slug,project:{id:N.id,title:N.title,icon:N.icon??null}})}}let W={matches:K};return Z.json(W)}),$}var yl$=D(()=>{U8();tB()});var hl$;var gl$=D(()=>{hl$={name:"decocms",version:"4.278.5",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 NN6(){let $=process.env.POSTHOG_KEY;if(!$)return null;return{key:$,host:process.env.POSTHOG_HOST??HN6}}var ul$,HN6="https://ph.studio.decocms.com",cl$;var ll$=D(()=>{U8();k50();TC();$9();R$();c51();gl$();ul$=new H1;ul$.get("/",($)=>{let Z={version:hl$.version,theme:Qi1(),...wH().logo&&{logo:wH().logo},...$N()&&{internalUrl:fC1()},...b0().enableDecoImport&&{enableDecoImport:!0},brandExtractEnabled:!!b0().firecrawlApiKey,auth:ix$(),posthog:NN6(),googleMapsApiKey:process.env.GOOGLE_MAPS_API_KEY?.trim()||null,runtime:{agentSandbox:Us()}};return $.header("Cache-Control","no-store"),$.json({success:!0,config:Z})});cl$=ul$});function uu($){let Z=($??"").trim().toLowerCase();return Z=Z.replace(/^https?:\/\//,""),Z=Z.replace(/^www\./,""),Z=Z.split(/[/?#]/)[0]??"",Z.replace(/\/+$/,"")}function J71($){return(uu($).split(".")[0]||$).replace(/[-_]/g," ").split(" ").filter(Boolean).map((X)=>X.charAt(0).toUpperCase()+X.slice(1)).join(" ")}function ml$($,Z=64){return`https://www.google.com/s2/favicons?domain=${encodeURIComponent(uu($))}&sz=${Z}`}function dl$($,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 il$($){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.`,K=Y?.trim()?dl$(`${Y.trim().replace(/\s+/g," ")} \u2014 ${J}`,200):dl$(`How does ${X} really perform? ${J}`,200);return{title:G,description:K}}import{z as l0}from"zod";var Xv,UN6,BN6,ON6,DN6,pl$;var nl$=D(()=>{Xv=l0.enum(["good","bad","neutral"]),UN6=l0.preprocess(($)=>{if(Array.isArray($))return{kind:"text",value:$.find((X)=>X!==null&&typeof X!=="object")??""};return $!==null&&typeof $==="object"?$:{kind:"text",value:$}},l0.object({kind:l0.enum(["text","number","sparkline","badge","score"]).catch("text"),value:l0.coerce.string().optional(),tone:Xv.optional(),muted:l0.boolean().optional(),delta:l0.coerce.string().optional(),deltaDir:l0.enum(["up","down","neutral"]).optional(),points:l0.array(l0.coerce.number()).optional(),label:l0.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 $})),BN6=l0.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},l0.array(UN6)),ON6={key:l0.coerce.string(),title:l0.coerce.string(),eyebrow:l0.coerce.string().optional(),headline:l0.coerce.string(),annotation:l0.coerce.string().optional(),methodology:l0.coerce.string().optional(),sources:l0.array(l0.object({name:l0.coerce.string(),logoUrl:l0.coerce.string()})).optional()},DN6=l0.discriminatedUnion("template",[l0.object({template:l0.literal("cover"),score:l0.object({value:l0.coerce.number(),max:l0.coerce.number().optional(),grade:l0.coerce.string().optional(),label:l0.coerce.string().optional()}).optional(),brandImage:l0.coerce.string().optional(),screenshot:l0.coerce.string().optional(),mobileScreenshot:l0.coerce.string().optional()}),l0.object({template:l0.literal("cta"),ctaUrl:l0.coerce.string().optional(),ctaLabel:l0.coerce.string().optional(),bullets:l0.array(l0.coerce.string()).optional()}),l0.object({template:l0.literal("series"),points:l0.array(l0.coerce.number()).min(2),xLabels:l0.array(l0.coerce.string()).min(1),unit:l0.coerce.string().optional(),callout:l0.object({index:l0.coerce.number(),value:l0.coerce.string(),tone:Xv.optional()})}),l0.object({template:l0.literal("threshold"),value:l0.coerce.string().default(""),metricLabel:l0.coerce.string().optional(),ratio:l0.coerce.number(),thresholdRatio:l0.coerce.number().optional(),thresholdLabel:l0.coerce.string().default(""),tone:Xv.optional()}),l0.object({template:l0.literal("stats"),stats:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),tone:Xv.optional()})).min(1)}),l0.object({template:l0.literal("bars"),items:l0.array(l0.object({value:l0.coerce.string(),label:l0.coerce.string(),ratio:l0.coerce.number(),tone:Xv.optional()})).min(1)}),l0.object({template:l0.literal("gauges"),gauges:l0.array(l0.object({label:l0.coerce.string(),value:l0.coerce.string(),status:l0.enum(["good","warn","bad"]).catch("warn"),caption:l0.coerce.string().optional(),ratio:l0.coerce.number().optional()})).min(1)}),l0.object({template:l0.literal("checklist"),checks:l0.array(l0.object({label:l0.coerce.string(),status:l0.enum(["pass","fail","warn"]).catch("fail"),value:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("table"),columns:l0.array(l0.object({label:l0.coerce.string(),align:l0.enum(["left","right"]).optional()})).min(1),rows:l0.array(BN6).min(1),highlightRow:l0.coerce.number().optional()}),l0.object({template:l0.literal("products"),products:l0.array(l0.object({name:l0.coerce.string(),price:l0.coerce.string().optional(),image:l0.coerce.string().optional(),url:l0.coerce.string().optional()})).min(1)}),l0.object({template:l0.literal("list"),entries:l0.array(l0.object({label:l0.coerce.string(),severity:l0.enum(["error","warning","notice"]).catch("notice")})).min(1),moreCount:l0.coerce.number().optional()}),l0.object({template:l0.literal("keywords"),volumeLabel:l0.coerce.string().optional(),keywords:l0.array(l0.object({term:l0.coerce.string(),volume:l0.coerce.string(),position:l0.coerce.number().catch(0)})).min(1)}),l0.object({template:l0.literal("competitor"),metricLabel:l0.coerce.string().optional(),competitors:l0.array(l0.object({name:l0.coerce.string(),value:l0.coerce.string(),tone:Xv.optional(),isYou:l0.boolean().optional()})).min(1)}),l0.object({template:l0.literal("scorecard"),rivalLabel:l0.coerce.string().optional(),dimensions:l0.array(l0.object({label:l0.coerce.string(),you:l0.coerce.string(),rival:l0.coerce.string().optional(),rivalName:l0.coerce.string().optional(),tone:Xv.optional()})).min(1)})]),pl$=l0.object({...ON6,template:DN6})});function QT0($){let Z=[],X=[...$.sections].sort((Y,G)=>Y.position-G.position).map((Y)=>{let G=pl$.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 K71=D(()=>{nl$()});import{join as tl$}from"path";async function wN6($){try{let Z=await fetch(`${GW({})}/api/v2/public/diagnostics/${encodeURIComponent($)}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(LN6)});if(!Z.ok)return null;let X=await Z.json(),{deck:Q}=QT0(X);if(!Q.slides.length)return null;let Y=Q.slides.find((K)=>K.template.template==="cover"),G=Y?.template,J=G&&G.template==="cover"?G:void 0;return{brand:Q.meta.brand?.trim()||J71($),score:Q.meta.scores?.cover??J?.score?.value,verdict:Y?.annotation?.trim()||Y?.headline?.trim()||void 0}}catch{return null}}function BG($){return $.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function EN6($,Z){let X=uu($),Q=Z?.brand?.trim()||J71(X),Y=ml$(X,128),J=`${(b0().baseUrl??"https://studio.decocms.com").replace(/\/+$/,"")}/report/${encodeURIComponent(X)}`,{title:K,description:W}=il$({brand:Q,domain:X,score:Z?.score,verdict:Z?.verdict}),F=`${J}/og.png`,H=`${Q} commerce report by decocms`;return[`<title>${BG(K)}</title>`,`<meta name="description" content="${BG(W)}" />`,'<meta name="robots" content="noindex, follow" />','<meta property="og:type" content="website" />','<meta property="og:site_name" content="decocms" />',`<meta property="og:title" content="${BG(K)}" />`,`<meta property="og:description" content="${BG(W)}" />`,`<meta property="og:url" content="${BG(J)}" />`,`<meta property="og:image" content="${BG(F)}" />`,'<meta property="og:image:width" content="1200" />','<meta property="og:image:height" content="630" />',`<meta property="og:image:alt" content="${BG(H)}" />`,'<meta name="twitter:card" content="summary_large_image" />',`<meta name="twitter:title" content="${BG(K)}" />`,`<meta name="twitter:description" content="${BG(W)}" />`,`<meta name="twitter:image" content="${BG(F)}" />`,`<meta name="twitter:image:alt" content="${BG(H)}" />`,`<link rel="canonical" href="${BG(J)}" />`,`<link rel="icon" href="${BG(Y)}" sizes="any" />`].join(`
|
|
2891
2891
|
`)}function jN6($,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}
|
|
2892
2892
|
</head>`)}function ol$($){let Z=new H1;return Z.get("/:domain/og.png",async(X)=>{let Q=uu(X.req.param("domain")),Y=async()=>{let G=$?Bun.file(tl$($,"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(`${GW({})}/api/v2/public/diagnostics/${encodeURIComponent(Q)}/og.png`,{signal:AbortSignal.timeout(zN6)}),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=$?tl$($,"index.html"):null,G=Y?Bun.file(Y):null;if(!G||!await G.exists())return X.notFound();let J=await G.text();try{let K=await wN6(uu(Q)),W=EN6(Q,K);return X.html(jN6(J,W),200,{"Cache-Control":"public, max-age=0, s-maxage=300"})}catch{return X.html(J)}}),Z}var LN6=2500,zN6=1e4;var rl$=D(()=>{U8();K71();ew();R$()});function Gs($,Z){return fetch(`${GW({})}${$}`,Z)}async function PN6($,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 Gs(`/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:K,drops:W}=QT0(J);return{status:K.slides.length?"ready":"empty",deck:K,scanned_at:J.scanned_at,drops:W}}var AN6,xN,al$=async($,Z)=>{if(!$.get("reportUser"))return $.json({error:"Authentication required"},401);await Z();return},sl$;var el$=D(()=>{U8();gY();ew();K71();AN6=new Set(["complete","errored","terminated","unknown"]),xN=new H1;xN.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});xN.use("/link-token/*",al$);xN.use("/suggest",al$);xN.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 PN6(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)}});xN.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 Gs("/api/v2/diagnostics/run",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${sw({})}`},body:JSON.stringify({url:Q,...Y?{email:Y}:{},distinct_id:G})});if(!J.ok)return $.json({error:`run HTTP ${J.status}`},502);let K=await J.json(),W=K.blocked?{state:"blocked"}:K.status==="fresh"?{state:"fresh"}:K.mode==="sync"?{state:"sync"}:{state:"running",id:K.id??null};return $.json(W)}catch{return $.json({error:"run failed"},502)}});xN.get("/status",async($)=>{let Z=$.req.query("id");if(!Z)return $.json({error:"id is required"},400);try{let X=await Gs(`/api/v2/diagnostics/status?id=${encodeURIComponent(Z)}`,{headers:{Authorization:`Bearer ${sw({})}`}});if(!X.ok)return $.json({error:`status HTTP ${X.status}`},502);let Y=(await X.json()).status??"unknown",G={done:AN6.has(Y),status:Y};return $.json(G)}catch{return $.json({error:"status failed"},502)}});xN.get("/link-token/:id",async($)=>{let Z=$.req.param("id");try{let X=await Gs(`/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)}});xN.get("/suggest",async($)=>{let Z=($.req.query("q")??"").trim().slice(0,64);if(Z.length<2)return $.json({suggestions:[]});try{let X=await Gs(`/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:[]})}});sl$=xN});import{createHmac as TN6,timingSafeEqual as RN6}from"crypto";function Zd$($,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)>IN6)return!1;let K=TN6("sha256",X).update(`${Y}.${$}`).digest("hex"),W=Buffer.from(K,"hex");return G.some((F)=>{let H=Buffer.from(F,"hex");return W.length===H.length&&RN6(W,H)})}function Xd$($){let Z;try{Z=JSON.parse($)}catch{return null}let X=vJ(Z),Q=vJ(vJ(X?.data)?.object);if(!X||typeof X.type!=="string"||!Q)return null;return{id:wF(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 Qd$($){switch($){case"active":case"trialing":return"active";case"past_due":return"past_due";default:return"canceled"}}function wF($){return typeof $==="string"?$:void 0}function vJ($){return typeof $==="object"&&$!==null?$:void 0}function YT0($){return typeof $==="number"?new Date($*1000):null}function H71($){return wF($)??wF(vJ($)?.id)}function qN6($){return H71($.subscription)??wF(vJ(vJ($.parent)?.subscription_details)?.subscription)}function MN6($){let Z=YT0($.current_period_end);if(Z)return Z;let X=vJ($.items)?.data;if(!Array.isArray(X))return null;let Q=0;for(let Y of X){let G=vJ(Y)?.current_period_end;if(typeof G==="number"&&G>Q)Q=G}return Q>0?new Date(Q*1000):null}function W71($,Z){let X=YT0($.created);return!!X&&!!Z.lastStripeEventAt&&X<Z.lastStripeEventAt}function F71($,Z){let X=YT0($.created);if(!X)return;return Z.lastStripeEventAt&&Z.lastStripeEventAt>X?void 0:X}async function kN6($,Z){let X=Z.data.object;switch(Z.type){case"checkout.session.completed":case"checkout.session.async_payment_succeeded":{let Q=wF(vJ(X.metadata)?.orgId);if(!Q)return{handled:!1,reason:"no orgId"};if(wF(vJ(X.metadata)?.kind)==="topup"){if(X.mode!=="payment")return{handled:!1,reason:"topup with wrong mode"};if(wF(X.payment_status)!=="paid")return{handled:!1,reason:"payment not confirmed"};let J=wF(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 K=Number(vJ(X.metadata)?.creditCents);if(!Number.isInteger(K)||K<=0)return console.error("stripe webhook: paid topup with bad metadata \u2014 credit NOT applied",{eventId:Z.id,organizationId:Q,creditCents:vJ(X.metadata)?.creditCents}),{handled:!1,reason:"bad topup metadata"};return{handled:!0,organizationId:Q,topUp:{creditCents:K,referenceId:`stripe-topup:${J}`}}}if(X.mode!=="subscription")return{handled:!1,reason:"not a subscription checkout"};if(wF(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=H71(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(W71(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Q,{stripeCustomerId:H71(X.customer),stripeSubscriptionId:G,status:"active",lastStripeEventAt:F71(Z,Y)}),{handled:!0,organizationId:Q}}case"customer.subscription.updated":case"customer.subscription.deleted":{let Q=wF(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&&W71(Z,Y))return{handled:!1,reason:"stale event"};let J=G?"canceled":Qd$(X.status);return await $.updateStripeState(Y.organizationId,{status:J,currentPeriodEnd:MN6(X),...G&&{stripeSubscriptionId:null},lastStripeEventAt:F71(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}case"invoice.paid":{let Q=qN6(X);if(!Q)return{handled:!1,reason:"no sub id"};let Y=await $.getBillingByStripeSubscriptionId(Q);if(!Y)return{handled:!1,reason:"unknown subscription"};if(W71(Z,Y))return{handled:!1,reason:"stale event"};return await $.updateStripeState(Y.organizationId,{status:"active",currentPeriodEnd:YT0(X.period_end),lastStripeEventAt:F71(Z,Y)}),{handled:!0,organizationId:Y.organizationId}}default:return{handled:!1,reason:`unhandled event ${Z.type}`}}}function VN6($,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:Qd$(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 $d$($,Z){let X=VN6($,Z);if(!X)return;vY({event:X.name,organizationId:X.organizationId,...$.id?{uuid:Nn1(`stripe:${$.id}:${X.name}`)}:{},...$.created?{timestamp:new Date($.created*1000)}:{},properties:X.properties})}async function Yd$($){let Z=new ZW(m8().db),X=await kN6(Z,$);if(!(X.handled&&X.topUp))$d$($,X);if(X.handled&&X.topUp)await TE$({organizationId:X.organizationId,amountCents:X.topUp.creditCents,referenceId:X.topUp.referenceId}),$d$($,X);if(!X.handled&&X.orphanSubscriptionId)try{await Se1(X.orphanSubscriptionId),console.error("stripe webhook: canceled orphan subscription",{subscriptionId:X.orphanSubscriptionId,eventId:$.id})}catch(Q){if(!(Q instanceof hY&&(Q.status===400||Q.status===404)))throw Q}return X}var IN6=300;var Gd$=D(()=>{cG();C4();K50();WE();P01()});var SN6=1048576,N71;var Jd$=D(()=>{U8();NF();R$();Gd$();N71=new H1;N71.post("/webhook",p5({maxSize:SN6,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(!Zd$(X,$.req.header("stripe-signature"),Z))return $.json({error:"invalid signature"},400);let Y=Xd$(X);if(!Y)return $.json({error:"invalid payload"},400);let G=await Yd$(Y);return console.log("stripe webhook",{eventId:Y.id,type:Y.type,livemode:Y.livemode,...G}),$.json({received:!0})})});import{timingSafeEqual as CN6}from"crypto";function vN6($,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 CN6(Buffer.from(Y),Buffer.from(Q))}var _N6=5242880,U71;var Kd$=D(()=>{U8();NF();h3();U71=new H1;U71.post("/webhook",p5({maxSize:_N6,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(!vN6(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 K=(await Pn0())?.markTenantPoolsDirty(G,Y)??[];return $.json({ok:!0,pools:K})})});function Wd$($,Z){if(Z.startsWith("text/html")||Z.startsWith("image/svg"))$.set("Content-Security-Policy","sandbox allow-scripts allow-modals allow-same-origin")}var Fd$,fN6,bN6,Hd$;var Nd$=D(()=>{U8();w3();Kg();dx();Fd$=new H1,fN6=["range","if-none-match","if-modified-since"],bN6=["content-type","content-length","content-range","accept-ranges","etag","last-modified"];Fd$.get("/:org/files/*",async($)=>{let Z=$.get("studioContext"),X=Z.organization?.id;if(!Z.auth?.user?.id){if(Bu($))return $.redirect(`/login?next=${encodeURIComponent($.req.path)}`,302);throw new $$(401,{message:"Authentication required"})}if(!X)throw new $$(401,{message:"Organization context required"});let Q=$.req.path.replace(/^.*\/files\//,"");if(!Q)throw new $$(400,{message:"Missing file key"});let Y=await Xt(Q,Z);if(!Y)throw new $$(503,{message:"Object storage not configured"});if(Y.startsWith("data:")&&iG()){let W=Y.match(/^data:([^;]+);base64,(.+)$/s);if(!W)throw new $$(500,{message:"Invalid data URL from storage"});let[,F,H]=W,N=Buffer.from(H,"base64"),U=new Headers({"Content-Type":F,"Cache-Control":"private, max-age=86400"});return Wd$(U,F),new Response(N,{status:200,headers:U})}let G=new Headers;for(let W of fN6){let F=$.req.header(W);if(F)G.set(W,F)}let J=await fetch(Y,{headers:G});if(J.status===403||J.status===404)throw new $$(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 $$(502,{message:"Upstream storage error"});let K=new Headers;for(let W of bN6){let F=J.headers.get(W);if(F)K.set(W,F)}return K.set("Cache-Control","private, max-age=86400"),Wd$(K,K.get("content-type")??""),new Response(J.body,{status:J.status,headers:K})});Hd$=Fd$});var Js=_((Qv)=>{var xN6=Qv&&Qv.__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]}),yN6=Qv&&Qv.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))xN6(Z,$,X)};Object.defineProperty(Qv,"__esModule",{value:!0});yN6(EY(),Qv)});var Od$=_((Ud$)=>{Object.defineProperty(Ud$,"__esModule",{value:!0});Ud$.version=void 0;Ud$.version="3.4.0"});var wd$=_((EF)=>{var gN6=EF&&EF.__importDefault||function($){return $&&$.__esModule?$:{default:$}};Object.defineProperty(EF,"__esModule",{value:!0});EF.NodeTransport=EF.VERSION=void 0;EF.nodeResolveHost=mN6;var a6=Js(),hN6=j0("net"),B71=j0("tls"),uN6=j0("path"),Dd$=j0("fs"),cN6=gN6(j0("dns")),lN6=Od$();EF.VERSION=lN6.version;var dN6="nats.js";class Ld${socket;version;lang;yields=[];signal=(0,a6.deferred)();closedNotification=(0,a6.deferred)();options;connected=!1;tlsName="";done=!1;closeError;constructor(){this.lang=dN6,this.version=EF.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,a6.checkOptions)(Y,Z);let{tls_required:G,tls_available:J}=Y,K=J===!0&&Z.tls!==null;if(!Q&&(G||K))this.socket=await this.startTLS();if(this.done)this.socket?.destroy();if(G&&this.socket.encrypted!==!0)throw a6.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 a6.errors.ConnectionError("error connecting - node provided an undefined error");let{code:J}=G,K=J==="ECONNREFUSED"?new a6.errors.ConnectionError("connection refused",{cause:G}):G;throw this.socket?.destroy(),K}}dial($){let Z=(0,a6.deferred)(),X,Q=(0,hN6.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,a6.deferred)(),Z;return this.socket.on("data",(X)=>{this.yields.push(X);let Q=a6.DataBuffer.concat(...this.yields),Y=(0,a6.extractProtocolMessage)(Q);if(Y!=="")try{let G=a6.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,a6.deferred)();try{if($=(0,uN6.resolve)($),!(0,Dd$.existsSync)($))Z.reject(Error(`${$} doesn't exist`));(0,Dd$.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 K=await this.loadFile(Z);if(K)$.cert=K}else if(X)$.cert=X;if(G){let K=await this.loadFile(G);if(K)$.key=K}else if(J)$.key=J;if(Q){let K=await this.loadFile(Q);if(K)$.ca=[K]}else if(Y)$.ca=Y;return Promise.resolve($)}catch(K){return Promise.reject(K)}}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,a6.extend)(X,this.options.tls,Y)}catch(Y){return Promise.reject(new a6.errors.ConnectionError(Y.message,{cause:Y}))}let Q=(0,a6.deferred)();try{let Y=(0,B71.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 a6.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,a6.extend)(Z,this.options.tls,Q)}catch(Q){return Promise.reject(new a6.errors.ConnectionError(Q.message,{cause:Q}))}let X=(0,a6.deferred)();try{let Q=(0,B71.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 a6.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,a6.render)($[Z])}`);yield $[Z]}if(this.done)break;else if(this.yields.length===0)$.length=0,this.yields=$,this.signal=(0,a6.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 B71.TLSSocket}_send($){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,a6.render)($)}`);let Z=(0,a6.deferred)();try{this.socket.write($,(X)=>{if(X){if(this.options.debug)console.error(`!!! ${(0,a6.render)($)}: ${X}`);return Z.reject(X)}return Z.resolve()})}catch(X){if(this.options.debug)console.error(`!!! ${(0,a6.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}}EF.NodeTransport=Ld$;function mN6($){let Z=(0,a6.deferred)();return cN6.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 Ad$=_((Pd$)=>{Object.defineProperty(Pd$,"__esModule",{value:!0});Pd$.connect=iN6;var Ed$=wd$(),jd$=Js(),zd$=Js();function iN6($={}){if((0,zd$.hasWsProtocol)($))return Promise.reject(zd$.errors.InvalidArgumentError.format("servers","node client doesn't support websockets, use the 'wsconnect' function instead"));return(0,jd$.setTransportFactory)({factory:()=>{return new Ed$.NodeTransport},dnsResolveFn:Ed$.nodeResolveHost}),jd$.NatsConnectionImpl.connect($)}});var Td$=_((yN)=>{var nN6=yN&&yN.__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]}),tN6=yN&&yN.__exportStar||function($,Z){for(var X in $)if(X!=="default"&&!Object.prototype.hasOwnProperty.call(Z,X))nN6(Z,$,X)};Object.defineProperty(yN,"__esModule",{value:!0});yN.connect=void 0;var oN6=Ad$();Object.defineProperty(yN,"connect",{enumerable:!0,get:function(){return oN6.connect}});tN6(Js(),yN)});function Md$($){let Z=$?.connectFn??eN6,X=null,Q=null,Y=!1,G=!1,J=!1,K=[];function W(){return X!==null&&!X.isClosed()&&!X.isDraining()&&!J}function F(){console.log(`[NatsProvider] fireReady: ${K.length} callbacks`);for(let U of K)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:sN6,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=oZ(aN6,rN6,O-1,2,0.5);await L$(L)}}return{init(U,B){if(Y)return;Y=!0,G=!1;let O=B?.creds?Rd$.credsAuthenticator(new TextEncoder().encode(B.creds)):void 0;N(U,O).catch(()=>{})},isConnected(){return W()},getConnection(){return W()?X:null},getJetStream(){if(!W())return null;if(!Q)Q=qd$.jetstream(X);return Q},onReady(U){if(K.push(U),W())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 eN6($){return Id$.connect($)}var Rd$,Id$,qd$,rN6=100,aN6=3000,sN6=3000;var kd$=D(()=>{K4();Rd$=V(Nc(),1),Id$=V(Td$(),1),qd$=V(XL(),1)});function O71($,Z){return`${$}.${Z}`}class D71{cache;constructor($){this.cache=th({ttlMs:$?.ttlMs??$U6,maxSize:$?.maxSize??ZU6})}async get($,Z){return this.cache.get(O71($,Z))??null}async set($,Z,X){this.cache.set(O71($,Z),X)}async invalidate($,Z){this.cache.delete(O71($,Z))}teardown(){this.cache.clear()}}var $U6=600000,ZU6=5000;var Vd$=()=>{};function GT0($,Z){return`${$}:${Z}`}function L71($){let Z=th({ttlMs:$?.ttlMs??XU6,maxSize:$?.maxSize??QU6}),X=$?.getConnection,Q=crypto.randomUUID(),Y=new TextEncoder,G=new TextDecoder,J=null;function K(W,F){let H=X?.();if(!H)return;try{H.publish(Sd$,Y.encode(JSON.stringify({organizationId:W,keyId:F,originId:Q})))}catch(N){console.warn("[ProviderKeyCache] Publish failed (non-critical):",N)}}return{get(W,F){return Z.get(GT0(W,F))},set(W,F,H){Z.set(GT0(W,F),H)},invalidate(W,F){Z.delete(GT0(W,F)),K(W,F)},start(){if(J)return;let W=X?.();if(!W)return;J=W.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(GT0(H.organizationId,H.keyId))}catch{}})().catch(console.error)},teardown(){J?.unsubscribe(),J=null,Z.clear()}}}var Sd$="studio.ai-provider-keys.invalidate",XU6=30000,QU6=5000;var Cd$=()=>{};class w71{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 _d$=($)=>{let Z;return()=>Z??=$()},E71,j71;var vd$=D(()=>{I6();E71=_d$(()=>w$.createHistogram("decopilot.stream.encode_ms",{description:"Per-chunk JSON.stringify+encode time for decopilot stream",unit:"ms"})),j71=_d$(()=>w$.createCounter("decopilot.stream.published_chunks",{description:"Logical decopilot stream chunks published to JetStream",unit:"{chunks}"}))});function NU6(){return{name:YN,subjects:[`${hr0}.>`],storage:DK.StorageType.File,max_age:JU6,max_bytes:WU6,max_msgs_per_subject:HU6,discard:DK.DiscardPolicy.Old,retention:DK.RetentionPolicy.Limits,duplicate_window:KU6,num_replicas:FU6}}class xd${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 fd$($){let Z=bd$.headers();for(let[X,Q]of Object.entries($))Z.set(X,Q);return Z}function DU6($,Z){let X=0;return{publish(Q,Y,G,J){Q.publish(Y,G,J?{headers:J}:void 0).catch((K)=>{if(X++,GU6().add(1,{"org.id":Z??"unknown"}),X===1||X%100===0)console.warn(`[Decopilot] JetStream publish failed for thread ${$} (${X} total):`,K)})},get errorCount(){return X}}}class z71{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=NU6(),X=await y6(async()=>{let Q=this.options.getJetStreamManager?await this.options.getJetStreamManager():await DK.jetstreamManager($);try{await Q.streams.info(YN),await Q.streams.update(YN,Z)}catch(Y){if(Y instanceof Error&&Y.message.includes("stream not found"))await Q.streams.add(Z);else if(Y instanceof Error&&/can ?not change.*storage|storage type/i.test(Y.message))await Q.streams.delete(YN),await Q.streams.add(Z);else throw Y}return Q},{maxAttempts:5,minTimeout:250,maxTimeout:4000,jitter:0.5,isRetriable:Eg});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=DU6(Z,Q),J=!1,K=()=>{if(J)return;J=!0;let F=OB$(Z);Y.publish(F.subject,F.data).catch(()=>{})};X.addEventListener("abort",K,{once:!0});let W=(F)=>{let H=performance.now(),N=cr0(F,{runId:Z}),U=performance.now()-H;E71().record(U),j71().add(1,{"org.id":Q??"unknown"}),OU6?.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?fd$(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(W(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(),K(),BU6)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 y6(()=>$.publish(Z.subject,Z.data,{...Z.headers?{headers:fd$(Z.headers)}:{},...Z.msgId?{msgID:Z.msgId}:{}}),{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:Eg}),!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=cr0(Z,{runId:$,dedup:X});E71().record(performance.now()-Y),j71().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=BB$({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"?DK.DeliverPolicy.New:DK.DeliverPolicy.All,G=X?.closeOnDone??!1,J=nO($),K;try{K=await y6(async()=>{return(await Q.consumers.get(YN,{filter_subjects:J,deliver_policy:Y})).consume()},{maxAttempts:6,minTimeout:250,maxTimeout:5000,jitter:0.5,isRetriable:Eg})}catch(L){return console.warn("[Decopilot] JetStream tail unavailable (non-critical):",L?.message??L),null}let H=uL0({messages:async function*(){try{for await(let L of K)yield{subject:L.subject,data:L.data,headers:L.headers}}finally{K.stop()}}(),onCancel:()=>K.stop()}).pipeThrough(xL0()).pipeThrough(yL0()).getReader(),N=!1,U=()=>{if(N)return;N=!0;try{H.releaseLock()}catch{}},B=!1,O=()=>{if(B)return;B=!0,K.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(YN,{filter:nO($)}).catch(()=>{})}teardown(){this.js=null,this.jsm=null}}var DK,bd$,YU6=($)=>{let Z;return()=>Z??=$()},GU6,JU6=86400000000000,KU6=120000000000,WU6=4294967296,FU6,HU6=500000,UU6,BU6,OU6;var yd$=D(()=>{K4();lr0();cL0();gL0();I6();vd$();DK=V(XL(),1),bd$=V(Nc(),1),GU6=YU6(()=>w$.createCounter("decopilot.stream.publish_errors",{description:"Number of JetStream publish failures for decopilot stream chunks",unit:"{errors}"})),FU6=Math.max(1,Number(process.env.DECOPILOT_STREAM_REPLICAS??3)||3);UU6=process.env.STREAM_ENCODE_TRACE==="1",BU6=process.env.DECOPILOT_STREAM_TRACE==="1";OU6=UU6?new xd$:null});function JT0($,Z,X,Q){if(!Q)return!1;return $.emit(Z,gK(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 gd$=D(()=>{_8()});class P71{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 hd$($,Z,X){let Q=Z.organizationId;if(Z.status!=="in_review")return!1;if(!zC(X))return!1;if(await $.storage.taskBoard.hasHumanRejectedDone(Z.id,Q))return!1;let Y=await $.storage.taskBoard.update(Z.id,Q,{status:"done"},Z.updatedBy);return await W6($,{taskBoardItemId:Z.id,action:"status_changed",actorId:null,data:{from:Z.status,to:"done",reason:"pr_merged"}}),x$(Q,Y),console.log(`[task-board-review-sweeper] ${Z.id}: linked PR already merged \u2014 moved to done`),!0}var ud$=D(()=>{WX();Yg();w5()});function AU6($){return $ instanceof s7}function TU6($,Z){return Z-$>=zU6}class A71{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??LU6;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??EU6,X=this.options.itemIntervalMs??wU6,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:K}of Y)try{if(await this.reconcileItem(J,K,Q))$++}catch(W){console.error(`[task-board-review-sweeper] ${J} failed`,W)}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()-Ft0),Yo0);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()-PU6));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 Xo0(this.taskBoard,Y,Q),await Qo0(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 K=await this.contextFactory(Y,J.assignedBy??J.createdBy);if(!K)continue;await p3(K,J,{runClass:"retry"}),Z++,console.warn(`[task-board-review-sweeper] re-dispatched ${Q} after a failure (attempt ${G})`)}catch(J){if(console.error(`[task-board-review-sweeper] retry dispatch for ${Q} failed`,J),AU6(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()+jU6)).catch((K)=>console.error(`[task-board-review-sweeper] re-arming ${Q} failed`,K))}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(()=>{}),x$(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(!TU6(VH(X),Date.now()))return;await vW($,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(Q.status!=="in_review")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 K=await Promise.all(G.map(async(W)=>({...W,...await Jg(Z,W)})));if(K.every((W)=>W.state===null))console.warn(`[task-board-review-sweeper] ${$}: no live PR state from GitHub (${K.length} PR(s)) \u2014 proceeding on unknown`);if(await hd$(J,Q,K))return!0;if(await $O$(J,Q))return!0;if(!Y)return!1;if(!Ro0(K))return!1;return await aD0(J,Q,{previewMatchesHead:Io0(K)}),!0}dispose(){if(this.timer)clearInterval(this.timer),this.timer=null}}var LU6=60000,wU6=300000,EU6=50,jU6=60000,zU6=900000,PU6=120000;var cd$=D(()=>{k5();sD0();_W();Tt();ud$();w5();oG();Go0();sY();sn()});import{readdir as RU6,rm as KT0}from"fs/promises";import{join as WT0}from"path";async function FT0($){let Z=new Date;Z.setUTCDate(Z.getUTCDate()-IU6),Z.setUTCHours(0,0,0,0);let X=0;try{let Q=await Yv($);for(let Y of Q)if(/^\d{4}$/.test(Y))X+=await ld$($,Y,Z);else if(!Y.startsWith(".")){let G=WT0($,Y),J=await Yv(G);for(let W of J){if(!/^\d{4}$/.test(W))continue;X+=await ld$(G,W,Z)}if((await Yv(G)).length===0)await KT0(G,{recursive:!0,force:!0})}}catch(Q){console.warn("monitoring retention cleanup failed:",Q)}return X}async function ld$($,Z,X){let Q=0,Y=WT0($,Z),G=await Yv(Y);for(let K of G){if(!/^\d{2}$/.test(K))continue;let W=WT0(Y,K),F=await Yv(W);for(let N of F){if(!/^\d{2}$/.test(N))continue;let U=new Date(`${Z}-${K}-${N}T00:00:00Z`);if(isNaN(U.getTime()))continue;if(U<X){let B=WT0(W,N);await KT0(B,{recursive:!0,force:!0}),Q++}}if((await Yv(W)).length===0)await KT0(W,{recursive:!0,force:!0})}if((await Yv(Y)).length===0)await KT0(Y,{recursive:!0,force:!0});return Q}async function Yv($){try{return(await RU6($)).filter((X)=>!X.startsWith("."))}catch{return[]}}var IU6=30;var T71=()=>{};import{DBOS as R71,SchedulerMode as qU6}from"@dbos-inc/dbos-sdk";async function kU6(){let $=[bJ(),Gv(),AF()],Z=0;for(let X of $)try{Z+=await FT0(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 VU6($,Z){await R71.runStep(()=>kU6(),{name:"monitoringRetention"})}function md$(){if(dd$)return;dd$=!0;let $=R71.registerWorkflow(VU6,{name:"monitoringRetentionWorkflow"});R71.registerScheduled($,{name:"monitoringRetentionWorkflow",crontab:MU6,mode:qU6.ExactlyOncePerIntervalWhenActive})}var MU6="23 4 * * *",dd$=!1;var id$=D(()=>{OY();T71()});function pd$($){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 WJ.create();Y.auth.user={id:X,role:Q.role},Y.organization={id:Q.orgId,slug:Q.orgSlug,name:Q.orgName};let G=await Jt($.db,Z,Q.role);return Y.boundAuth=R51({auth:Y.authInstance,headers:new Headers,role:Q.role,permissions:G,userId:X}),Y.access=new xw(X,void 0,Y.boundAuth,Q.role,"self"),yO(Y,{id:Q.orgId,slug:Q.orgSlug}),Y}}var nd$=D(()=>{yw();gO()});function SU6(){return[{name:"Postgres",status:"pending",port:0},{name:"NATS",status:"pending",port:0}]}function CU6(){return{services:SU6(),migrationsStatus:"pending",serverUrl:null,logs:[]}}function vU6(){for(let $ of _U6)$()}function td$($){let Z=[...I71.logs,$];I71={...I71,logs:Z.length>500?Z.slice(-500):Z},vU6()}function q71(){return fU6}var I71,_U6,fU6=!1;var M71=D(()=>{I71=CU6(),_U6=new Set});import{EventEmitter as bU6}from"events";var k71;var od$=D(()=>{M71();k71=new bU6;k71.on("request",($)=>{td$($)})});function rd$(){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=cu(U.params.name),O=U.params.arguments||{},L=Object.keys(O).map((E)=>cu(E)),w=L.length>0?L.slice(0,3).join(",")+(L.length>3?"\u2026":""):"";G=`${G5.tool}${B}${G5.dim}(${w})${G5.reset}`}else if(U.method)G=`${G5.dim}${cu(U.method)}${G5.reset}`}}catch{}}let K=cu(Y);if(Y.startsWith("/mcp/conn_")){let H=Y.split("/")[2]??"";K=`/mcp/${G5.mcp}${cu(H.slice(0,12))}\u2026${G5.reset}`}else if(Y==="/mcp")K=`${G5.mcp}/mcp${G5.reset}`;else if(Y==="/mcp/registry")K=`${G5.mcp}/mcp/registry${G5.reset}`;let W=yU6(Q),F=J?"\u25C0":"\u2190";if(!q71())console.log(`${G5.dim}${F}${G5.reset} ${W}${Q}${G5.reset} ${K}${G?` ${G}`:""}`);try{await Z()}finally{let H=Date.now()-X,N=$.res.status,U=xU6(N),B=H<1000?`${H}ms`:`${(H/1000).toFixed(1)}s`,O=J?"\u25B6":"\u2192";if(!q71())console.log(`${G5.dim}${O}${G5.reset} ${W}${Q}${G5.reset} ${K}${G?` ${G}`:""} ${U}${N}${G5.reset} ${G5.duration}${B}${G5.reset}`);k71.emit("request",{method:Q,path:cu(Y),status:N,duration:H,timestamp:new Date})}}}var G5,xU6=($)=>{if($>=500)return G5.serverError;if($>=400)return G5.clientError;if($>=300)return G5.redirect;return G5.ok},yU6=($)=>{return G5[$]||G5.reset},cu=($)=>{return $.replace(/\r/g,"").replace(/\n/g,"").replace(/\x1b\[[0-9;]*m/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g,"")};var ad$=D(()=>{M71();od$();G5={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 Zm$}from"crypto";import{mkdir as gU6,readdir as hU6,rm as sd$,stat as Xm$}from"fs/promises";import{join as S71,relative as uU6}from"path";import{z as P$}from"zod";function Ym$($){let Z=$.replace(/[^a-zA-Z0-9_-]/g,"_");return S71(cU6,Z)}function Gm$($){return $.replace(/^\/+/,"").replace(/\.\./g,"")}function V71($,Z){let X=Ym$($),Q=Gm$(Z);return S71(X,Q)}function lU6($,Z,X,Q){let Y=b0().encryptionKey||"dev-secret",G=`${$}:${Z}:${X}:${Q}`;return Zm$("sha256",Y).update(G).digest("hex")}function $m$($,Z,X,Q,Y){let G=Math.floor(Date.now()/1000)+Q,J=lU6(Z,X,G,Y),K=new URL(`/api/dev-assets/${Z}/${Gm$(X)}`,$);return K.searchParams.set("expires",G.toString()),K.searchParams.set("signature",J),K.searchParams.set("method",Y),K.toString()}function Jm$($,Z,X){let Q=`${$}:${Z.getTime()}:${X}`;return`"${Zm$("md5","etag").update(Q).digest("hex")}"`}async function Km$($,Z,X,Q,Y){try{let G=await hU6($,{withFileTypes:!0});for(let J of G){let K=S71($,J.name),F=uU6(Z,K).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 Km$(K,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 Xm$(K);Y.objects.push({key:F,size:H.size,lastModified:H.mtime.toISOString(),etag:Jm$(K,H.mtime,H.size)})}catch{}}}}catch{}}function Wm$($,Z){let Q=t($).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||"",K=G.maxKeys??1000,W=G.delimiter,F=G.continuationToken,H=Ym$(Q);await gU6(H,{recursive:!0});let N={objects:[],commonPrefixes:new Set};await Km$(H,H,J,W,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+K),O=U+K<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=V71(Q,G.key),K=await Xm$(J);return{contentType:H91(G.key),contentLength:K.size,lastModified:K.mtime.toISOString(),etag:Jm$(J,K.mtime,K.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??ed$;return{url:$m$(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??ed$;return{url:$m$(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=V71(Q,G.key);try{return await sd$(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=[],K=[];return await Promise.all(G.keys.map(async(W)=>{let F=V71(Q,W);try{await sd$(F),J.push(W)}catch(H){K.push({key:W,message:H instanceof Error?H.message:"Unknown error"})}})),{deleted:J,errors:K}}}]}async function C71($,Z,X){let Q=Wm$(Z,X),Y=new iK({name:"dev-assets-mcp",version:"1.0.0"},{capabilities:{tools:{}},jsonSchemaValidator:H5});for(let J of Q){let K="shape"in J.inputSchema?J.inputSchema.shape:P$.object({}).shape,W=J.outputSchema&&"shape"in J.outputSchema?J.outputSchema.shape:P$.object({}).shape;Y.registerTool(J.name,{description:J.description??"",inputSchema:K,outputSchema:W,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 YQ({enableJsonResponse:$.headers.get("Accept")?.includes("application/json")??!1});return await Y.connect(G),wJ(Y,G,$,"mcp:dev-assets")}async function Fm$($,Z,X,Q){let G=Wm$(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 cU6="./data/assets",ed$=3600,Qm$,Hm$;var Nm$=D(()=>{R$();Rg();U8();fd();cC();hX();GA0();Qm$=new H1;Qm$.all("/",async($)=>{let Z=$.get("studioContext"),X=new URL($.req.url),Q=`${X.protocol}//${X.host}`;return C71($.req.raw,Z,Q)});Hm$=Qm$});var Um$={};J4(Um$,{mountDevRoutes:()=>dU6});function dU6($,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 C71(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}`,K=Q.req.param("toolName");if(!K)return Q.json({error:"Missing tool name"},400);let W=await Q.req.json(),F=await Fm$(K,W,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",Hm$);let X=new H1;X.use("*",BK({mountPath:"/api/dev-assets"})),X.route("/",YA0({orgFromPath:!1})),$.route("/api/dev-assets",X)}var Bm$=D(()=>{U8();Q91();GA0();Nm$()});import{sql as mU6}from"kysely";import{randomUUID as Om$}from"crypto";import{z as iU6}from"zod";async function nU6($){let Z=new Date().toISOString(),X=Om$(),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((K)=>K.or([K("publisher","is",null),K("publisher","=",Q)])).execute();if(J.length>0)await $.db.insertInto("event_deliveries").values(J.map((K)=>({id:Om$(),event_id:X,subscription_id:K.id,status:"pending",attempts:0,last_error:null,delivered_at:null,next_retry_at:null,created_at:Z}))).execute();try{await mU6`SELECT
|
|
2893
2893
|
pg_notify('studio_events', ${X}),
|