@openhands/agent-canvas 1.10.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-DLe_gVDY.js → acp-providers-BkL3HWa3.js} +1 -1
  4. package/build/assets/{active-backend-context-B0wI7OzM.js → active-backend-context-BBvP-bI2.js} +1 -1
  5. package/build/assets/{agent-context-settings-CaQtdNA-.js → agent-context-settings-Bno1nwPL.js} +1 -1
  6. package/build/assets/{agent-profiles-settings-CvuErjp6.js → agent-profiles-settings-DqoS7RL3.js} +1 -1
  7. package/build/assets/agent-server-conversation-service.api-0RztSdJJ.js +86 -0
  8. package/build/assets/agent-settings-BJHryp65.js +1 -0
  9. package/build/assets/{agent-settings-UE-U4Xii.js → agent-settings-h8hQz-IU.js} +1 -1
  10. package/build/assets/{alert-banner-BMaOtTCG.js → alert-banner-lrK-2_0Y.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-Cy66vT4D.js → api-key-entry-screen-Qsb83VX1.js} +1 -1
  12. package/build/assets/{app-settings-9ok42bV6.js → app-settings-r1RUbgGi.js} +1 -1
  13. package/build/assets/{automation-detail-fuITm6i3.js → automation-detail-7LkL91j9.js} +3 -3
  14. package/build/assets/{automation-export-CRq40mux.js → automation-export-U2QNyNy6.js} +1 -1
  15. package/build/assets/{automation-setup-route-EXDazOHW.js → automation-setup-route-Bel9_Lue.js} +1 -1
  16. package/build/assets/{automation-templates-BArZsaxP.js → automation-templates-CRLDssaI.js} +1 -1
  17. package/build/assets/{automations-list-CG4HKOTn.js → automations-list-B2iV3ZKW.js} +1 -1
  18. package/build/assets/{back-nav-button-BZB6H7xz.js → back-nav-button-B3pYwmUJ.js} +1 -1
  19. package/build/assets/backend-form-modal-OroTqnAv.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-B_NXJ3u1.js → backend-synced-settings-badge-DB4717Iu.js} +1 -1
  21. package/build/assets/{badge-C64c-7PO.js → badge-yR53enbU.js} +1 -1
  22. package/build/assets/{base-modal-C0RQPug5.js → base-modal-3NmIOKDm.js} +1 -1
  23. package/build/assets/{brand-button-DJmFCyMK.js → brand-button-CJcwjnfb.js} +1 -1
  24. package/build/assets/{browser-D3gd2n83.js → browser--eoQOo4M.js} +1 -1
  25. package/build/assets/{browser-tab-BicAWuJ1.js → browser-tab-A94o33Vn.js} +1 -1
  26. package/build/assets/{chat-send-button-CCrH1E8u.js → chat-send-button-B8n6-DQA.js} +1 -1
  27. package/build/assets/{circle-plus-check-toggle-CB_sNERY.js → circle-plus-check-toggle-BVzv5EkZ.js} +1 -1
  28. package/build/assets/{cloud-funnel-analytics-XynamQGU.js → cloud-funnel-analytics-CBQdPZl_.js} +1 -1
  29. package/build/assets/{combobox-caret-Bwiifgjs.js → combobox-caret-BlmRwiM8.js} +1 -1
  30. package/build/assets/command-menu-PsRXVBz2.js +1 -0
  31. package/build/assets/{condenser-settings-cNGy75gq.js → condenser-settings-w7L3EFvm.js} +1 -1
  32. package/build/assets/{confirmation-modal-BATFmFyP.js → confirmation-modal-DAH0XtOp.js} +1 -1
  33. package/build/assets/{context-menu-list-item-DhJCcBA0.js → context-menu-list-item-BQhmFVEK.js} +1 -1
  34. package/build/assets/{conversation-Csdxh9Xt.js → conversation-BUzBZAc-.js} +4 -4
  35. package/build/assets/conversation-panel-pzAKsSDb.js +1 -0
  36. package/build/assets/conversation-pzAKsSDb.js +1 -0
  37. package/build/assets/{conversation-state-store-C2QzhPaK.js → conversation-state-store-Bs8gA263.js} +1 -1
  38. package/build/assets/{conversation-tab-empty-state-D3fb5xIA.js → conversation-tab-empty-state-C9sfDOlt.js} +1 -1
  39. package/build/assets/{copy-to-clipboard-button-c4MQwKGj.js → copy-to-clipboard-button-DatoElj8.js} +1 -1
  40. package/build/assets/{device-verify-oFpQoLgm.js → device-verify-BIjXeW9N.js} +1 -1
  41. package/build/assets/{dropdown-classes-f91ARMV1.js → dropdown-classes-zFW7qPSK.js} +1 -1
  42. package/build/assets/{entry.client-BCzY2Bf3.js → entry.client-DzbDyLkV.js} +2 -2
  43. package/build/assets/{enum-filter-dropdown-HG3q3rkV.js → enum-filter-dropdown-CctILg5t.js} +1 -1
  44. package/build/assets/{environment-switch-overlay-CquZXolz.js → environment-switch-overlay-Cvmo6clk.js} +1 -1
  45. package/build/assets/{extensions-hub-BeweE0PW.js → extensions-hub-DOmHPGTA.js} +1 -1
  46. package/build/assets/{extensions-navigation-Dd58NlUF.js → extensions-navigation-6zU5M1pa.js} +1 -1
  47. package/build/assets/{files-tab-CLLG55-q.js → files-tab-BzofBmF4.js} +1 -1
  48. package/build/assets/{form-control-classes-pHtZUI6K.js → form-control-classes-DLN3Qgub.js} +1 -1
  49. package/build/assets/{format-relative-time-6-3uvOXe.js → format-relative-time-DGPQlPx0.js} +1 -1
  50. package/build/assets/{git-provider-icon-wg7ShB98.js → git-provider-icon-BLMlwy02.js} +1 -1
  51. package/build/assets/{git-repo-dropdown-CWnaUyxL.js → git-repo-dropdown-B7RvO70z.js} +1 -1
  52. package/build/assets/git-repo-dropdown-B_PTq4ol.js +1 -0
  53. package/build/assets/{highlighted-source-view-DBtI3por.js → highlighted-source-view-CgJfD5VT.js} +1 -1
  54. package/build/assets/{home-BpZQkDWM.js → home-DEZaZqYv.js} +1 -1
  55. package/build/assets/home-r89Vj2td.js +1 -0
  56. package/build/assets/{home-store-DM4qw1lF.js → home-store-D7CjMN_-.js} +1 -1
  57. package/build/assets/index-home-r89Vj2td.js +1 -0
  58. package/build/assets/install-server-modal-BTwK5lbi.js +1 -0
  59. package/build/assets/{kebab-menu-item-content-By16Tm_0.js → kebab-menu-item-content-C4CkeiJO.js} +1 -1
  60. package/build/assets/{launch-C9uijypN.js → launch-DVlx4v9o.js} +1 -1
  61. package/build/assets/{llm-not-configured-banner-DrBrhfN0.js → llm-not-configured-banner-CwKu8C6g.js} +2 -2
  62. package/build/assets/llm-settings-BJotLQND.js +1 -0
  63. package/build/assets/llm-settings-CDM-5H2A.js +1 -0
  64. package/build/assets/{llm-subscription-service-DwjJ8-_X.js → llm-subscription-service-7eVfDIE1.js} +1 -1
  65. package/build/assets/{loading-spinner-6Yj-YyoS.js → loading-spinner-CN3riY7k.js} +1 -1
  66. package/build/assets/{manage-backends-modal-DrwErS0N.js → manage-backends-modal-HNWKLYhq.js} +1 -1
  67. package/build/assets/manifest-2a36a8f8.js +1 -0
  68. package/build/assets/{manifest-subpage-layout-CtqVwIvJ.js → manifest-subpage-layout-D-m-h8_t.js} +1 -1
  69. package/build/assets/map-provider-7Bp2aih5.js +1 -0
  70. package/build/assets/markdown-renderer-BiiiIznl.js +8 -0
  71. package/build/assets/mcp-gLgPP7AS.js +9 -0
  72. package/build/assets/{mcp-marketplace-utils-BMnYz0Gc.js → mcp-marketplace-utils-Dr_HG_ol.js} +1 -1
  73. package/build/assets/messages-D1cbVhRK.js +40 -0
  74. package/build/assets/{modal-body-BHGCSAtj.js → modal-body-duRaxj_K.js} +1 -1
  75. package/build/assets/{modal-classes-DSTLuxkA.js → modal-classes-CLEXO6dj.js} +1 -1
  76. package/build/assets/{modal-close-button-dheWZ2ys.js → modal-close-button-D0aT02hs.js} +1 -1
  77. package/build/assets/npm-DRzJF5Zn.js +1 -0
  78. package/build/assets/{onboarding-5CZvRBbh.js → onboarding-DSr8hOpk.js} +1 -1
  79. package/build/assets/{onboarding-modal-CD2ehuxt.js → onboarding-modal-C6Euf7N4.js} +1 -1
  80. package/build/assets/{organization-service.api-Dsuoep0g.js → organization-service.api-C4GYWwj9.js} +1 -1
  81. package/build/assets/{planner-tab-DeO7Thb0.js → planner-tab-CZcguxTK.js} +1 -1
  82. package/build/assets/{plugins-management-service-C9f75R6X.js → plugins-management-service-BmDzOQsd.js} +1 -1
  83. package/build/assets/{profiles-service.api-Dl20_2IM.js → profiles-service.api-CoLTwjc1.js} +1 -1
  84. package/build/assets/{providers-CeuhK46N.js → providers-tBzTpz1w.js} +1 -1
  85. package/build/assets/{proxy-CIGI9zQC.js → proxy-DCI9S-LA.js} +1 -1
  86. package/build/assets/recommended-automations-launcher-BbJAJVED.js +1 -0
  87. package/build/assets/root-BfM_kC_d.css +1 -0
  88. package/build/assets/root-gstBEjty.js +2 -0
  89. package/build/assets/root-layout-BIAFLP9p.js +2 -0
  90. package/build/assets/{schema-field-z2vSLuLo.js → schema-field-zhsVDllR.js} +1 -1
  91. package/build/assets/{sdk-section-page-BnCXAytf.js → sdk-section-page-CS4GWn0y.js} +1 -1
  92. package/build/assets/{secrets-service-DGUNlwQd.js → secrets-service-DjgGduXk.js} +1 -1
  93. package/build/assets/{secrets-settings-DUmML_dK.js → secrets-settings-f-qahfbi.js} +1 -1
  94. package/build/assets/{segmented-toggle-eSofF7gn.js → segmented-toggle-SmvsR3jW.js} +1 -1
  95. package/build/assets/settings-DQd0xLEw.js +1 -0
  96. package/build/assets/{settings-dropdown-input-Cx4g7Xfl.js → settings-dropdown-input-TWIeiG02.js} +1 -1
  97. package/build/assets/{settings-index-BECdgecg.js → settings-index-BVwy9JEp.js} +1 -1
  98. package/build/assets/{settings-input-BQY115xH.js → settings-input-D61Vzp9e.js} +1 -1
  99. package/build/assets/{settings-list-classes-C9cLrrcc.js → settings-list-classes-sE0ASr1s.js} +1 -1
  100. package/build/assets/{settings-modal-ChBJNTdd.js → settings-modal-D6D5ngET.js} +1 -1
  101. package/build/assets/{settings-service.api-Dz9cZyvx.js → settings-service.api-DZp7E7A9.js} +1 -1
  102. package/build/assets/{settings-switch-BIodMVz9.js → settings-switch-Drt-rF5s.js} +1 -1
  103. package/build/assets/{settings-utils-BL_Z9uIe.js → settings-utils-gw2ppAvw.js} +1 -1
  104. package/build/assets/{shared-conversation-CSF0aTuE.js → shared-conversation-DIxZjElr.js} +1 -1
  105. package/build/assets/{wrench-DRitTfwe.js → shield-check-D2cpEpv3.js} +1 -1
  106. package/build/assets/{sidebar-layout-DEycoFd_.js → sidebar-layout-Dxg6zc2K.js} +1 -1
  107. package/build/assets/{sidebar-mobile-menu-toggle-DeRvTupV.js → sidebar-mobile-menu-toggle-OoZBHxaT.js} +1 -1
  108. package/build/assets/{sidebar-nav-link-BjpQ-NVc.js → sidebar-nav-link-CxLoG-dG.js} +1 -1
  109. package/build/assets/sidebar-store-BJeYY-E9.js +1 -0
  110. package/build/assets/{skill-card-pill-row-BH6fPGba.js → skill-card-pill-row-B_BYBONu.js} +1 -1
  111. package/build/assets/{skill-icon-badge-D4uznfjU.js → skill-icon-badge-CN41Hy9l.js} +1 -1
  112. package/build/assets/{skill-scope-DH_AUUUP.js → skill-scope-B1Per5XI.js} +1 -1
  113. package/build/assets/{skills-plugins-vfvOk34h.js → skills-plugins-B3AO6sMz.js} +1 -1
  114. package/build/assets/skills-settings-DmmgJ6CT.js +2 -0
  115. package/build/assets/{styled-tooltip-CQ9JEFiO.js → styled-tooltip-C5C07RQC.js} +1 -1
  116. package/build/assets/{task-list-tab-DeF_uXdw.js → task-list-tab-C19Q_JNf.js} +1 -1
  117. package/build/assets/{terminal-DRc4rup7.js → terminal-CbuMRYal.js} +1 -1
  118. package/build/assets/{toggle-switch--8n8NeV_.js → toggle-switch-CIioisto.js} +1 -1
  119. package/build/assets/{typography-BSbUhJPn.js → typography-D9tiHct7.js} +1 -1
  120. package/build/assets/{use-acp-credential-form-BGKFi1VL.js → use-acp-credential-form-DJmmJKMo.js} +1 -1
  121. package/build/assets/{use-activate-agent-profile-2nvALjC-.js → use-activate-agent-profile-CeFfYwu_.js} +1 -1
  122. package/build/assets/{use-agent-profiles-BlQA67MW.js → use-agent-profiles-BHLkLbRR.js} +1 -1
  123. package/build/assets/{use-can-manage-org-profiles-Clw5Dh1s.js → use-can-manage-org-profiles-Bu4y8gSx.js} +1 -1
  124. package/build/assets/{use-cloud-current-user-id-B8AQSQFM.js → use-cloud-current-user-id-QD9x3ySO.js} +1 -1
  125. package/build/assets/{use-config-C3zGuUQI.js → use-config-CPwqciXN.js} +1 -1
  126. package/build/assets/{use-create-conversation-FaP0kUpg.js → use-create-conversation-DWaSVUOB.js} +1 -1
  127. package/build/assets/{use-create-secret-CgQ3pXd6.js → use-create-secret-BsOfOLvg.js} +1 -1
  128. package/build/assets/{use-llm-profiles-C-tDO6UB.js → use-llm-profiles-CU8ah1pz.js} +1 -1
  129. package/build/assets/{use-manifest-capabilities-DLP5wCxp.js → use-manifest-capabilities-DBYPjyV6.js} +1 -1
  130. package/build/assets/{use-onboarding-completion-BiCdXvlU.js → use-onboarding-completion-CtNJxkXG.js} +1 -1
  131. package/build/assets/{use-plugins-marketplace-DRFNLBlr.js → use-plugins-marketplace-ZEA-gyM9.js} +1 -1
  132. package/build/assets/{use-save-agent-profile-CaGVAudI.js → use-save-agent-profile-DgI_Uz9a.js} +1 -1
  133. package/build/assets/{use-save-settings-C9B8Y-h3.js → use-save-settings-pSjRhD_m.js} +1 -1
  134. package/build/assets/{use-settings-3RcgdUuZ.js → use-settings-BHWsOcIG.js} +1 -1
  135. package/build/assets/use-settings-nav-items-CQgkxUbV.js +16 -0
  136. package/build/assets/{use-tracking-CTtkLAmx.js → use-tracking-CGCsBWhg.js} +1 -1
  137. package/build/assets/{use-user-conversation-Bei82QsZ.js → use-user-conversation-DRfEU8x0.js} +1 -1
  138. package/build/assets/utils-DPQfkd-7.js +1 -0
  139. package/build/assets/{verification-settings-nD61Ijph.js → verification-settings-BItwt998.js} +1 -1
  140. package/build/assets/wrench-B1_H-tL1.js +1 -0
  141. package/build/index.html +4 -4
  142. package/build/locales/ar/openhands.json +39 -2
  143. package/build/locales/ca/openhands.json +39 -2
  144. package/build/locales/de/openhands.json +39 -2
  145. package/build/locales/en/openhands.json +39 -2
  146. package/build/locales/es/openhands.json +39 -2
  147. package/build/locales/fr/openhands.json +39 -2
  148. package/build/locales/it/openhands.json +39 -2
  149. package/build/locales/ja/openhands.json +39 -2
  150. package/build/locales/ko-KR/openhands.json +39 -2
  151. package/build/locales/no/openhands.json +39 -2
  152. package/build/locales/pt/openhands.json +39 -2
  153. package/build/locales/tr/openhands.json +39 -2
  154. package/build/locales/uk/openhands.json +39 -2
  155. package/build/locales/zh-CN/openhands.json +39 -2
  156. package/build/locales/zh-TW/openhands.json +39 -2
  157. package/config/defaults.json +1 -1
  158. package/dist/api/agent-server-adapter.cjs +3 -3
  159. package/dist/api/agent-server-adapter.cjs.map +1 -1
  160. package/dist/api/agent-server-adapter.d.ts +32 -5
  161. package/dist/api/agent-server-adapter.js +120 -91
  162. package/dist/api/agent-server-adapter.js.map +1 -1
  163. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  164. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  165. package/dist/api/cloud/conversation-service.api.d.ts +19 -2
  166. package/dist/api/cloud/conversation-service.api.js +51 -47
  167. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  168. package/dist/api/conversation-file-upload.api.cjs +1 -1
  169. package/dist/api/conversation-file-upload.api.js +10 -10
  170. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  171. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  172. package/dist/api/conversation-service/agent-server-conversation-service.api.js +55 -61
  173. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  174. package/dist/api/event-service/event-service.api.cjs +1 -1
  175. package/dist/api/event-service/event-service.api.js +12 -12
  176. package/dist/api/launch-child-conversation-client-tool.cjs +47 -0
  177. package/dist/api/launch-child-conversation-client-tool.cjs.map +1 -0
  178. package/dist/api/launch-child-conversation-client-tool.d.ts +3 -0
  179. package/dist/api/launch-child-conversation-client-tool.js +93 -0
  180. package/dist/api/launch-child-conversation-client-tool.js.map +1 -0
  181. package/dist/api/open-hands.types.d.ts +1 -1
  182. package/dist/api/workspace-upload-path.cjs +1 -1
  183. package/dist/api/workspace-upload-path.js +8 -8
  184. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +1 -1
  185. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -1
  186. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +24 -18
  187. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -1
  188. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  189. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  190. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +5 -0
  191. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  192. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -2
  193. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  194. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +11 -7
  195. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  196. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -2
  197. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  198. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +2 -8
  199. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +48 -51
  200. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  201. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs +2 -0
  202. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs.map +1 -0
  203. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.d.ts +12 -0
  204. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js +6 -0
  205. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js.map +1 -0
  206. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  207. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  208. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.d.ts +16 -1
  209. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +95 -78
  210. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  211. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs +1 -1
  212. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs.map +1 -1
  213. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js +40 -38
  214. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js.map +1 -1
  215. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +2 -0
  216. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -0
  217. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +14 -0
  218. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +167 -0
  219. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -0
  220. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +2 -0
  221. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -0
  222. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +63 -0
  223. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +66 -0
  224. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -0
  225. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs +2 -0
  226. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs.map +1 -0
  227. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.d.ts +15 -0
  228. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js +117 -0
  229. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js.map +1 -0
  230. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs +1 -1
  231. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs.map +1 -1
  232. package/dist/components/features/conversation-panel/conversation-card/no-repository.js +30 -19
  233. package/dist/components/features/conversation-panel/conversation-card/no-repository.js.map +1 -1
  234. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  235. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  236. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +7 -2
  237. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +146 -104
  238. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  239. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  240. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  241. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +20 -0
  242. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +53 -27
  243. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  244. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  245. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  246. package/dist/components/features/conversation-panel/conversation-panel.js +226 -213
  247. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  248. package/dist/components/features/settings/agent-canvas-update-card.cjs +1 -1
  249. package/dist/components/features/settings/agent-canvas-update-card.cjs.map +1 -1
  250. package/dist/components/features/settings/agent-canvas-update-card.d.ts +10 -5
  251. package/dist/components/features/settings/agent-canvas-update-card.js +223 -149
  252. package/dist/components/features/settings/agent-canvas-update-card.js.map +1 -1
  253. package/dist/components/features/settings/agent-canvas-version-modal.cjs +2 -0
  254. package/dist/components/features/settings/agent-canvas-version-modal.cjs.map +1 -0
  255. package/dist/components/features/settings/agent-canvas-version-modal.d.ts +11 -0
  256. package/dist/components/features/settings/agent-canvas-version-modal.js +166 -0
  257. package/dist/components/features/settings/agent-canvas-version-modal.js.map +1 -0
  258. package/dist/components/features/settings/agent-canvas-version-tile.cjs +2 -0
  259. package/dist/components/features/settings/agent-canvas-version-tile.cjs.map +1 -0
  260. package/dist/components/features/settings/agent-canvas-version-tile.d.ts +13 -0
  261. package/dist/components/features/settings/agent-canvas-version-tile.js +60 -0
  262. package/dist/components/features/settings/agent-canvas-version-tile.js.map +1 -0
  263. package/dist/components/features/settings/settings-desktop-sidebar.cjs +1 -1
  264. package/dist/components/features/settings/settings-desktop-sidebar.cjs.map +1 -1
  265. package/dist/components/features/settings/settings-desktop-sidebar.js +1 -1
  266. package/dist/components/features/settings/settings-desktop-sidebar.js.map +1 -1
  267. package/dist/components/features/settings/settings-mobile-drawer.cjs +1 -1
  268. package/dist/components/features/settings/settings-mobile-drawer.cjs.map +1 -1
  269. package/dist/components/features/settings/settings-mobile-drawer.js +1 -1
  270. package/dist/components/features/settings/settings-mobile-drawer.js.map +1 -1
  271. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  272. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  273. package/dist/components/features/sidebar/sidebar-rail-body.js +109 -108
  274. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  275. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  276. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  277. package/dist/components/features/skills/extensions-navigation.js +9 -9
  278. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  279. package/dist/config/defaults.cjs +1 -1
  280. package/dist/config/defaults.cjs.map +1 -1
  281. package/dist/config/defaults.js +1 -1
  282. package/dist/config/defaults.js.map +1 -1
  283. package/dist/constants/child-conversation.cjs +2 -0
  284. package/dist/constants/child-conversation.cjs.map +1 -0
  285. package/dist/constants/child-conversation.d.ts +29 -0
  286. package/dist/constants/child-conversation.js +6 -0
  287. package/dist/constants/child-conversation.js.map +1 -0
  288. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  289. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  290. package/dist/contexts/conversation-websocket-context.js +189 -188
  291. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  292. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  293. package/dist/hooks/chat/use-model-interceptor.js +6 -6
  294. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  295. package/dist/hooks/mutation/use-create-conversation.js +6 -6
  296. package/dist/i18n/declaration.cjs +1 -1
  297. package/dist/i18n/declaration.cjs.map +1 -1
  298. package/dist/i18n/declaration.d.ts +38 -1
  299. package/dist/i18n/declaration.js +1 -1
  300. package/dist/i18n/declaration.js.map +1 -1
  301. package/dist/i18n/translation.cjs +2 -2
  302. package/dist/i18n/translation.cjs.map +1 -1
  303. package/dist/i18n/translation.js +644 -15
  304. package/dist/i18n/translation.js.map +1 -1
  305. package/dist/icons/docker.cjs +2 -0
  306. package/dist/icons/docker.cjs.map +1 -0
  307. package/dist/icons/docker.js +19 -0
  308. package/dist/icons/docker.js.map +1 -0
  309. package/dist/icons/npm.cjs +2 -0
  310. package/dist/icons/npm.cjs.map +1 -0
  311. package/dist/icons/npm.js +19 -0
  312. package/dist/icons/npm.js.map +1 -0
  313. package/dist/locales/ar/openhands.json +39 -2
  314. package/dist/locales/ca/openhands.json +39 -2
  315. package/dist/locales/de/openhands.json +39 -2
  316. package/dist/locales/en/openhands.json +39 -2
  317. package/dist/locales/es/openhands.json +39 -2
  318. package/dist/locales/fr/openhands.json +39 -2
  319. package/dist/locales/it/openhands.json +39 -2
  320. package/dist/locales/ja/openhands.json +39 -2
  321. package/dist/locales/ko-KR/openhands.json +39 -2
  322. package/dist/locales/no/openhands.json +39 -2
  323. package/dist/locales/pt/openhands.json +39 -2
  324. package/dist/locales/tr/openhands.json +39 -2
  325. package/dist/locales/uk/openhands.json +39 -2
  326. package/dist/locales/zh-CN/openhands.json +39 -2
  327. package/dist/locales/zh-TW/openhands.json +39 -2
  328. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  329. package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -1
  330. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs +2 -0
  331. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs.map +1 -0
  332. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +16 -0
  333. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +1 -0
  334. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs +2 -0
  335. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs.map +1 -0
  336. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js +27 -0
  337. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js.map +1 -0
  338. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs +2 -0
  339. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs.map +1 -0
  340. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js +21 -0
  341. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js.map +1 -0
  342. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs +2 -0
  343. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs.map +1 -0
  344. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js +23 -0
  345. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js.map +1 -0
  346. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs +2 -0
  347. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs.map +1 -0
  348. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js +43 -0
  349. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js.map +1 -0
  350. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs +2 -0
  351. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs.map +1 -0
  352. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js +25 -0
  353. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js.map +1 -0
  354. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs +2 -0
  355. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs.map +1 -0
  356. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +9 -0
  357. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
  358. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs +2 -0
  359. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs.map +1 -0
  360. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js +27 -0
  361. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js.map +1 -0
  362. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs +2 -0
  363. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs.map +1 -0
  364. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js +25 -0
  365. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js.map +1 -0
  366. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs +2 -0
  367. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs.map +1 -0
  368. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js +30 -0
  369. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js.map +1 -0
  370. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs +2 -0
  371. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs.map +1 -0
  372. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js +35 -0
  373. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js.map +1 -0
  374. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs +2 -0
  375. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs.map +1 -0
  376. package/dist/node_modules/lucide-react/dist/esm/icons/house.js +12 -0
  377. package/dist/node_modules/lucide-react/dist/esm/icons/house.js.map +1 -0
  378. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs +2 -0
  379. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs.map +1 -0
  380. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js +33 -0
  381. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js.map +1 -0
  382. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs +2 -0
  383. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs.map +1 -0
  384. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js +15 -0
  385. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js.map +1 -0
  386. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs +2 -0
  387. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs.map +1 -0
  388. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js +19 -0
  389. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js.map +1 -0
  390. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs +2 -0
  391. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs.map +1 -0
  392. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js +22 -0
  393. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js.map +1 -0
  394. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs +2 -0
  395. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs.map +1 -0
  396. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js +23 -0
  397. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js.map +1 -0
  398. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs +2 -0
  399. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs.map +1 -0
  400. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js +12 -0
  401. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js.map +1 -0
  402. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs +2 -0
  403. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs.map +1 -0
  404. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js +23 -0
  405. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js.map +1 -0
  406. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs +2 -0
  407. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs.map +1 -0
  408. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js +27 -0
  409. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js.map +1 -0
  410. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs +2 -0
  411. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs.map +1 -0
  412. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js +23 -0
  413. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js.map +1 -0
  414. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs +2 -0
  415. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs.map +1 -0
  416. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js +21 -0
  417. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js.map +1 -0
  418. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs +2 -0
  419. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs.map +1 -0
  420. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js +43 -0
  421. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js.map +1 -0
  422. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs +2 -0
  423. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs.map +1 -0
  424. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js +19 -0
  425. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js.map +1 -0
  426. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs +2 -0
  427. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs.map +1 -0
  428. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js +27 -0
  429. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js.map +1 -0
  430. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs +2 -0
  431. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.map +1 -0
  432. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js +9 -0
  433. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js.map +1 -0
  434. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs +2 -0
  435. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs.map +1 -0
  436. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +9 -0
  437. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
  438. package/dist/package.cjs +1 -1
  439. package/dist/package.cjs.map +1 -1
  440. package/dist/package.js +6 -3
  441. package/dist/package.js.map +1 -1
  442. package/dist/services/child-conversation-launch.cjs +2 -0
  443. package/dist/services/child-conversation-launch.cjs.map +1 -0
  444. package/dist/services/child-conversation-launch.d.ts +41 -0
  445. package/dist/services/child-conversation-launch.js +182 -0
  446. package/dist/services/child-conversation-launch.js.map +1 -0
  447. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  448. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  449. package/dist/stores/conversation-panel-preferences-store.d.ts +5 -1
  450. package/dist/stores/conversation-panel-preferences-store.js +8 -2
  451. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  452. package/dist/types/agent-server/core/base/action.d.ts +17 -1
  453. package/dist/types/agent-server/core/base/base.d.ts +2 -1
  454. package/dist/types/agent-server/type-guards.cjs +1 -1
  455. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  456. package/dist/types/agent-server/type-guards.d.ts +8 -1
  457. package/dist/types/agent-server/type-guards.js +4 -3
  458. package/dist/types/agent-server/type-guards.js.map +1 -1
  459. package/dist/types/automation.d.ts +14 -0
  460. package/dist/utils/custom-toast-handlers.cjs +1 -1
  461. package/dist/utils/custom-toast-handlers.cjs.map +1 -1
  462. package/dist/utils/custom-toast-handlers.js +18 -1
  463. package/dist/utils/custom-toast-handlers.js.map +1 -1
  464. package/package.json +6 -3
  465. package/scripts/brand-dev-electron.mjs +244 -0
  466. package/scripts/check-translation-completeness.cjs +4 -0
  467. package/scripts/generate-icons.mjs +109 -0
  468. package/build/assets/agent-server-conversation-service.api-km_8sOVf.js +0 -41
  469. package/build/assets/agent-settings-nmO-KSXr.js +0 -1
  470. package/build/assets/backend-form-modal-B_lXjOGa.js +0 -1
  471. package/build/assets/command-menu-CA3IjGNc.js +0 -1
  472. package/build/assets/conversation-B6t6EiVp.js +0 -1
  473. package/build/assets/conversation-panel-B6t6EiVp.js +0 -1
  474. package/build/assets/copy-DaHuDtG4.js +0 -1
  475. package/build/assets/git-repo-dropdown-TzOuG5Ef.js +0 -1
  476. package/build/assets/home-OEx0XtfP.js +0 -1
  477. package/build/assets/index-home-OEx0XtfP.js +0 -1
  478. package/build/assets/info-C9lpK5pw.js +0 -1
  479. package/build/assets/install-server-modal-DnjZrJUy.js +0 -1
  480. package/build/assets/list-filter-C86CBRDE.js +0 -1
  481. package/build/assets/llm-settings-CRsLqxgu.js +0 -1
  482. package/build/assets/llm-settings-RBm_3kNm.js +0 -1
  483. package/build/assets/manifest-c352d453.js +0 -1
  484. package/build/assets/map-provider-CXU6issd.js +0 -1
  485. package/build/assets/markdown-renderer-lsvsp7jn.js +0 -8
  486. package/build/assets/mcp-DD4hPTRE.js +0 -9
  487. package/build/assets/messages-Dt77e0qi.js +0 -40
  488. package/build/assets/recommended-automations-launcher-6xmbf7lh.js +0 -1
  489. package/build/assets/root-BQPNqNvD.js +0 -2
  490. package/build/assets/root-BeuHFY2s.css +0 -1
  491. package/build/assets/root-layout-Dl_2CDoq.js +0 -3
  492. package/build/assets/settings-Co-M5bK9.js +0 -1
  493. package/build/assets/sidebar-store-B04sX8aP.js +0 -1
  494. package/build/assets/skills-settings-DnbIu2eO.js +0 -2
  495. package/build/assets/use-settings-nav-items-y-Oyc93G.js +0 -16
  496. package/build/assets/utils-BX9XJ0IE.js +0 -1
  497. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs +0 -2
  498. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs.map +0 -1
  499. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -9
  500. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
