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.
Files changed (261) hide show
  1. package/dist/client/assets/{AlertCircle-CeleFBrs.js → AlertCircle-BSGNUx7V.js} +1 -1
  2. package/dist/client/assets/{AreaChart-Cr68R9KD.js → AreaChart-qGMzdkmk.js} +1 -1
  3. package/dist/client/assets/{ArrowLeft-CwsJ1Sfc.js → ArrowLeft-DHRINKlz.js} +1 -1
  4. package/dist/client/assets/{ArrowUp-PM43ttWN.js → ArrowUp-ntTpD-To.js} +1 -1
  5. package/dist/client/assets/{ArrowUpRight-C0hTvHTE.js → ArrowUpRight-BG4SvGJv.js} +1 -1
  6. package/dist/client/assets/{Check-BdzjeMXF.js → Check-DhNjrmaj.js} +1 -1
  7. package/dist/client/assets/{CheckCircle-D-nlOrXB.js → CheckCircle-B_sdSbJU.js} +1 -1
  8. package/dist/client/assets/{ChevronDown-BOc1-i9L.js → ChevronDown-CaUFgq06.js} +1 -1
  9. package/dist/client/assets/{ChevronRight-wqbYwiLF.js → ChevronRight-jZWdrf9f.js} +1 -1
  10. package/dist/client/assets/{ChevronUp-IHCmvX3E.js → ChevronUp-BRjHRWFg.js} +1 -1
  11. package/dist/client/assets/{Copy01-DIJvVGQk.js → Copy01-C3CSvCmh.js} +1 -1
  12. package/dist/client/assets/{CreditCard01-W4m_wy49.js → CreditCard01-5rNLMrBA.js} +1 -1
  13. package/dist/client/assets/{DotsVertical-Bohq38Q1.js → DotsVertical-Dp5Cm_iP.js} +1 -1
  14. package/dist/client/assets/Download01-DIiuseU_.js +1 -0
  15. package/dist/client/assets/{Eye-C5vDWwaK.js → Eye-CVDf_kH4.js} +1 -1
  16. package/dist/client/assets/{FilterLines-C9pmu5SZ.js → FilterLines-DV7AkyjC.js} +1 -1
  17. package/dist/client/assets/Globe01-Bak8Df7R.js +1 -0
  18. package/dist/client/assets/{Globe04-CDJqKwdP.js → Globe04-21nMtmZT.js} +1 -1
  19. package/dist/client/assets/{HardDrive-BicURFt0.js → HardDrive-yKF5zKg2.js} +1 -1
  20. package/dist/client/assets/{Key01-CRQOB5O_.js → Key01-C-HagbU9.js} +1 -1
  21. package/dist/client/assets/{LayoutLeft-DZwVeKk1.js → LayoutLeft-DTt2h_gY.js} +1 -1
  22. package/dist/client/assets/{LinkExternal01-Do6tmctI.js → LinkExternal01-BAXCjJ3W.js} +1 -1
  23. package/dist/client/assets/{LockUnlocked01-BxK9l3CJ.js → LockUnlocked01-CTGb9BVB.js} +1 -1
  24. package/dist/client/assets/{LogOut01-DhAdDNkV.js → LogOut01-CI181NEF.js} +1 -1
  25. package/dist/client/assets/{Monitor01-BKGGKBRj.js → Monitor01-Be5N7TRy.js} +1 -1
  26. package/dist/client/assets/{Palette-5WrpEUaC.js → Palette-BNNCPeK0.js} +1 -1
  27. package/dist/client/assets/{Play-Yhg2bDxR.js → Play-BsRzOgzp.js} +1 -1
  28. package/dist/client/assets/{Plus-CgXuzVCT.js → Plus-9luEKPZw.js} +1 -1
  29. package/dist/client/assets/{SearchLg-CYNvKytJ.js → SearchLg-F6MPrrZo.js} +1 -1
  30. package/dist/client/assets/{SearchMd-BOeEZKFu.js → SearchMd-7UCVFr92.js} +1 -1
  31. package/dist/client/assets/{Settings02-CpRid7rG.js → Settings02-DWTUyGYI.js} +1 -1
  32. package/dist/client/assets/{Share07-B14EYmF_.js → Share07-BBwkuMmH.js} +1 -1
  33. package/dist/client/assets/{Shield01-DS1CkOm5.js → Shield01-DwaMx4Kj.js} +1 -1
  34. package/dist/client/assets/{Stars01-CPDNiFNQ.js → Stars01-gwxykcEQ.js} +1 -1
  35. package/dist/client/assets/{Stars02-CH68Qhm_.js → Stars02-B6JXDKru.js} +1 -1
  36. package/dist/client/assets/{Sun-CjcZKPaq.js → Sun-BJxBIAjy.js} +1 -1
  37. package/dist/client/assets/{SwitchHorizontal01-DOmwqeXB.js → SwitchHorizontal01-CdQluNjW.js} +1 -1
  38. package/dist/client/assets/{Tool01-BLxK-7k7.js → Tool01-B3cfX7QW.js} +1 -1
  39. package/dist/client/assets/{Tool02-B8GwG_SX.js → Tool02-Dz1T3Rmg.js} +1 -1
  40. package/dist/client/assets/{Trash01-COMthlp3.js → Trash01-Dx-L9twD.js} +1 -1
  41. package/dist/client/assets/{TrendUp01-Pa_0KlRB.js → TrendUp01-jt7vyfmI.js} +1 -1
  42. package/dist/client/assets/{Upload01-DO7DRGUd.js → Upload01-BxhthB2p.js} +1 -1
  43. package/dist/client/assets/{User01-C2rVZTl-.js → User01-CFSl83nB.js} +1 -1
  44. package/dist/client/assets/{Users01-ClsBMo4K.js → Users01-BijcXXI3.js} +1 -1
  45. package/dist/client/assets/{Users03-DP3zwt6-.js → Users03-D4EG206O.js} +1 -1
  46. package/dist/client/assets/{X-Bfx6rO6W.js → X-CSYXCnV9.js} +1 -1
  47. package/dist/client/assets/{XCircle-jlAhwcDu.js → XCircle-Cu0-8nUy.js} +1 -1
  48. package/dist/client/assets/{XClose-DdXn46Em.js → XClose-DSHM2tuZ.js} +1 -1
  49. package/dist/client/assets/{YAxis-C5lX8CaJ.js → YAxis-DaCLoj6F.js} +1 -1
  50. package/dist/client/assets/{Zap-li0rR-RI.js → Zap-BJ7aktKA.js} +1 -1
  51. package/dist/client/assets/{ZapSquare-Gxca0Ylc.js → ZapSquare-DsGT7WIC.js} +1 -1
  52. package/dist/client/assets/{access-gate-C8o_OE1N.js → access-gate-rP_MjwR7.js} +1 -1
  53. package/dist/client/assets/agent-icon-eH38g2HT.js +1 -0
  54. package/dist/client/assets/agents-list-DCLtFhhx.js +1 -0
  55. package/dist/client/assets/ai-providers-BVZMQNKu.js +1 -0
  56. package/dist/client/assets/{alert-1MxwzRCP.js → alert-BMVQGRt6.js} +1 -1
  57. package/dist/client/assets/{alert-dialog-Cqq7FgQj.js → alert-dialog-CMLgUtLr.js} +1 -1
  58. package/dist/client/assets/{api-keys-BmVwKDo4.js → api-keys-KMpkqWx8.js} +1 -1
  59. package/dist/client/assets/app-editor-DePidg7R.js +1 -0
  60. package/dist/client/assets/{auth-tEJ4bybR.js → auth-C0RxM0MV.js} +1 -1
  61. package/dist/client/assets/{auth-catchall-CYO83hyU.js → auth-catchall-DKTY___X.js} +1 -1
  62. package/dist/client/assets/{auth-entry-Dc1zlPtG.js → auth-entry-BpqowsP8.js} +1 -1
  63. package/dist/client/assets/{auth-split-layout-C945ZTK3.js → auth-split-layout-CjAUeNRJ.js} +1 -1
  64. package/dist/client/assets/{authenticate-and-persist-oauth-CqRX86RU.js → authenticate-and-persist-oauth-iw6ouFr9.js} +1 -1
  65. package/dist/client/assets/{automation-list-row-BN46j3bE.js → automation-list-row-Bkk5b-Xu.js} +1 -1
  66. package/dist/client/assets/{automation-runs-nfuxnSim.js → automation-runs-7BxhYAN0.js} +16 -16
  67. package/dist/client/assets/automations-g01DiXGR.js +1 -0
  68. package/dist/client/assets/{avatar-BqAz0FLa.js → avatar-CzJUVoDs.js} +1 -1
  69. package/dist/client/assets/{badge-D24p8Xxi.js → badge-DbSQDjS0.js} +1 -1
  70. package/dist/client/assets/{billing-DSz5ucLf.js → billing-4Wr63XfR.js} +1 -1
  71. package/dist/client/assets/{block-document-ChYHEJUH.js → block-document-c_ItM0iq.js} +1 -1
  72. package/dist/client/assets/{buckets-DyBjeMFW.js → buckets-BEGiPCkc.js} +1 -1
  73. package/dist/client/assets/bulk-category-panel-DhM1EGbP.js +1 -0
  74. package/dist/client/assets/{capability-load-error-CPQoG_lp.js → capability-load-error-CRpB249h.js} +1 -1
  75. package/dist/client/assets/{card-CooN3E-v.js → card-FCEwqon6.js} +1 -1
  76. package/dist/client/assets/cards-CIZK-4zJ.js +9 -0
  77. package/dist/client/assets/category-editor-CVaNQqlc.js +1 -0
  78. package/dist/client/assets/{chart-Dtka3CXu.js → chart-BVs8Wshz.js} +1 -1
  79. package/dist/client/assets/{chat-context--S2eGI2t.js → chat-context-Qk-9IhfU.js} +1 -1
  80. package/dist/client/assets/{checkbox-BqtDvsR1.js → checkbox-Badqx0C2.js} +1 -1
  81. package/dist/client/assets/{cli-auth-success-B6EGxQbP.js → cli-auth-success-BBdGAncX.js} +1 -1
  82. package/dist/client/assets/collection-detail-C13FmfjI.js +1 -0
  83. package/dist/client/assets/{collection-display-button-B1OCDGvC.js → collection-display-button-DBcRwNMI.js} +1 -1
  84. package/dist/client/assets/{collection-search-H6c7ia6t.js → collection-search-DcQsyJxv.js} +1 -1
  85. package/dist/client/assets/{collection-table-wrapper-CksgkvG8.js → collection-table-wrapper-DKCmgLGf.js} +1 -1
  86. package/dist/client/assets/{collection-tabs-BqnoVI6Y.js → collection-tabs-TNXMy8gA.js} +1 -1
  87. package/dist/client/assets/{command-DhvOaMnH.js → command-DWBbdLBX.js} +1 -1
  88. package/dist/client/assets/commerce-onboarding-4x4UgCdX.js +1 -0
  89. package/dist/client/assets/{connect-C-NmOGr7.js → connect-Dtqc1nsL.js} +1 -1
  90. package/dist/client/assets/{connection-DJ2785KU.js → connection-DyYsm8dV.js} +1 -1
  91. package/dist/client/assets/{connection-card-DSX5zHxO.js → connection-card-BsbMWXtq.js} +1 -1
  92. package/dist/client/assets/connection-detail-CusJoVJI.js +1 -0
  93. package/dist/client/assets/{connection-form-helpers-B07wLptq.js → connection-form-helpers-hjpjGHOP.js} +1 -1
  94. package/dist/client/assets/connections-C3g87Fyq.js +1 -0
  95. package/dist/client/assets/{decopilot-sse-pool-U92pbu07.js → decopilot-sse-pool-BNW6JWpR.js} +1 -1
  96. package/dist/client/assets/{dialog-C2XtKj4W.js → dialog-0fNUeR9R.js} +1 -1
  97. package/dist/client/assets/{domain-settings-D2fweBMx.js → domain-settings-B4x9P8HV.js} +1 -1
  98. package/dist/client/assets/{drawer-HtUPoolZ.js → drawer-HRJ32EbE.js} +1 -1
  99. package/dist/client/assets/{dropdown-menu-Buaqq-Fn.js → dropdown-menu-Gs5UGB4h.js} +1 -1
  100. package/dist/client/assets/{empty-state-Bd3g-2FH.js → empty-state-LcWMvkBG.js} +1 -1
  101. package/dist/client/assets/{extract-connection-data-V948FMyj.js → extract-connection-data-BYxfOuH_.js} +1 -1
  102. package/dist/client/assets/file-explorer-B7clljfW.js +2 -0
  103. package/dist/client/assets/{file-type-icon-BSAnhEu5.js → file-type-icon-CTX2jq9G.js} +1 -1
  104. package/dist/client/assets/{form-CMuk1nXb.js → form-DGhZtrNx.js} +1 -1
  105. package/dist/client/assets/general-B8n1QEr5.js +1 -0
  106. package/dist/client/assets/{github-repo-picker-DjVb6-0i.js → github-repo-picker-DOf_JZk2.js} +1 -1
  107. package/dist/client/assets/{hooks-Cd2G3711.js → hooks-Cj6NKwbB.js} +1 -1
  108. package/dist/client/assets/{index-Dwrgaiv3.js → index-2ZeZ7XA1.js} +1 -1
  109. package/dist/client/assets/{index-DNa-ZV66.js → index-Bqi-j8tu.js} +1 -1
  110. package/dist/client/assets/{index-BKOwC_zz.js → index-CElD4z4O.js} +1 -1
  111. package/dist/client/assets/{index-BflbKT0u.js → index-CiuQrzO7.js} +2 -2
  112. package/dist/client/assets/{index-BaWtU9eb.js → index-CnpdnndP.js} +58 -61
  113. package/dist/client/assets/{index-BoSySxnu.js → index-D87JktxF.js} +1 -1
  114. package/dist/client/assets/{index-CPCOiQxX.js → index-DZl62lg2.js} +1 -1
  115. package/dist/client/assets/{index-BRjr3L_N.js → index-DporvBqC.js} +1 -1
  116. package/dist/client/assets/{index-BphIXXOp.js → index-QSWmOkVC.js} +37 -37
  117. package/dist/client/assets/index-mmj8d1OZ.js +1 -0
  118. package/dist/client/assets/{index-redirect-CyqcxiJb.js → index-redirect-CLI7ZZ-t.js} +1 -1
  119. package/dist/client/assets/{infra-billing-B1fwJNOz.js → infra-billing-BEXhDVVj.js} +1 -1
  120. package/dist/client/assets/{input-9TNY2G6W.js → input-CjD4VhOq.js} +1 -1
  121. package/dist/client/assets/{integration-icon-CGwCrGIc.js → integration-icon-CPM2Wy4S.js} +1 -1
  122. package/dist/client/assets/{invite-member-dialog-BIJfPXUf.js → invite-member-dialog-uqixWqH7.js} +1 -1
  123. package/dist/client/assets/{label-DhJo3WjY.js → label-BM_KNax6.js} +1 -1
  124. package/dist/client/assets/{layout-CeWP0gEY.js → layout-Cyxx23a5.js} +1 -1
  125. package/dist/client/assets/{login-DxZTpOpk.js → login-DTcPenfD.js} +1 -1
  126. package/dist/client/assets/{mcp-oauth--A5K-xL8.js → mcp-oauth-CXtITOci.js} +1 -1
  127. package/dist/client/assets/{members-B5PzIuUU.js → members-BngJJI1k.js} +1 -1
  128. package/dist/client/assets/{monaco-editor-BMLOnDLJ.js → monaco-editor-BhG2pRsy.js} +1 -1
  129. package/dist/client/assets/{monitoring-stats-row-Rpla78Nn.js → monitoring-stats-row-V0REizP2.js} +1 -1
  130. package/dist/client/assets/{multi-select-Duz2hJ29.js → multi-select-DVmJ8N16.js} +1 -1
  131. package/dist/client/assets/{oauth-callback-Cn0wl-wL.js → oauth-callback-QWZ-1Ao_.js} +1 -1
  132. package/dist/client/assets/{oauth-callback-ai-provider-CvoqVCiX.js → oauth-callback-ai-provider-DNiT_-tQ.js} +1 -1
  133. package/dist/client/assets/{onboarding-CTQgNbX8.js → onboarding-4kFhDwBC.js} +1 -1
  134. package/dist/client/assets/{org-layout-tUX-e_rZ.js → org-layout-D1UQZWSN.js} +1 -1
  135. package/dist/client/assets/{organization-choice-T8a5zIBy.js → organization-choice-CguXU_qj.js} +1 -1
  136. package/dist/client/assets/{orgs-CGkwFzZ6.js → orgs-C0r08Wz9.js} +1 -1
  137. package/dist/client/assets/{page-seo-form-C0yVvfZn.js → page-seo-form-BYQ_C966.js} +1 -1
  138. package/dist/client/assets/{popover-BV2Ziop4.js → popover-Cdk4wGDs.js} +1 -1
  139. package/dist/client/assets/post-editor-CBRsERKT.js +1 -0
  140. package/dist/client/assets/{primitives-QfIbZaez.js → primitives-oSbSlJdK.js} +1 -1
  141. package/dist/client/assets/{profile-Bp26cqE6.js → profile-DT6piyAB.js} +1 -1
  142. package/dist/client/assets/project-app-view-ODxcuXJo.js +1 -0
  143. package/dist/client/assets/record-editor-DVIXyY1q.js +1 -0
  144. package/dist/client/assets/redirect-editor-CXtmXnNZ.js +1 -0
  145. package/dist/client/assets/registry-C7n-7FhE.js +2 -0
  146. package/dist/client/assets/{registry-layout-DdRmZw6K.js → registry-layout-DoD0R5_E.js} +3 -3
  147. package/dist/client/assets/{reports-DMvf7MMo.js → reports-CxxatuXV.js} +1 -1
  148. package/dist/client/assets/{require-capability-ChdE_Nc5.js → require-capability-BujVC6Iv.js} +1 -1
  149. package/dist/client/assets/{required-auth-layout-DYO8_0ig.js → required-auth-layout-Bc5Jqmw0.js} +1 -1
  150. package/dist/client/assets/{reset-password-C661myht.js → reset-password-CRp5Vxzw.js} +1 -1
  151. package/dist/client/assets/roles-Bg6Wpwtz.js +1 -0
  152. package/dist/client/assets/{search-input-ChJAF9CO.js → search-input-DPH-j2ty.js} +1 -1
  153. package/dist/client/assets/{secrets-CwgPWaoJ.js → secrets-BS8SMJ5_.js} +1 -1
  154. package/dist/client/assets/{sections-editor-D8xoci4G.js → sections-editor-Cm60dl8s.js} +2 -2
  155. package/dist/client/assets/{select-COjQ5V-V.js → select-BY-TTUaX.js} +1 -1
  156. package/dist/client/assets/select-model-CKrLO7E8.js +4 -0
  157. package/dist/client/assets/{self-tool-result-DA97K7F2.js → self-tool-result-CQmRuOJJ.js} +1 -1
  158. package/dist/client/assets/seo-editor-qcHpiGxs.js +1 -0
  159. package/dist/client/assets/{settings-layout-C23Ga1Si.js → settings-layout-CkkEfluT.js} +1 -1
  160. package/dist/client/assets/{settings-section-BN0IrtYX.js → settings-section-KNTU5IvO.js} +1 -1
  161. package/dist/client/assets/{settings-subnav-DlbWpD1A.js → settings-subnav-Cd0l_6Ey.js} +1 -1
  162. package/dist/client/assets/{shell-controls-BBRNaPXa.js → shell-controls-yGJ3B9DE.js} +1 -1
  163. package/dist/client/assets/{shell-layout-DIvwZhUJ.js → shell-layout-BJ43I-fM.js} +1 -1
  164. package/dist/client/assets/{sidebar-Dckv7Gxe.js → sidebar-B9FCz4Mq.js} +1 -1
  165. package/dist/client/assets/{skeleton-C_J-aMdg.js → skeleton-B9r2TOyq.js} +1 -1
  166. package/dist/client/assets/{spinner-Cbrhyipt.js → spinner-DzAXz-ak.js} +1 -1
  167. package/dist/client/assets/{sso-DC7cMRPW.js → sso-CktB1aVG.js} +1 -1
  168. package/dist/client/assets/{store-rWTYBa0y.js → store-DVzGhYCb.js} +1 -1
  169. package/dist/client/assets/store-registry-BsmH8UbB.js +2 -0
  170. package/dist/client/assets/{studio-tools-BoD8kcA1.js → studio-tools-D6IcfTHF.js} +1 -1
  171. package/dist/client/assets/{switch-b-8BZDWJ.js → switch-B8JKQssM.js} +1 -1
  172. package/dist/client/assets/synced-repos-R0AkTDG5.js +1 -0
  173. package/dist/client/assets/tab-id-CPIceFUq.js +1 -0
  174. package/dist/client/assets/{table-CfpVPCrj.js → table-DjnLlp3Y.js} +1 -1
  175. package/dist/client/assets/{tabs-D-7lRbur.js → tabs-BVCZRpzY.js} +1 -1
  176. package/dist/client/assets/tasks-bT0G2AAJ.js +1 -0
  177. package/dist/client/assets/{textarea-CosQp1Ex.js → textarea-DUhzY-49.js} +1 -1
  178. package/dist/client/assets/{toggle-group-5LW11eFN.js → toggle-group-C2GRyClc.js} +1 -1
  179. package/dist/client/assets/{toolbar-Q0b8veSU.js → toolbar-CRquLcIr.js} +1 -1
  180. package/dist/client/assets/{tooltip-BfkRKScU.js → tooltip-C8WdZoAs.js} +1 -1
  181. package/dist/client/assets/{track-CG8KgfQd.js → track-DlQssvS7.js} +1 -1
  182. package/dist/client/assets/{types-BGHf5GHQ.js → types-CPa8SGGQ.js} +1 -1
  183. package/dist/client/assets/{use-ai-providers-BezO2qdd.js → use-ai-providers-hG0NJmyg.js} +1 -1
  184. package/dist/client/assets/{use-api-keys-BELfjQ6X.js → use-api-keys-D8jDupAP.js} +1 -1
  185. package/dist/client/assets/{use-automations-BB8THpxC.js → use-automations-B_w6lxQU.js} +1 -1
  186. package/dist/client/assets/{use-autosave-C7alUjY0.js → use-autosave-g4einljo.js} +1 -1
  187. package/dist/client/assets/{use-capability-mz-0XBoJ.js → use-capability-B23RInvZ.js} +1 -1
  188. package/dist/client/assets/{use-clock-tick-BlWbr6nY.js → use-clock-tick-BDuDvLsc.js} +1 -1
  189. package/dist/client/assets/{use-commerce-diagnostic-B54oYyoh.js → use-commerce-diagnostic-C2s_wvEf.js} +1 -1
  190. package/dist/client/assets/{use-connection-B5TzA1Ut.js → use-connection-Dg56f5Vt.js} +1 -1
  191. package/dist/client/assets/{use-copy-BEi_L0rW.js → use-copy-DGVAP1M7.js} +1 -1
  192. package/dist/client/assets/{use-create-virtual-mcp-BfQJXcoA.js → use-create-virtual-mcp-Cv6u_vQj.js} +1 -1
  193. package/dist/client/assets/{use-debounced-autosave-BHPvlnZn.js → use-debounced-autosave-CTkEMRHe.js} +1 -1
  194. package/dist/client/assets/{use-debounced-value-D880nDlC.js → use-debounced-value-qVTGK2NR.js} +1 -1
  195. package/dist/client/assets/{use-decopilot-events-D7YXko6B.js → use-decopilot-events-_lZ6Xk3T.js} +1 -1
  196. package/dist/client/assets/{use-delete-connection-urOdWe-_.js → use-delete-connection-9Bgp-HfT.js} +1 -1
  197. package/dist/client/assets/{use-deployment-admin-D_5KLYHI.js → use-deployment-admin-Dsr6f3P7.js} +1 -1
  198. package/dist/client/assets/{use-file-configs-C4oqeXep.js → use-file-configs-BZ18LlNu.js} +1 -1
  199. package/dist/client/assets/{use-infinite-scroll-A-tTatQb.js → use-infinite-scroll-CWnPk8zt.js} +1 -1
  200. package/dist/client/assets/{use-join-requests-Cvq2Nlxy.js → use-join-requests-Bo2pV8IS.js} +1 -1
  201. package/dist/client/assets/{use-mcp-client-DKcZ7v-W.js → use-mcp-client-BsAnTcHa.js} +1 -1
  202. package/dist/client/assets/{use-mcp-tools-B4aUfPof.js → use-mcp-tools-kK8zHPYS.js} +1 -1
  203. package/dist/client/assets/{use-members-Dypq7HzL.js → use-members-B9vphmDn.js} +1 -1
  204. package/dist/client/assets/{use-mobile-C0XoguQx.js → use-mobile-D3ZpQ04i.js} +1 -1
  205. package/dist/client/assets/{use-navigate-to-agent-Cxg9_mL_.js → use-navigate-to-agent-BhiQJGHm.js} +1 -1
  206. package/dist/client/assets/{use-open-billing-url-BwHZpmU9.js → use-open-billing-url-FgqegUnw.js} +1 -1
  207. package/dist/client/assets/{use-org-auth-client-CEm0cNyU.js → use-org-auth-client-tPvCf1dF.js} +1 -1
  208. package/dist/client/assets/{use-org-repo-syncs-DCxfKVxi.js → use-org-repo-syncs-Dn3ug8I0.js} +1 -1
  209. package/dist/client/assets/{use-org-sso-8p_mXDai.js → use-org-sso-DdtLWeHC.js} +1 -1
  210. package/dist/client/assets/{use-organization-roles-EKX73RmE.js → use-organization-roles-BYyGmBMK.js} +1 -1
  211. package/dist/client/assets/{use-organization-settings-C62jhu_V.js → use-organization-settings-DbHsJaaW.js} +1 -1
  212. package/dist/client/assets/{use-registry-connections-C82adOhA.js → use-registry-connections-CI0z613-.js} +1 -1
  213. package/dist/client/assets/{use-secrets-CXv4Or8y.js → use-secrets-dYdxMugZ.js} +1 -1
  214. package/dist/client/assets/{use-section-preview-base-uursozx3.js → use-section-preview-base-B46aIuGF.js} +1 -1
  215. package/dist/client/assets/{use-settings-tabs-BO1uyGPC.js → use-settings-tabs-B_hY1mlT.js} +1 -1
  216. package/dist/client/assets/{use-status-sounds-Df1zE4-g.js → use-status-sounds-DnGWueq0.js} +1 -1
  217. package/dist/client/assets/{use-tags-DBhn0x6Q.js → use-tags-BIZOfShH.js} +1 -1
  218. package/dist/client/assets/{use-view-mode-B8mZlQkB.js → use-view-mode-DQUSR-GN.js} +1 -1
  219. package/dist/client/assets/{use-virtual-mcp-IokMTZJW.js → use-virtual-mcp-CJYABS2i.js} +1 -1
  220. package/dist/client/assets/useInfiniteQuery-3soE5ZtR.js +1 -0
  221. package/dist/client/assets/{useRouterState-BHrQRzTY.js → useRouterState-CFKKaLoi.js} +1 -1
  222. package/dist/client/assets/useSuspenseInfiniteQuery-Cean782d.js +1 -0
  223. package/dist/client/assets/{users-B6MzMck4.js → users-CAizcdlt.js} +1 -1
  224. package/dist/client/assets/variant-calendar-CpdX720c.js +1 -0
  225. package/dist/client/assets/{view-mode-toggle-waWn0PEd.js → view-mode-toggle-DMaq2N-u.js} +1 -1
  226. package/dist/client/index.html +1 -1
  227. package/dist/client/install.sh +443 -45
  228. package/dist/server/cli.js +1 -1
  229. package/dist/server/server.js +1 -1
  230. package/package.json +1 -1
  231. package/dist/client/assets/Globe01-DEX4B2yM.js +0 -1
  232. package/dist/client/assets/agent-icon-BnyLUh_P.js +0 -1
  233. package/dist/client/assets/agents-list-WqvM4PBU.js +0 -1
  234. package/dist/client/assets/ai-providers-Cm0Rm1KR.js +0 -1
  235. package/dist/client/assets/app-editor-BDtjnvii.js +0 -1
  236. package/dist/client/assets/automations-C9iJneF6.js +0 -1
  237. package/dist/client/assets/bulk-category-panel-tfM9zSbQ.js +0 -1
  238. package/dist/client/assets/cards-CxCBBMfu.js +0 -9
  239. package/dist/client/assets/category-editor-CIZoMWm2.js +0 -1
  240. package/dist/client/assets/collection-detail-DGbcByEY.js +0 -1
  241. package/dist/client/assets/commerce-onboarding-DO7FMttC.js +0 -1
  242. package/dist/client/assets/connection-detail-m014gzNI.js +0 -1
  243. package/dist/client/assets/connections-BNQ0Y0h7.js +0 -1
  244. package/dist/client/assets/file-explorer-DKHfXuC4.js +0 -2
  245. package/dist/client/assets/general-BTyXC0VC.js +0 -1
  246. package/dist/client/assets/index-Di0wCO9r.js +0 -1
  247. package/dist/client/assets/post-editor-DnamQd0I.js +0 -1
  248. package/dist/client/assets/project-app-view-C-J9cu-l.js +0 -1
  249. package/dist/client/assets/record-editor-CoztL6I2.js +0 -1
  250. package/dist/client/assets/redirect-editor-Bz1AUCqF.js +0 -1
  251. package/dist/client/assets/registry-DQjw_3WH.js +0 -2
  252. package/dist/client/assets/roles-CYg93TjU.js +0 -1
  253. package/dist/client/assets/select-model-B5IdH_n6.js +0 -4
  254. package/dist/client/assets/seo-editor-Do7jjKRP.js +0 -1
  255. package/dist/client/assets/store-registry-Dz8WBmEa.js +0 -2
  256. package/dist/client/assets/synced-repos-Cuzl6scP.js +0 -1
  257. package/dist/client/assets/tab-id-BJUTVZdl.js +0 -1
  258. package/dist/client/assets/tasks-EwwXPqCM.js +0 -1
  259. package/dist/client/assets/useInfiniteQuery-ewuCizNF.js +0 -1
  260. package/dist/client/assets/useSuspenseInfiniteQuery-BvX-6eAF.js +0 -1
  261. package/dist/client/assets/variant-calendar-DrArrrSO.js +0 -1
@@ -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-BphIXXOp.js"></script>
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>
@@ -1,9 +1,11 @@
1
1
  #!/bin/sh
2
- # deco studio installer for macOS (Apple Silicon).
2
+ # deco studio installer.
3
3
  #
4
4
  # curl -fsSL https://studio.decocms.com/install.sh | sh
5
5
  #
6
- # What this does, in order (no sudo anywhere):
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/decocms/studio"
21
- RELEASES="https://github.com/decocms/studio/releases"
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
- [ "$(uname -s)" = "Darwin" ] ||
30
- fail "this installer is macOS-only. Downloads: $RELEASES"
31
-
32
- [ "$(uname -m)" = "arm64" ] ||
33
- fail "only Apple Silicon builds exist so far. Watch $RELEASES for Intel."
34
-
35
- command -v brew > /dev/null 2>&1 ||
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