@openhands/agent-canvas 1.5.1 → 1.6.1

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 (720) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{Trans-DqF_OEZB.js → Trans-52HCczKK.js} +1 -1
  4. package/build/assets/{acp-providers-DerAmTyY.js → acp-providers-xACMK9ZP.js} +1 -1
  5. package/build/assets/{active-backend-context-B8rMv0X9.js → active-backend-context-Cd1qcZsb.js} +1 -1
  6. package/build/assets/{add-backend-modal-CxC7BNEc.js → add-backend-modal-5chsfln3.js} +1 -1
  7. package/build/assets/{agent-profiles-settings-BJb8YXR1.js → agent-profiles-settings-BWK4H3kR.js} +1 -1
  8. package/build/assets/agent-server-compatibility-DMY0CihN.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-CI5-xmIX.js +41 -0
  10. package/build/assets/agent-settings-CMd8-O4f.js +2 -0
  11. package/build/assets/agent-settings-CdrhQJXX.js +1 -0
  12. package/build/assets/{alert-banner-Dh51WURQ.js → alert-banner-CLfWuIAX.js} +1 -1
  13. package/build/assets/api-key-entry-screen-Cc3aC7DZ.js +1 -0
  14. package/build/assets/app-settings-B-DQcBoB.js +1 -0
  15. package/build/assets/{automation-detail-CZsu2CoM.js → automation-detail-BgxBIpyK.js} +2 -2
  16. package/build/assets/automation-export-Dbur8OHa.js +2 -0
  17. package/build/assets/automations-list-BWfjizlp.js +1 -0
  18. package/build/assets/{back-nav-button-DVknCcSP.js → back-nav-button-CaKvsD1E.js} +1 -1
  19. package/build/assets/backend-form-modal-YcfpuBZo.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-BSfN0AZA.js → backend-synced-settings-badge-BellMmgC.js} +1 -1
  21. package/build/assets/{base-modal-CIF_785P.js → base-modal-Cw7enAHz.js} +1 -1
  22. package/build/assets/{brand-button-B1izLAdR.js → brand-button-BulEFHr3.js} +1 -1
  23. package/build/assets/{browser-DKaeq_sT.js → browser-DfVgUREb.js} +2 -2
  24. package/build/assets/browser-store-CBqI3tNR.js +1 -0
  25. package/build/assets/{browser-tab-qb_ftCxW.js → browser-tab-CmIKQB7S.js} +1 -1
  26. package/build/assets/chat-send-button-BchSSwuD.js +1 -0
  27. package/build/assets/circle-check-BXbQ5nEH.js +1 -0
  28. package/build/assets/{circle-plus-check-toggle-DoFIjVE0.js → circle-plus-check-toggle-BhpPjkh9.js} +1 -1
  29. package/build/assets/client-source-DAUgyJsi.js +1 -0
  30. package/build/assets/cloud-funnel-analytics-B5OeWh4y.js +1 -0
  31. package/build/assets/{color-themes-CHizm1xF.js → color-themes-QKMSVfDU.js} +1 -1
  32. package/build/assets/{combobox-caret-CxZpqoSR.js → combobox-caret-kNZtp53R.js} +1 -1
  33. package/build/assets/{command-menu-oTvKDU3Y.js → command-menu-tUsn23zy.js} +1 -1
  34. package/build/assets/{command-store-D8J5LMW1.js → command-store-B0hrIWMN.js} +1 -1
  35. package/build/assets/{condenser-settings-BGlWn93P.js → condenser-settings-BBizzfIH.js} +1 -1
  36. package/build/assets/{confirmation-modal-DGBWM2Ls.js → confirmation-modal-108xng7X.js} +1 -1
  37. package/build/assets/{context-menu-list-item-6psNyl7X.js → context-menu-list-item-BbKfFuN1.js} +1 -1
  38. package/build/assets/conversation-CTzSrLMq.js +1 -0
  39. package/build/assets/conversation-CgcXNb-Z.js +90 -0
  40. package/build/assets/conversation-panel-bscjGQda.js +1 -0
  41. package/build/assets/{conversation-service.api-_f9GlIEi.js → conversation-service.api-DbBvscJA.js} +1 -1
  42. package/build/assets/conversation-state-store-C5GagZHT.js +1 -0
  43. package/build/assets/{conversation-store-LptbOvKa.js → conversation-store-CyVqoa0d.js} +1 -1
  44. package/build/assets/{conversation-tab-empty-state-CNUmIms2.js → conversation-tab-empty-state-2KYlk5Bh.js} +1 -1
  45. package/build/assets/{copy-to-clipboard-button-CFzH_NOX.js → copy-to-clipboard-button-C54YRPMg.js} +1 -1
  46. package/build/assets/declaration-_yumYLEx.js +1 -0
  47. package/build/assets/{device-verify-WBSjJBLH.js → device-verify-D6FW_KZq.js} +1 -1
  48. package/build/assets/{dropdown-classes-D3wMJlXT.js → dropdown-classes-9uONlOg1.js} +1 -1
  49. package/build/assets/{ellipsis-button-CbNnHlIq.js → ellipsis-button-CoaUrKmQ.js} +1 -1
  50. package/build/assets/{entry.client-DNlPGxsu.js → entry.client-BJSVzw7V.js} +2 -2
  51. package/build/assets/{enum-filter-dropdown-JLYv1t8L.js → enum-filter-dropdown-qQzyjk_q.js} +1 -1
  52. package/build/assets/{environment-switch-overlay-B1PFO8P8.js → environment-switch-overlay-XRWCClLu.js} +1 -1
  53. package/build/assets/extensions-hub-DUp9sWQY.js +1 -0
  54. package/build/assets/extensions-navigation-DmkftjAx.js +1 -0
  55. package/build/assets/file-tUAzhmJ3.js +1 -0
  56. package/build/assets/files-tab-GV5hwiIM.js +1 -0
  57. package/build/assets/files-tab-store-DehyITNC.js +1 -0
  58. package/build/assets/{form-control-classes-CbdN5aO3.js → form-control-classes-BPUnoYyg.js} +1 -1
  59. package/build/assets/git-provider-icon-DDkru3b_.js +1 -0
  60. package/build/assets/highlighted-source-view-CYkPZUxr.js +1 -0
  61. package/build/assets/home-C53WekZ2.js +1 -0
  62. package/build/assets/home-EAwq8ah2.js +1 -0
  63. package/build/assets/index-home-kBdZGKtu.js +1 -0
  64. package/build/assets/install-server-modal-DYk4VP3-.js +1 -0
  65. package/build/assets/{launch-CAGavYl-.js → launch-CIecOy_y.js} +1 -1
  66. package/build/assets/lesson-plan-BSEUwflx.js +4 -0
  67. package/build/assets/llm-not-configured-banner-C8uv1PHT.js +27 -0
  68. package/build/assets/llm-settings-0Bb97NCk.js +1 -0
  69. package/build/assets/llm-settings-D4toJ90k.js +1 -0
  70. package/build/assets/{llm-subscription-service-Casyzgn1.js → llm-subscription-service-BPRw3u3H.js} +1 -1
  71. package/build/assets/{loading-spinner-BcdnT0mN.js → loading-spinner-BCInDEXB.js} +1 -1
  72. package/build/assets/manage-backends-modal-Bon32JYr.js +1 -0
  73. package/build/assets/manifest-ec000ae3.js +1 -0
  74. package/build/assets/markdown-renderer-BlaJOAI2.js +2 -0
  75. package/build/assets/mcp-CFIpOkn2.js +9 -0
  76. package/build/assets/messages-eRPeR4pW.js +40 -0
  77. package/build/assets/{modal-body-Cc2zp0xb.js → modal-body-Bg9UCeoV.js} +1 -1
  78. package/build/assets/{modal-classes-3qT9Ap7Q.js → modal-classes-H1KbJkeC.js} +1 -1
  79. package/build/assets/{modal-close-button-BcIBUdSq.js → modal-close-button-BMLYvo0C.js} +1 -1
  80. package/build/assets/{model-selector-DJrMrFAr.js → model-selector-BqX2RvEr.js} +1 -1
  81. package/build/assets/{navigation-link-D8hfwvxI.js → navigation-link-DoJzTCEz.js} +1 -1
  82. package/build/assets/onboarding-3KO4qE6R.js +1 -0
  83. package/build/assets/onboarding-modal-D4vqkJeT.js +1 -0
  84. package/build/assets/{organization-service.api-vrRNwOma.js → organization-service.api-CvfQugOt.js} +1 -1
  85. package/build/assets/{path-utils-PNfCKQDV.js → path-utils-DRgexxnX.js} +1 -1
  86. package/build/assets/{plan-components-BdZXPyZU.js → plan-components-qkMiGs_-.js} +1 -1
  87. package/build/assets/{planner-tab-ByOw1he8.js → planner-tab-ZrjiirRr.js} +1 -1
  88. package/build/assets/{plugins-management-service-B75jyC56.js → plugins-management-service-9qT-r_37.js} +1 -1
  89. package/build/assets/plus-CzE1b-wl.js +1 -0
  90. package/build/assets/{profiles-service.api-BQTklD5D.js → profiles-service.api-CRVlrQpT.js} +1 -1
  91. package/build/assets/{providers-DfTB2gPd.js → providers-C2DFGBrf.js} +1 -1
  92. package/build/assets/{proxy-B3tCGf0X.js → proxy-DnnDqkwn.js} +1 -1
  93. package/build/assets/puzzle-IHQnD54C.js +1 -0
  94. package/build/assets/recommended-automations-launcher-B97vgHuN.js +58 -0
  95. package/build/assets/refresh-cw-DxbAs3SK.js +1 -0
  96. package/build/assets/root-BbONavTg.css +1 -0
  97. package/build/assets/root-D01rpqZU.js +2 -0
  98. package/build/assets/root-layout-BiHbCIkS.js +2 -0
  99. package/build/assets/{runtime-waiting-state-CnyVhX4T.js → runtime-waiting-state-CbUV9txX.js} +1 -1
  100. package/build/assets/{schema-field-CUwk4wrQ.js → schema-field-B9-9Ta9u.js} +1 -1
  101. package/build/assets/sdk-section-page-DG1s25Pr.js +1 -0
  102. package/build/assets/{sdk-settings-schema-CLR01YIK.js → sdk-settings-schema-B42JFr5Y.js} +1 -1
  103. package/build/assets/{secrets-service-CvyPWJhg.js → secrets-service-DvyS6-mV.js} +1 -1
  104. package/build/assets/secrets-settings-CeSq6cQw.js +1 -0
  105. package/build/assets/{segmented-toggle-kzwZkLaj.js → segmented-toggle-DRVJBNy0.js} +1 -1
  106. package/build/assets/settings-Dzo0dJKM.js +1 -0
  107. package/build/assets/{settings-mQUckT0g.js → settings-HcwfqMjJ.js} +1 -1
  108. package/build/assets/{settings-dropdown-input-Dhx9ErGd.js → settings-dropdown-input-B6RL_mt0.js} +1 -1
  109. package/build/assets/settings-index-uAKHyijw.js +1 -0
  110. package/build/assets/{settings-input-BsgQWS5R.js → settings-input-ZoaAPNQh.js} +1 -1
  111. package/build/assets/{settings-list-classes-DSJJX99U.js → settings-list-classes-Dr8LgITi.js} +1 -1
  112. package/build/assets/settings-modal-BVX2G_IT.js +1 -0
  113. package/build/assets/{settings-service.api-DXk5TdeJ.js → settings-service.api-BY7ncxIz.js} +1 -1
  114. package/build/assets/{settings-switch-Bes8dIlV.js → settings-switch-DUlGnP0B.js} +1 -1
  115. package/build/assets/{settings-utils-DzCVfiR3.js → settings-utils-kWEEvcdv.js} +1 -1
  116. package/build/assets/shared-conversation-CV4Rtdz2.js +1 -0
  117. package/build/assets/{sidebar-layout-Bm7pa3Vk.js → sidebar-layout-BhGooCga.js} +1 -1
  118. package/build/assets/sidebar-mobile-menu-toggle-BntOJphE.js +1 -0
  119. package/build/assets/{sidebar-nav-link-CHqyFXwV.js → sidebar-nav-link-DkA1XWV8.js} +1 -1
  120. package/build/assets/{sidebar-store-uiUXBU1N.js → sidebar-store-CF3b12-m.js} +1 -1
  121. package/build/assets/{skill-card-pill-row-BPYKQ3IN.js → skill-card-pill-row-_gWe1Tws.js} +1 -1
  122. package/build/assets/skill-icon-badge-C-zbaXbD.js +1 -0
  123. package/build/assets/skills-plugins-BwoXKtrR.js +1 -0
  124. package/build/assets/skills-settings-Crq-fZSt.js +2 -0
  125. package/build/assets/{styled-tooltip-B14i_Uac.js → styled-tooltip-CdnCJ67u.js} +1 -1
  126. package/build/assets/syntax-highlighter-CZK2ab-O.js +1 -0
  127. package/build/assets/{task-list-tab-DyfgG4MC.js → task-list-tab-CONOO9iI.js} +1 -1
  128. package/build/assets/telemetry-CC32dJYW.js +2 -0
  129. package/build/assets/{terminal-DRXt2Lr4.js → terminal-CTkDpIU-.js} +1 -1
  130. package/build/assets/{toggle-switch-DX_k418f.js → toggle-switch-yVIzmJLM.js} +1 -1
  131. package/build/assets/{typography-CzfoD9DY.js → typography-BBVEW0un.js} +1 -1
  132. package/build/assets/{use-acp-credential-form-Bm8qXdlc.js → use-acp-credential-form-CIsp8hJe.js} +1 -1
  133. package/build/assets/use-activate-agent-profile-BfcTTJJG.js +1 -0
  134. package/build/assets/{use-active-agent-profile-hI-x-UBa.js → use-active-agent-profile-CCeFtmk9.js} +1 -1
  135. package/build/assets/{use-active-conversation-2qeez40F.js → use-active-conversation-Badxj8w4.js} +1 -1
  136. package/build/assets/{use-agent-profiles-0pr5bLS7.js → use-agent-profiles-BSWVN6hH.js} +1 -1
  137. package/build/assets/{use-agent-state-C6peDXUm.js → use-agent-state-BzRrhoPd.js} +1 -1
  138. package/build/assets/use-backends-health-BsZikyFW.js +1 -0
  139. package/build/assets/{use-can-manage-org-profiles-Ck_bsNbH.js → use-can-manage-org-profiles-Do6mYf6P.js} +1 -1
  140. package/build/assets/{use-cloud-current-user-id-DUCSxNjY.js → use-cloud-current-user-id-Cx3B_0-w.js} +1 -1
  141. package/build/assets/use-config-D9zUVw5b.js +1 -0
  142. package/build/assets/{use-create-conversation-r1JHfKO5.js → use-create-conversation-vvl0kvu7.js} +1 -1
  143. package/build/assets/{use-create-secret-Cf2N11d2.js → use-create-secret-CB7Dvd4s.js} +1 -1
  144. package/build/assets/use-event-store-BlpSUF7N.js +4 -0
  145. package/build/assets/{use-handle-plan-click-CsAW3FlH.js → use-handle-plan-click-DDZkew9p.js} +1 -1
  146. package/build/assets/use-is-creating-conversation-fxSzN778.js +1 -0
  147. package/build/assets/{use-launch-skill-in-chat-DJWEfVc5.js → use-launch-skill-in-chat-D6_n1fs3.js} +1 -1
  148. package/build/assets/use-llm-profiles-CNQm7HYS.js +1 -0
  149. package/build/assets/use-plugins-marketplace-CloojomS.js +1 -0
  150. package/build/assets/use-runtime-is-ready-Bx_4cfar.js +1 -0
  151. package/build/assets/{use-save-agent-profile-RqUGqTv6.js → use-save-agent-profile-Bj7N-1jS.js} +1 -1
  152. package/build/assets/{use-save-settings-Chvzeu2s.js → use-save-settings-BMsb2wk_.js} +1 -1
  153. package/build/assets/use-settings-B9XEmh7i.js +1 -0
  154. package/build/assets/use-settings-nav-items-BGfBS0yL.js +16 -0
  155. package/build/assets/{use-skills-xrVoKYrF.js → use-skills-CSRbvPle.js} +1 -1
  156. package/build/assets/{use-task-list-CfisapBW.js → use-task-list-CTIVLrQA.js} +1 -1
  157. package/build/assets/use-tracking-DjdCssvp.js +1 -0
  158. package/build/assets/{use-user-conversation-CnE4zhOA.js → use-user-conversation-BCpFn-Ei.js} +1 -1
  159. package/build/assets/{useTranslation-Cbf5AGg_.js → useTranslation-CHm_6BRr.js} +1 -1
  160. package/build/assets/{utils-DB9LsAzA.js → utils-CrRpzbM2.js} +1 -1
  161. package/build/assets/vendor-markdown-DzO4uO_0.js +37 -0
  162. package/build/assets/{vendor~browser-wXQ-WZEC.js → vendor~browser-Byfuq5J-.js} +1 -1
  163. package/build/assets/{vendor~browser-tab-CsMb-pta.js → vendor~browser-tab-BLk3qxhw.js} +1 -1
  164. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-eGLBu60s.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-DTJ_cjR5.js} +2 -2
  165. package/build/assets/{vendor~files-tab-B-5fBohe.js → vendor~files-tab-XmnauIZI.js} +1 -1
  166. package/build/assets/{vendor~launch-_Km3J77E.js → vendor~launch-DeC8QhXQ.js} +1 -1
  167. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-BrguKXCn.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-DDmLzCzm.js} +1 -1
  168. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-YrfJYTQw.js +1 -0
  169. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~j2jlu22h-mC0v44WR.js → vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~j2jlu22h-DoaS51iW.js} +123 -3
  170. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation~aler~gfu7qdtz-BOKQkbc6.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation~aler~gfu7qdtz-DEYwoy8u.js} +1 -1
  171. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-DZHLw5Sr.js +1 -0
  172. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~ftka0fnu-cFNmfAE6.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~ftka0fnu-UJ4BNDJP.js} +1 -1
  173. package/build/assets/{verification-settings-CfkrXoSa.js → verification-settings-uwOfc16F.js} +1 -1
  174. package/build/index.html +4 -4
  175. package/build/locales/ar/openhands.json +38 -4
  176. package/build/locales/ca/openhands.json +38 -4
  177. package/build/locales/de/openhands.json +38 -4
  178. package/build/locales/en/openhands.json +38 -4
  179. package/build/locales/es/openhands.json +38 -4
  180. package/build/locales/fr/openhands.json +38 -4
  181. package/build/locales/it/openhands.json +38 -4
  182. package/build/locales/ja/openhands.json +38 -4
  183. package/build/locales/ko-KR/openhands.json +38 -4
  184. package/build/locales/no/openhands.json +38 -4
  185. package/build/locales/pt/openhands.json +38 -4
  186. package/build/locales/tr/openhands.json +38 -4
  187. package/build/locales/uk/openhands.json +38 -4
  188. package/build/locales/zh-CN/openhands.json +38 -4
  189. package/build/locales/zh-TW/openhands.json +38 -4
  190. package/config/defaults.json +7 -3
  191. package/dist/api/agent-canvas-updates.cjs +2 -0
  192. package/dist/api/agent-canvas-updates.cjs.map +1 -0
  193. package/dist/api/agent-canvas-updates.d.ts +7 -0
  194. package/dist/api/agent-canvas-updates.js +19 -0
  195. package/dist/api/agent-canvas-updates.js.map +1 -0
  196. package/dist/api/agent-server-adapter.cjs +1 -1
  197. package/dist/api/agent-server-adapter.cjs.map +1 -1
  198. package/dist/api/agent-server-adapter.d.ts +3 -0
  199. package/dist/api/agent-server-adapter.js +1 -0
  200. package/dist/api/agent-server-adapter.js.map +1 -1
  201. package/dist/api/agent-server-compatibility.cjs +1 -1
  202. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  203. package/dist/api/agent-server-compatibility.d.ts +5 -0
  204. package/dist/api/agent-server-compatibility.js +24 -15
  205. package/dist/api/agent-server-compatibility.js.map +1 -1
  206. package/dist/api/agent-server-config.cjs +1 -1
  207. package/dist/api/agent-server-config.cjs.map +1 -1
  208. package/dist/api/agent-server-config.js +11 -8
  209. package/dist/api/agent-server-config.js.map +1 -1
  210. package/dist/api/automation-service/automation-service.api.cjs +2 -0
  211. package/dist/api/automation-service/automation-service.api.cjs.map +1 -0
  212. package/dist/api/automation-service/automation-service.api.d.ts +3 -0
  213. package/dist/api/automation-service/automation-service.api.js +283 -0
  214. package/dist/api/automation-service/automation-service.api.js.map +1 -0
  215. package/dist/api/client-source.cjs +1 -1
  216. package/dist/api/client-source.cjs.map +1 -1
  217. package/dist/api/client-source.d.ts +3 -0
  218. package/dist/api/client-source.js +4 -4
  219. package/dist/api/client-source.js.map +1 -1
  220. package/dist/api/cloud/settings-service.api.cjs.map +1 -1
  221. package/dist/api/cloud/settings-service.api.js.map +1 -1
  222. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  223. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  224. package/dist/api/conversation-service/agent-server-conversation-service.api.js +111 -109
  225. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  226. package/dist/api/mcp-health/mcp-health-store.cjs +2 -0
  227. package/dist/api/mcp-health/mcp-health-store.cjs.map +1 -0
  228. package/dist/api/mcp-health/mcp-health-store.d.ts +22 -0
  229. package/dist/api/mcp-health/mcp-health-store.js +45 -0
  230. package/dist/api/mcp-health/mcp-health-store.js.map +1 -0
  231. package/dist/api/mcp-health/probe-mcp-server-health.cjs +2 -0
  232. package/dist/api/mcp-health/probe-mcp-server-health.cjs.map +1 -0
  233. package/dist/api/mcp-health/probe-mcp-server-health.d.ts +31 -0
  234. package/dist/api/mcp-health/probe-mcp-server-health.js +57 -0
  235. package/dist/api/mcp-health/probe-mcp-server-health.js.map +1 -0
  236. package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
  237. package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
  238. package/dist/api/mcp-service/mcp-service.api.js +66 -46
  239. package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
  240. package/dist/api/plugins-management-service.cjs.map +1 -1
  241. package/dist/api/plugins-management-service.d.ts +6 -1
  242. package/dist/api/plugins-management-service.js.map +1 -1
  243. package/dist/api/plugins-service.d.ts +30 -2
  244. package/dist/api/secrets-service.cjs +1 -1
  245. package/dist/api/secrets-service.cjs.map +1 -1
  246. package/dist/api/secrets-service.d.ts +6 -6
  247. package/dist/api/secrets-service.js +8 -3
  248. package/dist/api/secrets-service.js.map +1 -1
  249. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  250. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  251. package/dist/api/settings-service/settings-service.api.d.ts +1 -1
  252. package/dist/api/settings-service/settings-service.api.js +1 -0
  253. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  254. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
  255. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
  256. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  257. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  258. package/dist/components/features/backends/backend-form-modal.d.ts +4 -1
  259. package/dist/components/features/backends/backend-form-modal.js +15 -16
  260. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  261. package/dist/components/features/backends/backend-selector.cjs +1 -1
  262. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  263. package/dist/components/features/backends/backend-selector.js +103 -102
  264. package/dist/components/features/backends/backend-selector.js.map +1 -1
  265. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  266. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  267. package/dist/components/features/backends/manage-backends-modal.js +85 -73
  268. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  269. package/dist/components/features/chat/chat-interface.cjs +2 -2
  270. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  271. package/dist/components/features/chat/chat-interface.js +131 -129
  272. package/dist/components/features/chat/chat-interface.js.map +1 -1
  273. package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
  274. package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
  275. package/dist/components/features/chat/skill-install-restart-banner.cjs +2 -0
  276. package/dist/components/features/chat/skill-install-restart-banner.cjs.map +1 -0
  277. package/dist/components/features/chat/skill-install-restart-banner.d.ts +11 -0
  278. package/dist/components/features/chat/skill-install-restart-banner.js +63 -0
  279. package/dist/components/features/chat/skill-install-restart-banner.js.map +1 -0
  280. package/dist/components/features/conversation/right-panel-toggle.cjs +1 -1
  281. package/dist/components/features/conversation/right-panel-toggle.cjs.map +1 -1
  282. package/dist/components/features/conversation/right-panel-toggle.js +1 -1
  283. package/dist/components/features/conversation/right-panel-toggle.js.map +1 -1
  284. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  285. package/dist/components/features/conversation-panel/conversation-panel.js +10 -10
  286. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  287. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  288. package/dist/components/features/mcp-page/custom-server-editor.js +78 -77
  289. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  290. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  291. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  292. package/dist/components/features/mcp-page/install-server-modal.d.ts +4 -1
  293. package/dist/components/features/mcp-page/install-server-modal.js +135 -136
  294. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  295. package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
  296. package/dist/components/features/mcp-page/installed-server-card.cjs.map +1 -1
  297. package/dist/components/features/mcp-page/installed-server-card.js +40 -34
  298. package/dist/components/features/mcp-page/installed-server-card.js.map +1 -1
  299. package/dist/components/features/mcp-page/mcp-server-health.cjs +2 -0
  300. package/dist/components/features/mcp-page/mcp-server-health.cjs.map +1 -0
  301. package/dist/components/features/mcp-page/mcp-server-health.d.ts +18 -0
  302. package/dist/components/features/mcp-page/mcp-server-health.js +117 -0
  303. package/dist/components/features/mcp-page/mcp-server-health.js.map +1 -0
  304. package/dist/components/features/plugins/build-plugins-view-model.d.ts +10 -1
  305. package/dist/components/features/plugins/plugin-files-section.d.ts +13 -0
  306. package/dist/components/features/settings/agent-canvas-update-card.cjs +2 -0
  307. package/dist/components/features/settings/agent-canvas-update-card.cjs.map +1 -0
  308. package/dist/components/features/settings/agent-canvas-update-card.d.ts +7 -0
  309. package/dist/components/features/settings/agent-canvas-update-card.js +170 -0
  310. package/dist/components/features/settings/agent-canvas-update-card.js.map +1 -0
  311. package/dist/components/features/settings/integrations-settings-link.cjs +2 -0
  312. package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -0
  313. package/dist/components/features/settings/integrations-settings-link.d.ts +5 -0
  314. package/dist/components/features/settings/integrations-settings-link.js +41 -0
  315. package/dist/components/features/settings/integrations-settings-link.js.map +1 -0
  316. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  317. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
  318. package/dist/components/features/settings/settings-desktop-sidebar.cjs +1 -1
  319. package/dist/components/features/settings/settings-desktop-sidebar.cjs.map +1 -1
  320. package/dist/components/features/settings/settings-desktop-sidebar.js +31 -21
  321. package/dist/components/features/settings/settings-desktop-sidebar.js.map +1 -1
  322. package/dist/components/features/settings/settings-mobile-drawer.cjs +1 -1
  323. package/dist/components/features/settings/settings-mobile-drawer.cjs.map +1 -1
  324. package/dist/components/features/settings/settings-mobile-drawer.js +40 -30
  325. package/dist/components/features/settings/settings-mobile-drawer.js.map +1 -1
  326. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  327. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  328. package/dist/components/features/skills/extensions-navigation.js +54 -33
  329. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  330. package/dist/config/defaults.cjs +1 -1
  331. package/dist/config/defaults.cjs.map +1 -1
  332. package/dist/config/defaults.js +7 -3
  333. package/dist/config/defaults.js.map +1 -1
  334. package/dist/constants/acp-providers.cjs.map +1 -1
  335. package/dist/constants/acp-providers.js.map +1 -1
  336. package/dist/contexts/conversation-websocket-context.cjs +2 -2
  337. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  338. package/dist/contexts/conversation-websocket-context.js +169 -166
  339. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  340. package/dist/hooks/mutation/use-delete-llm-profile.cjs +1 -1
  341. package/dist/hooks/mutation/use-delete-llm-profile.js +1 -0
  342. package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
  343. package/dist/hooks/mutation/use-delete-mcp-server.cjs.map +1 -1
  344. package/dist/hooks/mutation/use-delete-mcp-server.js +8 -6
  345. package/dist/hooks/mutation/use-delete-mcp-server.js.map +1 -1
  346. package/dist/hooks/mutation/use-rename-llm-profile.cjs +1 -1
  347. package/dist/hooks/mutation/use-rename-llm-profile.js +1 -0
  348. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  349. package/dist/hooks/mutation/use-save-settings.js +3 -3
  350. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  351. package/dist/hooks/mutation/use-update-mcp-server.cjs.map +1 -1
  352. package/dist/hooks/mutation/use-update-mcp-server.js +11 -9
  353. package/dist/hooks/mutation/use-update-mcp-server.js.map +1 -1
  354. package/dist/hooks/query/query-keys.cjs +1 -1
  355. package/dist/hooks/query/query-keys.cjs.map +1 -1
  356. package/dist/hooks/query/query-keys.d.ts +4 -0
  357. package/dist/hooks/query/query-keys.js +2 -2
  358. package/dist/hooks/query/query-keys.js.map +1 -1
  359. package/dist/hooks/query/use-automation-sdk-version.cjs +2 -0
  360. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -0
  361. package/dist/hooks/query/use-automation-sdk-version.d.ts +3 -0
  362. package/dist/hooks/query/use-automation-sdk-version.js +63 -0
  363. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -0
  364. package/dist/hooks/query/use-latest-agent-canvas-version.cjs +2 -0
  365. package/dist/hooks/query/use-latest-agent-canvas-version.cjs.map +1 -0
  366. package/dist/hooks/query/use-latest-agent-canvas-version.d.ts +10 -0
  367. package/dist/hooks/query/use-latest-agent-canvas-version.js +19 -0
  368. package/dist/hooks/query/use-latest-agent-canvas-version.js.map +1 -0
  369. package/dist/hooks/query/use-plugin-file-content.d.ts +7 -0
  370. package/dist/hooks/query/use-resolved-workspaces.cjs +1 -1
  371. package/dist/hooks/query/use-resolved-workspaces.cjs.map +1 -1
  372. package/dist/hooks/query/use-resolved-workspaces.js +25 -26
  373. package/dist/hooks/query/use-resolved-workspaces.js.map +1 -1
  374. package/dist/hooks/query/use-search-subdirs.cjs +1 -1
  375. package/dist/hooks/query/use-search-subdirs.cjs.map +1 -1
  376. package/dist/hooks/query/use-search-subdirs.d.ts +5 -0
  377. package/dist/hooks/query/use-search-subdirs.js +16 -4
  378. package/dist/hooks/query/use-search-subdirs.js.map +1 -1
  379. package/dist/hooks/query/use-task-polling.cjs +1 -1
  380. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  381. package/dist/hooks/query/use-task-polling.d.ts +19 -3
  382. package/dist/hooks/query/use-task-polling.js +36 -35
  383. package/dist/hooks/query/use-task-polling.js.map +1 -1
  384. package/dist/hooks/use-device-flow.cjs +1 -1
  385. package/dist/hooks/use-device-flow.js +6 -6
  386. package/dist/hooks/use-llm-configured.cjs +1 -1
  387. package/dist/hooks/use-llm-configured.js +3 -3
  388. package/dist/hooks/use-mcp-server-health.cjs +2 -0
  389. package/dist/hooks/use-mcp-server-health.cjs.map +1 -0
  390. package/dist/hooks/use-mcp-server-health.d.ts +11 -0
  391. package/dist/hooks/use-mcp-server-health.js +18 -0
  392. package/dist/hooks/use-mcp-server-health.js.map +1 -0
  393. package/dist/hooks/use-skill-installs.cjs +2 -0
  394. package/dist/hooks/use-skill-installs.cjs.map +1 -0
  395. package/dist/hooks/use-skill-installs.d.ts +10 -0
  396. package/dist/hooks/use-skill-installs.js +21 -0
  397. package/dist/hooks/use-skill-installs.js.map +1 -0
  398. package/dist/hooks/use-tracking.cjs +1 -1
  399. package/dist/hooks/use-tracking.cjs.map +1 -1
  400. package/dist/hooks/use-tracking.d.ts +3 -3
  401. package/dist/hooks/use-tracking.js +67 -52
  402. package/dist/hooks/use-tracking.js.map +1 -1
  403. package/dist/i18n/declaration.cjs +1 -1
  404. package/dist/i18n/declaration.cjs.map +1 -1
  405. package/dist/i18n/declaration.d.ts +35 -1
  406. package/dist/i18n/declaration.js +1 -1
  407. package/dist/i18n/declaration.js.map +1 -1
  408. package/dist/i18n/translation.cjs +3 -3
  409. package/dist/i18n/translation.cjs.map +1 -1
  410. package/dist/i18n/translation.js +623 -45
  411. package/dist/i18n/translation.js.map +1 -1
  412. package/dist/index.cjs +1 -1
  413. package/dist/index.js +1 -2
  414. package/dist/lib/index.cjs +1 -1
  415. package/dist/lib/index.d.ts +0 -1
  416. package/dist/lib/index.js +0 -1
  417. package/dist/locales/ar/openhands.json +38 -4
  418. package/dist/locales/ca/openhands.json +38 -4
  419. package/dist/locales/de/openhands.json +38 -4
  420. package/dist/locales/en/openhands.json +38 -4
  421. package/dist/locales/es/openhands.json +38 -4
  422. package/dist/locales/fr/openhands.json +38 -4
  423. package/dist/locales/it/openhands.json +38 -4
  424. package/dist/locales/ja/openhands.json +38 -4
  425. package/dist/locales/ko-KR/openhands.json +38 -4
  426. package/dist/locales/no/openhands.json +38 -4
  427. package/dist/locales/pt/openhands.json +38 -4
  428. package/dist/locales/tr/openhands.json +38 -4
  429. package/dist/locales/uk/openhands.json +38 -4
  430. package/dist/locales/zh-CN/openhands.json +38 -4
  431. package/dist/locales/zh-TW/openhands.json +38 -4
  432. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian-rovo.cjs +2 -0
  433. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian-rovo.cjs.map +1 -0
  434. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian-rovo.js +44 -0
  435. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian-rovo.js.map +1 -0
  436. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.cjs +1 -1
  437. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.cjs.map +1 -1
  438. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.js +13 -0
  439. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.js.map +1 -1
  440. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs +1 -1
  441. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs.map +1 -1
  442. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js +21 -1
  443. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js.map +1 -1
  444. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs +1 -1
  445. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs.map +1 -1
  446. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js +1 -1
  447. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js.map +1 -1
  448. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs +1 -1
  449. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs.map +1 -1
  450. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js +13 -0
  451. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js.map +1 -1
  452. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs +1 -1
  453. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs.map +1 -1
  454. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js +13 -0
  455. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js.map +1 -1
  456. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
  457. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
  458. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +13 -0
  459. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
  460. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs +1 -1
  461. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs.map +1 -1
  462. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js +13 -0
  463. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js.map +1 -1
  464. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs +1 -1
  465. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs.map +1 -1
  466. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js +13 -0
  467. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js.map +1 -1
  468. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs +1 -1
  469. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs.map +1 -1
  470. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js +16 -2
  471. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js.map +1 -1
  472. package/dist/node_modules/@openhands/extensions/integrations/catalog/vanta.cjs +2 -0
  473. package/dist/node_modules/@openhands/extensions/integrations/catalog/vanta.cjs.map +1 -0
  474. package/dist/node_modules/@openhands/extensions/integrations/catalog/vanta.js +46 -0
  475. package/dist/node_modules/@openhands/extensions/integrations/catalog/vanta.js.map +1 -0
  476. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  477. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  478. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +74 -70
  479. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  480. package/dist/node_modules/@openhands/extensions/skills/index.cjs +123 -3
  481. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  482. package/dist/node_modules/@openhands/extensions/skills/index.js +7 -1
  483. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  484. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs +2 -0
  485. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs.map +1 -0
  486. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +9 -0
  487. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +1 -0
  488. package/dist/node_modules/lucide-react/dist/esm/icons/info.cjs +2 -0
  489. package/dist/node_modules/lucide-react/dist/esm/icons/info.cjs.map +1 -0
  490. package/dist/node_modules/lucide-react/dist/esm/icons/info.js +21 -0
  491. package/dist/node_modules/lucide-react/dist/esm/icons/info.js.map +1 -0
  492. package/dist/package.cjs +1 -1
  493. package/dist/package.cjs.map +1 -1
  494. package/dist/package.js +10 -3
  495. package/dist/package.js.map +1 -1
  496. package/dist/routes/app-settings.cjs +1 -1
  497. package/dist/routes/app-settings.cjs.map +1 -1
  498. package/dist/routes/app-settings.js +113 -67
  499. package/dist/routes/app-settings.js.map +1 -1
  500. package/dist/routes/conversation.cjs +1 -1
  501. package/dist/routes/conversation.cjs.map +1 -1
  502. package/dist/routes/conversation.js +1 -1
  503. package/dist/routes/conversation.js.map +1 -1
  504. package/dist/routes/mcp.cjs +1 -1
  505. package/dist/routes/mcp.cjs.map +1 -1
  506. package/dist/routes/mcp.js +1 -0
  507. package/dist/routes/mcp.js.map +1 -1
  508. package/dist/services/cloud-funnel-analytics.cjs +1 -1
  509. package/dist/services/cloud-funnel-analytics.cjs.map +1 -1
  510. package/dist/services/cloud-funnel-analytics.d.ts +2 -2
  511. package/dist/services/cloud-funnel-analytics.js +18 -16
  512. package/dist/services/cloud-funnel-analytics.js.map +1 -1
  513. package/dist/services/settings.cjs +1 -1
  514. package/dist/services/settings.cjs.map +1 -1
  515. package/dist/services/settings.js +1 -0
  516. package/dist/services/settings.js.map +1 -1
  517. package/dist/services/telemetry-context.cjs +2 -0
  518. package/dist/services/telemetry-context.cjs.map +1 -0
  519. package/dist/services/telemetry-context.d.ts +17 -0
  520. package/dist/services/telemetry-context.js +27 -0
  521. package/dist/services/telemetry-context.js.map +1 -0
  522. package/dist/services/telemetry.cjs +1 -1
  523. package/dist/services/telemetry.cjs.map +1 -1
  524. package/dist/services/telemetry.d.ts +7 -5
  525. package/dist/services/telemetry.js +132 -123
  526. package/dist/services/telemetry.js.map +1 -1
  527. package/dist/stores/skill-install-banner-store.cjs +2 -0
  528. package/dist/stores/skill-install-banner-store.cjs.map +1 -0
  529. package/dist/stores/skill-install-banner-store.d.ts +32 -0
  530. package/dist/stores/skill-install-banner-store.js +14 -0
  531. package/dist/stores/skill-install-banner-store.js.map +1 -0
  532. package/dist/stores/use-event-store.cjs +1 -1
  533. package/dist/stores/use-event-store.cjs.map +1 -1
  534. package/dist/stores/use-event-store.js +35 -35
  535. package/dist/stores/use-event-store.js.map +1 -1
  536. package/dist/types/mcp-health.cjs +2 -0
  537. package/dist/types/mcp-health.cjs.map +1 -0
  538. package/dist/types/mcp-health.d.ts +21 -0
  539. package/dist/types/mcp-health.js +6 -0
  540. package/dist/types/mcp-health.js.map +1 -0
  541. package/dist/types/settings.d.ts +1 -0
  542. package/dist/utils/handle-event-for-ui.cjs +1 -1
  543. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  544. package/dist/utils/handle-event-for-ui.d.ts +5 -0
  545. package/dist/utils/handle-event-for-ui.js +71 -57
  546. package/dist/utils/handle-event-for-ui.js.map +1 -1
  547. package/dist/utils/mcp-credential-validation.cjs +1 -1
  548. package/dist/utils/mcp-credential-validation.cjs.map +1 -1
  549. package/dist/utils/mcp-credential-validation.js +32 -16
  550. package/dist/utils/mcp-credential-validation.js.map +1 -1
  551. package/dist/utils/mcp-server-health-key.cjs +2 -0
  552. package/dist/utils/mcp-server-health-key.cjs.map +1 -0
  553. package/dist/utils/mcp-server-health-key.d.ts +16 -0
  554. package/dist/utils/mcp-server-health-key.js +23 -0
  555. package/dist/utils/mcp-server-health-key.js.map +1 -0
  556. package/dist/utils/mcp-test-error-message.cjs +2 -0
  557. package/dist/utils/mcp-test-error-message.cjs.map +1 -0
  558. package/dist/utils/mcp-test-error-message.d.ts +8 -0
  559. package/dist/utils/mcp-test-error-message.js +14 -0
  560. package/dist/utils/mcp-test-error-message.js.map +1 -0
  561. package/dist/utils/redact-mcp-secrets.cjs +2 -0
  562. package/dist/utils/redact-mcp-secrets.cjs.map +1 -0
  563. package/dist/utils/redact-mcp-secrets.d.ts +13 -0
  564. package/dist/utils/redact-mcp-secrets.js +57 -0
  565. package/dist/utils/redact-mcp-secrets.js.map +1 -0
  566. package/dist/utils/settings-utils.cjs.map +1 -1
  567. package/dist/utils/settings-utils.js.map +1 -1
  568. package/dist/utils/skill-install-events.cjs +3 -0
  569. package/dist/utils/skill-install-events.cjs.map +1 -0
  570. package/dist/utils/skill-install-events.d.ts +16 -0
  571. package/dist/utils/skill-install-events.js +26 -0
  572. package/dist/utils/skill-install-events.js.map +1 -0
  573. package/dist/utils/title-llm-profile.cjs +2 -0
  574. package/dist/utils/title-llm-profile.cjs.map +1 -0
  575. package/dist/utils/title-llm-profile.d.ts +2 -0
  576. package/dist/utils/title-llm-profile.js +11 -0
  577. package/dist/utils/title-llm-profile.js.map +1 -0
  578. package/package.json +10 -3
  579. package/scripts/check-sdk-version-sync.mjs +6 -6
  580. package/scripts/check-translation-completeness.cjs +2 -0
  581. package/scripts/dev-process-utils.mjs +62 -1
  582. package/scripts/dev-safe.mjs +2 -2
  583. package/scripts/dev-static.mjs +5 -3
  584. package/scripts/dev-with-automation.mjs +98 -14
  585. package/scripts/download-node.mjs +382 -0
  586. package/scripts/download-uv.mjs +204 -0
  587. package/scripts/logger.mjs +64 -35
  588. package/build/assets/agent-server-compatibility-BWN-EIQn.js +0 -1
  589. package/build/assets/agent-server-conversation-service.api-DSPIkMwJ.js +0 -41
  590. package/build/assets/agent-settings-CgCnqaAA.js +0 -2
  591. package/build/assets/agent-settings-DDkSavD7.js +0 -1
  592. package/build/assets/api-key-entry-screen-iZc7n8AI.js +0 -1
  593. package/build/assets/app-settings-B5zyipxJ.js +0 -1
  594. package/build/assets/automation-export-BwRX6H32.js +0 -2
  595. package/build/assets/automations-list-lHAVzMoA.js +0 -1
  596. package/build/assets/backend-form-modal-RGcu909r.js +0 -1
  597. package/build/assets/browser-store-BI6uklCG.js +0 -1
  598. package/build/assets/chat-send-button-BZHG2hAW.js +0 -1
  599. package/build/assets/client-source-BZK8vRs2.js +0 -1
  600. package/build/assets/cloud-funnel-analytics-Zcv57hfT.js +0 -1
  601. package/build/assets/conversation-BoCYx8n2.js +0 -89
  602. package/build/assets/conversation-DgHqMjnY.js +0 -1
  603. package/build/assets/conversation-panel-78Rxh_-I.js +0 -1
  604. package/build/assets/conversation-state-store-B2Bp32XI.js +0 -1
  605. package/build/assets/declaration-BGsHjPEW.js +0 -1
  606. package/build/assets/extensions-hub-CCbLA7IM.js +0 -1
  607. package/build/assets/extensions-navigation-CPNjMNvR.js +0 -1
  608. package/build/assets/files-tab-store-DJsPxYdg.js +0 -1
  609. package/build/assets/files-tab-y4K7EXBO.js +0 -1
  610. package/build/assets/git-provider-icon-ITvsH4Ko.js +0 -1
  611. package/build/assets/home-BwbeOWwU.js +0 -1
  612. package/build/assets/home-DKPGQ5P3.js +0 -1
  613. package/build/assets/index-home-Bko2Itv5.js +0 -1
  614. package/build/assets/install-server-modal-Qk1gwyI8.js +0 -1
  615. package/build/assets/lesson-plan-DMCPdtrf.js +0 -4
  616. package/build/assets/llm-not-configured-banner-C1ktyb3C.js +0 -27
  617. package/build/assets/llm-settings-BBsZFi9l.js +0 -1
  618. package/build/assets/llm-settings-DFkJQr_w.js +0 -1
  619. package/build/assets/manage-backends-modal-CKQ46rvw.js +0 -1
  620. package/build/assets/manifest-03478bbf.js +0 -1
  621. package/build/assets/markdown-renderer-B4V2OMFP.js +0 -2
  622. package/build/assets/mcp-BapoJsDc.js +0 -9
  623. package/build/assets/messages-CUBFMY5o.js +0 -40
  624. package/build/assets/objectWithoutPropertiesLoose-BgYIAs2y.js +0 -1
  625. package/build/assets/onboarding-6NMkdNxV.js +0 -1
  626. package/build/assets/onboarding-modal-Q4AnpIdg.js +0 -1
  627. package/build/assets/recommended-automations-launcher-Bj7PuHY1.js +0 -58
  628. package/build/assets/refresh-cw-B9B7-vsy.js +0 -1
  629. package/build/assets/root-CDnuTToz.js +0 -2
  630. package/build/assets/root-CYWeTrWE.css +0 -1
  631. package/build/assets/root-layout-DfYVlcRG.js +0 -2
  632. package/build/assets/sdk-section-page-DLLNrYjI.js +0 -1
  633. package/build/assets/secrets-settings-CHy72A5C.js +0 -1
  634. package/build/assets/settings-B9S8UVQr.js +0 -1
  635. package/build/assets/settings-index-BKDl2CQ-.js +0 -1
  636. package/build/assets/settings-modal-DeK11CyT.js +0 -1
  637. package/build/assets/shared-conversation-9atDzTR4.js +0 -1
  638. package/build/assets/sidebar-mobile-menu-toggle-giMMZctn.js +0 -1
  639. package/build/assets/skills-plugins-Tropusio.js +0 -1
  640. package/build/assets/skills-settings-BvzBBCWk.js +0 -2
  641. package/build/assets/telemetry-C5JMEfqB.js +0 -2
  642. package/build/assets/use-activate-agent-profile-DlykqEfN.js +0 -1
  643. package/build/assets/use-backends-health-CLHPitJM.js +0 -1
  644. package/build/assets/use-config-B5r8erYt.js +0 -1
  645. package/build/assets/use-event-store-Bbaz51GR.js +0 -4
  646. package/build/assets/use-llm-profiles-Dr5__SlZ.js +0 -1
  647. package/build/assets/use-plugins-marketplace-BplU65ae.js +0 -1
  648. package/build/assets/use-runtime-is-ready-vCFOcLFa.js +0 -1
  649. package/build/assets/use-settings-CyxSlyTQ.js +0 -1
  650. package/build/assets/use-settings-nav-items-zEkSO_Bf.js +0 -16
  651. package/build/assets/use-tracking-D2Qg5Lpd.js +0 -1
  652. package/build/assets/useMutationState-OnAsCLA_.js +0 -1
  653. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD7v71DM.js +0 -2
  654. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BT05Osu4.js +0 -28
  655. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-COhHANvV.js +0 -2
  656. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DgzWSMRc.js +0 -2
  657. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DqZatR3B.js +0 -7
  658. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-FghQ3Z1a.js +0 -1
  659. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-BTvhGHHG.js +0 -1
  660. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-C4-GDgiF.js +0 -1
  661. package/dist/components/features/analytics/telemetry-consent-banner.cjs +0 -2
  662. package/dist/components/features/analytics/telemetry-consent-banner.cjs.map +0 -1
  663. package/dist/components/features/analytics/telemetry-consent-banner.d.ts +0 -29
  664. package/dist/components/features/analytics/telemetry-consent-banner.js +0 -59
  665. package/dist/components/features/analytics/telemetry-consent-banner.js.map +0 -1
  666. /package/build/assets/{__vite-browser-external-BQUj0sYu.js → __vite-browser-external-CKHVBTNC.js} +0 -0
  667. /package/build/assets/{agent-server-ui-style-scope-qhnhZHBV.js → agent-server-ui-style-scope-BvSa9on7.js} +0 -0
  668. /package/build/assets/{automation-LZB0MjdV.js → automation-BGiPmxFR.js} +0 -0
  669. /package/build/assets/{canvas-ui-COgjltGz.js → canvas-ui-CC4EJo-H.js} +0 -0
  670. /package/build/assets/{checkmark-h7udgXMM.js → checkmark-ygQB1AtV.js} +0 -0
  671. /package/build/assets/{close-DLFb5kfv.js → close-BjSA0HWT.js} +0 -0
  672. /package/build/assets/{code-tag-DYlAhEQY.js → code-tag-D9aPPbOe.js} +0 -0
  673. /package/build/assets/{common-CxbUL3nR.js → common-CCuqQy_S.js} +0 -0
  674. /package/build/assets/{conversation-local-storage-F6zVMM--.js → conversation-local-storage-BDjWPg0Z.js} +0 -0
  675. /package/build/assets/{copy-BLmGeJcd.js → copy-Dce7sOvS.js} +0 -0
  676. /package/build/assets/{copy-D1YGjP-C.js → copy-iPJAncAj.js} +0 -0
  677. /package/build/assets/{dist-CodhvuAP.js → dist-D9PhjOaq.js} +0 -0
  678. /package/build/assets/{environment-switch-store-DkjlKWzN.js → environment-switch-store-DHfcz4M4.js} +0 -0
  679. /package/build/assets/{extension-module-card-classes-9V3J9J_b.js → extension-module-card-classes-BpebKiN6.js} +0 -0
  680. /package/build/assets/{external-link-lhdITPqq.js → external-link-CpPMXxrV.js} +0 -0
  681. /package/build/assets/{folder-Bk311brm.js → folder-BabbYnbF.js} +0 -0
  682. /package/build/assets/{format-time-delta-DhDbkD7V.js → format-time-delta-BkAmJEPT.js} +0 -0
  683. /package/build/assets/{get-language-from-path-DBqBsCWH.js → get-language-from-path-CPNnuVhI.js} +0 -0
  684. /package/build/assets/{git-status-mapper-DnL9OC8_.js → git-status-mapper-BIXK0AAG.js} +0 -0
  685. /package/build/assets/{iconBase-Dz51Zn5x.js → iconBase-Ch-fOe8B.js} +0 -0
  686. /package/build/assets/{link-external-CaBmUEs_.js → link-external-DfKQroKX.js} +0 -0
  687. /package/build/assets/{list-todo-CAtvkzcy.js → list-todo-6J6zc8oS.js} +0 -0
  688. /package/build/assets/{llm-subscription-DtsX5Lhg.js → llm-subscription-Bvu8BLXc.js} +0 -0
  689. /package/build/assets/{loader-circle-CsAsfLIs.js → loader-circle-DGsqG5qw.js} +0 -0
  690. /package/build/assets/{map-provider-BbIb12oh.js → map-provider-BSvXvVR0.js} +0 -0
  691. /package/build/assets/{middleware-DYHYNAnP.js → middleware-_izt7V6U.js} +0 -0
  692. /package/build/assets/{modal-backdrop-zVwfOJZr.js → modal-backdrop-B7H42xHG.js} +0 -0
  693. /package/build/assets/{navigation-context-DPs2G0X8.js → navigation-context-cvyvI1WA.js} +0 -0
  694. /package/build/assets/{openhands-logo-bcNw5bkY.js → openhands-logo-pEw0nKFP.js} +0 -0
  695. /package/build/assets/{pencil-CWhApFIT.js → pencil-DmSqWUA3.js} +0 -0
  696. /package/build/assets/{react-DPDgL6du.js → react-MKQOkha9.js} +0 -0
  697. /package/build/assets/{search-BgOCR7_c.js → search-B5D5EuSn.js} +0 -0
  698. /package/build/assets/{search-dIQ09UY2.js → search-vnYL5jwV.js} +0 -0
  699. /package/build/assets/{settings-gear-MXCyZW0x.js → settings-gear-BOwF59Bs.js} +0 -0
  700. /package/build/assets/{settings-section-header-context-COMOIaxV.js → settings-section-header-context-CGgHZXrf.js} +0 -0
  701. /package/build/assets/{skills-EqzxYBvT.js → skills-arUOHLcS.js} +0 -0
  702. /package/build/assets/{square-chevron-right-DE-JN-2Z.js → square-chevron-right-EizCGtgq.js} +0 -0
  703. /package/build/assets/{switch-skeleton-DqQwalyu.js → switch-skeleton-BjPRx1QD.js} +0 -0
  704. /package/build/assets/{terminal-Cgf___rK.js → terminal-a57bHgZs.js} +0 -0
  705. /package/build/assets/{trash-2-BU6BlW4i.js → trash-2-CF3hilrY.js} +0 -0
  706. /package/build/assets/{u-check-circle-BqoIxNz_.js → u-check-circle-WGqHdtfO.js} +0 -0
  707. /package/build/assets/{u-check-circle-half-MsShT8Ec.js → u-check-circle-half-LiwZkuFe.js} +0 -0
  708. /package/build/assets/{u-edit-DL5LgKon.js → u-edit-BwHepAPi.js} +0 -0
  709. /package/build/assets/{use-breakpoint-BP3lqLMx.js → use-breakpoint-B-O0lQ84.js} +0 -0
  710. /package/build/assets/{use-click-outside-element-D9BYdANT.js → use-click-outside-element-DLQIMQrz.js} +0 -0
  711. /package/build/assets/{use-is-authed-BezEyfeh.js → use-is-authed-BSeo4coy.js} +0 -0
  712. /package/build/assets/{use-onboarding-completion-C_Swglzp.js → use-onboarding-completion-C0hPNGpw.js} +0 -0
  713. /package/build/assets/{v4-DbCkTSoU.js → v4-q4yWTlMz.js} +0 -0
  714. /package/build/assets/{vendor~browser-By2MVv_N.js → vendor~browser-UwB1jbAZ.js} +0 -0
  715. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-CxfzCmkN.js → vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js} +0 -0
  716. /package/build/assets/{vendor~index-home~home~conversation-panel~conversation-ChmYLVgz.js → vendor~index-home~home~conversation-panel~conversation-Bff9cq5J.js} +0 -0
  717. /package/build/assets/{vendor~module-D5a_AClf.js → vendor~module-D4DeFV4J.js} +0 -0
  718. /package/build/assets/{vendor~terminal-CnKZILnC.js → vendor~terminal-B7Eiak0-.js} +0 -0
  719. /package/build/assets/{x-ZE4iplpF.js → x-DQB_00VJ.js} +0 -0
  720. /package/build/assets/{x-mark-Batp6gXa.js → x-mark-B32XuEwS.js} +0 -0