@@ -1,170 +1,244 @@
1
1
  import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
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";
3
+ import { Check as n } from "../../../node_modules/lucide-react/dist/esm/icons/check.js";
4
+ import { CircleArrowUp as r } from "../../../node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js";
5
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";
6
+ import { Copy as a } from "../../../node_modules/lucide-react/dist/esm/icons/copy.js";
7
+ import { ExternalLink as o } from "../../../node_modules/lucide-react/dist/esm/icons/external-link.js";
8
8
  import { RefreshCw as s } from "../../../node_modules/lucide-react/dist/esm/icons/refresh-cw.js";
9
9
  import { cn as c } from "../../../utils/utils.js";
10
10
  import { getLockedCloudHost as l } from "../../../api/agent-server-config.js";
11
11
  import { compareAgentServerVersions as u } from "../../../api/agent-server-compatibility.js";
12
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";
13
+ import { ModalBackdrop as f } from "../../shared/modals/modal-backdrop.js";
14
+ import { ModalBody as p } from "../../shared/modals/modal-body.js";
15
+ import { BaseModalTitle as m } from "../../shared/modals/confirmation-modals/base-modal.js";
16
+ import { ModalCloseButton as h } from "../../shared/modals/modal-close-button.js";
17
+ import { BrandButton as g } from "./brand-button.js";
18
+ import { AGENT_CANVAS_RELEASE_NOTES_URL as _, AGENT_CANVAS_UPDATE_COMMANDS as v } from "../../../api/agent-canvas-updates.js";
19
+ import { useLatestAgentCanvasVersion as y } from "../../../hooks/query/use-latest-agent-canvas-version.js";
20
+ import b from "../../../icons/docker.js";
21
+ import x from "../../../icons/npm.js";
22
+ import { useCallback as S, useEffect as C, useRef as w, useState as T } from "react";
23
+ import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
19
24
  //#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
