decocms 4.239.2 → 4.241.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/{AlertCircle-CeleFBrs.js → AlertCircle-BSGNUx7V.js} +1 -1
- package/dist/client/assets/{AreaChart-Cr68R9KD.js → AreaChart-qGMzdkmk.js} +1 -1
- package/dist/client/assets/{ArrowLeft-CwsJ1Sfc.js → ArrowLeft-DHRINKlz.js} +1 -1
- package/dist/client/assets/{ArrowUp-PM43ttWN.js → ArrowUp-ntTpD-To.js} +1 -1
- package/dist/client/assets/{ArrowUpRight-C0hTvHTE.js → ArrowUpRight-BG4SvGJv.js} +1 -1
- package/dist/client/assets/{Check-BdzjeMXF.js → Check-DhNjrmaj.js} +1 -1
- package/dist/client/assets/{CheckCircle-D-nlOrXB.js → CheckCircle-B_sdSbJU.js} +1 -1
- package/dist/client/assets/{ChevronDown-BOc1-i9L.js → ChevronDown-CaUFgq06.js} +1 -1
- package/dist/client/assets/{ChevronRight-wqbYwiLF.js → ChevronRight-jZWdrf9f.js} +1 -1
- package/dist/client/assets/{ChevronUp-IHCmvX3E.js → ChevronUp-BRjHRWFg.js} +1 -1
- package/dist/client/assets/{Copy01-DIJvVGQk.js → Copy01-C3CSvCmh.js} +1 -1
- package/dist/client/assets/{CreditCard01-W4m_wy49.js → CreditCard01-5rNLMrBA.js} +1 -1
- package/dist/client/assets/{DotsVertical-Bohq38Q1.js → DotsVertical-Dp5Cm_iP.js} +1 -1
- package/dist/client/assets/Download01-DIiuseU_.js +1 -0
- package/dist/client/assets/{Eye-C5vDWwaK.js → Eye-CVDf_kH4.js} +1 -1
- package/dist/client/assets/{FilterLines-C9pmu5SZ.js → FilterLines-DV7AkyjC.js} +1 -1
- package/dist/client/assets/Globe01-Bak8Df7R.js +1 -0
- package/dist/client/assets/{Globe04-CDJqKwdP.js → Globe04-21nMtmZT.js} +1 -1
- package/dist/client/assets/{HardDrive-BicURFt0.js → HardDrive-yKF5zKg2.js} +1 -1
- package/dist/client/assets/{Key01-CRQOB5O_.js → Key01-C-HagbU9.js} +1 -1
- package/dist/client/assets/{LayoutLeft-DZwVeKk1.js → LayoutLeft-DTt2h_gY.js} +1 -1
- package/dist/client/assets/{LinkExternal01-Do6tmctI.js → LinkExternal01-BAXCjJ3W.js} +1 -1
- package/dist/client/assets/{LockUnlocked01-BxK9l3CJ.js → LockUnlocked01-CTGb9BVB.js} +1 -1
- package/dist/client/assets/{LogOut01-DhAdDNkV.js → LogOut01-CI181NEF.js} +1 -1
- package/dist/client/assets/{Monitor01-BKGGKBRj.js → Monitor01-Be5N7TRy.js} +1 -1
- package/dist/client/assets/{Palette-5WrpEUaC.js → Palette-BNNCPeK0.js} +1 -1
- package/dist/client/assets/{Play-Yhg2bDxR.js → Play-BsRzOgzp.js} +1 -1
- package/dist/client/assets/{Plus-CgXuzVCT.js → Plus-9luEKPZw.js} +1 -1
- package/dist/client/assets/{SearchLg-CYNvKytJ.js → SearchLg-F6MPrrZo.js} +1 -1
- package/dist/client/assets/{SearchMd-BOeEZKFu.js → SearchMd-7UCVFr92.js} +1 -1
- package/dist/client/assets/{Settings02-CpRid7rG.js → Settings02-DWTUyGYI.js} +1 -1
- package/dist/client/assets/{Share07-B14EYmF_.js → Share07-BBwkuMmH.js} +1 -1
- package/dist/client/assets/{Shield01-DS1CkOm5.js → Shield01-DwaMx4Kj.js} +1 -1
- package/dist/client/assets/{Stars01-CPDNiFNQ.js → Stars01-gwxykcEQ.js} +1 -1
- package/dist/client/assets/{Stars02-CH68Qhm_.js → Stars02-B6JXDKru.js} +1 -1
- package/dist/client/assets/{Sun-CjcZKPaq.js → Sun-BJxBIAjy.js} +1 -1
- package/dist/client/assets/{SwitchHorizontal01-DOmwqeXB.js → SwitchHorizontal01-CdQluNjW.js} +1 -1
- package/dist/client/assets/{Tool01-BLxK-7k7.js → Tool01-B3cfX7QW.js} +1 -1
- package/dist/client/assets/{Tool02-B8GwG_SX.js → Tool02-Dz1T3Rmg.js} +1 -1
- package/dist/client/assets/{Trash01-COMthlp3.js → Trash01-Dx-L9twD.js} +1 -1
- package/dist/client/assets/{TrendUp01-Pa_0KlRB.js → TrendUp01-jt7vyfmI.js} +1 -1
- package/dist/client/assets/{Upload01-DO7DRGUd.js → Upload01-BxhthB2p.js} +1 -1
- package/dist/client/assets/{User01-C2rVZTl-.js → User01-CFSl83nB.js} +1 -1
- package/dist/client/assets/{Users01-ClsBMo4K.js → Users01-BijcXXI3.js} +1 -1
- package/dist/client/assets/{Users03-DP3zwt6-.js → Users03-D4EG206O.js} +1 -1
- package/dist/client/assets/{X-Bfx6rO6W.js → X-CSYXCnV9.js} +1 -1
- package/dist/client/assets/{XCircle-jlAhwcDu.js → XCircle-Cu0-8nUy.js} +1 -1
- package/dist/client/assets/{XClose-DdXn46Em.js → XClose-DSHM2tuZ.js} +1 -1
- package/dist/client/assets/{YAxis-C5lX8CaJ.js → YAxis-DaCLoj6F.js} +1 -1
- package/dist/client/assets/{Zap-li0rR-RI.js → Zap-BJ7aktKA.js} +1 -1
- package/dist/client/assets/{ZapSquare-Gxca0Ylc.js → ZapSquare-DsGT7WIC.js} +1 -1
- package/dist/client/assets/{access-gate-C8o_OE1N.js → access-gate-rP_MjwR7.js} +1 -1
- package/dist/client/assets/agent-icon-eH38g2HT.js +1 -0
- package/dist/client/assets/agents-list-DCLtFhhx.js +1 -0
- package/dist/client/assets/ai-providers-BVZMQNKu.js +1 -0
- package/dist/client/assets/{alert-1MxwzRCP.js → alert-BMVQGRt6.js} +1 -1
- package/dist/client/assets/{alert-dialog-Cqq7FgQj.js → alert-dialog-CMLgUtLr.js} +1 -1
- package/dist/client/assets/{api-keys-BmVwKDo4.js → api-keys-KMpkqWx8.js} +1 -1
- package/dist/client/assets/app-editor-DePidg7R.js +1 -0
- package/dist/client/assets/{auth-tEJ4bybR.js → auth-C0RxM0MV.js} +1 -1
- package/dist/client/assets/{auth-catchall-CYO83hyU.js → auth-catchall-DKTY___X.js} +1 -1
- package/dist/client/assets/{auth-entry-Dc1zlPtG.js → auth-entry-BpqowsP8.js} +1 -1
- package/dist/client/assets/{auth-split-layout-C945ZTK3.js → auth-split-layout-CjAUeNRJ.js} +1 -1
- package/dist/client/assets/{authenticate-and-persist-oauth-CqRX86RU.js → authenticate-and-persist-oauth-iw6ouFr9.js} +1 -1
- package/dist/client/assets/{automation-list-row-BN46j3bE.js → automation-list-row-Bkk5b-Xu.js} +1 -1
- package/dist/client/assets/{automation-runs-nfuxnSim.js → automation-runs-7BxhYAN0.js} +16 -16
- package/dist/client/assets/automations-g01DiXGR.js +1 -0
- package/dist/client/assets/{avatar-BqAz0FLa.js → avatar-CzJUVoDs.js} +1 -1
- package/dist/client/assets/{badge-D24p8Xxi.js → badge-DbSQDjS0.js} +1 -1
- package/dist/client/assets/{billing-DSz5ucLf.js → billing-4Wr63XfR.js} +1 -1
- package/dist/client/assets/{block-document-ChYHEJUH.js → block-document-c_ItM0iq.js} +1 -1
- package/dist/client/assets/{buckets-DyBjeMFW.js → buckets-BEGiPCkc.js} +1 -1
- package/dist/client/assets/bulk-category-panel-DhM1EGbP.js +1 -0
- package/dist/client/assets/{capability-load-error-CPQoG_lp.js → capability-load-error-CRpB249h.js} +1 -1
- package/dist/client/assets/{card-CooN3E-v.js → card-FCEwqon6.js} +1 -1
- package/dist/client/assets/cards-CIZK-4zJ.js +9 -0
- package/dist/client/assets/category-editor-CVaNQqlc.js +1 -0
- package/dist/client/assets/{chart-Dtka3CXu.js → chart-BVs8Wshz.js} +1 -1
- package/dist/client/assets/{chat-context--S2eGI2t.js → chat-context-Qk-9IhfU.js} +1 -1
- package/dist/client/assets/{checkbox-BqtDvsR1.js → checkbox-Badqx0C2.js} +1 -1
- package/dist/client/assets/{cli-auth-success-B6EGxQbP.js → cli-auth-success-BBdGAncX.js} +1 -1
- package/dist/client/assets/collection-detail-C13FmfjI.js +1 -0
- package/dist/client/assets/{collection-display-button-B1OCDGvC.js → collection-display-button-DBcRwNMI.js} +1 -1
- package/dist/client/assets/{collection-search-H6c7ia6t.js → collection-search-DcQsyJxv.js} +1 -1
- package/dist/client/assets/{collection-table-wrapper-CksgkvG8.js → collection-table-wrapper-DKCmgLGf.js} +1 -1
- package/dist/client/assets/{collection-tabs-BqnoVI6Y.js → collection-tabs-TNXMy8gA.js} +1 -1
- package/dist/client/assets/{command-DhvOaMnH.js → command-DWBbdLBX.js} +1 -1
- package/dist/client/assets/commerce-onboarding-4x4UgCdX.js +1 -0
- package/dist/client/assets/{connect-C-NmOGr7.js → connect-Dtqc1nsL.js} +1 -1
- package/dist/client/assets/{connection-DJ2785KU.js → connection-DyYsm8dV.js} +1 -1
- package/dist/client/assets/{connection-card-DSX5zHxO.js → connection-card-BsbMWXtq.js} +1 -1
- package/dist/client/assets/connection-detail-CusJoVJI.js +1 -0
- package/dist/client/assets/{connection-form-helpers-B07wLptq.js → connection-form-helpers-hjpjGHOP.js} +1 -1
- package/dist/client/assets/connections-C3g87Fyq.js +1 -0
- package/dist/client/assets/{decopilot-sse-pool-U92pbu07.js → decopilot-sse-pool-BNW6JWpR.js} +1 -1
- package/dist/client/assets/{dialog-C2XtKj4W.js → dialog-0fNUeR9R.js} +1 -1
- package/dist/client/assets/{domain-settings-D2fweBMx.js → domain-settings-B4x9P8HV.js} +1 -1
- package/dist/client/assets/{drawer-HtUPoolZ.js → drawer-HRJ32EbE.js} +1 -1
- package/dist/client/assets/{dropdown-menu-Buaqq-Fn.js → dropdown-menu-Gs5UGB4h.js} +1 -1
- package/dist/client/assets/{empty-state-Bd3g-2FH.js → empty-state-LcWMvkBG.js} +1 -1
- package/dist/client/assets/{extract-connection-data-V948FMyj.js → extract-connection-data-BYxfOuH_.js} +1 -1
- package/dist/client/assets/file-explorer-B7clljfW.js +2 -0
- package/dist/client/assets/{file-type-icon-BSAnhEu5.js → file-type-icon-CTX2jq9G.js} +1 -1
- package/dist/client/assets/{form-CMuk1nXb.js → form-DGhZtrNx.js} +1 -1
- package/dist/client/assets/general-B8n1QEr5.js +1 -0
- package/dist/client/assets/{github-repo-picker-DjVb6-0i.js → github-repo-picker-DOf_JZk2.js} +1 -1
- package/dist/client/assets/{hooks-Cd2G3711.js → hooks-Cj6NKwbB.js} +1 -1
- package/dist/client/assets/{index-Dwrgaiv3.js → index-2ZeZ7XA1.js} +1 -1
- package/dist/client/assets/{index-DNa-ZV66.js → index-Bqi-j8tu.js} +1 -1
- package/dist/client/assets/{index-BKOwC_zz.js → index-CElD4z4O.js} +1 -1
- package/dist/client/assets/{index-BflbKT0u.js → index-CiuQrzO7.js} +2 -2
- package/dist/client/assets/{index-BaWtU9eb.js → index-CnpdnndP.js} +58 -61
- package/dist/client/assets/{index-BoSySxnu.js → index-D87JktxF.js} +1 -1
- package/dist/client/assets/{index-CPCOiQxX.js → index-DZl62lg2.js} +1 -1
- package/dist/client/assets/{index-BRjr3L_N.js → index-DporvBqC.js} +1 -1
- package/dist/client/assets/{index-BphIXXOp.js → index-QSWmOkVC.js} +37 -37
- package/dist/client/assets/index-mmj8d1OZ.js +1 -0
- package/dist/client/assets/{index-redirect-CyqcxiJb.js → index-redirect-CLI7ZZ-t.js} +1 -1
- package/dist/client/assets/{infra-billing-B1fwJNOz.js → infra-billing-BEXhDVVj.js} +1 -1
- package/dist/client/assets/{input-9TNY2G6W.js → input-CjD4VhOq.js} +1 -1
- package/dist/client/assets/{integration-icon-CGwCrGIc.js → integration-icon-CPM2Wy4S.js} +1 -1
- package/dist/client/assets/{invite-member-dialog-BIJfPXUf.js → invite-member-dialog-uqixWqH7.js} +1 -1
- package/dist/client/assets/{label-DhJo3WjY.js → label-BM_KNax6.js} +1 -1
- package/dist/client/assets/{layout-CeWP0gEY.js → layout-Cyxx23a5.js} +1 -1
- package/dist/client/assets/{login-DxZTpOpk.js → login-DTcPenfD.js} +1 -1
- package/dist/client/assets/{mcp-oauth--A5K-xL8.js → mcp-oauth-CXtITOci.js} +1 -1
- package/dist/client/assets/{members-B5PzIuUU.js → members-BngJJI1k.js} +1 -1
- package/dist/client/assets/{monaco-editor-BMLOnDLJ.js → monaco-editor-BhG2pRsy.js} +1 -1
- package/dist/client/assets/{monitoring-stats-row-Rpla78Nn.js → monitoring-stats-row-V0REizP2.js} +1 -1
- package/dist/client/assets/{multi-select-Duz2hJ29.js → multi-select-DVmJ8N16.js} +1 -1
- package/dist/client/assets/{oauth-callback-Cn0wl-wL.js → oauth-callback-QWZ-1Ao_.js} +1 -1
- package/dist/client/assets/{oauth-callback-ai-provider-CvoqVCiX.js → oauth-callback-ai-provider-DNiT_-tQ.js} +1 -1
- package/dist/client/assets/{onboarding-CTQgNbX8.js → onboarding-4kFhDwBC.js} +1 -1
- package/dist/client/assets/{org-layout-tUX-e_rZ.js → org-layout-D1UQZWSN.js} +1 -1
- package/dist/client/assets/{organization-choice-T8a5zIBy.js → organization-choice-CguXU_qj.js} +1 -1
- package/dist/client/assets/{orgs-CGkwFzZ6.js → orgs-C0r08Wz9.js} +1 -1
- package/dist/client/assets/{page-seo-form-C0yVvfZn.js → page-seo-form-BYQ_C966.js} +1 -1
- package/dist/client/assets/{popover-BV2Ziop4.js → popover-Cdk4wGDs.js} +1 -1
- package/dist/client/assets/post-editor-CBRsERKT.js +1 -0
- package/dist/client/assets/{primitives-QfIbZaez.js → primitives-oSbSlJdK.js} +1 -1
- package/dist/client/assets/{profile-Bp26cqE6.js → profile-DT6piyAB.js} +1 -1
- package/dist/client/assets/project-app-view-ODxcuXJo.js +1 -0
- package/dist/client/assets/record-editor-DVIXyY1q.js +1 -0
- package/dist/client/assets/redirect-editor-CXtmXnNZ.js +1 -0
- package/dist/client/assets/registry-C7n-7FhE.js +2 -0
- package/dist/client/assets/{registry-layout-DdRmZw6K.js → registry-layout-DoD0R5_E.js} +3 -3
- package/dist/client/assets/{reports-DMvf7MMo.js → reports-CxxatuXV.js} +1 -1
- package/dist/client/assets/{require-capability-ChdE_Nc5.js → require-capability-BujVC6Iv.js} +1 -1
- package/dist/client/assets/{required-auth-layout-DYO8_0ig.js → required-auth-layout-Bc5Jqmw0.js} +1 -1
- package/dist/client/assets/{reset-password-C661myht.js → reset-password-CRp5Vxzw.js} +1 -1
- package/dist/client/assets/roles-Bg6Wpwtz.js +1 -0
- package/dist/client/assets/{search-input-ChJAF9CO.js → search-input-DPH-j2ty.js} +1 -1
- package/dist/client/assets/{secrets-CwgPWaoJ.js → secrets-BS8SMJ5_.js} +1 -1
- package/dist/client/assets/{sections-editor-D8xoci4G.js → sections-editor-Cm60dl8s.js} +2 -2
- package/dist/client/assets/{select-COjQ5V-V.js → select-BY-TTUaX.js} +1 -1
- package/dist/client/assets/select-model-CKrLO7E8.js +4 -0
- package/dist/client/assets/{self-tool-result-DA97K7F2.js → self-tool-result-CQmRuOJJ.js} +1 -1
- package/dist/client/assets/seo-editor-qcHpiGxs.js +1 -0
- package/dist/client/assets/{settings-layout-C23Ga1Si.js → settings-layout-CkkEfluT.js} +1 -1
- package/dist/client/assets/{settings-section-BN0IrtYX.js → settings-section-KNTU5IvO.js} +1 -1
- package/dist/client/assets/{settings-subnav-DlbWpD1A.js → settings-subnav-Cd0l_6Ey.js} +1 -1
- package/dist/client/assets/{shell-controls-BBRNaPXa.js → shell-controls-yGJ3B9DE.js} +1 -1
- package/dist/client/assets/{shell-layout-DIvwZhUJ.js → shell-layout-BJ43I-fM.js} +1 -1
- package/dist/client/assets/{sidebar-Dckv7Gxe.js → sidebar-B9FCz4Mq.js} +1 -1
- package/dist/client/assets/{skeleton-C_J-aMdg.js → skeleton-B9r2TOyq.js} +1 -1
- package/dist/client/assets/{spinner-Cbrhyipt.js → spinner-DzAXz-ak.js} +1 -1
- package/dist/client/assets/{sso-DC7cMRPW.js → sso-CktB1aVG.js} +1 -1
- package/dist/client/assets/{store-rWTYBa0y.js → store-DVzGhYCb.js} +1 -1
- package/dist/client/assets/store-registry-BsmH8UbB.js +2 -0
- package/dist/client/assets/{studio-tools-BoD8kcA1.js → studio-tools-D6IcfTHF.js} +1 -1
- package/dist/client/assets/{switch-b-8BZDWJ.js → switch-B8JKQssM.js} +1 -1
- package/dist/client/assets/synced-repos-R0AkTDG5.js +1 -0
- package/dist/client/assets/tab-id-CPIceFUq.js +1 -0
- package/dist/client/assets/{table-CfpVPCrj.js → table-DjnLlp3Y.js} +1 -1
- package/dist/client/assets/{tabs-D-7lRbur.js → tabs-BVCZRpzY.js} +1 -1
- package/dist/client/assets/tasks-bT0G2AAJ.js +1 -0
- package/dist/client/assets/{textarea-CosQp1Ex.js → textarea-DUhzY-49.js} +1 -1
- package/dist/client/assets/{toggle-group-5LW11eFN.js → toggle-group-C2GRyClc.js} +1 -1
- package/dist/client/assets/{toolbar-Q0b8veSU.js → toolbar-CRquLcIr.js} +1 -1
- package/dist/client/assets/{tooltip-BfkRKScU.js → tooltip-C8WdZoAs.js} +1 -1
- package/dist/client/assets/{track-CG8KgfQd.js → track-DlQssvS7.js} +1 -1
- package/dist/client/assets/{types-BGHf5GHQ.js → types-CPa8SGGQ.js} +1 -1
- package/dist/client/assets/{use-ai-providers-BezO2qdd.js → use-ai-providers-hG0NJmyg.js} +1 -1
- package/dist/client/assets/{use-api-keys-BELfjQ6X.js → use-api-keys-D8jDupAP.js} +1 -1
- package/dist/client/assets/{use-automations-BB8THpxC.js → use-automations-B_w6lxQU.js} +1 -1
- package/dist/client/assets/{use-autosave-C7alUjY0.js → use-autosave-g4einljo.js} +1 -1
- package/dist/client/assets/{use-capability-mz-0XBoJ.js → use-capability-B23RInvZ.js} +1 -1
- package/dist/client/assets/{use-clock-tick-BlWbr6nY.js → use-clock-tick-BDuDvLsc.js} +1 -1
- package/dist/client/assets/{use-commerce-diagnostic-B54oYyoh.js → use-commerce-diagnostic-C2s_wvEf.js} +1 -1
- package/dist/client/assets/{use-connection-B5TzA1Ut.js → use-connection-Dg56f5Vt.js} +1 -1
- package/dist/client/assets/{use-copy-BEi_L0rW.js → use-copy-DGVAP1M7.js} +1 -1
- package/dist/client/assets/{use-create-virtual-mcp-BfQJXcoA.js → use-create-virtual-mcp-Cv6u_vQj.js} +1 -1
- package/dist/client/assets/{use-debounced-autosave-BHPvlnZn.js → use-debounced-autosave-CTkEMRHe.js} +1 -1
- package/dist/client/assets/{use-debounced-value-D880nDlC.js → use-debounced-value-qVTGK2NR.js} +1 -1
- package/dist/client/assets/{use-decopilot-events-D7YXko6B.js → use-decopilot-events-_lZ6Xk3T.js} +1 -1
- package/dist/client/assets/{use-delete-connection-urOdWe-_.js → use-delete-connection-9Bgp-HfT.js} +1 -1
- package/dist/client/assets/{use-deployment-admin-D_5KLYHI.js → use-deployment-admin-Dsr6f3P7.js} +1 -1
- package/dist/client/assets/{use-file-configs-C4oqeXep.js → use-file-configs-BZ18LlNu.js} +1 -1
- package/dist/client/assets/{use-infinite-scroll-A-tTatQb.js → use-infinite-scroll-CWnPk8zt.js} +1 -1
- package/dist/client/assets/{use-join-requests-Cvq2Nlxy.js → use-join-requests-Bo2pV8IS.js} +1 -1
- package/dist/client/assets/{use-mcp-client-DKcZ7v-W.js → use-mcp-client-BsAnTcHa.js} +1 -1
- package/dist/client/assets/{use-mcp-tools-B4aUfPof.js → use-mcp-tools-kK8zHPYS.js} +1 -1
- package/dist/client/assets/{use-members-Dypq7HzL.js → use-members-B9vphmDn.js} +1 -1
- package/dist/client/assets/{use-mobile-C0XoguQx.js → use-mobile-D3ZpQ04i.js} +1 -1
- package/dist/client/assets/{use-navigate-to-agent-Cxg9_mL_.js → use-navigate-to-agent-BhiQJGHm.js} +1 -1
- package/dist/client/assets/{use-open-billing-url-BwHZpmU9.js → use-open-billing-url-FgqegUnw.js} +1 -1
- package/dist/client/assets/{use-org-auth-client-CEm0cNyU.js → use-org-auth-client-tPvCf1dF.js} +1 -1
- package/dist/client/assets/{use-org-repo-syncs-DCxfKVxi.js → use-org-repo-syncs-Dn3ug8I0.js} +1 -1
- package/dist/client/assets/{use-org-sso-8p_mXDai.js → use-org-sso-DdtLWeHC.js} +1 -1
- package/dist/client/assets/{use-organization-roles-EKX73RmE.js → use-organization-roles-BYyGmBMK.js} +1 -1
- package/dist/client/assets/{use-organization-settings-C62jhu_V.js → use-organization-settings-DbHsJaaW.js} +1 -1
- package/dist/client/assets/{use-registry-connections-C82adOhA.js → use-registry-connections-CI0z613-.js} +1 -1
- package/dist/client/assets/{use-secrets-CXv4Or8y.js → use-secrets-dYdxMugZ.js} +1 -1
- package/dist/client/assets/{use-section-preview-base-uursozx3.js → use-section-preview-base-B46aIuGF.js} +1 -1
- package/dist/client/assets/{use-settings-tabs-BO1uyGPC.js → use-settings-tabs-B_hY1mlT.js} +1 -1
- package/dist/client/assets/{use-status-sounds-Df1zE4-g.js → use-status-sounds-DnGWueq0.js} +1 -1
- package/dist/client/assets/{use-tags-DBhn0x6Q.js → use-tags-BIZOfShH.js} +1 -1
- package/dist/client/assets/{use-view-mode-B8mZlQkB.js → use-view-mode-DQUSR-GN.js} +1 -1
- package/dist/client/assets/{use-virtual-mcp-IokMTZJW.js → use-virtual-mcp-CJYABS2i.js} +1 -1
- package/dist/client/assets/useInfiniteQuery-3soE5ZtR.js +1 -0
- package/dist/client/assets/{useRouterState-BHrQRzTY.js → useRouterState-CFKKaLoi.js} +1 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-Cean782d.js +1 -0
- package/dist/client/assets/{users-B6MzMck4.js → users-CAizcdlt.js} +1 -1
- package/dist/client/assets/variant-calendar-CpdX720c.js +1 -0
- package/dist/client/assets/{view-mode-toggle-waWn0PEd.js → view-mode-toggle-DMaq2N-u.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/client/install.sh +443 -45
- package/dist/server/cli.js +1 -1
- package/dist/server/server.js +1 -1
- package/package.json +1 -1
- package/dist/client/assets/Globe01-DEX4B2yM.js +0 -1
- package/dist/client/assets/agent-icon-BnyLUh_P.js +0 -1
- package/dist/client/assets/agents-list-WqvM4PBU.js +0 -1
- package/dist/client/assets/ai-providers-Cm0Rm1KR.js +0 -1
- package/dist/client/assets/app-editor-BDtjnvii.js +0 -1
- package/dist/client/assets/automations-C9iJneF6.js +0 -1
- package/dist/client/assets/bulk-category-panel-tfM9zSbQ.js +0 -1
- package/dist/client/assets/cards-CxCBBMfu.js +0 -9
- package/dist/client/assets/category-editor-CIZoMWm2.js +0 -1
- package/dist/client/assets/collection-detail-DGbcByEY.js +0 -1
- package/dist/client/assets/commerce-onboarding-DO7FMttC.js +0 -1
- package/dist/client/assets/connection-detail-m014gzNI.js +0 -1
- package/dist/client/assets/connections-BNQ0Y0h7.js +0 -1
- package/dist/client/assets/file-explorer-DKHfXuC4.js +0 -2
- package/dist/client/assets/general-BTyXC0VC.js +0 -1
- package/dist/client/assets/index-Di0wCO9r.js +0 -1
- package/dist/client/assets/post-editor-DnamQd0I.js +0 -1
- package/dist/client/assets/project-app-view-C-J9cu-l.js +0 -1
- package/dist/client/assets/record-editor-CoztL6I2.js +0 -1
- package/dist/client/assets/redirect-editor-Bz1AUCqF.js +0 -1
- package/dist/client/assets/registry-DQjw_3WH.js +0 -2
- package/dist/client/assets/roles-CYg93TjU.js +0 -1
- package/dist/client/assets/select-model-B5IdH_n6.js +0 -4
- package/dist/client/assets/seo-editor-Do7jjKRP.js +0 -1
- package/dist/client/assets/store-registry-Dz8WBmEa.js +0 -2
- package/dist/client/assets/synced-repos-Cuzl6scP.js +0 -1
- package/dist/client/assets/tab-id-BJUTVZdl.js +0 -1
- package/dist/client/assets/tasks-EwwXPqCM.js +0 -1
- package/dist/client/assets/useInfiniteQuery-ewuCizNF.js +0 -1
- package/dist/client/assets/useSuspenseInfiniteQuery-BvX-6eAF.js +0 -1
- package/dist/client/assets/variant-calendar-DrArrrSO.js +0 -1
package/dist/client/index.html
CHANGED
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
<meta name="twitter:description" content="Hire specialized agents, give them access to your tools, and let them deliver real projects — with planning, verification, and observability built in." />
|
|
51
51
|
<meta name="twitter:image" content="/og-image.png" />
|
|
52
52
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
53
|
-
<script type="module" crossorigin src="/assets/index-
|
|
53
|
+
<script type="module" crossorigin src="/assets/index-QSWmOkVC.js"></script>
|
|
54
54
|
<link rel="stylesheet" crossorigin href="/assets/index-iwXkDaR-.css">
|
|
55
55
|
</head>
|
|
56
56
|
<body>
|
package/dist/client/install.sh
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
#!/bin/sh
|
|
2
|
-
# deco studio installer
|
|
2
|
+
# deco studio installer.
|
|
3
3
|
#
|
|
4
4
|
# curl -fsSL https://studio.decocms.com/install.sh | sh
|
|
5
5
|
#
|
|
6
|
-
#
|
|
6
|
+
# Two platforms, two shapes, no sudo on either.
|
|
7
|
+
#
|
|
8
|
+
# macOS (Apple Silicon) — Homebrew cask:
|
|
7
9
|
# 1. adds the decocms/studio Homebrew tap (this repo doubles as the tap)
|
|
8
10
|
# 2. marks the tap trusted (Homebrew >= 6 otherwise prompts on install)
|
|
9
11
|
# 3. installs or upgrades the deco-studio cask
|
|
@@ -11,59 +13,455 @@
|
|
|
11
13
|
# can launch (macOS reports unsigned downloads as "damaged"). This step
|
|
12
14
|
# is skipped automatically once releases are signed and notarized.
|
|
13
15
|
#
|
|
16
|
+
# Linux (x86_64) — the self-contained AppImage, no package manager involved:
|
|
17
|
+
# 1. reads the version off the rolling `native-updates` channel manifest
|
|
18
|
+
# (releases/download/native-updates/latest.json — the same document the
|
|
19
|
+
# installed app's updater polls). That manifest is promoted only after
|
|
20
|
+
# EVERY platform's assets are on the immutable native-v<version> release,
|
|
21
|
+
# so every version it names does ship to Linux. It is NOT necessarily the
|
|
22
|
+
# newest one: promotion is throttled (THROTTLE_MS in
|
|
23
|
+
# native-update-channel.mjs, ~20h), so the channel can sit a few releases
|
|
24
|
+
# behind head. releases/latest is not usable here (other workflows publish
|
|
25
|
+
# releases from this repo, so "latest" is not guaranteed to be a native
|
|
26
|
+
# tag), and neither is scanning the release list: this repo publishes both
|
|
27
|
+
# a vX.Y.Z and a native-vX.Y.Z per bump, ~46 releases a day, so one
|
|
28
|
+
# 100-item API page spans barely two days — a Linux leg red for longer
|
|
29
|
+
# than that would scroll the newest installable version off the page and
|
|
30
|
+
# this installer would report "never released" about a release that
|
|
31
|
+
# exists. One fixed URL has no such window, and no API rate limit either.
|
|
32
|
+
# 2. verifies what it downloads, as strongly as this host can:
|
|
33
|
+
# - with minisign installed: fetches <asset>.tar.gz and its .sig and
|
|
34
|
+
# checks them against the minisign public key EMBEDDED BELOW, then
|
|
35
|
+
# unpacks the AppImage out of that verified tarball. That key rides in
|
|
36
|
+
# with this script from studio.decocms.com — a different origin from the
|
|
37
|
+
# GitHub CDN that serves the release — so it is a genuine out-of-band
|
|
38
|
+
# anchor, and this step really does prove authenticity.
|
|
39
|
+
# - without minisign: falls back to the published .sha256, which detects a
|
|
40
|
+
# CORRUPT OR TRUNCATED download and nothing more. Digest and binary sit
|
|
41
|
+
# on the same release, same origin, same TLS session: whoever can change
|
|
42
|
+
# one can change the other. The script says so out loud rather than
|
|
43
|
+
# downgrading in silence.
|
|
44
|
+
# A missing .sha256 aborts the install either way. Note the asymmetry with
|
|
45
|
+
# macOS: the cask pins its sha256 in git, which is auditable after the
|
|
46
|
+
# fact (the release bot pushes it to main unreviewed, so it is a record,
|
|
47
|
+
# not an approval). Without minisign the Linux path has no out-of-band
|
|
48
|
+
# anchor at all.
|
|
49
|
+
# 3. installs to ~/.local/bin/deco-studio with a matching
|
|
50
|
+
# ~/.local/share/applications entry (plus its icon), replacing any
|
|
51
|
+
# previous install in place.
|
|
52
|
+
# 4. probes for FUSE, which the AppImage runtime needs to self-mount, and
|
|
53
|
+
# falls back to --appimage-extract-and-run when the host has none.
|
|
54
|
+
#
|
|
14
55
|
# Source: https://github.com/decocms/studio (apps/web/public/install.sh)
|
|
15
56
|
set -eu
|
|
16
57
|
|
|
58
|
+
REPO="decocms/studio"
|
|
17
59
|
APP="/Applications/deco.app"
|
|
18
60
|
CASK="deco-studio"
|
|
19
61
|
TAP="decocms/studio"
|
|
20
|
-
TAP_URL="https://github.com
|
|
21
|
-
RELEASES="https://github.com/
|
|
62
|
+
TAP_URL="https://github.com/$REPO"
|
|
63
|
+
RELEASES="https://github.com/$REPO/releases"
|
|
64
|
+
# The rolling updater channel: one stable URL, promoted only once every
|
|
65
|
+
# platform's assets are on the immutable release (release-native.yaml's
|
|
66
|
+
# `promote` job holds it back otherwise). Same document the installed app
|
|
67
|
+
# polls — see plugins.updater.endpoints in apps/native/src-tauri/tauri.conf.json5.
|
|
68
|
+
UPDATE_CHANNEL="$RELEASES/download/native-updates/latest.json"
|
|
69
|
+
|
|
70
|
+
# The minisign PUBLIC key every updater artifact is signed with — the same pin
|
|
71
|
+
# the shipped app verifies against, stored base64-wrapped in
|
|
72
|
+
# apps/native/src-tauri/tauri.conf.json5 (plugins.updater.pubkey) and used by
|
|
73
|
+
# release-native.yaml's promote job. A public key only verifies, so shipping it
|
|
74
|
+
# in a public script costs nothing; rotate BOTH copies together.
|
|
75
|
+
UPDATER_PUBKEY='untrusted comment: minisign public key: 7E59F0D430876374
|
|
76
|
+
RWR0Y4cw1PBZfoLU9KTGnUUpEuO9YnNTHtcSVltHin7c8Xr2mS/QtlK1'
|
|
22
77
|
|
|
23
78
|
say() { printf '\033[1m[deco studio]\033[0m %s\n' "$1"; }
|
|
24
79
|
fail() {
|
|
25
80
|
printf '\033[1;31m[deco studio]\033[0m %s\n' "$1" >&2
|
|
26
81
|
exit 1
|
|
27
82
|
}
|
|
83
|
+
have() { command -v "$1" > /dev/null 2>&1; }
|
|
84
|
+
|
|
85
|
+
# ---------------------------------------------------------------- macOS ----
|
|
86
|
+
|
|
87
|
+
install_macos() {
|
|
88
|
+
[ "$(uname -m)" = "arm64" ] ||
|
|
89
|
+
fail "only Apple Silicon builds exist so far. Watch $RELEASES for Intel."
|
|
90
|
+
|
|
91
|
+
have brew ||
|
|
92
|
+
fail "Homebrew is required (https://brew.sh) — or grab the DMG: $RELEASES"
|
|
93
|
+
|
|
94
|
+
say "adding the $TAP tap"
|
|
95
|
+
brew tap "$TAP" "$TAP_URL"
|
|
96
|
+
|
|
97
|
+
# Homebrew >= 6 gates third-party taps behind a trust prompt; trusting here
|
|
98
|
+
# keeps the install below non-interactive. Older Homebrew has no such command.
|
|
99
|
+
if brew trust --help > /dev/null 2>&1; then
|
|
100
|
+
say "trusting the $TAP tap"
|
|
101
|
+
brew trust "$TAP"
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
if brew list --cask "$CASK" > /dev/null 2>&1; then
|
|
105
|
+
say "upgrading $CASK"
|
|
106
|
+
brew upgrade --cask "$CASK" ||
|
|
107
|
+
say "already up to date"
|
|
108
|
+
else
|
|
109
|
+
say "installing $CASK"
|
|
110
|
+
brew install --cask "$CASK"
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
[ -d "$APP" ] || fail "expected $APP after install; check brew output above"
|
|
114
|
+
|
|
115
|
+
# Unsigned builds arrive quarantined and macOS refuses to open them
|
|
116
|
+
# ("damaged"). Only strip the flag while Gatekeeper actually rejects the
|
|
117
|
+
# app — once releases are signed + notarized this becomes a no-op.
|
|
118
|
+
if ! spctl --assess --type execute "$APP" > /dev/null 2>&1; then
|
|
119
|
+
say "builds are not yet notarized; clearing the quarantine flag"
|
|
120
|
+
xattr -dr com.apple.quarantine "$APP"
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
say "launching"
|
|
124
|
+
open "$APP"
|
|
125
|
+
say "done — deco.app is installed. Upgrade later with: brew upgrade --cask $CASK"
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
# ---------------------------------------------------------------- Linux ----
|
|
129
|
+
|
|
130
|
+
# curl is how this script normally arrives, but `wget -qO- … | sh` is just as
|
|
131
|
+
# valid an invocation — resolve one downloader up front and use it everywhere.
|
|
132
|
+
fetch() {
|
|
133
|
+
if [ "$DOWNLOADER" = curl ]; then
|
|
134
|
+
curl -fsSL --retry 3 --retry-delay 1 -o "$2" "$1"
|
|
135
|
+
else
|
|
136
|
+
wget -q -O "$2" "$1"
|
|
137
|
+
fi
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
sha256_of() {
|
|
141
|
+
case "$SHA_TOOL" in
|
|
142
|
+
sha256sum) sha256sum "$1" | cut -d' ' -f1 ;;
|
|
143
|
+
shasum) shasum -a 256 "$1" | cut -d' ' -f1 ;;
|
|
144
|
+
*) openssl dgst -sha256 "$1" | awk '{ print $NF }' ;;
|
|
145
|
+
esac
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
# The bundled runtime is a static type-2 runtime, so it needs no libfuse on
|
|
149
|
+
# disk — but self-MOUNTING still needs the kernel's /dev/fuse plus a
|
|
150
|
+
# fusermount helper to set it up unprivileged. Missing either one, the runtime
|
|
151
|
+
# dies with a terse mount error; --appimage-extract-and-run unpacks to a temp
|
|
152
|
+
# directory instead (slower start, no mount, works everywhere).
|
|
153
|
+
fuse_ready() {
|
|
154
|
+
[ -e /dev/fuse ] || return 1
|
|
155
|
+
have fusermount3 || have fusermount
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
cleanup() {
|
|
159
|
+
if [ -n "${STAGED:-}" ]; then rm -f "$STAGED"; fi
|
|
160
|
+
if [ -n "${TMP:-}" ]; then rm -rf "$TMP"; fi
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
# Stage inside $BIN_DIR, then rename. Overwriting a RUNNING AppImage in place
|
|
164
|
+
# fails with ETXTBSY, while a rename swaps the directory entry and leaves the
|
|
165
|
+
# running process on its old inode; staging in the SAME directory is what keeps
|
|
166
|
+
# that rename atomic. Shared by both verification paths so the install step
|
|
167
|
+
# cannot drift between them.
|
|
168
|
+
#
|
|
169
|
+
# `$2` is the digest these bytes were proven at BY SIGNATURE, or empty on the
|
|
170
|
+
# digest-only path. Written last, so a stamp can never outlive the install it
|
|
171
|
+
# describes; cleared on the unsigned path so a downgrade in verification
|
|
172
|
+
# strength is never left claiming the stronger one.
|
|
173
|
+
#
|
|
174
|
+
# NEVER fatal. The stamp is an optimisation — dropping it only costs the next
|
|
175
|
+
# run a re-verify, which is the fail-closed direction. It sits AFTER the `mv`
|
|
176
|
+
# and BEFORE the icon, the .desktop entry and the completion message, so on
|
|
177
|
+
# `set -eu` an unwritable stamp would abort with the binary already in place
|
|
178
|
+
# and no launcher entry: a half install that does not self-repair, because
|
|
179
|
+
# every re-run takes the same path and dies at the same line.
|
|
180
|
+
install_appimage() {
|
|
181
|
+
mkdir -p "$BIN_DIR"
|
|
182
|
+
STAGED="$BIN_DIR/.deco-studio.$$"
|
|
183
|
+
cp "$1" "$STAGED"
|
|
184
|
+
chmod 755 "$STAGED"
|
|
185
|
+
mv -f "$STAGED" "$BIN_PATH"
|
|
186
|
+
STAGED=""
|
|
187
|
+
if [ -n "${2:-}" ]; then
|
|
188
|
+
{ mkdir -p "$STAMP_DIR" && printf '%s\n' "$2" > "$STAMP_PATH"; } 2>/dev/null ||
|
|
189
|
+
say "could not record the verification stamp at $STAMP_PATH; the next run will re-verify the signature."
|
|
190
|
+
else
|
|
191
|
+
rm -f "$STAMP_PATH" 2>/dev/null || true
|
|
192
|
+
fi
|
|
193
|
+
INSTALLED_NEW=true
|
|
194
|
+
say "installed $BIN_PATH"
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
install_linux() {
|
|
198
|
+
[ "$(uname -m)" = "x86_64" ] ||
|
|
199
|
+
fail "only linux-x86_64 builds exist so far (this machine reports $(uname -m)); there is no aarch64 release yet. Watch $RELEASES."
|
|
200
|
+
|
|
201
|
+
[ -n "${HOME:-}" ] ||
|
|
202
|
+
fail "\$HOME is unset, so there is no per-user directory to install into."
|
|
203
|
+
|
|
204
|
+
if have curl; then
|
|
205
|
+
DOWNLOADER=curl
|
|
206
|
+
elif have wget; then
|
|
207
|
+
DOWNLOADER=wget
|
|
208
|
+
else
|
|
209
|
+
fail "curl or wget is required to download the AppImage."
|
|
210
|
+
fi
|
|
211
|
+
|
|
212
|
+
if have sha256sum; then
|
|
213
|
+
SHA_TOOL=sha256sum
|
|
214
|
+
elif have shasum; then
|
|
215
|
+
SHA_TOOL=shasum
|
|
216
|
+
elif have openssl; then
|
|
217
|
+
SHA_TOOL=openssl
|
|
218
|
+
else
|
|
219
|
+
fail "no sha256 tool found (sha256sum, shasum or openssl), so the download cannot be verified — refusing to install. Install coreutils, or download and check $RELEASES by hand."
|
|
220
|
+
fi
|
|
221
|
+
|
|
222
|
+
BIN_DIR="$HOME/.local/bin"
|
|
223
|
+
BIN_PATH="$BIN_DIR/deco-studio"
|
|
224
|
+
DESKTOP_DIR="$HOME/.local/share/applications"
|
|
225
|
+
DESKTOP_PATH="$DESKTOP_DIR/deco-studio.desktop"
|
|
226
|
+
ICON_DIR="$HOME/.local/share/icons/hicolor/256x256/apps"
|
|
227
|
+
ICON_PATH="$ICON_DIR/deco-studio.png"
|
|
228
|
+
# Records WHICH bytes were proven by signature, not merely by digest. The
|
|
229
|
+
# installed AppImage carries no record of how it was verified, so without
|
|
230
|
+
# this a host that took the unsigned fallback and then installed minisign —
|
|
231
|
+
# exactly what that path tells the user to do — would hit the up-to-date
|
|
232
|
+
# shortcut below and never check the signature at all.
|
|
233
|
+
STAMP_DIR="$HOME/.local/share/deco-studio"
|
|
234
|
+
STAMP_PATH="$STAMP_DIR/verified.sha256"
|
|
235
|
+
|
|
236
|
+
TMP=$(mktemp -d) || fail "could not create a temporary directory."
|
|
237
|
+
trap 'cleanup; exit 130' INT
|
|
238
|
+
trap 'cleanup; exit 143' TERM
|
|
239
|
+
trap cleanup EXIT
|
|
240
|
+
|
|
241
|
+
say "reading the update channel"
|
|
242
|
+
CHANNEL_JSON="$TMP/latest.json"
|
|
243
|
+
# A downloader that exits non-zero has told us nothing about which versions
|
|
244
|
+
# exist — network down, proxy, DNS, 404, GitHub outage. That is a DIFFERENT
|
|
245
|
+
# failure from a manifest we read and could not understand, and neither one
|
|
246
|
+
# may ever be reported as "Linux was never released".
|
|
247
|
+
fetch "$UPDATE_CHANNEL" "$CHANNEL_JSON" ||
|
|
248
|
+
fail "could not fetch the update channel manifest at $UPDATE_CHANNEL — the download itself failed (network, DNS, proxy, a GitHub outage, or that asset is missing), so which version to install is simply unknown. Nothing was installed; re-run once it is reachable, or pick a release by hand from $RELEASES."
|
|
249
|
+
|
|
250
|
+
# Prove this is the manifest before blaming anyone for its contents. `curl
|
|
251
|
+
# -fsSL` happily returns a captive-portal or proxy block page with HTTP 200,
|
|
252
|
+
# and the rolling channel asset is the one file in the scheme that is
|
|
253
|
+
# re-uploaded on every promote, so a half-written body is possible. Without
|
|
254
|
+
# this, an HTML block page is reported as a publishing fault and a truncated
|
|
255
|
+
# manifest as "Linux was never released" — both confidently wrong.
|
|
256
|
+
grep -q '"platforms"' "$CHANNEL_JSON" ||
|
|
257
|
+
fail "what came back from $UPDATE_CHANNEL is not the updater manifest (no \"platforms\" object) — most likely a captive portal, an intercepting proxy, or a corrupt channel asset, not a missing release. Nothing was installed."
|
|
258
|
+
|
|
259
|
+
# No jq on a bare host: split the document on commas so every field lands on
|
|
260
|
+
# its own line, then read the manifest's single top-level "version". The
|
|
261
|
+
# per-platform entries hold only "url" and "signature", so this cannot match
|
|
262
|
+
# anything else.
|
|
263
|
+
VERSION=$(tr ',' '\n' < "$CHANNEL_JSON" |
|
|
264
|
+
sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' |
|
|
265
|
+
head -n 1)
|
|
266
|
+
# It becomes a URL and a filename below, so it has to look like a version.
|
|
267
|
+
case "$VERSION" in
|
|
268
|
+
"" | *[!0-9A-Za-z.+-]*) VERSION="" ;;
|
|
269
|
+
[0-9]*) ;;
|
|
270
|
+
*) VERSION="" ;;
|
|
271
|
+
esac
|
|
272
|
+
[ -n "$VERSION" ] ||
|
|
273
|
+
fail "the update channel manifest at $UPDATE_CHANNEL was downloaded but carries no usable \"version\", so there is nothing to resolve. This is a publishing fault, not a network one — report it at $RELEASES, or install a release by hand from there."
|
|
274
|
+
|
|
275
|
+
# The manifest is refused unless it covers EVERY platform the channel serves
|
|
276
|
+
# (native-update-channel.mjs's PLATFORM_ASSETS / buildLatestJson), so a
|
|
277
|
+
# manifest without this key was promoted before Linux was a shipping target —
|
|
278
|
+
# its version genuinely has no AppImage to install. Saying that here beats
|
|
279
|
+
# failing three lines down on a missing checksum, which reads like an outage.
|
|
280
|
+
grep -q '"linux-x86_64"' "$CHANNEL_JSON" ||
|
|
281
|
+
fail "the update channel is serving $VERSION, but that manifest covers no linux-x86_64 build, so there is no Linux release to install yet. Watch $RELEASES."
|
|
282
|
+
|
|
283
|
+
TAG="native-v$VERSION"
|
|
284
|
+
ASSET="deco-$VERSION-linux-x86_64.AppImage"
|
|
285
|
+
SUM_ASSET="$ASSET.sha256"
|
|
286
|
+
TARBALL="$ASSET.tar.gz"
|
|
287
|
+
# The AppImage's name INSIDE the signed tarball: the bundler's dpkg
|
|
288
|
+
# vocabulary (amd64), not the release's (x86_64). release-native.yaml asserts
|
|
289
|
+
# this exact name at build time and src-tauri/src/updater.rs parses it.
|
|
290
|
+
MEMBER="deco_${VERSION}_amd64.AppImage"
|
|
291
|
+
BASE="$RELEASES/download/$TAG"
|
|
292
|
+
say "the update channel is serving $VERSION"
|
|
293
|
+
|
|
294
|
+
# What this host can prove about the bytes it is about to execute. minisign
|
|
295
|
+
# is the only one of the three that establishes AUTHENTICITY; tar and base64
|
|
296
|
+
# are what it takes to consume the signed artifact (the .sig is
|
|
297
|
+
# base64-wrapped, the payload is a gzipped tar).
|
|
298
|
+
SIG_MISSING=""
|
|
299
|
+
for TOOL in minisign tar base64; do
|
|
300
|
+
have "$TOOL" || SIG_MISSING="${SIG_MISSING:+$SIG_MISSING, }$TOOL"
|
|
301
|
+
done
|
|
302
|
+
|
|
303
|
+
# Checksum first: it is a few bytes, it decides whether the ~100 MB download
|
|
304
|
+
# is worth starting, and it doubles as the up-to-date check below. Required
|
|
305
|
+
# on both paths — under the signed path it is the cross-check that the tag's
|
|
306
|
+
# two Linux assets describe the same build.
|
|
307
|
+
fetch "$BASE/$SUM_ASSET" "$TMP/$SUM_ASSET" ||
|
|
308
|
+
fail "could not download $BASE/$SUM_ASSET, so $ASSET cannot be verified and will not be installed. Re-run to retry, or download and check $ASSET yourself from $RELEASES/tag/$TAG."
|
|
309
|
+
|
|
310
|
+
EXPECTED=$(cut -d' ' -f1 < "$TMP/$SUM_ASSET" | head -n 1 | tr -d '\r' | tr 'A-F' 'a-f')
|
|
311
|
+
case "$EXPECTED" in
|
|
312
|
+
*[!0-9a-f]*) EXPECTED="" ;;
|
|
313
|
+
esac
|
|
314
|
+
[ "${#EXPECTED}" -eq 64 ] ||
|
|
315
|
+
fail "$SUM_ASSET on $TAG does not hold a sha256 digest, so nothing can be verified against it. Report this at $RELEASES."
|
|
316
|
+
|
|
317
|
+
# A re-run against an install that already carries these exact bytes is a
|
|
318
|
+
# no-op: skip the download and only re-assert the desktop integration below.
|
|
319
|
+
#
|
|
320
|
+
# Matching bytes are not enough on their own. A host that took the unsigned
|
|
321
|
+
# fallback, then installed minisign and re-ran — the remedy that path prints
|
|
322
|
+
# — would otherwise exit here having verified nothing, so the instruction
|
|
323
|
+
# would be a no-op against exactly the attacker it warns about (one who
|
|
324
|
+
# serves both the AppImage and its .sha256). So the shortcut also needs
|
|
325
|
+
# either nothing better available on this host, or a stamp proving these
|
|
326
|
+
# bytes already passed the signature check.
|
|
327
|
+
INSTALLED_NEW=false
|
|
328
|
+
if [ -f "$BIN_PATH" ] && [ "$(sha256_of "$BIN_PATH")" = "$EXPECTED" ] &&
|
|
329
|
+
{ [ -n "$SIG_MISSING" ] || [ "$(cat "$STAMP_PATH" 2>/dev/null)" = "$EXPECTED" ]; }; then
|
|
330
|
+
say "already up to date at $VERSION"
|
|
331
|
+
elif [ -z "$SIG_MISSING" ]; then
|
|
332
|
+
# The signed path. `deco-$V-linux-x86_64.AppImage.tar.gz` is a gzipped tar
|
|
333
|
+
# of the very AppImage the raw asset serves, published on the same tag with
|
|
334
|
+
# a minisign .sig — the pair release-native.yaml's promote job verifies
|
|
335
|
+
# before it will build a manifest from it. Verifying it HERE, against a key
|
|
336
|
+
# that arrived with this script from a different origin, is the only step
|
|
337
|
+
# in this install that a GitHub-side compromise cannot forge.
|
|
338
|
+
say "minisign is installed here, so the release signature will be checked against the key embedded in this installer"
|
|
339
|
+
PUB="$TMP/updater.pub"
|
|
340
|
+
printf '%s\n' "$UPDATER_PUBKEY" > "$PUB"
|
|
341
|
+
|
|
342
|
+
say "downloading $TARBALL"
|
|
343
|
+
fetch "$BASE/$TARBALL" "$TMP/$TARBALL" ||
|
|
344
|
+
fail "could not download $BASE/$TARBALL. Check the network and re-run, or grab $ASSET by hand from $RELEASES/tag/$TAG."
|
|
345
|
+
fetch "$BASE/$TARBALL.sig" "$TMP/$TARBALL.sig" ||
|
|
346
|
+
fail "could not download $BASE/$TARBALL.sig, so the release signature cannot be checked and nothing was installed. Re-run to retry, or grab $ASSET by hand from $RELEASES/tag/$TAG."
|
|
347
|
+
|
|
348
|
+
# Tauri publishes the signature base64-wrapped; decoding yields an ordinary
|
|
349
|
+
# minisign .minisig file.
|
|
350
|
+
tr -d '\r\n' < "$TMP/$TARBALL.sig" | base64 -d > "$TMP/$TARBALL.minisig" ||
|
|
351
|
+
fail "$TARBALL.sig on $TAG is not the base64-wrapped minisign signature it should be, so nothing can be verified against it. Report this at $RELEASES."
|
|
352
|
+
|
|
353
|
+
minisign -V -p "$PUB" -x "$TMP/$TARBALL.minisig" -m "$TMP/$TARBALL" \
|
|
354
|
+
> /dev/null ||
|
|
355
|
+
fail "$TARBALL does NOT verify against the deco updater signing key embedded in this installer. These are not the bytes deco published — refusing to install. Report this at $RELEASES."
|
|
356
|
+
say "verified $TARBALL against the deco updater signing key"
|
|
357
|
+
|
|
358
|
+
mkdir -p "$TMP/unpack"
|
|
359
|
+
tar xzf "$TMP/$TARBALL" -C "$TMP/unpack" ||
|
|
360
|
+
fail "could not unpack the verified $TARBALL. Re-run to retry, or grab $ASSET by hand from $RELEASES/tag/$TAG."
|
|
361
|
+
|
|
362
|
+
SRC="$TMP/unpack/$MEMBER"
|
|
363
|
+
if [ ! -f "$SRC" ]; then
|
|
364
|
+
# The member name is asserted at build time, so this is drift, not
|
|
365
|
+
# tampering — the tarball is already proven authentic, and the digest
|
|
366
|
+
# check below still has to pass. Take the AppImage it does contain rather
|
|
367
|
+
# than refusing an otherwise-good install over a rename.
|
|
368
|
+
SRC=""
|
|
369
|
+
for CANDIDATE in "$TMP"/unpack/*.AppImage; do
|
|
370
|
+
if [ -f "$CANDIDATE" ]; then
|
|
371
|
+
SRC="$CANDIDATE"
|
|
372
|
+
break
|
|
373
|
+
fi
|
|
374
|
+
done
|
|
375
|
+
fi
|
|
376
|
+
[ -n "$SRC" ] ||
|
|
377
|
+
fail "the verified $TARBALL contains no AppImage (expected $MEMBER). Report this at $RELEASES."
|
|
378
|
+
|
|
379
|
+
# Same bytes on both assets by construction — release-native.yaml copies
|
|
380
|
+
# one build's AppImage into the tarball and hashes it into $SUM_ASSET, and
|
|
381
|
+
# publishes that leg all-or-nothing. A disagreement therefore means the tag
|
|
382
|
+
# carries two different builds, which is a defect to report, not something
|
|
383
|
+
# to install through.
|
|
384
|
+
ACTUAL=$(sha256_of "$SRC")
|
|
385
|
+
[ "$ACTUAL" = "$EXPECTED" ] ||
|
|
386
|
+
fail "the AppImage inside the signature-verified $TARBALL does not match $SUM_ASSET on $TAG — expected $EXPECTED, got $ACTUAL. Those two assets describe different builds, so one of them is wrong; nothing was installed. Report this at $RELEASES."
|
|
387
|
+
|
|
388
|
+
install_appimage "$SRC" "$EXPECTED"
|
|
389
|
+
else
|
|
390
|
+
# The unsigned path: the digest is all this host can check, and it only
|
|
391
|
+
# rules out a mangled transfer. Announced, never silent — an installer that
|
|
392
|
+
# quietly drops from "signature verified" to "not corrupt" has lied by
|
|
393
|
+
# omission about what it just proved.
|
|
394
|
+
say "no signature check on this host ($SIG_MISSING not installed): falling back to the published sha256, which catches a corrupt or truncated download but NOT a tampered one — the digest sits on the same release, same origin and same TLS session as the binary it describes. Install minisign and re-run to have the release signature verified instead."
|
|
395
|
+
say "downloading $ASSET"
|
|
396
|
+
fetch "$BASE/$ASSET" "$TMP/$ASSET" ||
|
|
397
|
+
fail "could not download $BASE/$ASSET. Check the network and re-run, or grab it by hand from $RELEASES/tag/$TAG."
|
|
398
|
+
|
|
399
|
+
ACTUAL=$(sha256_of "$TMP/$ASSET")
|
|
400
|
+
[ "$ACTUAL" = "$EXPECTED" ] ||
|
|
401
|
+
fail "checksum mismatch for $ASSET — expected $EXPECTED, got $ACTUAL. Nothing was installed. Re-run to retry a truncated download; if it persists, report it at $RELEASES."
|
|
402
|
+
say "$ASSET matches $SUM_ASSET (an intact download, not a proof of origin)"
|
|
403
|
+
|
|
404
|
+
install_appimage "$TMP/$ASSET"
|
|
405
|
+
fi
|
|
406
|
+
|
|
407
|
+
if fuse_ready; then
|
|
408
|
+
EXEC_ARGS=""
|
|
409
|
+
else
|
|
410
|
+
EXEC_ARGS=" --appimage-extract-and-run"
|
|
411
|
+
say "no usable FUSE here (/dev/fuse plus fusermount/fusermount3), so the AppImage cannot self-mount; falling back to --appimage-extract-and-run, which unpacks to a temp directory on every start. Installing your distribution's fuse package (fuse3 / libfuse2) and re-running this installer restores the faster path."
|
|
412
|
+
fi
|
|
413
|
+
|
|
414
|
+
# Best effort, never fatal: --appimage-extract is handled by the runtime
|
|
415
|
+
# itself and needs no FUSE, so the launcher entry can carry the real icon.
|
|
416
|
+
# A failure here costs a generic icon and nothing else.
|
|
417
|
+
if [ "$INSTALLED_NEW" = true ] || [ ! -f "$ICON_PATH" ]; then
|
|
418
|
+
if (cd "$TMP" && "$BIN_PATH" --appimage-extract \
|
|
419
|
+
"usr/share/icons/hicolor/256x256/apps/deco.png" > /dev/null 2>&1) &&
|
|
420
|
+
[ -f "$TMP/squashfs-root/usr/share/icons/hicolor/256x256/apps/deco.png" ]; then
|
|
421
|
+
mkdir -p "$ICON_DIR"
|
|
422
|
+
cp "$TMP/squashfs-root/usr/share/icons/hicolor/256x256/apps/deco.png" \
|
|
423
|
+
"$ICON_PATH"
|
|
424
|
+
fi
|
|
425
|
+
fi
|
|
426
|
+
|
|
427
|
+
# Rewritten every run: it is a few bytes, it repairs a half-written entry,
|
|
428
|
+
# and Exec has to track whichever FUSE verdict this host just produced. The
|
|
429
|
+
# program is double-quoted because the desktop-entry spec splits Exec on
|
|
430
|
+
# whitespace, and $HOME may contain a space.
|
|
431
|
+
mkdir -p "$DESKTOP_DIR"
|
|
432
|
+
cat > "$DESKTOP_PATH" << DESKTOP_ENTRY
|
|
433
|
+
[Desktop Entry]
|
|
434
|
+
Type=Application
|
|
435
|
+
Name=deco
|
|
436
|
+
GenericName=MCP control plane
|
|
437
|
+
Comment=deco studio
|
|
438
|
+
Exec="$BIN_PATH"$EXEC_ARGS
|
|
439
|
+
Icon=deco-studio
|
|
440
|
+
Terminal=false
|
|
441
|
+
Categories=Development;Network;
|
|
442
|
+
StartupWMClass=deco
|
|
443
|
+
DESKTOP_ENTRY
|
|
444
|
+
if have update-desktop-database; then
|
|
445
|
+
update-desktop-database "$DESKTOP_DIR" > /dev/null 2>&1 || true
|
|
446
|
+
fi
|
|
447
|
+
|
|
448
|
+
case ":${PATH:-}:" in
|
|
449
|
+
*":$BIN_DIR:"*) ;;
|
|
450
|
+
*)
|
|
451
|
+
say "note: $BIN_DIR is not on your PATH. To launch from a terminal, add this to your shell profile:"
|
|
452
|
+
say " export PATH=\"\$HOME/.local/bin:\$PATH\""
|
|
453
|
+
;;
|
|
454
|
+
esac
|
|
455
|
+
|
|
456
|
+
say "done — deco $VERSION is installed and listed in your application launcher."
|
|
457
|
+
say "run it with: $BIN_PATH$EXEC_ARGS"
|
|
458
|
+
say "upgrade later by re-running this installer."
|
|
459
|
+
}
|
|
28
460
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
fail "Homebrew is required (https://brew.sh) — or grab the DMG: $RELEASES"
|
|
37
|
-
|
|
38
|
-
say "adding the $TAP tap"
|
|
39
|
-
brew tap "$TAP" "$TAP_URL"
|
|
40
|
-
|
|
41
|
-
# Homebrew >= 6 gates third-party taps behind a trust prompt; trusting here
|
|
42
|
-
# keeps the install below non-interactive. Older Homebrew has no such command.
|
|
43
|
-
if brew trust --help > /dev/null 2>&1; then
|
|
44
|
-
say "trusting the $TAP tap"
|
|
45
|
-
brew trust "$TAP"
|
|
46
|
-
fi
|
|
47
|
-
|
|
48
|
-
if brew list --cask "$CASK" > /dev/null 2>&1; then
|
|
49
|
-
say "upgrading $CASK"
|
|
50
|
-
brew upgrade --cask "$CASK" ||
|
|
51
|
-
say "already up to date"
|
|
52
|
-
else
|
|
53
|
-
say "installing $CASK"
|
|
54
|
-
brew install --cask "$CASK"
|
|
55
|
-
fi
|
|
56
|
-
|
|
57
|
-
[ -d "$APP" ] || fail "expected $APP after install; check brew output above"
|
|
58
|
-
|
|
59
|
-
# Unsigned builds arrive quarantined and macOS refuses to open them
|
|
60
|
-
# ("damaged"). Only strip the flag while Gatekeeper actually rejects the
|
|
61
|
-
# app — once releases are signed + notarized this becomes a no-op.
|
|
62
|
-
if ! spctl --assess --type execute "$APP" > /dev/null 2>&1; then
|
|
63
|
-
say "builds are not yet notarized; clearing the quarantine flag"
|
|
64
|
-
xattr -dr com.apple.quarantine "$APP"
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
say "launching"
|
|
68
|
-
open "$APP"
|
|
69
|
-
say "done — deco.app is installed. Upgrade later with: brew upgrade --cask $CASK"
|
|
461
|
+
case "$(uname -s)" in
|
|
462
|
+
Darwin) install_macos ;;
|
|
463
|
+
Linux) install_linux ;;
|
|
464
|
+
*)
|
|
465
|
+
fail "unsupported operating system: $(uname -s). deco studio ships a macOS (Apple Silicon) app and a Linux x86_64 AppImage — see $RELEASES."
|
|
466
|
+
;;
|
|
467
|
+
esac
|