@@ -1,4 +1,4 @@
1
- import type { MarketplacePlugin, LocalPlugin } from "#/api/plugins-service";
1
+ import type { MarketplacePlugin, LocalPlugin, PluginBundledSkill } from "#/api/plugins-service";
2
2
  import type { InstalledPluginInfo } from "#/api/plugins-management-service";
3
3
  export type PluginStatusFilter = "all" | "installed" | "available" | "local";
4
4
  /**
@@ -24,6 +24,15 @@ export interface PluginViewModel {
24
24
  * Read-only: it auto-loads into conversations and is not installed/managed.
25
25
  */
26
26
  isLocal: boolean;
27
+ /**
28
+ * Plugin contents (`skills` bundled in the plugin, `files` relative to
29
+ * `path`). The three fields travel as a unit from one server response so the
30
+ * file viewer never joins a base path with another copy's file list; null
31
+ * when the server has no local copy or predates the contents fields.
32
+ */
33
+ path: string | null;
34
+ skills: PluginBundledSkill[] | null;
35
+ files: string[] | null;
27
36
  }
28
37
  /**
29
38
  * Merge the marketplace catalog with the installed plugins into one
@@ -0,0 +1,13 @@
1
+ interface PluginFilesSectionProps {
2
+ /** Plugin directory on the agent-server (`path`/`install_path`). */
3
+ basePath: string;
4
+ /** File paths relative to `basePath`, as reported by the agent-server. */
5
+ files: string[];
6
+ }
7
+ /**
8
+ * "Files" section of the plugin detail modal: the plugin's file tree with an
9
+ * inline viewer for the selected file. Clicking the selected file again
10
+ * deselects it and closes the viewer.
11
+ */
12
+ export declare function PluginFilesSection({ basePath, files, }: PluginFilesSectionProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs`),r=require(`../../../node_modules/lucide-react/dist/esm/icons/chevron-up.cjs`),i=require(`../../../node_modules/lucide-react/dist/esm/icons/circle-check.cjs`),a=require(`../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs`),o=require(`../../../node_modules/lucide-react/dist/esm/icons/info.cjs`),s=require(`../../../node_modules/lucide-react/dist/esm/icons/refresh-cw.cjs`),c=require(`../../../utils/utils.cjs`),l=require(`../../../api/agent-server-config.cjs`),u=require(`../../../api/agent-server-compatibility.cjs`),d=require(`../../../api/client-source.cjs`),f=require(`../../shared/buttons/copy-to-clipboard-button.cjs`),p=require(`./brand-button.cjs`),m=require(`../../../api/agent-canvas-updates.cjs`),h=require(`../../../hooks/query/use-latest-agent-canvas-version.cjs`);let g=require(`react`),_=require(`react/jsx-runtime`);function v({command:e,testId:t}){let[n,r]=(0,g.useState)(!1);return(0,_.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-2 py-1.5`,children:[(0,_.jsx)(`code`,{"data-testid":t,className:`min-w-0 flex-1 select-all break-all font-mono text-[11px] leading-4 text-white`,children:e}),(0,_.jsx)(f.CopyToClipboardButton,{isHidden:!1,isDisabled:!1,onClick:()=>{navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!1),2e3)},mode:n?`copied`:`copy`})]})}function y(){let{t:f}=e.useTranslation(`openhands`),[y,b]=(0,g.useState)(!1),x=(0,g.useId)(),S=l.getLockedCloudHost()!==null,C=h.useLatestAgentCanvasVersion({enabled:!S});if(S)return null;let w=C.data,T=w===void 0?null:u.compareAgentServerVersions(w,d.AGENT_CANVAS_CLIENT_VERSION),E=T===1,D=T!==null&&T<=0,O=y?r.ChevronUp:n.ChevronDown;return(0,_.jsxs)(`section`,{"data-testid":`agent-canvas-update-card`,className:`flex flex-col gap-2 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-3`,children:[(0,_.jsxs)(`button`,{type:`button`,onClick:()=>b(e=>!e),"aria-expanded":y,"aria-controls":x,"data-testid":`agent-canvas-update-toggle`,className:`flex w-full cursor-pointer items-center gap-2 text-left`,children:[(0,_.jsx)(`span`,{className:`flex-1 truncate text-xs font-medium text-white`,children:f(t.I18nKey.SETTINGS$APP_UPDATE_CARD_TITLE)}),T!==null&&(0,_.jsx)(`span`,{"data-testid":`agent-canvas-update-badge`,className:c.cn(`inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none`,E?`text-warning`:`text-success`),children:f(E?t.I18nKey.SETTINGS$APP_UPDATE_BADGE_UPDATE_AVAILABLE:t.I18nKey.SETTINGS$APP_UPDATE_BADGE_UP_TO_DATE)}),(0,_.jsx)(O,{className:`size-4 shrink-0 text-[var(--oh-muted)]`,"aria-hidden":!0})]}),(0,_.jsxs)(`div`,{className:`flex items-center justify-between text-xs`,children:[(0,_.jsx)(`span`,{className:`text-[var(--oh-text-dim)]`,children:f(t.I18nKey.SETTINGS$APP_UPDATE_VERSION_LABEL)}),(0,_.jsx)(`span`,{className:`font-mono text-white`,children:d.AGENT_CANVAS_CLIENT_VERSION})]}),y&&(0,_.jsxs)(`div`,{id:x,className:`flex flex-col gap-3 pt-1`,children:[(0,_.jsx)(`div`,{"data-testid":`agent-canvas-update-status`,className:`flex items-start gap-2 text-xs`,children:C.isPending?(0,_.jsx)(`span`,{className:`text-[var(--oh-muted)]`,children:f(t.I18nKey.SETTINGS$APP_UPDATE_CHECKING)}):E?(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(o.Info,{className:`size-4 shrink-0 text-warning`,"aria-hidden":!0}),(0,_.jsx)(`span`,{className:`text-warning`,children:f(t.I18nKey.SETTINGS$APP_UPDATE_AVAILABLE_MESSAGE,{version:w})})]}):D?(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(i.CircleCheck,{className:`size-4 shrink-0 text-success`,"aria-hidden":!0}),(0,_.jsx)(`span`,{className:`text-success`,children:f(t.I18nKey.SETTINGS$APP_UPDATE_LATEST_MESSAGE)})]}):(0,_.jsx)(`span`,{className:`text-[var(--oh-muted)]`,children:f(t.I18nKey.SETTINGS$APP_UPDATE_CHECK_FAILED)})}),(0,_.jsx)(p.BrandButton,{testId:`agent-canvas-update-check-button`,type:`button`,variant:`secondary`,className:`w-full`,isDisabled:C.isFetching,"aria-busy":C.isFetching,onClick:()=>C.refetch(),startContent:(0,_.jsx)(s.RefreshCw,{className:c.cn(`size-4`,C.isFetching&&`animate-spin`),"aria-hidden":!0}),children:f(t.I18nKey.SETTINGS$APP_UPDATE_CHECK_BUTTON)}),(0,_.jsxs)(`div`,{className:`flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-xs`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-1.5 text-white`,children:[(0,_.jsx)(o.Info,{className:`size-4 shrink-0`,"aria-hidden":!0}),(0,_.jsx)(`span`,{className:`font-medium`,children:f(t.I18nKey.SETTINGS$APP_UPDATE_HOW_TO_UPDATE)})]}),(0,_.jsx)(`span`,{className:`text-[var(--oh-text-dim)]`,children:f(t.I18nKey.SETTINGS$APP_UPDATE_RUN_COMMANDS)}),(0,_.jsx)(v,{command:m.AGENT_CANVAS_UPDATE_COMMANDS.npm,testId:`agent-canvas-update-command-npm`}),(0,_.jsx)(`span`,{className:`text-center text-[var(--oh-text-dim)]`,children:f(t.I18nKey.SETTINGS$APP_UPDATE_OR)}),(0,_.jsx)(v,{command:m.AGENT_CANVAS_UPDATE_COMMANDS.docker,testId:`agent-canvas-update-command-docker`})]}),(0,_.jsxs)(`a`,{"data-testid":`agent-canvas-update-release-notes`,href:`https://github.com/OpenHands/agent-canvas/releases`,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1 self-start text-xs text-[var(--oh-accent)] underline`,children:[f(t.I18nKey.SETTINGS$APP_UPDATE_RELEASE_NOTES),(0,_.jsx)(a.ExternalLink,{size:12,"aria-hidden":!0})]})]})]})}exports.AgentCanvasUpdateCard=y;
2
+ //# sourceMappingURL=agent-canvas-update-card.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-canvas-update-card.cjs","names":[],"sources":["../../../../src/components/features/settings/agent-canvas-update-card.tsx"],"sourcesContent":["import { useId, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n ChevronDown,\n ChevronUp,\n CircleCheck,\n ExternalLink,\n Info,\n RefreshCw,\n} from \"lucide-react\";\nimport {\n AGENT_CANVAS_RELEASE_NOTES_URL,\n AGENT_CANVAS_UPDATE_COMMANDS,\n} from \"#/api/agent-canvas-updates\";\nimport { compareAgentServerVersions } from \"#/api/agent-server-compatibility\";\nimport { getLockedCloudHost } from \"#/api/agent-server-config\";\nimport { AGENT_CANVAS_CLIENT_VERSION } from \"#/api/client-source\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport { useLatestAgentCanvasVersion } from \"#/hooks/query/use-latest-agent-canvas-version\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\n\nfunction UpdateCommandRow({\n command,\n testId,\n}: {\n command: string;\n testId: string;\n}) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = () => {\n navigator.clipboard.writeText(command);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <div className=\"flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-2 py-1.5\">\n <code\n data-testid={testId}\n className=\"min-w-0 flex-1 select-all break-all font-mono text-[11px] leading-4 text-white\"\n >\n {command}\n </code>\n <CopyToClipboardButton\n isHidden={false}\n isDisabled={false}\n onClick={handleCopy}\n mode={copied ? \"copied\" : \"copy\"}\n />\n </div>\n );\n}\n\n/**\n * Information-only version/update card for the settings navigation surfaces.\n * Never blocks or toasts; check failures degrade to a quiet inline message.\n * Hidden in locked-to-Cloud deployments — the hosted canvas has no npm/docker\n * install to update.\n */\nexport function AgentCanvasUpdateCard() {\n const { t } = useTranslation(\"openhands\");\n const [expanded, setExpanded] = useState(false);\n // The card is mounted on multiple settings surfaces at once; ids must not\n // collide across instances.\n const detailsId = useId();\n const isLockedToCloud = getLockedCloudHost() !== null;\n const latestVersionQuery = useLatestAgentCanvasVersion({\n enabled: !isLockedToCloud,\n });\n\n if (isLockedToCloud) return null;\n\n const latestVersion = latestVersionQuery.data;\n const comparison =\n latestVersion !== undefined\n ? compareAgentServerVersions(latestVersion, AGENT_CANVAS_CLIENT_VERSION)\n : null;\n const updateAvailable = comparison === 1;\n // 0 or -1: running the npm latest or newer (local dev build).\n const upToDate = comparison !== null && comparison <= 0;\n const ChevronIcon = expanded ? ChevronUp : ChevronDown;\n\n return (\n <section\n data-testid=\"agent-canvas-update-card\"\n className=\"flex flex-col gap-2 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-3\"\n >\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n aria-expanded={expanded}\n aria-controls={detailsId}\n data-testid=\"agent-canvas-update-toggle\"\n className=\"flex w-full cursor-pointer items-center gap-2 text-left\"\n >\n <span className=\"flex-1 truncate text-xs font-medium text-white\">\n {t(I18nKey.SETTINGS$APP_UPDATE_CARD_TITLE)}\n </span>\n {comparison !== null && (\n <span\n data-testid=\"agent-canvas-update-badge\"\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none\",\n updateAvailable ? \"text-warning\" : \"text-success\",\n )}\n >\n {t(\n updateAvailable\n ? I18nKey.SETTINGS$APP_UPDATE_BADGE_UPDATE_AVAILABLE\n : I18nKey.SETTINGS$APP_UPDATE_BADGE_UP_TO_DATE,\n )}\n </span>\n )}\n <ChevronIcon\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </button>\n\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-[var(--oh-text-dim)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_VERSION_LABEL)}\n </span>\n <span className=\"font-mono text-white\">\n {AGENT_CANVAS_CLIENT_VERSION}\n </span>\n </div>\n\n {expanded && (\n <div id={detailsId} className=\"flex flex-col gap-3 pt-1\">\n <div\n data-testid=\"agent-canvas-update-status\"\n className=\"flex items-start gap-2 text-xs\"\n >\n {latestVersionQuery.isPending ? (\n <span className=\"text-[var(--oh-muted)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_CHECKING)}\n </span>\n ) : updateAvailable ? (\n <>\n <Info className=\"size-4 shrink-0 text-warning\" aria-hidden />\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$APP_UPDATE_AVAILABLE_MESSAGE, {\n version: latestVersion,\n })}\n </span>\n </>\n ) : upToDate ? (\n <>\n <CircleCheck\n className=\"size-4 shrink-0 text-success\"\n aria-hidden\n />\n <span className=\"text-success\">\n {t(I18nKey.SETTINGS$APP_UPDATE_LATEST_MESSAGE)}\n </span>\n </>\n ) : (\n <span className=\"text-[var(--oh-muted)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_CHECK_FAILED)}\n </span>\n )}\n </div>\n\n <BrandButton\n testId=\"agent-canvas-update-check-button\"\n type=\"button\"\n variant=\"secondary\"\n className=\"w-full\"\n isDisabled={latestVersionQuery.isFetching}\n aria-busy={latestVersionQuery.isFetching}\n onClick={() => latestVersionQuery.refetch()}\n startContent={\n <RefreshCw\n className={cn(\n \"size-4\",\n latestVersionQuery.isFetching && \"animate-spin\",\n )}\n aria-hidden\n />\n }\n >\n {t(I18nKey.SETTINGS$APP_UPDATE_CHECK_BUTTON)}\n </BrandButton>\n\n <div className=\"flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-xs\">\n <div className=\"flex items-center gap-1.5 text-white\">\n <Info className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"font-medium\">\n {t(I18nKey.SETTINGS$APP_UPDATE_HOW_TO_UPDATE)}\n </span>\n </div>\n <span className=\"text-[var(--oh-text-dim)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_RUN_COMMANDS)}\n </span>\n <UpdateCommandRow\n command={AGENT_CANVAS_UPDATE_COMMANDS.npm}\n testId=\"agent-canvas-update-command-npm\"\n />\n <span className=\"text-center text-[var(--oh-text-dim)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_OR)}\n </span>\n <UpdateCommandRow\n command={AGENT_CANVAS_UPDATE_COMMANDS.docker}\n testId=\"agent-canvas-update-command-docker\"\n />\n </div>\n\n <a\n data-testid=\"agent-canvas-update-release-notes\"\n href={AGENT_CANVAS_RELEASE_NOTES_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 self-start text-xs text-[var(--oh-accent)] underline\"\n >\n {t(I18nKey.SETTINGS$APP_UPDATE_RELEASE_NOTES)}\n <ExternalLink size={12} aria-hidden />\n </a>\n </div>\n )}\n </section>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Information-only version/update card for the settings navigation surfaces.
3
+ * Never blocks or toasts; check failures degrade to a quiet inline message.
4
+ * Hidden in locked-to-Cloud deployments — the hosted canvas has no npm/docker
5
+ * install to update.
6
+ */
7
+ export declare function AgentCanvasUpdateCard(): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,170 @@
1
+ import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../../../i18n/declaration.js";
3
+ import { ChevronDown as n } from "../../../node_modules/lucide-react/dist/esm/icons/chevron-down.js";
4
+ import { ChevronUp as r } from "../../../node_modules/lucide-react/dist/esm/icons/chevron-up.js";
5
+ import { CircleCheck as i } from "../../../node_modules/lucide-react/dist/esm/icons/circle-check.js";
6
+ import { ExternalLink as a } from "../../../node_modules/lucide-react/dist/esm/icons/external-link.js";
7
+ import { Info as o } from "../../../node_modules/lucide-react/dist/esm/icons/info.js";
8
+ import { RefreshCw as s } from "../../../node_modules/lucide-react/dist/esm/icons/refresh-cw.js";
9
+ import { cn as c } from "../../../utils/utils.js";
10
+ import { getLockedCloudHost as l } from "../../../api/agent-server-config.js";
11
+ import { compareAgentServerVersions as u } from "../../../api/agent-server-compatibility.js";
12
+ import { AGENT_CANVAS_CLIENT_VERSION as d } from "../../../api/client-source.js";
13
+ import { CopyToClipboardButton as f } from "../../shared/buttons/copy-to-clipboard-button.js";
14
+ import { BrandButton as p } from "./brand-button.js";
15
+ import { AGENT_CANVAS_UPDATE_COMMANDS as m } from "../../../api/agent-canvas-updates.js";
16
+ import { useLatestAgentCanvasVersion as h } from "../../../hooks/query/use-latest-agent-canvas-version.js";
17
+ import { useId as g, useState as _ } from "react";
18
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
19
+ //#region src/components/features/settings/agent-canvas-update-card.tsx
20
+ function x({ command: e, testId: t }) {
21
+ let [n, r] = _(!1);
22
+ return /* @__PURE__ */ b("div", {
23
+ className: "flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-2 py-1.5",
24
+ children: [/* @__PURE__ */ y("code", {
25
+ "data-testid": t,
26
+ className: "min-w-0 flex-1 select-all break-all font-mono text-[11px] leading-4 text-white",
27
+ children: e
28
+ }), /* @__PURE__ */ y(f, {
29
+ isHidden: !1,
30
+ isDisabled: !1,
31
+ onClick: () => {
32
+ navigator.clipboard.writeText(e), r(!0), setTimeout(() => r(!1), 2e3);
33
+ },
34
+ mode: n ? "copied" : "copy"
35
+ })]
36
+ });
37
+ }
38
+ function S() {
39
+ let { t: f } = e("openhands"), [S, C] = _(!1), w = g(), T = l() !== null, E = h({ enabled: !T });
40
+ if (T) return null;
41
+ let D = E.data, O = D === void 0 ? null : u(D, d), k = O === 1, A = O !== null && O <= 0, j = S ? r : n;
42
+ return /* @__PURE__ */ b("section", {
43
+ "data-testid": "agent-canvas-update-card",
44
+ className: "flex flex-col gap-2 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-3",
45
+ children: [
46
+ /* @__PURE__ */ b("button", {
47
+ type: "button",
48
+ onClick: () => C((e) => !e),
49
+ "aria-expanded": S,
50
+ "aria-controls": w,
51
+ "data-testid": "agent-canvas-update-toggle",
52
+ className: "flex w-full cursor-pointer items-center gap-2 text-left",
53
+ children: [
54
+ /* @__PURE__ */ y("span", {
55
+ className: "flex-1 truncate text-xs font-medium text-white",
56
+ children: f(t.SETTINGS$APP_UPDATE_CARD_TITLE)
57
+ }),
58
+ O !== null && /* @__PURE__ */ y("span", {
59
+ "data-testid": "agent-canvas-update-badge",
60
+ className: c("inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none", k ? "text-warning" : "text-success"),
61
+ children: f(k ? t.SETTINGS$APP_UPDATE_BADGE_UPDATE_AVAILABLE : t.SETTINGS$APP_UPDATE_BADGE_UP_TO_DATE)
62
+ }),
63
+ /* @__PURE__ */ y(j, {
64
+ className: "size-4 shrink-0 text-[var(--oh-muted)]",
65
+ "aria-hidden": !0
66
+ })
67
+ ]
68
+ }),
69
+ /* @__PURE__ */ b("div", {
70
+ className: "flex items-center justify-between text-xs",
71
+ children: [/* @__PURE__ */ y("span", {
72
+ className: "text-[var(--oh-text-dim)]",
73
+ children: f(t.SETTINGS$APP_UPDATE_VERSION_LABEL)
74
+ }), /* @__PURE__ */ y("span", {
75
+ className: "font-mono text-white",
76
+ children: d
77
+ })]
78
+ }),
79
+ S && /* @__PURE__ */ b("div", {
80
+ id: w,
81
+ className: "flex flex-col gap-3 pt-1",
82
+ children: [
83
+ /* @__PURE__ */ y("div", {
84
+ "data-testid": "agent-canvas-update-status",
85
+ className: "flex items-start gap-2 text-xs",
86
+ children: E.isPending ? /* @__PURE__ */ y("span", {
87
+ className: "text-[var(--oh-muted)]",
88
+ children: f(t.SETTINGS$APP_UPDATE_CHECKING)
89
+ }) : k ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(o, {
90
+ className: "size-4 shrink-0 text-warning",
91
+ "aria-hidden": !0
92
+ }), /* @__PURE__ */ y("span", {
93
+ className: "text-warning",
94
+ children: f(t.SETTINGS$APP_UPDATE_AVAILABLE_MESSAGE, { version: D })
95
+ })] }) : A ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(i, {
96
+ className: "size-4 shrink-0 text-success",
97
+ "aria-hidden": !0
98
+ }), /* @__PURE__ */ y("span", {
99
+ className: "text-success",
100
+ children: f(t.SETTINGS$APP_UPDATE_LATEST_MESSAGE)
101
+ })] }) : /* @__PURE__ */ y("span", {
102
+ className: "text-[var(--oh-muted)]",
103
+ children: f(t.SETTINGS$APP_UPDATE_CHECK_FAILED)
104
+ })
105
+ }),
106
+ /* @__PURE__ */ y(p, {
107
+ testId: "agent-canvas-update-check-button",
108
+ type: "button",
109
+ variant: "secondary",
110
+ className: "w-full",
111
+ isDisabled: E.isFetching,
112
+ "aria-busy": E.isFetching,
113
+ onClick: () => E.refetch(),
114
+ startContent: /* @__PURE__ */ y(s, {
115
+ className: c("size-4", E.isFetching && "animate-spin"),
116
+ "aria-hidden": !0
117
+ }),
118
+ children: f(t.SETTINGS$APP_UPDATE_CHECK_BUTTON)
119
+ }),
120
+ /* @__PURE__ */ b("div", {
121
+ className: "flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-xs",
122
+ children: [
123
+ /* @__PURE__ */ b("div", {
124
+ className: "flex items-center gap-1.5 text-white",
125
+ children: [/* @__PURE__ */ y(o, {
126
+ className: "size-4 shrink-0",
127
+ "aria-hidden": !0
128
+ }), /* @__PURE__ */ y("span", {
129
+ className: "font-medium",
130
+ children: f(t.SETTINGS$APP_UPDATE_HOW_TO_UPDATE)
131
+ })]
132
+ }),
133
+ /* @__PURE__ */ y("span", {
134
+ className: "text-[var(--oh-text-dim)]",
135
+ children: f(t.SETTINGS$APP_UPDATE_RUN_COMMANDS)
136
+ }),
137
+ /* @__PURE__ */ y(x, {
138
+ command: m.npm,
139
+ testId: "agent-canvas-update-command-npm"
140
+ }),
141
+ /* @__PURE__ */ y("span", {
142
+ className: "text-center text-[var(--oh-text-dim)]",
143
+ children: f(t.SETTINGS$APP_UPDATE_OR)
144
+ }),
145
+ /* @__PURE__ */ y(x, {
146
+ command: m.docker,
147
+ testId: "agent-canvas-update-command-docker"
148
+ })
149
+ ]
150
+ }),
151
+ /* @__PURE__ */ b("a", {
152
+ "data-testid": "agent-canvas-update-release-notes",
153
+ href: "https://github.com/OpenHands/agent-canvas/releases",
154
+ target: "_blank",
155
+ rel: "noopener noreferrer",
156
+ className: "inline-flex items-center gap-1 self-start text-xs text-[var(--oh-accent)] underline",
157
+ children: [f(t.SETTINGS$APP_UPDATE_RELEASE_NOTES), /* @__PURE__ */ y(a, {
158
+ size: 12,
159
+ "aria-hidden": !0
160
+ })]
161
+ })
162
+ ]
163
+ })
164
+ ]
165
+ });
166
+ }
167
+ //#endregion
168
+ export { S as AgentCanvasUpdateCard };
169
+
170
+ //# sourceMappingURL=agent-canvas-update-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-canvas-update-card.js","names":[],"sources":["../../../../src/components/features/settings/agent-canvas-update-card.tsx"],"sourcesContent":["import { useId, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n ChevronDown,\n ChevronUp,\n CircleCheck,\n ExternalLink,\n Info,\n RefreshCw,\n} from \"lucide-react\";\nimport {\n AGENT_CANVAS_RELEASE_NOTES_URL,\n AGENT_CANVAS_UPDATE_COMMANDS,\n} from \"#/api/agent-canvas-updates\";\nimport { compareAgentServerVersions } from \"#/api/agent-server-compatibility\";\nimport { getLockedCloudHost } from \"#/api/agent-server-config\";\nimport { AGENT_CANVAS_CLIENT_VERSION } from \"#/api/client-source\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { CopyToClipboardButton } from \"#/components/shared/buttons/copy-to-clipboard-button\";\nimport { useLatestAgentCanvasVersion } from \"#/hooks/query/use-latest-agent-canvas-version\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\n\nfunction UpdateCommandRow({\n command,\n testId,\n}: {\n command: string;\n testId: string;\n}) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = () => {\n navigator.clipboard.writeText(command);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <div className=\"flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-2 py-1.5\">\n <code\n data-testid={testId}\n className=\"min-w-0 flex-1 select-all break-all font-mono text-[11px] leading-4 text-white\"\n >\n {command}\n </code>\n <CopyToClipboardButton\n isHidden={false}\n isDisabled={false}\n onClick={handleCopy}\n mode={copied ? \"copied\" : \"copy\"}\n />\n </div>\n );\n}\n\n/**\n * Information-only version/update card for the settings navigation surfaces.\n * Never blocks or toasts; check failures degrade to a quiet inline message.\n * Hidden in locked-to-Cloud deployments — the hosted canvas has no npm/docker\n * install to update.\n */\nexport function AgentCanvasUpdateCard() {\n const { t } = useTranslation(\"openhands\");\n const [expanded, setExpanded] = useState(false);\n // The card is mounted on multiple settings surfaces at once; ids must not\n // collide across instances.\n const detailsId = useId();\n const isLockedToCloud = getLockedCloudHost() !== null;\n const latestVersionQuery = useLatestAgentCanvasVersion({\n enabled: !isLockedToCloud,\n });\n\n if (isLockedToCloud) return null;\n\n const latestVersion = latestVersionQuery.data;\n const comparison =\n latestVersion !== undefined\n ? compareAgentServerVersions(latestVersion, AGENT_CANVAS_CLIENT_VERSION)\n : null;\n const updateAvailable = comparison === 1;\n // 0 or -1: running the npm latest or newer (local dev build).\n const upToDate = comparison !== null && comparison <= 0;\n const ChevronIcon = expanded ? ChevronUp : ChevronDown;\n\n return (\n <section\n data-testid=\"agent-canvas-update-card\"\n className=\"flex flex-col gap-2 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-3\"\n >\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n aria-expanded={expanded}\n aria-controls={detailsId}\n data-testid=\"agent-canvas-update-toggle\"\n className=\"flex w-full cursor-pointer items-center gap-2 text-left\"\n >\n <span className=\"flex-1 truncate text-xs font-medium text-white\">\n {t(I18nKey.SETTINGS$APP_UPDATE_CARD_TITLE)}\n </span>\n {comparison !== null && (\n <span\n data-testid=\"agent-canvas-update-badge\"\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none\",\n updateAvailable ? \"text-warning\" : \"text-success\",\n )}\n >\n {t(\n updateAvailable\n ? I18nKey.SETTINGS$APP_UPDATE_BADGE_UPDATE_AVAILABLE\n : I18nKey.SETTINGS$APP_UPDATE_BADGE_UP_TO_DATE,\n )}\n </span>\n )}\n <ChevronIcon\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </button>\n\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-[var(--oh-text-dim)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_VERSION_LABEL)}\n </span>\n <span className=\"font-mono text-white\">\n {AGENT_CANVAS_CLIENT_VERSION}\n </span>\n </div>\n\n {expanded && (\n <div id={detailsId} className=\"flex flex-col gap-3 pt-1\">\n <div\n data-testid=\"agent-canvas-update-status\"\n className=\"flex items-start gap-2 text-xs\"\n >\n {latestVersionQuery.isPending ? (\n <span className=\"text-[var(--oh-muted)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_CHECKING)}\n </span>\n ) : updateAvailable ? (\n <>\n <Info className=\"size-4 shrink-0 text-warning\" aria-hidden />\n <span className=\"text-warning\">\n {t(I18nKey.SETTINGS$APP_UPDATE_AVAILABLE_MESSAGE, {\n version: latestVersion,\n })}\n </span>\n </>\n ) : upToDate ? (\n <>\n <CircleCheck\n className=\"size-4 shrink-0 text-success\"\n aria-hidden\n />\n <span className=\"text-success\">\n {t(I18nKey.SETTINGS$APP_UPDATE_LATEST_MESSAGE)}\n </span>\n </>\n ) : (\n <span className=\"text-[var(--oh-muted)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_CHECK_FAILED)}\n </span>\n )}\n </div>\n\n <BrandButton\n testId=\"agent-canvas-update-check-button\"\n type=\"button\"\n variant=\"secondary\"\n className=\"w-full\"\n isDisabled={latestVersionQuery.isFetching}\n aria-busy={latestVersionQuery.isFetching}\n onClick={() => latestVersionQuery.refetch()}\n startContent={\n <RefreshCw\n className={cn(\n \"size-4\",\n latestVersionQuery.isFetching && \"animate-spin\",\n )}\n aria-hidden\n />\n }\n >\n {t(I18nKey.SETTINGS$APP_UPDATE_CHECK_BUTTON)}\n </BrandButton>\n\n <div className=\"flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-xs\">\n <div className=\"flex items-center gap-1.5 text-white\">\n <Info className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"font-medium\">\n {t(I18nKey.SETTINGS$APP_UPDATE_HOW_TO_UPDATE)}\n </span>\n </div>\n <span className=\"text-[var(--oh-text-dim)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_RUN_COMMANDS)}\n </span>\n <UpdateCommandRow\n command={AGENT_CANVAS_UPDATE_COMMANDS.npm}\n testId=\"agent-canvas-update-command-npm\"\n />\n <span className=\"text-center text-[var(--oh-text-dim)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_OR)}\n </span>\n <UpdateCommandRow\n command={AGENT_CANVAS_UPDATE_COMMANDS.docker}\n testId=\"agent-canvas-update-command-docker\"\n />\n </div>\n\n <a\n data-testid=\"agent-canvas-update-release-notes\"\n href={AGENT_CANVAS_RELEASE_NOTES_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 self-start text-xs text-[var(--oh-accent)] underline\"\n >\n {t(I18nKey.SETTINGS$APP_UPDATE_RELEASE_NOTES)}\n <ExternalLink size={12} aria-hidden />\n </a>\n </div>\n )}\n </section>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs`),r=require(`../../../node_modules/lucide-react/dist/esm/icons/puzzle.cjs`),i=require(`../../../utils/utils.cjs`),a=require(`../../../api/backend-registry/active-store.cjs`),o=require(`../../../contexts/active-backend-context.cjs`),s=require(`../sidebar/sidebar-layout.cjs`);let c=require(`react/jsx-runtime`);function l(){let{t:l}=e.useTranslation(`openhands`),{active:u}=o.useActiveBackendContext(),{backend:d}=u;return a.isNoBackend(d)||d.kind!==`cloud`?null:(0,c.jsxs)(`a`,{"data-testid":`settings-integrations-link`,href:`${d.host.replace(/\/+$/,``)}/settings/integrations`,target:`_blank`,rel:`noopener noreferrer`,className:i.cn(s.sidebarNavRowClassName({collapsed:!1}),s.SIDEBAR_ROW_INTERACTIVE_CLASS.idle),children:[(0,c.jsx)(`span`,{className:s.SIDEBAR_ICON_SLOT_CLASS,children:(0,c.jsx)(r.Puzzle,{className:`size-4 shrink-0`,"aria-hidden":!0})}),(0,c.jsx)(`span`,{className:i.cn(s.sidebarNavLabelClassName(!1),`flex-1`),children:l(t.I18nKey.SETTINGS$INTEGRATIONS_SETTINGS_LINK)}),(0,c.jsx)(n.ExternalLink,{className:`size-4 shrink-0 text-[var(--oh-muted)]`,"aria-hidden":!0})]})}exports.IntegrationsSettingsLink=l;
2
+ //# sourceMappingURL=integrations-settings-link.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations-settings-link.cjs","names":[],"sources":["../../../../src/components/features/settings/integrations-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { ExternalLink, Puzzle } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted integrations settings page.\n */\nexport function IntegrationsSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n const integrationsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings/integrations`;\n\n return (\n <a\n data-testid=\"settings-integrations-link\"\n href={integrationsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Puzzle className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$INTEGRATIONS_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":"qjBAiBA,SAAgB,GAA2B,CACzC,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,UAAW,EAAA,yBAAyB,CACtC,CAAE,WAAY,EAMpB,OAJI,EAAA,YAAY,EAAQ,EAAI,EAAQ,OAAS,QAAgB,MAK3D,EAAA,EAAA,MAAC,IAAD,CACE,cAAY,6BACZ,KAAM,GALiB,EAAQ,KAAK,QAAQ,OAAQ,GAAG,CAAC,wBAMxD,OAAO,SACP,IAAI,sBACJ,UAAW,EAAA,GACT,EAAA,uBAAuB,CAAE,UAAW,GAAO,CAAC,CAC5C,EAAA,8BAA8B,KAC/B,UARH,EAUE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,kCACf,EAAA,EAAA,KAAC,EAAA,OAAD,CAAQ,UAAU,kBAAkB,cAAA,GAAc,CAAA,CAC7C,CAAA,EACP,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,yBAAyB,GAAM,CAAE,SAAS,UAC3D,EAAE,EAAA,QAAQ,oCAAoC,CAC1C,CAAA,EACP,EAAA,EAAA,KAAC,EAAA,aAAD,CACE,UAAU,yCACV,cAAA,GACA,CAAA,CACA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Renders only for cloud backends — local backends have no equivalent
3
+ * hosted integrations settings page.
4
+ */
5
+ export declare function IntegrationsSettingsLink(): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,41 @@
1
+ import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../../../i18n/declaration.js";
3
+ import { ExternalLink as n } from "../../../node_modules/lucide-react/dist/esm/icons/external-link.js";
4
+ import { Puzzle as r } from "../../../node_modules/lucide-react/dist/esm/icons/puzzle.js";
5
+ import { cn as i } from "../../../utils/utils.js";
6
+ import { isNoBackend as a } from "../../../api/backend-registry/active-store.js";
7
+ import { useActiveBackendContext as o } from "../../../contexts/active-backend-context.js";
8
+ import { SIDEBAR_ICON_SLOT_CLASS as s, SIDEBAR_ROW_INTERACTIVE_CLASS as c, sidebarNavLabelClassName as l, sidebarNavRowClassName as u } from "../sidebar/sidebar-layout.js";
9
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
10
+ //#region src/components/features/settings/integrations-settings-link.tsx
11
+ function p() {
12
+ let { t: p } = e("openhands"), { active: m } = o(), { backend: h } = m;
13
+ return a(h) || h.kind !== "cloud" ? null : /* @__PURE__ */ f("a", {
14
+ "data-testid": "settings-integrations-link",
15
+ href: `${h.host.replace(/\/+$/, "")}/settings/integrations`,
16
+ target: "_blank",
17
+ rel: "noopener noreferrer",
18
+ className: i(u({ collapsed: !1 }), c.idle),
19
+ children: [
20
+ /* @__PURE__ */ d("span", {
21
+ className: s,
22
+ children: /* @__PURE__ */ d(r, {
23
+ className: "size-4 shrink-0",
24
+ "aria-hidden": !0
25
+ })
26
+ }),
27
+ /* @__PURE__ */ d("span", {
28
+ className: i(l(!1), "flex-1"),
29
+ children: p(t.SETTINGS$INTEGRATIONS_SETTINGS_LINK)
30
+ }),
31
+ /* @__PURE__ */ d(n, {
32
+ className: "size-4 shrink-0 text-[var(--oh-muted)]",
33
+ "aria-hidden": !0
34
+ })
35
+ ]
36
+ });
37
+ }
38
+ //#endregion
39
+ export { p as IntegrationsSettingsLink };
40
+
41
+ //# sourceMappingURL=integrations-settings-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations-settings-link.js","names":[],"sources":["../../../../src/components/features/settings/integrations-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { ExternalLink, Puzzle } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted integrations settings page.\n */\nexport function IntegrationsSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n const integrationsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings/integrations`;\n\n return (\n <a\n data-testid=\"settings-integrations-link\"\n href={integrationsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Puzzle className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$INTEGRATIONS_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,IAA2B;CACzC,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,cAAW,GAAyB,EACtC,EAAE,eAAY;AAMpB,QAJI,EAAY,EAAQ,IAAI,EAAQ,SAAS,UAAgB,OAK3D,kBAAC,KAAD;EACE,eAAY;EACZ,MAAM,GALiB,EAAQ,KAAK,QAAQ,QAAQ,GAAG,CAAC;EAMxD,QAAO;EACP,KAAI;EACJ,WAAW,EACT,EAAuB,EAAE,WAAW,IAAO,CAAC,EAC5C,EAA8B,KAC/B;YARH;GAUE,kBAAC,QAAD;IAAM,WAAW;cACf,kBAAC,GAAD;KAAQ,WAAU;KAAkB,eAAA;KAAc,CAAA;IAC7C,CAAA;GACP,kBAAC,QAAD;IAAM,WAAW,EAAG,EAAyB,GAAM,EAAE,SAAS;cAC3D,EAAE,EAAQ,oCAAoC;IAC1C,CAAA;GACP,kBAAC,GAAD;IACE,WAAU;IACV,eAAA;IACA,CAAA;GACA"}
@@ -1 +1 @@
1
- const e=require(`../../../../_virtual/_rolldown/runtime.cjs`);require(`../../../../utils/custom-toast-handlers.cjs`),require(`../../../../api/profiles-service/profiles-service.api.cjs`),require(`../../../../hooks/query/use-settings.cjs`),require(`../../../../hooks/query/use-llm-profiles.cjs`),require(`../../../../ui/typography.cjs`),require(`../brand-button.cjs`),require(`../../../../hooks/query/use-agent-settings-schema.cjs`),require(`./profile-name-input.cjs`),require(`../../../../hooks/mutation/use-activate-llm-profile.cjs`),require(`../../../../hooks/mutation/use-save-llm-profile.cjs`),require(`./llm-profiles-manager.cjs`),require(`../../../shared/buttons/back-nav-button.cjs`),require(`../../../../contexts/settings-section-header-context.cjs`),require(`../../../../routes/llm-settings.cjs`);let t=require(`react`);t=e.__toESM(t,1),require(`react/jsx-runtime`);
1
+ const e=require(`../../../../_virtual/_rolldown/runtime.cjs`);require(`../../../../utils/custom-toast-handlers.cjs`),require(`../../../../api/profiles-service/profiles-service.api.cjs`),require(`../../../../hooks/query/use-llm-profiles.cjs`),require(`../../../../hooks/query/use-settings.cjs`),require(`../../../../ui/typography.cjs`),require(`../brand-button.cjs`),require(`../../../../hooks/query/use-agent-settings-schema.cjs`),require(`./profile-name-input.cjs`),require(`../../../../hooks/mutation/use-activate-llm-profile.cjs`),require(`../../../../hooks/mutation/use-save-llm-profile.cjs`),require(`./llm-profiles-manager.cjs`),require(`../../../shared/buttons/back-nav-button.cjs`),require(`../../../../contexts/settings-section-header-context.cjs`),require(`../../../../routes/llm-settings.cjs`);let t=require(`react`);t=e.__toESM(t,1),require(`react/jsx-runtime`);
@@ -1,7 +1,7 @@
1
1
  import "../../../../utils/custom-toast-handlers.js";