- })]
25
+ var k = 2e3, A = ["npm", "docker"];
26
+ function j(e) {
27
+ return e === "npm" ? t.SETTINGS$VERSION_NPM_RECOMMENDED : t.SETTINGS$VERSION_DOCKER;
28
+ }
29
+ function M({ tab: e }) {
30
+ return e === "npm" ? /* @__PURE__ */ D(x, {
31
+ className: "size-4 shrink-0",
32
+ "aria-hidden": !0
33
+ }) : /* @__PURE__ */ D(b, {
34
+ className: "size-5 shrink-0",
35
+ "aria-hidden": !0
36
36
  });
37
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", {
38
+ function N() {
39
+ let { t: r } = e("openhands"), [i, o] = T("npm"), [s, l] = T(!1), u = w(null), d = i === "npm" ? v.npm : v.docker;
40
+ C(() => () => {
41
+ u.current !== null && window.clearTimeout(u.current);
42
+ }, []), C(() => {
43
+ l(!1), u.current !== null && (window.clearTimeout(u.current), u.current = null);
44
+ }, [i]);
45
+ let f = S(() => {
46
+ navigator.clipboard?.writeText(d), l(!0), u.current !== null && window.clearTimeout(u.current), u.current = window.setTimeout(() => {
47
+ l(!1), u.current = null;
48
+ }, k);
49
+ }, [d]);
50
+ return /* @__PURE__ */ O("div", {
51
+ className: "w-full",
52
+ children: [/* @__PURE__ */ D("div", {
53
+ className: "flex justify-center",
54
+ children: A.map((e) => /* @__PURE__ */ O("button", {
47
55
  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
56
+ onClick: () => o(e),
57
+ className: c("inline-flex items-center gap-1.5 px-3 pb-2 text-sm font-medium", i === e ? "border-b border-white text-white" : "text-[var(--oh-muted)] hover:text-white"),
58
+ children: [/* @__PURE__ */ D(M, { tab: e }), r(j(e))]
59
+ }, e))
60
+ }), /* @__PURE__ */ O("div", {
61
+ className: "flex items-center gap-3 rounded-lg border border-[var(--oh-border)] bg-[var(--oh-surface-deep)] px-4 py-3",
62
+ children: [/* @__PURE__ */ D("code", {
63
+ "data-testid": i === "npm" ? "agent-canvas-update-command-npm" : "agent-canvas-update-command-docker",
64
+ className: "min-w-0 flex-1 overflow-visible whitespace-nowrap font-mono text-sm text-white",
65
+ children: d
66
+ }), /* @__PURE__ */ D("button", {
67
+ type: "button",
68
+ "data-testid": "copy-to-clipboard",
69
+ onClick: f,
70
+ "aria-label": r(s ? t.BUTTON$COPIED : t.SETTINGS$VERSION_COPY_COMMAND),
71
+ disabled: s,
72
+ className: "shrink-0 text-[var(--oh-muted)] hover:text-white disabled:hover:text-[var(--oh-muted)]",
73
+ children: s ? /* @__PURE__ */ D(n, {
74
+ className: "size-4 text-[var(--oh-status-success)]",
75
+ "aria-hidden": !0
76
+ }) : /* @__PURE__ */ D(a, {
77
+ className: "size-4",
78
+ "aria-hidden": !0
79
+ })
80
+ })]
81
+ })]
82
+ });
83
+ }
84
+ function P({ onClose: n, latestVersion: a, isPending: l, isFetching: u, updateAvailable: v, upToDate: y, onCheckForUpdates: b }) {
85
+ let { t: x } = e("openhands");
86
+ return /* @__PURE__ */ D(f, {
87
+ onClose: n,
88
+ children: /* @__PURE__ */ O(p, {
89
+ width: "md",
90
+ className: "relative flex max-h-[80vh] flex-col items-start overflow-auto border border-[var(--oh-border)]",
91
+ testID: "agent-canvas-update-modal",
92
+ children: [
93
+ /* @__PURE__ */ D(h, {
94
+ onClose: n,
95
+ testId: "close-agent-canvas-update-modal"
96
+ }),
97
+ /* @__PURE__ */ O("div", {
98
+ className: "flex w-full flex-col gap-2 pr-10",
99
+ children: [/* @__PURE__ */ D(m, { title: x(t.SETTINGS$APP_UPDATE_CARD_TITLE) }), /* @__PURE__ */ O("div", {
100
+ className: "flex items-center gap-1.5 text-xs",
101
+ children: [/* @__PURE__ */ D("span", {
102
+ className: "text-[var(--oh-text-dim)]",
103
+ children: x(t.SETTINGS$APP_UPDATE_VERSION_LABEL)
104
+ }), /* @__PURE__ */ D("span", {
105
+ className: "text-white",
106
+ children: d
107
+ })]
108
+ })]
109
+ }),
110
+ /* @__PURE__ */ O("div", {
111
+ className: "flex w-full flex-col gap-3",
112
+ children: [
113
+ /* @__PURE__ */ D(g, {
114
+ testId: "agent-canvas-update-check-button",
115
+ type: "button",
116
+ variant: "secondary",
117
+ className: "w-full",
118
+ isDisabled: u,
119
+ "aria-busy": u,
120
+ onClick: b,
121
+ startContent: /* @__PURE__ */ D(s, {
122
+ className: c("size-4", u && "animate-spin"),
123
+ "aria-hidden": !0
124
+ }),
125
+ children: x(t.SETTINGS$APP_UPDATE_CHECK_BUTTON)
117
126
  }),
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, {
127
+ /* @__PURE__ */ D("div", {
128
+ "data-testid": "agent-canvas-update-status",
129
+ className: "w-full",
130
+ children: l || u ? /* @__PURE__ */ D("span", {
131
+ className: "text-xs text-[var(--oh-muted)]",
132
+ children: x(t.SETTINGS$APP_UPDATE_CHECKING)
133
+ }) : v ? /* @__PURE__ */ O("div", {
134
+ className: "flex items-start gap-2 rounded-lg border border-[#3B82F6]/30 bg-[#1E3A5F] px-3 py-2 text-xs text-[#3B82F6]",
135
+ children: [/* @__PURE__ */ D(r, {
126
136
  className: "size-4 shrink-0",
127
137
  "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"
138
+ }), /* @__PURE__ */ O("span", { children: [
139
+ x(t.SETTINGS$APP_UPDATE_AVAILABLE_MESSAGE, { version: a }),
140
+ " ",
141
+ /* @__PURE__ */ O("a", {
142
+ "data-testid": "agent-canvas-update-release-notes",
143
+ href: _,
144
+ target: "_blank",
145
+ rel: "noopener noreferrer",
146
+ className: "inline-flex items-center gap-1.5 whitespace-nowrap font-medium text-white hover:text-[var(--oh-text)]",
147
+ children: [x(t.SETTINGS$VERSION_RELEASE_NOTES), /* @__PURE__ */ D(o, {
148
+ className: "size-3.5 shrink-0",
149
+ "aria-hidden": !0
150
+ })]
151
+ })
152
+ ] })]
153
+ }) : y ? /* @__PURE__ */ O("div", {
154
+ className: "flex items-start gap-2 rounded-lg border border-[var(--oh-status-success)]/30 bg-[var(--oh-status-success)]/10 px-3 py-2 text-xs text-[var(--oh-status-success)]",
155
+ children: [/* @__PURE__ */ D(i, {
156
+ className: "size-4 shrink-0",
157
+ "aria-hidden": !0
158
+ }), /* @__PURE__ */ O("span", { children: [
159
+ x(t.SETTINGS$APP_UPDATE_LATEST_MESSAGE),
160
+ " ",
161
+ /* @__PURE__ */ O("a", {
162
+ "data-testid": "agent-canvas-update-release-notes",
163
+ href: _,
164
+ target: "_blank",
165
+ rel: "noopener noreferrer",
166
+ className: "inline-flex items-center gap-1.5 whitespace-nowrap font-medium text-white hover:text-[var(--oh-text)]",
167
+ children: [x(t.SETTINGS$VERSION_RELEASE_NOTES), /* @__PURE__ */ D(o, {
168
+ className: "size-3.5 shrink-0",
169
+ "aria-hidden": !0
170
+ })]
171
+ })
172
+ ] })]
173
+ }) : /* @__PURE__ */ D("span", {
174
+ className: "text-xs text-[var(--oh-muted)]",
175
+ children: x(t.SETTINGS$APP_UPDATE_CHECK_FAILED)
148
176
  })
149
- ]
150
- }),
151
- /* @__PURE__ */ b("a", {
152
- "data-testid": "agent-canvas-update-release-notes",
153
- href: "https://github.com/OpenHands/OpenHands/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
- ]
177
+ }),
178
+ v ? /* @__PURE__ */ O("div", {
179
+ className: "flex w-full flex-col border-t border-[var(--oh-border)] pt-3",
180
+ children: [
181
+ /* @__PURE__ */ D("span", {
182
+ className: "text-sm font-medium text-white",
183
+ children: x(t.SETTINGS$APP_UPDATE_HOW_TO_UPDATE)
184
+ }),
185
+ /* @__PURE__ */ D("span", {
186
+ className: "mt-1 mb-4 text-sm text-[var(--oh-text-dim)]",
187
+ children: x(t.SETTINGS$APP_UPDATE_RUN_COMMANDS)
188
+ }),
189
+ /* @__PURE__ */ D(N, {})
190
+ ]
191
+ }) : null
192
+ ]
193
+ })
194
+ ]
195
+ })
165
196
  });
166
197
  }
198
+ function F({ hideWhenUpToDate: n = !1 }) {
199
+ let { t: a } = e("openhands"), [o, s] = T(!1), f = l() !== null, p = y({ enabled: !f });
200
+ if (f) return null;
201
+ let m = p.data, h = m === void 0 ? null : u(m, d), g = h === 1, _ = h !== null && h <= 0;
202
+ return n && !g ? null : /* @__PURE__ */ O(E, { children: [/* @__PURE__ */ D("section", {
203
+ "data-testid": "agent-canvas-update-card",
204
+ children: /* @__PURE__ */ O("button", {
205
+ type: "button",
206
+ onClick: () => s(!0),
207
+ "aria-haspopup": "dialog",
208
+ "data-testid": "agent-canvas-update-toggle",
209
+ className: "flex w-full cursor-pointer flex-col gap-1 rounded-md border border-[var(--oh-border)] bg-base-secondary px-3 py-2 text-left hover:bg-[var(--oh-surface-raised)]",
210
+ children: [/* @__PURE__ */ O("span", {
211
+ className: "flex w-full items-center gap-2",
212
+ children: [/* @__PURE__ */ D("span", {
213
+ className: "flex-1 truncate text-sm font-semibold leading-5 text-white",
214
+ children: a(t.SETTINGS$APP_UPDATE_CARD_TITLE)
215
+ }), h !== null && /* @__PURE__ */ O("span", {
216
+ "data-testid": "agent-canvas-update-badge",
217
+ className: c("inline-flex shrink-0 items-center gap-1 text-[10px] font-medium leading-none", g ? "rounded-full border border-transparent bg-[#1E3A5F] px-1.5 py-0.5 text-[#3B82F6]" : "text-success"),
218
+ children: [D(g ? r : i, {
219
+ className: "size-3 shrink-0",
220
+ "aria-hidden": !0
221
+ }), a(g ? t.SETTINGS$APP_UPDATE_BADGE_UPDATE_AVAILABLE : t.SETTINGS$APP_UPDATE_BADGE_UP_TO_DATE)]
222
+ })]
223
+ }), /* @__PURE__ */ O("span", {
224
+ className: "flex items-center gap-1.5 text-xs leading-5 text-[var(--oh-muted)]",
225
+ children: [/* @__PURE__ */ D("span", { children: a(t.SETTINGS$APP_UPDATE_VERSION_LABEL) }), /* @__PURE__ */ D("span", {
226
+ className: "text-white",
227
+ children: d
228
+ })]
229
+ })]
230
+ })
231
+ }), o && /* @__PURE__ */ D(P, {
232
+ onClose: () => s(!1),
233
+ latestVersion: m,
234
+ isPending: p.isPending,
235
+ isFetching: p.isFetching,
236
+ updateAvailable: g,
237
+ upToDate: _,
238
+ onCheckForUpdates: () => p.refetch()
239
+ })] });
240
+ }
167
241
  //#endregion