2
2
  import "../../../../api/profiles-service/profiles-service.api.js";
3
- import "../../../../hooks/query/use-settings.js";
4
3
  import "../../../../hooks/query/use-llm-profiles.js";
4
+ import "../../../../hooks/query/use-settings.js";
5
5
  import "../../../../ui/typography.js";
6
6
  import "../brand-button.js";
7
7
  import "../../../../hooks/query/use-agent-settings-schema.js";
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../../ui/typography.cjs`),i=require(`../sidebar/sidebar-nav-link.cjs`),a=require(`./backend-synced-settings-badge.cjs`),o=require(`./cloud-settings-link.cjs`);let s=require(`react/jsx-runtime`);function c({navigationItems:c}){let{t:l}=e.useTranslation(`openhands`),u=c.filter(e=>e.type===`item`);return(0,s.jsxs)(`aside`,{"data-testid":`settings-navbar-desktop`,className:n.cn(`hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2`,`md:sticky md:top-8 md:self-start md:pl-8`),children:[(0,s.jsx)(r.Typography.Text,{className:`px-2 text-sm font-normal text-white`,children:l(t.I18nKey.SETTINGS$TITLE)}),(0,s.jsxs)(`div`,{className:`flex flex-col gap-0.5 pt-0.5`,children:[u.map(e=>(0,s.jsx)(i.SidebarNavLink,{to:e.item.to,label:l(e.item.text),end:!0,testId:`sidebar-settings-${e.item.to}`,icon:e.item.icon,disabled:e.disabled,disabledReason:e.disabled&&e.disabledAgentName?l(t.I18nKey.SETTINGS$AGENT_DISABLED_TOOLTIP,{agentName:e.disabledAgentName}):void 0},e.item.to)),(0,s.jsx)(o.CloudSettingsLink,{})]}),(0,s.jsx)(`div`,{className:`px-2 pt-3`,children:(0,s.jsx)(a.BackendSyncedSettingsBadge,{})})]})}exports.SettingsDesktopSidebar=c;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../../ui/typography.cjs`),i=require(`../sidebar/sidebar-nav-link.cjs`),a=require(`./agent-canvas-update-card.cjs`),o=require(`./backend-synced-settings-badge.cjs`),s=require(`./cloud-settings-link.cjs`),c=require(`./integrations-settings-link.cjs`);let l=require(`react/jsx-runtime`);function u({navigationItems:u}){let{t:d}=e.useTranslation(`openhands`),f=u.filter(e=>e.type===`item`);return(0,l.jsxs)(`aside`,{"data-testid":`settings-navbar-desktop`,className:n.cn(`hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2`,`md:sticky md:top-8 md:self-start md:pl-8`),children:[(0,l.jsx)(r.Typography.Text,{className:`px-2 text-sm font-normal text-white`,children:d(t.I18nKey.SETTINGS$TITLE)}),(0,l.jsxs)(`div`,{className:`flex flex-col gap-0.5 pt-0.5`,children:[f.map(e=>(0,l.jsx)(i.SidebarNavLink,{to:e.item.to,label:d(e.item.text),end:!0,testId:`sidebar-settings-${e.item.to}`,icon:e.item.icon,disabled:e.disabled,disabledReason:e.disabled&&e.disabledAgentName?d(t.I18nKey.SETTINGS$AGENT_DISABLED_TOOLTIP,{agentName:e.disabledAgentName}):void 0},e.item.to)),(0,l.jsx)(c.IntegrationsSettingsLink,{}),(0,l.jsx)(s.CloudSettingsLink,{})]}),(0,l.jsx)(`div`,{className:`px-2 pt-3`,children:(0,l.jsx)(a.AgentCanvasUpdateCard,{})}),(0,l.jsx)(`div`,{className:`px-2 pt-3`,children:(0,l.jsx)(o.BackendSyncedSettingsBadge,{})})]})}exports.SettingsDesktopSidebar=u;
2
2
  //# sourceMappingURL=settings-desktop-sidebar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-desktop-sidebar.cjs","names":[],"sources":["../../../../src/components/features/settings/settings-desktop-sidebar.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { SettingsNavRenderedItem } from \"#/hooks/use-settings-nav-items\";\nimport { SidebarNavLink } from \"#/components/features/sidebar/sidebar-nav-link\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport { CloudSettingsLink } from \"#/components/features/settings/cloud-settings-link\";\n\ninterface SettingsDesktopSidebarProps {\n navigationItems: SettingsNavRenderedItem[];\n}\n\n/**\n * Desktop sidebar — sibling of the scrolling main column (same pattern as\n * {@link ExtensionsNavigation}). Mobile drawer stays `position: fixed` outside\n * this row in the layout.\n */\nexport function SettingsDesktopSidebar({\n navigationItems,\n}: SettingsDesktopSidebarProps) {\n const { t } = useTranslation(\"openhands\");\n const desktopNavItems = navigationItems.filter(\n (item): item is Extract<SettingsNavRenderedItem, { type: \"item\" }> =>\n item.type === \"item\",\n );\n\n return (\n <aside\n data-testid=\"settings-navbar-desktop\"\n className={cn(\n \"hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2\",\n \"md:sticky md:top-8 md:self-start md:pl-8\",\n )}\n >\n <Typography.Text className=\"px-2 text-sm font-normal text-white\">\n {t(I18nKey.SETTINGS$TITLE)}\n </Typography.Text>\n <div className=\"flex flex-col gap-0.5 pt-0.5\">\n {desktopNavItems.map((renderedItem) => (\n <SidebarNavLink\n key={renderedItem.item.to}\n to={renderedItem.item.to}\n label={t(renderedItem.item.text as I18nKey)}\n end\n testId={`sidebar-settings-${renderedItem.item.to}`}\n icon={renderedItem.item.icon}\n // Items marked ``disabledByAcp`` (LLM, Condenser, …) are greyed\n // out and un-clickable while an ACP agent is active — those\n // pages have nothing to configure while a separate sub-agent\n // owns the LLM/condenser/MCP layers. The mobile drawer below\n // already does this via ``SettingsNavLink``; do the same on\n // desktop. The clientLoader-side redirect in ``routes/\n // settings.tsx`` handles direct URL navigation.\n disabled={renderedItem.disabled}\n disabledReason={\n renderedItem.disabled && renderedItem.disabledAgentName\n ? t(I18nKey.SETTINGS$AGENT_DISABLED_TOOLTIP, {\n agentName: renderedItem.disabledAgentName,\n })\n : undefined\n }\n />\n ))}\n <CloudSettingsLink />\n </div>\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </aside>\n );\n}\n"],"mappings":"saAkBA,SAAgB,EAAuB,CACrC,mBAC8B,CAC9B,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,EAAkB,EAAgB,OACrC,GACC,EAAK,OAAS,OACjB,CAED,OACE,EAAA,EAAA,MAAC,QAAD,CACE,cAAY,0BACZ,UAAW,EAAA,GACT,+DACA,2CACD,UALH,EAOE,EAAA,EAAA,KAAC,EAAA,WAAW,KAAZ,CAAiB,UAAU,+CACxB,EAAE,EAAA,QAAQ,eAAe,CACV,CAAA,EAClB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,wCAAf,CACG,EAAgB,IAAK,IACpB,EAAA,EAAA,KAAC,EAAA,eAAD,CAEE,GAAI,EAAa,KAAK,GACtB,MAAO,EAAE,EAAa,KAAK,KAAgB,CAC3C,IAAA,GACA,OAAQ,oBAAoB,EAAa,KAAK,KAC9C,KAAM,EAAa,KAAK,KAQxB,SAAU,EAAa,SACvB,eACE,EAAa,UAAY,EAAa,kBAClC,EAAE,EAAA,QAAQ,gCAAiC,CACzC,UAAW,EAAa,kBACzB,CAAC,CACF,IAAA,GAEN,CArBK,EAAa,KAAK,GAqBvB,CACF,EACF,EAAA,EAAA,KAAC,EAAA,kBAAD,EAAqB,CAAA,CACjB,IACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,2BAAD,EAA8B,CAAA,CAC1B,CAAA,CACA"}
1
+ {"version":3,"file":"settings-desktop-sidebar.cjs","names":[],"sources":["../../../../src/components/features/settings/settings-desktop-sidebar.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { SettingsNavRenderedItem } from \"#/hooks/use-settings-nav-items\";\nimport { SidebarNavLink } from \"#/components/features/sidebar/sidebar-nav-link\";\nimport { AgentCanvasUpdateCard } from \"#/components/features/settings/agent-canvas-update-card\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport { CloudSettingsLink } from \"#/components/features/settings/cloud-settings-link\";\nimport { IntegrationsSettingsLink } from \"#/components/features/settings/integrations-settings-link\";\n\ninterface SettingsDesktopSidebarProps {\n navigationItems: SettingsNavRenderedItem[];\n}\n\n/**\n * Desktop sidebar — sibling of the scrolling main column (same pattern as\n * {@link ExtensionsNavigation}). Mobile drawer stays `position: fixed` outside\n * this row in the layout.\n */\nexport function SettingsDesktopSidebar({\n navigationItems,\n}: SettingsDesktopSidebarProps) {\n const { t } = useTranslation(\"openhands\");\n const desktopNavItems = navigationItems.filter(\n (item): item is Extract<SettingsNavRenderedItem, { type: \"item\" }> =>\n item.type === \"item\",\n );\n\n return (\n <aside\n data-testid=\"settings-navbar-desktop\"\n className={cn(\n \"hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2\",\n \"md:sticky md:top-8 md:self-start md:pl-8\",\n )}\n >\n <Typography.Text className=\"px-2 text-sm font-normal text-white\">\n {t(I18nKey.SETTINGS$TITLE)}\n </Typography.Text>\n <div className=\"flex flex-col gap-0.5 pt-0.5\">\n {desktopNavItems.map((renderedItem) => (\n <SidebarNavLink\n key={renderedItem.item.to}\n to={renderedItem.item.to}\n label={t(renderedItem.item.text as I18nKey)}\n end\n testId={`sidebar-settings-${renderedItem.item.to}`}\n icon={renderedItem.item.icon}\n // Items marked ``disabledByAcp`` (LLM, Condenser, …) are greyed\n // out and un-clickable while an ACP agent is active — those\n // pages have nothing to configure while a separate sub-agent\n // owns the LLM/condenser/MCP layers. The mobile drawer below\n // already does this via ``SettingsNavLink``; do the same on\n // desktop. The clientLoader-side redirect in ``routes/\n // settings.tsx`` handles direct URL navigation.\n disabled={renderedItem.disabled}\n disabledReason={\n renderedItem.disabled && renderedItem.disabledAgentName\n ? t(I18nKey.SETTINGS$AGENT_DISABLED_TOOLTIP, {\n agentName: renderedItem.disabledAgentName,\n })\n : undefined\n }\n />\n ))}\n <IntegrationsSettingsLink />\n <CloudSettingsLink />\n </div>\n <div className=\"px-2 pt-3\">\n <AgentCanvasUpdateCard />\n </div>\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </aside>\n );\n}\n"],"mappings":"ggBAoBA,SAAgB,EAAuB,CACrC,mBAC8B,CAC9B,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,EAAkB,EAAgB,OACrC,GACC,EAAK,OAAS,OACjB,CAED,OACE,EAAA,EAAA,MAAC,QAAD,CACE,cAAY,0BACZ,UAAW,EAAA,GACT,+DACA,2CACD,UALH,EAOE,EAAA,EAAA,KAAC,EAAA,WAAW,KAAZ,CAAiB,UAAU,+CACxB,EAAE,EAAA,QAAQ,eAAe,CACV,CAAA,EAClB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,wCAAf,CACG,EAAgB,IAAK,IACpB,EAAA,EAAA,KAAC,EAAA,eAAD,CAEE,GAAI,EAAa,KAAK,GACtB,MAAO,EAAE,EAAa,KAAK,KAAgB,CAC3C,IAAA,GACA,OAAQ,oBAAoB,EAAa,KAAK,KAC9C,KAAM,EAAa,KAAK,KAQxB,SAAU,EAAa,SACvB,eACE,EAAa,UAAY,EAAa,kBAClC,EAAE,EAAA,QAAQ,gCAAiC,CACzC,UAAW,EAAa,kBACzB,CAAC,CACF,IAAA,GAEN,CArBK,EAAa,KAAK,GAqBvB,CACF,EACF,EAAA,EAAA,KAAC,EAAA,yBAAD,EAA4B,CAAA,EAC5B,EAAA,EAAA,KAAC,EAAA,kBAAD,EAAqB,CAAA,CACjB,IACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,sBAAD,EAAyB,CAAA,CACrB,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,2BAAD,EAA8B,CAAA,CAC1B,CAAA,CACA"}
@@ -3,40 +3,50 @@ import { I18nKey as t } from "../../../i18n/declaration.js";
3
3
  import { cn as n } from "../../../utils/utils.js";