168
- export { S as AgentCanvasUpdateCard };
242
+ export { F as AgentCanvasUpdateCard };
169
243
 
170
244
  //# sourceMappingURL=agent-canvas-update-card.js.map
@@ -1 +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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"}
1
+ {"version":3,"file":"agent-canvas-update-card.js","names":[],"sources":["../../../../src/components/features/settings/agent-canvas-update-card.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n ArrowUpCircle,\n Check,\n CircleCheck,\n Copy,\n ExternalLink,\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 { BaseModalTitle } from \"#/components/shared/modals/confirmation-modals/base-modal\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalBody } from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { useLatestAgentCanvasVersion } from \"#/hooks/query/use-latest-agent-canvas-version\";\nimport DockerIcon from \"#/icons/docker.svg?react\";\nimport NpmIcon from \"#/icons/npm.svg?react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\n\nconst COPY_FEEDBACK_MS = 2000;\n\ntype UpdateCommandTab = \"npm\" | \"docker\";\n\nconst UPDATE_COMMAND_TABS: UpdateCommandTab[] = [\"npm\", \"docker\"];\n\nfunction getUpdateCommandTabLabelKey(tab: UpdateCommandTab): I18nKey {\n return tab === \"npm\"\n ? I18nKey.SETTINGS$VERSION_NPM_RECOMMENDED\n : I18nKey.SETTINGS$VERSION_DOCKER;\n}\n\nfunction UpdateCommandTabIcon({ tab }: { tab: UpdateCommandTab }) {\n if (tab === \"npm\") {\n return <NpmIcon className=\"size-4 shrink-0\" aria-hidden />;\n }\n return <DockerIcon className=\"size-5 shrink-0\" aria-hidden />;\n}\n\nfunction UpdateCommandTabs() {\n const { t } = useTranslation(\"openhands\");\n const [selectedTab, setSelectedTab] = useState<UpdateCommandTab>(\"npm\");\n const [copied, setCopied] = useState(false);\n const copiedTimeoutRef = useRef<number | null>(null);\n const command =\n selectedTab === \"npm\"\n ? AGENT_CANVAS_UPDATE_COMMANDS.npm\n : AGENT_CANVAS_UPDATE_COMMANDS.docker;\n\n useEffect(\n () => () => {\n if (copiedTimeoutRef.current !== null) {\n window.clearTimeout(copiedTimeoutRef.current);\n }\n },\n [],\n );\n\n useEffect(() => {\n setCopied(false);\n if (copiedTimeoutRef.current !== null) {\n window.clearTimeout(copiedTimeoutRef.current);\n copiedTimeoutRef.current = null;\n }\n }, [selectedTab]);\n\n const copyCommand = useCallback(() => {\n void navigator.clipboard?.writeText(command);\n setCopied(true);\n if (copiedTimeoutRef.current !== null) {\n window.clearTimeout(copiedTimeoutRef.current);\n }\n copiedTimeoutRef.current = window.setTimeout(() => {\n setCopied(false);\n copiedTimeoutRef.current = null;\n }, COPY_FEEDBACK_MS);\n }, [command]);\n\n return (\n <div className=\"w-full\">\n <div className=\"flex justify-center\">\n {UPDATE_COMMAND_TABS.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n onClick={() => setSelectedTab(tab)}\n className={cn(\n \"inline-flex items-center gap-1.5 px-3 pb-2 text-sm font-medium\",\n selectedTab === tab\n ? \"border-b border-white text-white\"\n : \"text-[var(--oh-muted)] hover:text-white\",\n )}\n >\n <UpdateCommandTabIcon tab={tab} />\n {t(getUpdateCommandTabLabelKey(tab))}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-[var(--oh-border)] bg-[var(--oh-surface-deep)] px-4 py-3\">\n <code\n data-testid={\n selectedTab === \"npm\"\n ? \"agent-canvas-update-command-npm\"\n : \"agent-canvas-update-command-docker\"\n }\n className=\"min-w-0 flex-1 overflow-visible whitespace-nowrap font-mono text-sm text-white\"\n >\n {command}\n </code>\n <button\n type=\"button\"\n data-testid=\"copy-to-clipboard\"\n onClick={copyCommand}\n aria-label={t(\n copied\n ? I18nKey.BUTTON$COPIED\n : I18nKey.SETTINGS$VERSION_COPY_COMMAND,\n )}\n disabled={copied}\n className=\"shrink-0 text-[var(--oh-muted)] hover:text-white disabled:hover:text-[var(--oh-muted)]\"\n >\n {copied ? (\n <Check\n className=\"size-4 text-[var(--oh-status-success)]\"\n aria-hidden\n />\n ) : (\n <Copy className=\"size-4\" aria-hidden />\n )}\n </button>\n </div>\n </div>\n );\n}\n\ninterface AgentCanvasUpdateModalProps {\n onClose: () => void;\n latestVersion: string | undefined;\n isPending: boolean;\n isFetching: boolean;\n updateAvailable: boolean;\n upToDate: boolean;\n onCheckForUpdates: () => void;\n}\n\nfunction AgentCanvasUpdateModal({\n onClose,\n latestVersion,\n isPending,\n isFetching,\n updateAvailable,\n upToDate,\n onCheckForUpdates,\n}: AgentCanvasUpdateModalProps) {\n const { t } = useTranslation(\"openhands\");\n\n return (\n <ModalBackdrop onClose={onClose}>\n <ModalBody\n width=\"md\"\n className=\"relative flex max-h-[80vh] flex-col items-start overflow-auto border border-[var(--oh-border)]\"\n testID=\"agent-canvas-update-modal\"\n >\n <ModalCloseButton\n onClose={onClose}\n testId=\"close-agent-canvas-update-modal\"\n />\n <div className=\"flex w-full flex-col gap-2 pr-10\">\n <BaseModalTitle title={t(I18nKey.SETTINGS$APP_UPDATE_CARD_TITLE)} />\n <div className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-[var(--oh-text-dim)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_VERSION_LABEL)}\n </span>\n <span className=\"text-white\">{AGENT_CANVAS_CLIENT_VERSION}</span>\n </div>\n </div>\n\n <div className=\"flex w-full flex-col gap-3\">\n <BrandButton\n testId=\"agent-canvas-update-check-button\"\n type=\"button\"\n variant=\"secondary\"\n className=\"w-full\"\n isDisabled={isFetching}\n aria-busy={isFetching}\n onClick={onCheckForUpdates}\n startContent={\n <RefreshCw\n className={cn(\"size-4\", isFetching && \"animate-spin\")}\n aria-hidden\n />\n }\n >\n {t(I18nKey.SETTINGS$APP_UPDATE_CHECK_BUTTON)}\n </BrandButton>\n\n <div data-testid=\"agent-canvas-update-status\" className=\"w-full\">\n {isPending || isFetching ? (\n <span className=\"text-xs text-[var(--oh-muted)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_CHECKING)}\n </span>\n ) : updateAvailable ? (\n <div className=\"flex items-start gap-2 rounded-lg border border-[#3B82F6]/30 bg-[#1E3A5F] px-3 py-2 text-xs text-[#3B82F6]\">\n <ArrowUpCircle className=\"size-4 shrink-0\" aria-hidden />\n <span>\n {t(I18nKey.SETTINGS$APP_UPDATE_AVAILABLE_MESSAGE, {\n version: latestVersion,\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.5 whitespace-nowrap font-medium text-white hover:text-[var(--oh-text)]\"\n >\n {t(I18nKey.SETTINGS$VERSION_RELEASE_NOTES)}\n <ExternalLink className=\"size-3.5 shrink-0\" aria-hidden />\n </a>\n </span>\n </div>\n ) : upToDate ? (\n <div className=\"flex items-start gap-2 rounded-lg border border-[var(--oh-status-success)]/30 bg-[var(--oh-status-success)]/10 px-3 py-2 text-xs text-[var(--oh-status-success)]\">\n <CircleCheck className=\"size-4 shrink-0\" aria-hidden />\n <span>\n {t(I18nKey.SETTINGS$APP_UPDATE_LATEST_MESSAGE)}{\" \"}\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.5 whitespace-nowrap font-medium text-white hover:text-[var(--oh-text)]\"\n >\n {t(I18nKey.SETTINGS$VERSION_RELEASE_NOTES)}\n <ExternalLink className=\"size-3.5 shrink-0\" aria-hidden />\n </a>\n </span>\n </div>\n ) : (\n <span className=\"text-xs text-[var(--oh-muted)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_CHECK_FAILED)}\n </span>\n )}\n </div>\n\n {updateAvailable ? (\n <div className=\"flex w-full flex-col border-t border-[var(--oh-border)] pt-3\">\n <span className=\"text-sm font-medium text-white\">\n {t(I18nKey.SETTINGS$APP_UPDATE_HOW_TO_UPDATE)}\n </span>\n <span className=\"mt-1 mb-4 text-sm text-[var(--oh-text-dim)]\">\n {t(I18nKey.SETTINGS$APP_UPDATE_RUN_COMMANDS)}\n </span>\n <UpdateCommandTabs />\n </div>\n ) : null}\n </div>\n </ModalBody>\n </ModalBackdrop>\n );\n}\n\ninterface AgentCanvasUpdateCardProps {\n /** When true, omit the card unless an update is available (main sidebar). */\n hideWhenUpToDate?: boolean;\n}\n\n/**\n * Information-only version/update card for settings and the main sidebar.\n * Opens update details in a modal. Never blocks or toasts; check failures\n * degrade to a quiet inline message. Hidden in locked-to-Cloud deployments —\n * the hosted canvas has no npm/docker install to update.\n */\nexport function AgentCanvasUpdateCard({\n hideWhenUpToDate = false,\n}: AgentCanvasUpdateCardProps) {\n const { t } = useTranslation(\"openhands\");\n const [isModalOpen, setIsModalOpen] = useState(false);\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\n if (hideWhenUpToDate && !updateAvailable) return null;\n\n return (\n <>\n <section data-testid=\"agent-canvas-update-card\">\n <button\n type=\"button\"\n onClick={() => setIsModalOpen(true)}\n aria-haspopup=\"dialog\"\n data-testid=\"agent-canvas-update-toggle\"\n className=\"flex w-full cursor-pointer flex-col gap-1 rounded-md border border-[var(--oh-border)] bg-base-secondary px-3 py-2 text-left hover:bg-[var(--oh-surface-raised)]\"\n >\n <span className=\"flex w-full items-center gap-2\">\n <span className=\"flex-1 truncate text-sm font-semibold leading-5 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 gap-1 text-[10px] font-medium leading-none\",\n updateAvailable\n ? \"rounded-full border border-transparent bg-[#1E3A5F] px-1.5 py-0.5 text-[#3B82F6]\"\n : \"text-success\",\n )}\n >\n {updateAvailable ? (\n <ArrowUpCircle className=\"size-3 shrink-0\" aria-hidden />\n ) : (\n <CircleCheck className=\"size-3 shrink-0\" aria-hidden />\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 </span>\n\n <span className=\"flex items-center gap-1.5 text-xs leading-5 text-[var(--oh-muted)]\">\n <span>{t(I18nKey.SETTINGS$APP_UPDATE_VERSION_LABEL)}</span>\n <span className=\"text-white\">{AGENT_CANVAS_CLIENT_VERSION}</span>\n </span>\n </button>\n </section>\n\n {isModalOpen && (\n <AgentCanvasUpdateModal\n onClose={() => setIsModalOpen(false)}\n latestVersion={latestVersion}\n isPending={latestVersionQuery.isPending}\n isFetching={latestVersionQuery.isFetching}\n updateAvailable={updateAvailable}\n upToDate={upToDate}\n onCheckForUpdates={() => latestVersionQuery.refetch()}\n />\n )}\n </>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/check.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs"),a=require("../../../node_modules/lucide-react/dist/esm/icons/circle-check.cjs"),o=require("../../../node_modules/lucide-react/dist/esm/icons/copy.cjs"),s=require("../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs"),c=require("../../../node_modules/lucide-react/dist/esm/icons/refresh-cw.cjs"),l=require("../../../utils/utils.cjs"),u=require("../../shared/modals/modal-backdrop.cjs"),d=require("../../shared/modals/modal-close-button.cjs"),f=require("../../../api/agent-canvas-updates.cjs"),p=require("../../../icons/docker.cjs"),m=require("../../../icons/npm.cjs");let h=require("react");h=e.__toESM(h,1);let g=require("react/jsx-runtime");var _=2e3,v=[`npm`,`docker`];function y(e){return e===`npm`?n.I18nKey.SETTINGS$VERSION_NPM_RECOMMENDED:n.I18nKey.SETTINGS$VERSION_DOCKER}function b({tab:e}){return e===`npm`?(0,g.jsx)(m.default,{className:`size-4 shrink-0`,"aria-hidden":!0}):(0,g.jsx)(p.default,{className:`size-5 shrink-0`,"aria-hidden":!0})}function x({installedVersion:e,latestVersion:p,updateAvailable:m,isChecking:x,onCheckForUpdates:S,onClose:C}){let{t:w}=t.useTranslation(`openhands`),[T,E]=h.default.useState(`npm`),[D,O]=h.default.useState(!1),k=h.default.useRef(null),A=T===`npm`?f.AGENT_CANVAS_UPDATE_COMMANDS.npm:f.AGENT_CANVAS_UPDATE_COMMANDS.docker;h.default.useEffect(()=>()=>{k.current!==null&&window.clearTimeout(k.current)},[]),h.default.useEffect(()=>{O(!1),k.current!==null&&(window.clearTimeout(k.current),k.current=null)},[T]);let j=h.default.useCallback(()=>{navigator.clipboard?.writeText(A),O(!0),k.current!==null&&window.clearTimeout(k.current),k.current=window.setTimeout(()=>{O(!1),k.current=null},_)},[A]);return(0,g.jsx)(u.ModalBackdrop,{onClose:C,"aria-label":w(n.I18nKey.SETTINGS$VERSION_MODAL_ARIA_LABEL),children:(0,g.jsxs)(`section`,{className:`relative flex w-[520px] max-w-[90vw] flex-col gap-5 rounded-xl border border-[var(--oh-border)] bg-base-secondary p-6 shadow-xl`,children:[(0,g.jsx)(d.ModalCloseButton,{onClose:C,testId:`agent-canvas-version-modal-close`}),(0,g.jsxs)(`header`,{className:`flex items-center gap-3 pr-8`,children:[m?(0,g.jsx)(i.CircleArrowUp,{className:`size-7 shrink-0 text-[#3B82F6]`,"aria-hidden":!0}):(0,g.jsx)(a.CircleCheck,{className:`size-7 shrink-0 text-[var(--oh-status-success)]`,"aria-hidden":!0}),(0,g.jsx)(`h2`,{className:`text-base font-semibold leading-6 text-white`,children:w(m?n.I18nKey.SETTINGS$VERSION_UPDATE_AVAILABLE:n.I18nKey.SETTINGS$VERSION_UP_TO_DATE_TITLE)}),m&&p?(0,g.jsx)(`span`,{className:`rounded-full bg-[#1E3A5F] px-2 py-0.5 text-xs font-semibold text-[#3B82F6]`,children:p}):null]}),(0,g.jsx)(`div`,{className:`flex flex-col gap-1`,children:m&&p?(0,g.jsxs)(`p`,{className:`text-sm text-[var(--oh-text)]`,children:[w(n.I18nKey.SETTINGS$VERSION_UPDATE_MESSAGE,{installed:e,latest:p}),` `,(0,g.jsxs)(`a`,{href:f.AGENT_CANVAS_RELEASE_NOTES_URL,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1.5 whitespace-nowrap font-medium text-white hover:text-[var(--oh-text)]`,children:[w(n.I18nKey.SETTINGS$VERSION_RELEASE_NOTES),(0,g.jsx)(s.ExternalLink,{className:`size-4 shrink-0`,"aria-hidden":!0})]})]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`p`,{className:`text-sm text-[var(--oh-text)]`,children:w(n.I18nKey.SETTINGS$VERSION_INSTALLED,{version:e})}),p?(0,g.jsxs)(`p`,{className:`whitespace-nowrap text-sm text-[var(--oh-status-success)]`,children:[w(n.I18nKey.SETTINGS$VERSION_LATEST_MESSAGE),` `,(0,g.jsxs)(`a`,{href:f.AGENT_CANVAS_RELEASE_NOTES_URL,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1.5 font-medium text-white hover:text-[var(--oh-text)]`,children:[w(n.I18nKey.SETTINGS$VERSION_RELEASE_NOTES),(0,g.jsx)(s.ExternalLink,{className:`size-4 shrink-0`,"aria-hidden":!0})]})]}):(0,g.jsx)(`p`,{className:`text-sm text-[var(--oh-muted)]`,children:w(n.I18nKey.SETTINGS$VERSION_CHECK_UNAVAILABLE)})]})}),m?(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`div`,{className:`flex justify-center`,children:v.map(e=>(0,g.jsxs)(`button`,{type:`button`,onClick:()=>E(e),className:l.cn(`inline-flex items-center gap-1.5 px-3 pb-2 text-sm font-medium`,T===e?`border-b border-white text-white`:`text-[var(--oh-muted)] hover:text-white`),children:[(0,g.jsx)(b,{tab:e}),w(y(e))]},e))}),(0,g.jsxs)(`div`,{className:`flex items-center gap-3 rounded-lg border border-[var(--oh-border)] bg-[var(--oh-surface-deep)] px-4 py-3`,children:[(0,g.jsx)(`code`,{className:`min-w-0 flex-1 overflow-visible whitespace-nowrap font-mono text-sm text-white`,children:A}),(0,g.jsx)(`button`,{type:`button`,onClick:j,"aria-label":w(D?n.I18nKey.BUTTON$COPIED:n.I18nKey.SETTINGS$VERSION_COPY_COMMAND),disabled:D,className:`shrink-0 text-[var(--oh-muted)] hover:text-white disabled:hover:text-[var(--oh-muted)]`,children:D?(0,g.jsx)(r.Check,{className:`size-4 text-[var(--oh-status-success)]`,"aria-hidden":!0}):(0,g.jsx)(o.Copy,{className:`size-4`,"aria-hidden":!0})})]})]}):null,m?null:(0,g.jsx)(`div`,{className:`flex flex-wrap gap-x-8 gap-y-3`,children:(0,g.jsxs)(`button`,{type:`button`,onClick:S,className:`inline-flex items-center gap-2 text-sm font-medium text-white hover:text-[var(--oh-text)] disabled:cursor-wait disabled:text-[var(--oh-muted)]`,disabled:x,children:[w(n.I18nKey.SETTINGS$VERSION_CHECK_FOR_UPDATES),(0,g.jsx)(c.RefreshCw,{className:l.cn(`size-4 shrink-0`,x&&`animate-spin`),"aria-hidden":!0})]})})]})})}exports.AgentCanvasVersionModal=x;
2
+ //# sourceMappingURL=agent-canvas-version-modal.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-canvas-version-modal.cjs","names":[],"sources":["../../../../src/components/features/settings/agent-canvas-version-modal.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n ArrowUpCircle,\n Check,\n CheckCircle2,\n Copy,\n ExternalLink,\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 { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport DockerIcon from \"#/icons/docker.svg?react\";\nimport NpmIcon from \"#/icons/npm.svg?react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\n\nconst COPY_FEEDBACK_MS = 2000;\n\ntype UpdateCommandTab = \"npm\" | \"docker\";\n\nconst UPDATE_COMMAND_TABS: UpdateCommandTab[] = [\"npm\", \"docker\"];\n\ninterface AgentCanvasVersionModalProps {\n installedVersion: string;\n latestVersion: string | null;\n updateAvailable: boolean;\n isChecking: boolean;\n onCheckForUpdates: () => void;\n onClose: () => void;\n}\n\nfunction getUpdateCommandTabLabelKey(tab: UpdateCommandTab): I18nKey {\n return tab === \"npm\"\n ? I18nKey.SETTINGS$VERSION_NPM_RECOMMENDED\n : I18nKey.SETTINGS$VERSION_DOCKER;\n}\n\nfunction UpdateCommandTabIcon({ tab }: { tab: UpdateCommandTab }) {\n if (tab === \"npm\") {\n return <NpmIcon className=\"size-4 shrink-0\" aria-hidden />;\n }\n return <DockerIcon className=\"size-5 shrink-0\" aria-hidden />;\n}\n\nexport function AgentCanvasVersionModal({\n installedVersion,\n latestVersion,\n updateAvailable,\n isChecking,\n onCheckForUpdates,\n onClose,\n}: AgentCanvasVersionModalProps) {\n const { t } = useTranslation(\"openhands\");\n const [selectedTab, setSelectedTab] = React.useState<UpdateCommandTab>(\"npm\");\n const [copied, setCopied] = React.useState(false);\n const copiedTimeoutRef = React.useRef<number | null>(null);\n const command =\n selectedTab === \"npm\"\n ? AGENT_CANVAS_UPDATE_COMMANDS.npm\n : AGENT_CANVAS_UPDATE_COMMANDS.docker;\n\n React.useEffect(\n () => () => {\n if (copiedTimeoutRef.current !== null) {\n window.clearTimeout(copiedTimeoutRef.current);\n }\n },\n [],\n );\n\n React.useEffect(() => {\n setCopied(false);\n if (copiedTimeoutRef.current !== null) {\n window.clearTimeout(copiedTimeoutRef.current);\n copiedTimeoutRef.current = null;\n }\n }, [selectedTab]);\n\n const copyCommand = React.useCallback(() => {\n void navigator.clipboard?.writeText(command);\n setCopied(true);\n if (copiedTimeoutRef.current !== null) {\n window.clearTimeout(copiedTimeoutRef.current);\n }\n copiedTimeoutRef.current = window.setTimeout(() => {\n setCopied(false);\n copiedTimeoutRef.current = null;\n }, COPY_FEEDBACK_MS);\n }, [command]);\n\n return (\n <ModalBackdrop\n onClose={onClose}\n aria-label={t(I18nKey.SETTINGS$VERSION_MODAL_ARIA_LABEL)}\n >\n <section className=\"relative flex w-[520px] max-w-[90vw] flex-col gap-5 rounded-xl border border-[var(--oh-border)] bg-base-secondary p-6 shadow-xl\">\n <ModalCloseButton\n onClose={onClose}\n testId=\"agent-canvas-version-modal-close\"\n />\n\n <header className=\"flex items-center gap-3 pr-8\">\n {updateAvailable ? (\n <ArrowUpCircle\n className=\"size-7 shrink-0 text-[#3B82F6]\"\n aria-hidden\n />\n ) : (\n <CheckCircle2\n className=\"size-7 shrink-0 text-[var(--oh-status-success)]\"\n aria-hidden\n />\n )}\n <h2 className=\"text-base font-semibold leading-6 text-white\">\n {t(\n updateAvailable\n ? I18nKey.SETTINGS$VERSION_UPDATE_AVAILABLE\n : I18nKey.SETTINGS$VERSION_UP_TO_DATE_TITLE,\n )}\n </h2>\n {updateAvailable && latestVersion ? (\n <span className=\"rounded-full bg-[#1E3A5F] px-2 py-0.5 text-xs font-semibold text-[#3B82F6]\">\n {latestVersion}\n </span>\n ) : null}\n </header>\n\n <div className=\"flex flex-col gap-1\">\n {updateAvailable && latestVersion ? (\n <p className=\"text-sm text-[var(--oh-text)]\">\n {t(I18nKey.SETTINGS$VERSION_UPDATE_MESSAGE, {\n installed: installedVersion,\n latest: latestVersion,\n })}{\" \"}\n <a\n href={AGENT_CANVAS_RELEASE_NOTES_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 whitespace-nowrap font-medium text-white hover:text-[var(--oh-text)]\"\n >\n {t(I18nKey.SETTINGS$VERSION_RELEASE_NOTES)}\n <ExternalLink className=\"size-4 shrink-0\" aria-hidden />\n </a>\n </p>\n ) : (\n <>\n <p className=\"text-sm text-[var(--oh-text)]\">\n {t(I18nKey.SETTINGS$VERSION_INSTALLED, {\n version: installedVersion,\n })}\n </p>\n {latestVersion ? (\n <p className=\"whitespace-nowrap text-sm text-[var(--oh-status-success)]\">\n {t(I18nKey.SETTINGS$VERSION_LATEST_MESSAGE)}{\" \"}\n <a\n href={AGENT_CANVAS_RELEASE_NOTES_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 font-medium text-white hover:text-[var(--oh-text)]\"\n >\n {t(I18nKey.SETTINGS$VERSION_RELEASE_NOTES)}\n <ExternalLink className=\"size-4 shrink-0\" aria-hidden />\n </a>\n </p>\n ) : (\n <p className=\"text-sm text-[var(--oh-muted)]\">\n {t(I18nKey.SETTINGS$VERSION_CHECK_UNAVAILABLE)}\n </p>\n )}\n </>\n )}\n </div>\n\n {updateAvailable ? (\n <div>\n <div className=\"flex justify-center\">\n {UPDATE_COMMAND_TABS.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n onClick={() => setSelectedTab(tab)}\n className={cn(\n \"inline-flex items-center gap-1.5 px-3 pb-2 text-sm font-medium\",\n selectedTab === tab\n ? \"border-b border-white text-white\"\n : \"text-[var(--oh-muted)] hover:text-white\",\n )}\n >\n <UpdateCommandTabIcon tab={tab} />\n {t(getUpdateCommandTabLabelKey(tab))}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-[var(--oh-border)] bg-[var(--oh-surface-deep)] px-4 py-3\">\n <code className=\"min-w-0 flex-1 overflow-visible whitespace-nowrap font-mono text-sm text-white\">\n {command}\n </code>\n <button\n type=\"button\"\n onClick={copyCommand}\n aria-label={t(\n copied\n ? I18nKey.BUTTON$COPIED\n : I18nKey.SETTINGS$VERSION_COPY_COMMAND,\n )}\n disabled={copied}\n className=\"shrink-0 text-[var(--oh-muted)] hover:text-white disabled:hover:text-[var(--oh-muted)]\"\n >\n {copied ? (\n <Check\n className=\"size-4 text-[var(--oh-status-success)]\"\n aria-hidden\n />\n ) : (\n <Copy className=\"size-4\" aria-hidden />\n )}\n </button>\n </div>\n </div>\n ) : null}\n\n {!updateAvailable ? (\n <div className=\"flex flex-wrap gap-x-8 gap-y-3\">\n <button\n type=\"button\"\n onClick={onCheckForUpdates}\n className=\"inline-flex items-center gap-2 text-sm font-medium text-white hover:text-[var(--oh-text)] disabled:cursor-wait disabled:text-[var(--oh-muted)]\"\n disabled={isChecking}\n >\n {t(I18nKey.SETTINGS$VERSION_CHECK_FOR_UPDATES)}\n <RefreshCw\n className={cn(\"size-4 shrink-0\", isChecking && \"animate-spin\")}\n aria-hidden\n />\n </button>\n </div>\n ) : null}\n </section>\n </ModalBackdrop>\n );\n}\n"],"mappings":"g+BAqBA,IAAM,EAAmB,IAInB,EAA0C,CAAC,MAAO,QAAQ,EAWhE,SAAS,EAA4B,EAAgC,CACnE,OAAO,IAAQ,MACX,EAAA,QAAQ,iCACR,EAAA,QAAQ,uBACd,CAEA,SAAS,EAAqB,CAAE,OAAkC,CAIhE,OAHI,IAAQ,OACH,EAAA,EAAA,KAAC,EAAA,QAAD,CAAS,UAAU,kBAAkB,cAAA,EAAa,CAAA,GAEpD,EAAA,EAAA,KAAC,EAAA,QAAD,CAAY,UAAU,kBAAkB,cAAA,EAAa,CAAA,CAC9D,CAEA,SAAgB,EAAwB,CACtC,mBACA,gBACA,kBACA,aACA,oBACA,WAC+B,CAC/B,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAC,EAAa,GAAkB,EAAA,QAAM,SAA2B,KAAK,EACtE,CAAC,EAAQ,GAAa,EAAA,QAAM,SAAS,EAAK,EAC1C,EAAmB,EAAA,QAAM,OAAsB,IAAI,EACnD,EACJ,IAAgB,MACZ,EAAA,6BAA6B,IAC7B,EAAA,6BAA6B,OAEnC,EAAA,QAAM,kBACQ,CACN,EAAiB,UAAY,MAC/B,OAAO,aAAa,EAAiB,OAAO,CAEhD,EACA,CAAC,CACH,EAEA,EAAA,QAAM,cAAgB,CACpB,EAAU,EAAK,EACX,EAAiB,UAAY,OAC/B,OAAO,aAAa,EAAiB,OAAO,EAC5C,EAAiB,QAAU,KAE/B,EAAG,CAAC,CAAW,CAAC,EAEhB,IAAM,EAAc,EAAA,QAAM,gBAAkB,CAC1C,UAAe,WAAW,UAAU,CAAO,EAC3C,EAAU,EAAI,EACV,EAAiB,UAAY,MAC/B,OAAO,aAAa,EAAiB,OAAO,EAE9C,EAAiB,QAAU,OAAO,eAAiB,CACjD,EAAU,EAAK,EACf,EAAiB,QAAU,IAC7B,EAAG,CAAgB,CACrB,EAAG,CAAC,CAAO,CAAC,EAEZ,OACE,EAAA,EAAA,KAAC,EAAA,cAAD,CACW,UACT,aAAY,EAAE,EAAA,QAAQ,iCAAiC,YAEvD,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,2IAAnB,EACE,EAAA,EAAA,KAAC,EAAA,iBAAD,CACW,UACT,OAAO,kCACR,CAAA,GAED,EAAA,EAAA,MAAC,SAAD,CAAQ,UAAU,wCAAlB,CACG,GACC,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,UAAU,iCACV,cAAA,EACD,CAAA,GAED,EAAA,EAAA,KAAC,EAAA,YAAD,CACE,UAAU,kDACV,cAAA,EACD,CAAA,GAEH,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,wDACX,EACC,EACI,EAAA,QAAQ,kCACR,EAAA,QAAQ,iCACd,CACE,CAAA,EACH,GAAmB,GAClB,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sFACb,CACG,CAAA,EACJ,IACE,KAER,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+BACZ,GAAmB,GAClB,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,yCAAb,CACG,EAAE,EAAA,QAAQ,gCAAiC,CAC1C,UAAW,EACX,OAAQ,CACV,CAAC,EAAG,KACJ,EAAA,EAAA,MAAC,IAAD,CACE,KAAM,EAAA,+BACN,OAAO,SACP,IAAI,sBACJ,UAAU,iHAJZ,CAMG,EAAE,EAAA,QAAQ,8BAA8B,GACzC,EAAA,EAAA,KAAC,EAAA,aAAD,CAAc,UAAU,kBAAkB,cAAA,EAAa,CAAA,CACtD,GACF,KAEH,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,yCACV,EAAE,EAAA,QAAQ,2BAA4B,CACrC,QAAS,CACX,CAAC,CACA,CAAA,EACF,GACC,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,qEAAb,CACG,EAAE,EAAA,QAAQ,+BAA+B,EAAG,KAC7C,EAAA,EAAA,MAAC,IAAD,CACE,KAAM,EAAA,+BACN,OAAO,SACP,IAAI,sBACJ,UAAU,+FAJZ,CAMG,EAAE,EAAA,QAAQ,8BAA8B,GACzC,EAAA,EAAA,KAAC,EAAA,aAAD,CAAc,UAAU,kBAAkB,cAAA,EAAa,CAAA,CACtD,GACF,KAEH,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,0CACV,EAAE,EAAA,QAAQ,kCAAkC,CAC5C,CAAA,CAEL,CAAA,CAAA,CAED,CAAA,EAEJ,GACC,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+BACZ,EAAoB,IAAK,IACxB,EAAA,EAAA,MAAC,SAAD,CAEE,KAAK,SACL,YAAe,EAAe,CAAG,EACjC,UAAW,EAAA,GACT,iEACA,IAAgB,EACZ,mCACA,yCACN,WATF,EAWE,EAAA,EAAA,KAAC,EAAD,CAA2B,KAAM,CAAA,EAChC,EAAE,EAA4B,CAAG,CAAC,CAC7B,GAZD,CAYC,CACT,CACE,CAAA,GACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qHAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,0FACb,CACG,CAAA,GACN,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,QAAS,EACT,aAAY,EACV,EACI,EAAA,QAAQ,cACR,EAAA,QAAQ,6BACd,EACA,SAAU,EACV,UAAU,kGAET,GACC,EAAA,EAAA,KAAC,EAAA,MAAD,CACE,UAAU,yCACV,cAAA,EACD,CAAA,GAED,EAAA,EAAA,KAAC,EAAA,KAAD,CAAM,UAAU,SAAS,cAAA,EAAa,CAAA,CAElC,CAAA,CACL,GACF,CAAA,CAAA,EACH,KAEF,EAeE,MAdF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2CACb,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,QAAS,EACT,UAAU,iJACV,SAAU,WAJZ,CAMG,EAAE,EAAA,QAAQ,kCAAkC,GAC7C,EAAA,EAAA,KAAC,EAAA,UAAD,CACE,UAAW,EAAA,GAAG,kBAAmB,GAAc,cAAc,EAC7D,cAAA,EACD,CAAA,CACK,GACL,CAAA,CAEA,GACI,CAAA,CAEnB"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface AgentCanvasVersionModalProps {
3
+ installedVersion: string;
4
+ latestVersion: string | null;
5
+ updateAvailable: boolean;
6
+ isChecking: boolean;
7
+ onCheckForUpdates: () => void;
8
+ onClose: () => void;
9
+ }
10
+ export declare function AgentCanvasVersionModal({ installedVersion, latestVersion, updateAvailable, isChecking, onCheckForUpdates, onClose, }: AgentCanvasVersionModalProps): React.JSX.Element;
11
+ export {};