4
4
  import { Typography as r } from "../../../ui/typography.js";
5
5
  import { SidebarNavLink as i } from "../sidebar/sidebar-nav-link.js";
6
- import { BackendSyncedSettingsBadge as a } from "./backend-synced-settings-badge.js";
7
- import { CloudSettingsLink as o } from "./cloud-settings-link.js";
8
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
6
+ import { AgentCanvasUpdateCard as a } from "./agent-canvas-update-card.js";
7
+ import { BackendSyncedSettingsBadge as o } from "./backend-synced-settings-badge.js";
8
+ import { CloudSettingsLink as s } from "./cloud-settings-link.js";
9
+ import { IntegrationsSettingsLink as c } from "./integrations-settings-link.js";
10
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
9
11
  //#region src/components/features/settings/settings-desktop-sidebar.tsx
10
- function l({ navigationItems: l }) {
11
- let { t: u } = e("openhands"), d = l.filter((e) => e.type === "item");
12
- return /* @__PURE__ */ c("aside", {
12
+ function d({ navigationItems: d }) {
13
+ let { t: f } = e("openhands"), p = d.filter((e) => e.type === "item");
14
+ return /* @__PURE__ */ u("aside", {
13
15
  "data-testid": "settings-navbar-desktop",
14
16
  className: n("hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2", "md:sticky md:top-8 md:self-start md:pl-8"),
15
17
  children: [
16
- /* @__PURE__ */ s(r.Text, {
18
+ /* @__PURE__ */ l(r.Text, {
17
19
  className: "px-2 text-sm font-normal text-white",
18
- children: u(t.SETTINGS$TITLE)
20
+ children: f(t.SETTINGS$TITLE)
19
21
  }),
20
- /* @__PURE__ */ c("div", {
22
+ /* @__PURE__ */ u("div", {
21
23
  className: "flex flex-col gap-0.5 pt-0.5",
22
- children: [d.map((e) => /* @__PURE__ */ s(i, {
23
- to: e.item.to,
24
- label: u(e.item.text),
25
- end: !0,
26
- testId: `sidebar-settings-${e.item.to}`,
27
- icon: e.item.icon,
28
- disabled: e.disabled,
29
- disabledReason: e.disabled && e.disabledAgentName ? u(t.SETTINGS$AGENT_DISABLED_TOOLTIP, { agentName: e.disabledAgentName }) : void 0
30
- }, e.item.to)), /* @__PURE__ */ s(o, {})]
24
+ children: [
25
+ p.map((e) => /* @__PURE__ */ l(i, {
26
+ to: e.item.to,
27
+ label: f(e.item.text),
28
+ end: !0,
29
+ testId: `sidebar-settings-${e.item.to}`,
30
+ icon: e.item.icon,
31
+ disabled: e.disabled,
32
+ disabledReason: e.disabled && e.disabledAgentName ? f(t.SETTINGS$AGENT_DISABLED_TOOLTIP, { agentName: e.disabledAgentName }) : void 0
33
+ }, e.item.to)),
34
+ /* @__PURE__ */ l(c, {}),
35
+ /* @__PURE__ */ l(s, {})
36
+ ]
31
37
  }),
32
- /* @__PURE__ */ s("div", {
38
+ /* @__PURE__ */ l("div", {
33
39
  className: "px-2 pt-3",
34
- children: /* @__PURE__ */ s(a, {})
40
+ children: /* @__PURE__ */ l(a, {})
41
+ }),
42
+ /* @__PURE__ */ l("div", {
43
+ className: "px-2 pt-3",
44
+ children: /* @__PURE__ */ l(o, {})
35
45
  })
36
46
  ]
37
47
  });
38
48
  }
39
49
  //#endregion
40
- export { l as SettingsDesktopSidebar };
50
+ export { d as SettingsDesktopSidebar };
41
51
 
42
52
  //# sourceMappingURL=settings-desktop-sidebar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-desktop-sidebar.js","names":[],"sources":["../../../../src/components/features/settings/settings-desktop-sidebar.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { SettingsNavRenderedItem } from \"#/hooks/use-settings-nav-items\";\nimport { SidebarNavLink } from \"#/components/features/sidebar/sidebar-nav-link\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport { CloudSettingsLink } from \"#/components/features/settings/cloud-settings-link\";\n\ninterface SettingsDesktopSidebarProps {\n navigationItems: SettingsNavRenderedItem[];\n}\n\n/**\n * Desktop sidebar — sibling of the scrolling main column (same pattern as\n * {@link ExtensionsNavigation}). Mobile drawer stays `position: fixed` outside\n * this row in the layout.\n */\nexport function SettingsDesktopSidebar({\n navigationItems,\n}: SettingsDesktopSidebarProps) {\n const { t } = useTranslation(\"openhands\");\n const desktopNavItems = navigationItems.filter(\n (item): item is Extract<SettingsNavRenderedItem, { type: \"item\" }> =>\n item.type === \"item\",\n );\n\n return (\n <aside\n data-testid=\"settings-navbar-desktop\"\n className={cn(\n \"hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2\",\n \"md:sticky md:top-8 md:self-start md:pl-8\",\n )}\n >\n <Typography.Text className=\"px-2 text-sm font-normal text-white\">\n {t(I18nKey.SETTINGS$TITLE)}\n </Typography.Text>\n <div className=\"flex flex-col gap-0.5 pt-0.5\">\n {desktopNavItems.map((renderedItem) => (\n <SidebarNavLink\n key={renderedItem.item.to}\n to={renderedItem.item.to}\n label={t(renderedItem.item.text as I18nKey)}\n end\n testId={`sidebar-settings-${renderedItem.item.to}`}\n icon={renderedItem.item.icon}\n // Items marked ``disabledByAcp`` (LLM, Condenser, …) are greyed\n // out and un-clickable while an ACP agent is active — those\n // pages have nothing to configure while a separate sub-agent\n // owns the LLM/condenser/MCP layers. The mobile drawer below\n // already does this via ``SettingsNavLink``; do the same on\n // desktop. The clientLoader-side redirect in ``routes/\n // settings.tsx`` handles direct URL navigation.\n disabled={renderedItem.disabled}\n disabledReason={\n renderedItem.disabled && renderedItem.disabledAgentName\n ? t(I18nKey.SETTINGS$AGENT_DISABLED_TOOLTIP, {\n agentName: renderedItem.disabledAgentName,\n })\n : undefined\n }\n />\n ))}\n <CloudSettingsLink />\n </div>\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </aside>\n );\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAgB,EAAuB,EACrC,sBAC8B;CAC9B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,IAAkB,EAAgB,QACrC,MACC,EAAK,SAAS,OACjB;AAED,QACE,kBAAC,SAAD;EACE,eAAY;EACZ,WAAW,EACT,gEACA,2CACD;YALH;GAOE,kBAAC,EAAW,MAAZ;IAAiB,WAAU;cACxB,EAAE,EAAQ,eAAe;IACV,CAAA;GAClB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAgB,KAAK,MACpB,kBAAC,GAAD;KAEE,IAAI,EAAa,KAAK;KACtB,OAAO,EAAE,EAAa,KAAK,KAAgB;KAC3C,KAAA;KACA,QAAQ,oBAAoB,EAAa,KAAK;KAC9C,MAAM,EAAa,KAAK;KAQxB,UAAU,EAAa;KACvB,gBACE,EAAa,YAAY,EAAa,oBAClC,EAAE,EAAQ,iCAAiC,EACzC,WAAW,EAAa,mBACzB,CAAC,GACF,KAAA;KAEN,EArBK,EAAa,KAAK,GAqBvB,CACF,EACF,kBAAC,GAAD,EAAqB,CAAA,CACjB;;GACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAA8B,CAAA;IAC1B,CAAA;GACA"}
1
+ {"version":3,"file":"settings-desktop-sidebar.js","names":[],"sources":["../../../../src/components/features/settings/settings-desktop-sidebar.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { SettingsNavRenderedItem } from \"#/hooks/use-settings-nav-items\";\nimport { SidebarNavLink } from \"#/components/features/sidebar/sidebar-nav-link\";\nimport { AgentCanvasUpdateCard } from \"#/components/features/settings/agent-canvas-update-card\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport { CloudSettingsLink } from \"#/components/features/settings/cloud-settings-link\";\nimport { IntegrationsSettingsLink } from \"#/components/features/settings/integrations-settings-link\";\n\ninterface SettingsDesktopSidebarProps {\n navigationItems: SettingsNavRenderedItem[];\n}\n\n/**\n * Desktop sidebar — sibling of the scrolling main column (same pattern as\n * {@link ExtensionsNavigation}). Mobile drawer stays `position: fixed` outside\n * this row in the layout.\n */\nexport function SettingsDesktopSidebar({\n navigationItems,\n}: SettingsDesktopSidebarProps) {\n const { t } = useTranslation(\"openhands\");\n const desktopNavItems = navigationItems.filter(\n (item): item is Extract<SettingsNavRenderedItem, { type: \"item\" }> =>\n item.type === \"item\",\n );\n\n return (\n <aside\n data-testid=\"settings-navbar-desktop\"\n className={cn(\n \"hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2\",\n \"md:sticky md:top-8 md:self-start md:pl-8\",\n )}\n >\n <Typography.Text className=\"px-2 text-sm font-normal text-white\">\n {t(I18nKey.SETTINGS$TITLE)}\n </Typography.Text>\n <div className=\"flex flex-col gap-0.5 pt-0.5\">\n {desktopNavItems.map((renderedItem) => (\n <SidebarNavLink\n key={renderedItem.item.to}\n to={renderedItem.item.to}\n label={t(renderedItem.item.text as I18nKey)}\n end\n testId={`sidebar-settings-${renderedItem.item.to}`}\n icon={renderedItem.item.icon}\n // Items marked ``disabledByAcp`` (LLM, Condenser, …) are greyed\n // out and un-clickable while an ACP agent is active — those\n // pages have nothing to configure while a separate sub-agent\n // owns the LLM/condenser/MCP layers. The mobile drawer below\n // already does this via ``SettingsNavLink``; do the same on\n // desktop. The clientLoader-side redirect in ``routes/\n // settings.tsx`` handles direct URL navigation.\n disabled={renderedItem.disabled}\n disabledReason={\n renderedItem.disabled && renderedItem.disabledAgentName\n ? t(I18nKey.SETTINGS$AGENT_DISABLED_TOOLTIP, {\n agentName: renderedItem.disabledAgentName,\n })\n : undefined\n }\n />\n ))}\n <IntegrationsSettingsLink />\n <CloudSettingsLink />\n </div>\n <div className=\"px-2 pt-3\">\n <AgentCanvasUpdateCard />\n </div>\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </aside>\n );\n}\n"],"mappings":";;;;;;;;;;;AAoBA,SAAgB,EAAuB,EACrC,sBAC8B;CAC9B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,IAAkB,EAAgB,QACrC,MACC,EAAK,SAAS,OACjB;AAED,QACE,kBAAC,SAAD;EACE,eAAY;EACZ,WAAW,EACT,gEACA,2CACD;YALH;GAOE,kBAAC,EAAW,MAAZ;IAAiB,WAAU;cACxB,EAAE,EAAQ,eAAe;IACV,CAAA;GAClB,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,EAAgB,KAAK,MACpB,kBAAC,GAAD;MAEE,IAAI,EAAa,KAAK;MACtB,OAAO,EAAE,EAAa,KAAK,KAAgB;MAC3C,KAAA;MACA,QAAQ,oBAAoB,EAAa,KAAK;MAC9C,MAAM,EAAa,KAAK;MAQxB,UAAU,EAAa;MACvB,gBACE,EAAa,YAAY,EAAa,oBAClC,EAAE,EAAQ,iCAAiC,EACzC,WAAW,EAAa,mBACzB,CAAC,GACF,KAAA;MAEN,EArBK,EAAa,KAAK,GAqBvB,CACF;KACF,kBAAC,GAAD,EAA4B,CAAA;KAC5B,kBAAC,GAAD,EAAqB,CAAA;KACjB;;GACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAAyB,CAAA;IACrB,CAAA;GACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAA8B,CAAA;IAC1B,CAAA;GACA"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../../ui/typography.cjs`),i=require(`../../../icons/settings-gear.cjs`),a=require(`../../../icons/close.cjs`),o=require(`../sidebar/sidebar-layout.cjs`),s=require(`./backend-synced-settings-badge.cjs`),c=require(`./cloud-settings-link.cjs`),l=require(`./settings-nav-header.cjs`),u=require(`./settings-nav-divider.cjs`),d=require(`./settings-nav-link.cjs`);let f=require(`react/jsx-runtime`);function p({isMobileMenuOpen:p,onCloseMobileMenu:m,navigationItems:h}){let{t:g}=e.useTranslation(`openhands`);return(0,f.jsxs)(f.Fragment,{children:[p&&(0,f.jsx)(`div`,{className:`fixed inset-0 z-40 bg-black bg-opacity-50 md:hidden`,onClick:m}),(0,f.jsxs)(`nav`,{"data-testid":`settings-navbar`,className:n.cn(`flex flex-col gap-6 transition-transform duration-300 ease-in-out`,`fixed inset-0 z-50 w-full bg-[var(--oh-surface-deep)] p-4 transform md:hidden`,p?`translate-x-0`:`-translate-x-full`),children:[(0,f.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,f.jsxs)(`div`,{className:`ml-1 flex items-center gap-2 sm:ml-4.5`,children:[(0,f.jsx)(i.default,{width:16,height:16}),(0,f.jsx)(r.Typography.H2,{children:g(t.I18nKey.SETTINGS$TITLE)})]}),(0,f.jsx)(`button`,{type:`button`,onClick:m,className:n.cn(`cursor-pointer rounded-md p-0.5 hover:bg-tertiary md:hidden`,o.navInteractiveTransitionClassName),"aria-label":g(t.I18nKey.SIDEBAR$CLOSE_MENU),children:(0,f.jsx)(a.default,{width:32,height:32})})]}),(0,f.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[h.map((e,t)=>e.type===`header`?(0,f.jsx)(l.SettingsNavHeader,{text:e.text},`header-${e.text}`):e.type===`divider`?(0,f.jsx)(u.SettingsNavDivider,{},`divider-${t}`):(0,f.jsx)(d.SettingsNavLink,{item:e.item,onClick:m,disabled:e.disabled,disabledAgentName:e.disabledAgentName},e.item.to)),(0,f.jsx)(c.CloudSettingsLink,{})]}),(0,f.jsx)(`div`,{className:`px-2 pt-3`,children:(0,f.jsx)(s.BackendSyncedSettingsBadge,{})})]})]})}exports.SettingsMobileDrawer=p;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../../ui/typography.cjs`),i=require(`../../../icons/settings-gear.cjs`),a=require(`../../../icons/close.cjs`),o=require(`../sidebar/sidebar-layout.cjs`),s=require(`./agent-canvas-update-card.cjs`),c=require(`./backend-synced-settings-badge.cjs`),l=require(`./cloud-settings-link.cjs`),u=require(`./integrations-settings-link.cjs`),d=require(`./settings-nav-header.cjs`),f=require(`./settings-nav-divider.cjs`),p=require(`./settings-nav-link.cjs`);let m=require(`react/jsx-runtime`);function h({isMobileMenuOpen:h,onCloseMobileMenu:g,navigationItems:_}){let{t:v}=e.useTranslation(`openhands`);return(0,m.jsxs)(m.Fragment,{children:[h&&(0,m.jsx)(`div`,{className:`fixed inset-0 z-40 bg-black bg-opacity-50 md:hidden`,onClick:g}),(0,m.jsxs)(`nav`,{"data-testid":`settings-navbar`,className:n.cn(`flex flex-col gap-6 transition-transform duration-300 ease-in-out`,`fixed inset-0 z-50 w-full bg-[var(--oh-surface-deep)] p-4 transform md:hidden`,h?`translate-x-0`:`-translate-x-full`),children:[(0,m.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,m.jsxs)(`div`,{className:`ml-1 flex items-center gap-2 sm:ml-4.5`,children:[(0,m.jsx)(i.default,{width:16,height:16}),(0,m.jsx)(r.Typography.H2,{children:v(t.I18nKey.SETTINGS$TITLE)})]}),(0,m.jsx)(`button`,{type:`button`,onClick:g,className:n.cn(`cursor-pointer rounded-md p-0.5 hover:bg-tertiary md:hidden`,o.navInteractiveTransitionClassName),"aria-label":v(t.I18nKey.SIDEBAR$CLOSE_MENU),children:(0,m.jsx)(a.default,{width:32,height:32})})]}),(0,m.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[_.map((e,t)=>e.type===`header`?(0,m.jsx)(d.SettingsNavHeader,{text:e.text},`header-${e.text}`):e.type===`divider`?(0,m.jsx)(f.SettingsNavDivider,{},`divider-${t}`):(0,m.jsx)(p.SettingsNavLink,{item:e.item,onClick:g,disabled:e.disabled,disabledAgentName:e.disabledAgentName},e.item.to)),(0,m.jsx)(u.IntegrationsSettingsLink,{}),(0,m.jsx)(l.CloudSettingsLink,{})]}),(0,m.jsx)(`div`,{className:`px-2 pt-3`,children:(0,m.jsx)(s.AgentCanvasUpdateCard,{})}),(0,m.jsx)(`div`,{className:`px-2 pt-3`,children:(0,m.jsx)(c.BackendSyncedSettingsBadge,{})})]})]})}exports.SettingsMobileDrawer=h;
2
2
  //# sourceMappingURL=settings-mobile-drawer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-mobile-drawer.cjs","names":[],"sources":["../../../../src/components/features/settings/settings-mobile-drawer.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport SettingsIcon from \"#/icons/settings-gear.svg?react\";\nimport CloseIcon from \"#/icons/close.svg?react\";\nimport { SettingsNavRenderedItem } from \"#/hooks/use-settings-nav-items\";\nimport { SettingsNavHeader } from \"./settings-nav-header\";\nimport { SettingsNavDivider } from \"./settings-nav-divider\";\nimport { SettingsNavLink } from \"./settings-nav-link\";\nimport { navInteractiveTransitionClassName } from \"#/components/features/sidebar/sidebar-layout\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport { CloudSettingsLink } from \"#/components/features/settings/cloud-settings-link\";\n\ninterface SettingsMobileDrawerProps {\n isMobileMenuOpen: boolean;\n onCloseMobileMenu: () => void;\n navigationItems: SettingsNavRenderedItem[];\n}\n\n/**\n * Mobile overlay + drawer. Rendered outside the scrolling flex row so `position:\n * fixed` does not interact with flex item sizing on desktop.\n */\nexport function SettingsMobileDrawer({\n isMobileMenuOpen,\n onCloseMobileMenu,\n navigationItems,\n}: SettingsMobileDrawerProps) {\n const { t } = useTranslation(\"openhands\");\n\n return (\n <>\n {isMobileMenuOpen && (\n <div\n className=\"fixed inset-0 z-40 bg-black bg-opacity-50 md:hidden\"\n onClick={onCloseMobileMenu}\n />\n )}\n <nav\n data-testid=\"settings-navbar\"\n className={cn(\n \"flex flex-col gap-6 transition-transform duration-300 ease-in-out\",\n \"fixed inset-0 z-50 w-full bg-[var(--oh-surface-deep)] p-4 transform md:hidden\",\n isMobileMenuOpen ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"ml-1 flex items-center gap-2 sm:ml-4.5\">\n <SettingsIcon width={16} height={16} />\n <Typography.H2>{t(I18nKey.SETTINGS$TITLE)}</Typography.H2>\n </div>\n <button\n type=\"button\"\n onClick={onCloseMobileMenu}\n className={cn(\n \"cursor-pointer rounded-md p-0.5 hover:bg-tertiary md:hidden\",\n navInteractiveTransitionClassName,\n )}\n aria-label={t(I18nKey.SIDEBAR$CLOSE_MENU)}\n >\n <CloseIcon width={32} height={32} />\n </button>\n </div>\n\n <div className=\"flex flex-col gap-2\">\n {navigationItems.map((renderedItem, index) => {\n if (renderedItem.type === \"header\") {\n return (\n <SettingsNavHeader\n key={`header-${renderedItem.text}`}\n text={renderedItem.text}\n />\n );\n }\n\n if (renderedItem.type === \"divider\") {\n return <SettingsNavDivider key={`divider-${index}`} />;\n }\n\n return (\n <SettingsNavLink\n key={renderedItem.item.to}\n item={renderedItem.item}\n onClick={onCloseMobileMenu}\n disabled={renderedItem.disabled}\n disabledAgentName={renderedItem.disabledAgentName}\n />\n );\n })}\n <CloudSettingsLink />\n </div>\n\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </nav>\n </>\n );\n}\n"],"mappings":"4mBAwBA,SAAgB,EAAqB,CACnC,mBACA,oBACA,mBAC4B,CAC5B,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CAEzC,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,CACG,IACC,EAAA,EAAA,KAAC,MAAD,CACE,UAAU,sDACV,QAAS,EACT,CAAA,EAEJ,EAAA,EAAA,MAAC,MAAD,CACE,cAAY,kBACZ,UAAW,EAAA,GACT,oEACA,gFACA,EAAmB,gBAAkB,oBACtC,UANH,EAQE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kDAAf,EACE,EAAA,EAAA,KAAC,EAAA,QAAD,CAAc,MAAO,GAAI,OAAQ,GAAM,CAAA,EACvC,EAAA,EAAA,KAAC,EAAA,WAAW,GAAZ,CAAA,SAAgB,EAAE,EAAA,QAAQ,eAAe,CAAiB,CAAA,CACtD,IACN,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,QAAS,EACT,UAAW,EAAA,GACT,8DACA,EAAA,kCACD,CACD,aAAY,EAAE,EAAA,QAAQ,mBAAmB,WAEzC,EAAA,EAAA,KAAC,EAAA,QAAD,CAAW,MAAO,GAAI,OAAQ,GAAM,CAAA,CAC7B,CAAA,CACL,IAEN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+BAAf,CACG,EAAgB,KAAK,EAAc,IAC9B,EAAa,OAAS,UAEtB,EAAA,EAAA,KAAC,EAAA,kBAAD,CAEE,KAAM,EAAa,KACnB,CAFK,UAAU,EAAa,OAE5B,CAIF,EAAa,OAAS,WACjB,EAAA,EAAA,KAAC,EAAA,mBAAD,EAA+C,CAAtB,WAAW,IAAW,EAItD,EAAA,EAAA,KAAC,EAAA,gBAAD,CAEE,KAAM,EAAa,KACnB,QAAS,EACT,SAAU,EAAa,SACvB,kBAAmB,EAAa,kBAChC,CALK,EAAa,KAAK,GAKvB,CAEJ,EACF,EAAA,EAAA,KAAC,EAAA,kBAAD,EAAqB,CAAA,CACjB,IAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,2BAAD,EAA8B,CAAA,CAC1B,CAAA,CACF,GACL,CAAA,CAAA"}
1
+ {"version":3,"file":"settings-mobile-drawer.cjs","names":[],"sources":["../../../../src/components/features/settings/settings-mobile-drawer.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { cn } from \"#/utils/utils\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport SettingsIcon from \"#/icons/settings-gear.svg?react\";\nimport CloseIcon from \"#/icons/close.svg?react\";\nimport { SettingsNavRenderedItem } from \"#/hooks/use-settings-nav-items\";\nimport { SettingsNavHeader } from \"./settings-nav-header\";\nimport { SettingsNavDivider } from \"./settings-nav-divider\";\nimport { SettingsNavLink } from \"./settings-nav-link\";\nimport { navInteractiveTransitionClassName } from \"#/components/features/sidebar/sidebar-layout\";\nimport { AgentCanvasUpdateCard } from \"#/components/features/settings/agent-canvas-update-card\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport { CloudSettingsLink } from \"#/components/features/settings/cloud-settings-link\";\nimport { IntegrationsSettingsLink } from \"#/components/features/settings/integrations-settings-link\";\n\ninterface SettingsMobileDrawerProps {\n isMobileMenuOpen: boolean;\n onCloseMobileMenu: () => void;\n navigationItems: SettingsNavRenderedItem[];\n}\n\n/**\n * Mobile overlay + drawer. Rendered outside the scrolling flex row so `position:\n * fixed` does not interact with flex item sizing on desktop.\n */\nexport function SettingsMobileDrawer({\n isMobileMenuOpen,\n onCloseMobileMenu,\n navigationItems,\n}: SettingsMobileDrawerProps) {\n const { t } = useTranslation(\"openhands\");\n\n return (\n <>\n {isMobileMenuOpen && (\n <div\n className=\"fixed inset-0 z-40 bg-black bg-opacity-50 md:hidden\"\n onClick={onCloseMobileMenu}\n />\n )}\n <nav\n data-testid=\"settings-navbar\"\n className={cn(\n \"flex flex-col gap-6 transition-transform duration-300 ease-in-out\",\n \"fixed inset-0 z-50 w-full bg-[var(--oh-surface-deep)] p-4 transform md:hidden\",\n isMobileMenuOpen ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"ml-1 flex items-center gap-2 sm:ml-4.5\">\n <SettingsIcon width={16} height={16} />\n <Typography.H2>{t(I18nKey.SETTINGS$TITLE)}</Typography.H2>\n </div>\n <button\n type=\"button\"\n onClick={onCloseMobileMenu}\n className={cn(\n \"cursor-pointer rounded-md p-0.5 hover:bg-tertiary md:hidden\",\n navInteractiveTransitionClassName,\n )}\n aria-label={t(I18nKey.SIDEBAR$CLOSE_MENU)}\n >\n <CloseIcon width={32} height={32} />\n </button>\n </div>\n\n <div className=\"flex flex-col gap-2\">\n {navigationItems.map((renderedItem, index) => {\n if (renderedItem.type === \"header\") {\n return (\n <SettingsNavHeader\n key={`header-${renderedItem.text}`}\n text={renderedItem.text}\n />\n );\n }\n\n if (renderedItem.type === \"divider\") {\n return <SettingsNavDivider key={`divider-${index}`} />;\n }\n\n return (\n <SettingsNavLink\n key={renderedItem.item.to}\n item={renderedItem.item}\n onClick={onCloseMobileMenu}\n disabled={renderedItem.disabled}\n disabledAgentName={renderedItem.disabledAgentName}\n />\n );\n })}\n <IntegrationsSettingsLink />\n <CloudSettingsLink />\n </div>\n\n <div className=\"px-2 pt-3\">\n <AgentCanvasUpdateCard />\n </div>\n\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </nav>\n </>\n );\n}\n"],"mappings":"ssBA0BA,SAAgB,EAAqB,CACnC,mBACA,oBACA,mBAC4B,CAC5B,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CAEzC,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,CACG,IACC,EAAA,EAAA,KAAC,MAAD,CACE,UAAU,sDACV,QAAS,EACT,CAAA,EAEJ,EAAA,EAAA,MAAC,MAAD,CACE,cAAY,kBACZ,UAAW,EAAA,GACT,oEACA,gFACA,EAAmB,gBAAkB,oBACtC,UANH,EAQE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kDAAf,EACE,EAAA,EAAA,KAAC,EAAA,QAAD,CAAc,MAAO,GAAI,OAAQ,GAAM,CAAA,EACvC,EAAA,EAAA,KAAC,EAAA,WAAW,GAAZ,CAAA,SAAgB,EAAE,EAAA,QAAQ,eAAe,CAAiB,CAAA,CACtD,IACN,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,QAAS,EACT,UAAW,EAAA,GACT,8DACA,EAAA,kCACD,CACD,aAAY,EAAE,EAAA,QAAQ,mBAAmB,WAEzC,EAAA,EAAA,KAAC,EAAA,QAAD,CAAW,MAAO,GAAI,OAAQ,GAAM,CAAA,CAC7B,CAAA,CACL,IAEN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+BAAf,CACG,EAAgB,KAAK,EAAc,IAC9B,EAAa,OAAS,UAEtB,EAAA,EAAA,KAAC,EAAA,kBAAD,CAEE,KAAM,EAAa,KACnB,CAFK,UAAU,EAAa,OAE5B,CAIF,EAAa,OAAS,WACjB,EAAA,EAAA,KAAC,EAAA,mBAAD,EAA+C,CAAtB,WAAW,IAAW,EAItD,EAAA,EAAA,KAAC,EAAA,gBAAD,CAEE,KAAM,EAAa,KACnB,QAAS,EACT,SAAU,EAAa,SACvB,kBAAmB,EAAa,kBAChC,CALK,EAAa,KAAK,GAKvB,CAEJ,EACF,EAAA,EAAA,KAAC,EAAA,yBAAD,EAA4B,CAAA,EAC5B,EAAA,EAAA,KAAC,EAAA,kBAAD,EAAqB,CAAA,CACjB,IAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,sBAAD,EAAyB,CAAA,CACrB,CAAA,EAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,2BAAD,EAA8B,CAAA,CAC1B,CAAA,CACF,GACL,CAAA,CAAA"}