@openhands/agent-canvas 1.0.0-beta.6 → 1.0.0-beta.7

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 (802) hide show
  1. package/README.md +24 -7
  2. package/README.windows.md +27 -0
  3. package/bin/agent-canvas.mjs +26 -3
  4. package/build/assets/{QueryClientProvider-CkGuhXg-.js → QueryClientProvider-Cnr-Yl3j.js} +1 -1
  5. package/build/assets/{Trans-Cvm_-SMi.js → Trans-4jmk54WC.js} +1 -1
  6. package/build/assets/acp-providers-CPdgcp13.js +1 -0
  7. package/build/assets/{acp-route-guard-B2yoBZ_4.js → acp-route-guard-BoVmCn0e.js} +1 -1
  8. package/build/assets/active-backend-context-Beu-LZL-.js +1 -0
  9. package/build/assets/add-backend-modal-BheqYXHK.js +1 -0
  10. package/build/assets/agent-server-client-options-HEOwGVIU.js +1 -0
  11. package/build/assets/agent-server-compatibility-CdI3N7dr.js +1 -0
  12. package/build/assets/agent-server-conversation-service.api-CORdqJZg.js +5 -0
  13. package/build/assets/{agent-settings-CnGSCmK8.js → agent-settings-UFvcGjoI.js} +1 -1
  14. package/build/assets/{alert-banner-DtzAX654.js → alert-banner-DFnn_lC6.js} +1 -1
  15. package/build/assets/{analytics-consent-form-modal-CHZ3I37v.js → analytics-consent-form-modal-CVNugqzu.js} +1 -1
  16. package/build/assets/api-key-entry-screen-M6su2VSf.js +1 -0
  17. package/build/assets/{app-settings-Db9ITeJH.js → app-settings-BlvBhBdc.js} +1 -1
  18. package/build/assets/automation-detail-BWrQk4Oa.js +1 -0
  19. package/build/assets/automations-list-ux9KvYsU.js +1 -0
  20. package/build/assets/back-nav-button-7dQJ2k3O.js +1 -0
  21. package/build/assets/backend-form-modal-CDnEYjaU.js +1 -0
  22. package/build/assets/{backend-synced-settings-badge-Dc6c7GT4.js → backend-synced-settings-badge-BTIj-Ffq.js} +1 -1
  23. package/build/assets/base-modal-C2oy2EBG.js +1 -0
  24. package/build/assets/brand-button-DJ_S16rO.js +1 -0
  25. package/build/assets/{browser-D810xUYt.js → browser-CGM-k-sH.js} +2 -2
  26. package/build/assets/browser-store-DAsixKdU.js +1 -0
  27. package/build/assets/{browser-tab-B-aIqXRl.js → browser-tab-dvSPdvkm.js} +1 -1
  28. package/build/assets/{checkmark-DL7acQA7.js → checkmark-Dus0b6jt.js} +1 -1
  29. package/build/assets/{chevron-left-small-CVWf8TI6.js → chevron-left-small-_uvG7RVM.js} +1 -1
  30. package/build/assets/{circle-plus-check-toggle-P7ZZToV4.js → circle-plus-check-toggle-DKS8MAVV.js} +1 -1
  31. package/build/assets/{close-B5LROHR3.js → close-BU5iTc66.js} +1 -1
  32. package/build/assets/code-tag-BzyqOtPD.js +1 -0
  33. package/build/assets/combobox-caret-BJC7XJsz.js +1 -0
  34. package/build/assets/{command-store-DFN_17p1.js → command-store-CE1weJy8.js} +1 -1
  35. package/build/assets/{condenser-settings-wnEKhBof.js → condenser-settings-BolbDvm5.js} +1 -1
  36. package/build/assets/{confirmation-modal-Dau3w_sa.js → confirmation-modal-B5Ca6qFE.js} +1 -1
  37. package/build/assets/context-menu-list-item-7tAcm2c3.js +1 -0
  38. package/build/assets/conversation-D0N4dw_p.js +19 -0
  39. package/build/assets/conversation-DhRJuZLG.js +1 -0
  40. package/build/assets/conversation-panel-CNqHbS_Z.js +1 -0
  41. package/build/assets/conversation-service.api-BsJy6uuL.js +1 -0
  42. package/build/assets/conversation-state-store-D-w0uurj.js +1 -0
  43. package/build/assets/conversation-store-CC-isCnP.js +1 -0
  44. package/build/assets/{conversation-tab-empty-state-DyssnnWa.js → conversation-tab-empty-state-CStQLPVW.js} +1 -1
  45. package/build/assets/conversation-websocket-context-DvHgx_FE.js +3 -0
  46. package/build/assets/{copy-DYgmUdIw.js → copy-Chg-sFu3.js} +1 -1
  47. package/build/assets/{custom-toast-handlers-C-SZFmto.js → custom-toast-handlers-ufGJ6_Rc.js} +1 -1
  48. package/build/assets/declaration-CR6HMp29.js +1 -0
  49. package/build/assets/{device-verify-DqDlphsG.js → device-verify-C6mj28zv.js} +1 -1
  50. package/build/assets/dist-DNeWJ2bh.js +1 -0
  51. package/build/assets/dropdown-classes-BsVmxlNG.js +1 -0
  52. package/build/assets/edit-automation-modal-BpX-t-HD.js +1 -0
  53. package/build/assets/ellipsis-button-Vh5MvRZa.js +1 -0
  54. package/build/assets/entry.client-Ck9rQCg-.js +2 -0
  55. package/build/assets/enum-filter-dropdown-5JeF2RLb.js +1 -0
  56. package/build/assets/{environment-switch-overlay-XL8yCGP6.js → environment-switch-overlay-Tf_BIfeR.js} +1 -1
  57. package/build/assets/extensions-hub-CE9QOb5n.js +1 -0
  58. package/build/assets/{extensions-navigation-BYR8Giqq.js → extensions-navigation-DSLGNGbS.js} +1 -1
  59. package/build/assets/file-BTY6Gyy9.js +1 -0
  60. package/build/assets/files-tab-cL668j1I.js +1 -0
  61. package/build/assets/files-tab-store-m0ARqX_E.js +1 -0
  62. package/build/assets/{folder-ZZJVGgd7.js → folder-D1T2W1cj.js} +1 -1
  63. package/build/assets/git-control-bar-branch-button-DtIrOrie.js +27 -0
  64. package/build/assets/git-provider-icon-CHdGBdU2.js +1 -0
  65. package/build/assets/globe-Bzj_0oXT.js +1 -0
  66. package/build/assets/home-Cz2Veg56.js +1 -0
  67. package/build/assets/{i18n-CTohRuoO.js → i18n-DET2iOyh.js} +1 -1
  68. package/build/assets/install-server-modal-B9nXCS3u.js +1 -0
  69. package/build/assets/launch-CWz0dm4o.js +1 -0
  70. package/build/assets/{lesson-plan-dH5Bj0pN.js → lesson-plan-duSsqWVs.js} +1 -1
  71. package/build/assets/link-external-DGxVm4Ps.js +1 -0
  72. package/build/assets/{llm-client-DaH1TuyR.js → llm-client-CYEaUjGx.js} +1 -1
  73. package/build/assets/llm-settings-DFkXHuvT.js +1 -0
  74. package/build/assets/llm-settings-DhrdCXqX.js +1 -0
  75. package/build/assets/{loading-spinner-BPtYORNK.js → loading-spinner-5GT9q1xy.js} +1 -1
  76. package/build/assets/manage-backends-modal-DpBD_vR9.js +1 -0
  77. package/build/assets/manage-workspaces-modal-CtRbxREx.js +1 -0
  78. package/build/assets/manifest-eed90ff5.js +1 -0
  79. package/build/assets/{markdown-renderer-DMzf2i4x.js → markdown-renderer-B3IAVfv4.js} +1 -1
  80. package/build/assets/mcp-BUe7kiYM.js +9 -0
  81. package/build/assets/messages-dqp_KYyl.js +36 -0
  82. package/build/assets/{modal-backdrop-BAbgYsqB.js → modal-backdrop-RfNCrSpK.js} +1 -1
  83. package/build/assets/{modal-body-BI6Ru2Qr.js → modal-body-aoa2fx5W.js} +1 -1
  84. package/build/assets/modal-classes-6YqcqA6y.js +1 -0
  85. package/build/assets/{modal-close-button-t1Gh3qmL.js → modal-close-button-CtWOUMmw.js} +1 -1
  86. package/build/assets/{model-selector-SM9IUz-q.js → model-selector-BvSTrkhT.js} +1 -1
  87. package/build/assets/{navigation-context-D0YWpT8d.js → navigation-context-BdKYH32C.js} +1 -1
  88. package/build/assets/{navigation-link-Cn7KP3c5.js → navigation-link-U4vY9i_C.js} +1 -1
  89. package/build/assets/{openhands-logo-CnrF6LKb.js → openhands-logo-CCo0wJZX.js} +1 -1
  90. package/build/assets/{option-service.api-KvY_mZMY.js → option-service.api-DmNVxAvS.js} +1 -1
  91. package/build/assets/{organization-service.api-DzYTHTYC.js → organization-service.api-DbnougaQ.js} +1 -1
  92. package/build/assets/{path-utils-C3bQf6lJ.js → path-utils-onx24uF5.js} +1 -1
  93. package/build/assets/{plan-components-atxXCF0R.js → plan-components-CRDMQzsS.js} +1 -1
  94. package/build/assets/{planner-tab-BlrCpv-7.js → planner-tab-CmIjLz7q.js} +1 -1
  95. package/build/assets/{profiles-client-D6IkTJof.js → profiles-client-fEmgWkCW.js} +1 -1
  96. package/build/assets/{providers-Bx6EfrzZ.js → providers-CbD7fiic.js} +1 -1
  97. package/build/assets/proxy-BAdHH8QB.js +1 -0
  98. package/build/assets/{query-client-config-B7u9asM0.js → query-client-config-CRnGSujB.js} +1 -1
  99. package/build/assets/{recommended-automations-launcher-CgV8FyPK.js → recommended-automations-launcher-uTyODuzB.js} +3 -3
  100. package/build/assets/{root-dNntxffj.js → root-DmjpFpTu.js} +2 -2
  101. package/build/assets/root-Z2VHU4R3.css +1 -0
  102. package/build/assets/root-layout-DejMsKhy.js +2 -0
  103. package/build/assets/{sdk-section-page-DOIKvwSL.js → sdk-section-page-BgDlMhcq.js} +1 -1
  104. package/build/assets/{sdk-settings-schema-DsUf9wu1.js → sdk-settings-schema-CLmJ9sho.js} +1 -1
  105. package/build/assets/{search-27Owlc3A.js → search-SuJctqNJ.js} +1 -1
  106. package/build/assets/secrets-service-B7CxNinp.js +1 -0
  107. package/build/assets/secrets-settings-yK7CqIpm.js +1 -0
  108. package/build/assets/{server-client-DyAQ3NZ_.js → server-client-Kh4QSwDJ.js} +1 -1
  109. package/build/assets/{settings-BYkVX7vW.js → settings-DN5PpgRD.js} +1 -1
  110. package/build/assets/{settings-dropdown-input-BJYvGdg-.js → settings-dropdown-input-BtoovFre.js} +1 -1
  111. package/build/assets/{settings-gear-C77PgE_O.js → settings-gear-Dd8K2_8B.js} +1 -1
  112. package/build/assets/settings-index-DKC8IY1P.js +1 -0
  113. package/build/assets/{settings-input-Bn7F5C75.js → settings-input-CehsXnb3.js} +1 -1
  114. package/build/assets/settings-list-classes-E3v_f6QG.js +1 -0
  115. package/build/assets/settings-modal-DJ4kGzUx.js +1 -0
  116. package/build/assets/{settings-section-header-context-BgZe5YkE.js → settings-section-header-context-DewwJ0-F.js} +1 -1
  117. package/build/assets/settings-service.api-C3rxTtPj.js +1 -0
  118. package/build/assets/{settings-switch-BeIKrWms.js → settings-switch-BiBuS3xa.js} +1 -1
  119. package/build/assets/{settings-utils-B6Nl07io.js → settings-utils-DY04tWG1.js} +1 -1
  120. package/build/assets/{shared-conversation-AMyqXvpk.js → shared-conversation-h9YnBtCU.js} +1 -1
  121. package/build/assets/sidebar-mobile-menu-toggle-D0-AvsnT.js +1 -0
  122. package/build/assets/{sidebar-nav-link-BGjiJq-4.js → sidebar-nav-link-OhIeFyna.js} +1 -1
  123. package/build/assets/{sidebar-store-Uy3v0AOV.js → sidebar-store-DnQAJAE5.js} +1 -1
  124. package/build/assets/{skill-card-pill-row-DF1axQCG.js → skill-card-pill-row-BW9qvhoK.js} +1 -1
  125. package/build/assets/{skills-ChIKZPK4.js → skills-0GRKX5Xj.js} +1 -1
  126. package/build/assets/{skills-plugins-CcI_19lM.js → skills-plugins-DNcsNF88.js} +1 -1
  127. package/build/assets/skills-settings-7liFiSY6.js +2 -0
  128. package/build/assets/{styled-tooltip-CBzrri6o.js → styled-tooltip-hdfMXPQC.js} +1 -1
  129. package/build/assets/{switch-skeleton-DnC9wLp7.js → switch-skeleton-DSKqSx2A.js} +1 -1
  130. package/build/assets/{task-list-tab-DUJn1sgz.js → task-list-tab-DT6_zfUs.js} +1 -1
  131. package/build/assets/{terminal-DgQk1Ay6.js → terminal-CDhQGDua.js} +2 -2
  132. package/build/assets/{terminal-RmuaSdhJ.js → terminal-CPYWdo4j.js} +1 -1
  133. package/build/assets/{toggle-switch-Pvyp2RAN.js → toggle-switch-T2v6sJ6l.js} +1 -1
  134. package/build/assets/{typography-gpuWmrQO.js → typography-BDgnT7Yp.js} +1 -1
  135. package/build/assets/{u-check-circle-IUIfACQQ.js → u-check-circle-DOauqQKb.js} +1 -1
  136. package/build/assets/{u-check-circle-half-C1YxB6py.js → u-check-circle-half-steSK_JB.js} +1 -1
  137. package/build/assets/{u-circuit-BmVikJHu.js → u-circuit-x3ExjBbU.js} +1 -1
  138. package/build/assets/{u-edit-CFvXHqZk.js → u-edit-BbrptMCa.js} +1 -1
  139. package/build/assets/{use-active-conversation-BEFNwnFk.js → use-active-conversation-DHGcmjCK.js} +1 -1
  140. package/build/assets/use-agent-settings-schema-CLoTOSJI.js +1 -0
  141. package/build/assets/{use-agent-state-Bkrd1FZq.js → use-agent-state-PKrUPMJ3.js} +1 -1
  142. package/build/assets/{use-cloud-current-user-id-CvkXFnTT.js → use-cloud-current-user-id-Ddr75hEz.js} +1 -1
  143. package/build/assets/{use-config-Co1O8-Ey.js → use-config-OIMQLQ2s.js} +1 -1
  144. package/build/assets/{use-create-conversation-CEgXpkfH.js → use-create-conversation-Bszyp13O.js} +1 -1
  145. package/build/assets/{use-event-store-BT_gV3ut.js → use-event-store-BomO7ywK.js} +1 -1
  146. package/build/assets/{use-get-secrets-DuhdIA59.js → use-get-secrets-8Jby8ele.js} +1 -1
  147. package/build/assets/{use-handle-plan-click-Ckkm5eIY.js → use-handle-plan-click-CohJPvvW.js} +1 -1
  148. package/build/assets/use-is-authed-dw2026rR.js +1 -0
  149. package/build/assets/{use-is-creating-conversation-BZ5hB_Bg.js → use-is-creating-conversation-DX2qSlfL.js} +1 -1
  150. package/build/assets/{use-launch-skill-in-chat-fNN_xGZG.js → use-launch-skill-in-chat-sQNEOLGD.js} +1 -1
  151. package/build/assets/use-llm-profiles-C861aFAq.js +1 -0
  152. package/build/assets/use-runtime-is-ready-Do2h_hRl.js +1 -0
  153. package/build/assets/{use-save-settings-VUrj_QNG.js → use-save-settings-DkAOEfD9.js} +1 -1
  154. package/build/assets/use-settings-D5hbTS9t.js +1 -0
  155. package/build/assets/{use-settings-nav-items-1ZvovKSr.js → use-settings-nav-items-BcSbo02d.js} +1 -1
  156. package/build/assets/{use-skills-DAMLFjKU.js → use-skills-D7PS0fH0.js} +1 -1
  157. package/build/assets/{use-task-list-CLJbuJgM.js → use-task-list-CsT10CBb.js} +1 -1
  158. package/build/assets/{use-unified-vscode-url-DdSRw-6P.js → use-unified-vscode-url-DEoe-NRI.js} +1 -1
  159. package/build/assets/use-user-conversation-Cs5H1pUF.js +1 -0
  160. package/build/assets/{useMutation-DqrumCWD.js → useMutation-GSSKKebK.js} +1 -1
  161. package/build/assets/{useTranslation-DCOdSSMl.js → useTranslation-B6voJV4y.js} +1 -1
  162. package/build/assets/utils-DCVfKFRt.js +1 -0
  163. package/build/assets/{vendor~browser-BNjNhjFU.js → vendor~browser-BrOJLj3y.js} +1 -1
  164. package/build/assets/vendor~conversation-panel~conversation-C9o-K1hW.js +1 -0
  165. package/build/assets/vendor~conversation-panel~conversation~index-RXYdJYxU.js +1 -0
  166. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-VnmIZrq3.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-DJS-rJdI.js} +1 -1
  167. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DpAdkv8m.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-6ByzelMS.js} +1 -1
  168. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B92czPCF.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BED5W_c4.js} +1 -1
  169. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-By5W2oHN.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CCbqAFiI.js} +1 -1
  170. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BbFOrAjI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CG96FCly.js} +1 -1
  171. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-smY2r837.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-E4d6IEfI.js} +1 -1
  172. package/build/assets/{vendor~home~mcp~automations-list-Cs-TO3fK.js → vendor~home~mcp~automations-list-CZSK-lT2.js} +1 -1
  173. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-Z3nsiNNq.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CjJdFLoM.js} +1 -1
  174. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-DbfELDJu.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-m8dOii0J.js} +2 -2
  175. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-DjAjXS5J.js → vendor~root-layout~home~conversation-panel~conversation-B5WNMnt4.js} +1 -1
  176. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-CbAhtEMv.js +1 -0
  177. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-6Rm8U_Sr.js +9 -0
  178. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-BkQGKpye.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-tTR8C6m0.js} +1 -1
  179. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-Bbs7UJ5U.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-BJbu9kpL.js} +2 -2
  180. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-DTwbEEcX.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-hTzSytKK.js} +1 -1
  181. package/build/assets/{vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-CDXvdvb2.js → vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-DYXOLEck.js} +1 -1
  182. package/build/assets/{verification-settings-CsbvQcYS.js → verification-settings-Dlt8pINd.js} +1 -1
  183. package/build/assets/{vscode-tab-DjNArCgY.js → vscode-tab-DgepcYtF.js} +1 -1
  184. package/build/assets/{waiting-for-runtime-message-CntjExbU.js → waiting-for-runtime-message-CdK3btDZ.js} +1 -1
  185. package/build/assets/{x-mark-CrpjscNc.js → x-mark-BrkSPIiT.js} +1 -1
  186. package/build/index.html +4 -4
  187. package/build/locales/ar/openhands.json +20 -2
  188. package/build/locales/ca/openhands.json +20 -2
  189. package/build/locales/de/openhands.json +20 -2
  190. package/build/locales/en/openhands.json +20 -2
  191. package/build/locales/es/openhands.json +20 -2
  192. package/build/locales/fr/openhands.json +20 -2
  193. package/build/locales/it/openhands.json +20 -2
  194. package/build/locales/ja/openhands.json +20 -2
  195. package/build/locales/ko-KR/openhands.json +20 -2
  196. package/build/locales/no/openhands.json +20 -2
  197. package/build/locales/pt/openhands.json +20 -2
  198. package/build/locales/tr/openhands.json +20 -2
  199. package/build/locales/uk/openhands.json +20 -2
  200. package/build/locales/zh-CN/openhands.json +20 -2
  201. package/build/locales/zh-TW/openhands.json +20 -2
  202. package/dist/api/acp-service/acp-service.api.d.ts +18 -0
  203. package/dist/api/agent-server-adapter.cjs +3 -3
  204. package/dist/api/agent-server-adapter.cjs.map +1 -1
  205. package/dist/api/agent-server-adapter.js +54 -55
  206. package/dist/api/agent-server-adapter.js.map +1 -1
  207. package/dist/api/agent-server-client-options.cjs +1 -1
  208. package/dist/api/agent-server-client-options.cjs.map +1 -1
  209. package/dist/api/agent-server-client-options.d.ts +4 -0
  210. package/dist/api/agent-server-client-options.js +18 -12
  211. package/dist/api/agent-server-client-options.js.map +1 -1
  212. package/dist/api/agent-server-compatibility.cjs +1 -1
  213. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  214. package/dist/api/agent-server-compatibility.d.ts +1 -1
  215. package/dist/api/agent-server-compatibility.js +30 -25
  216. package/dist/api/agent-server-compatibility.js.map +1 -1
  217. package/dist/api/agent-server-config.cjs +1 -1
  218. package/dist/api/agent-server-config.cjs.map +1 -1
  219. package/dist/api/agent-server-config.d.ts +1 -51
  220. package/dist/api/agent-server-config.js +20 -70
  221. package/dist/api/agent-server-config.js.map +1 -1
  222. package/dist/api/backend-registry/active-store.cjs +1 -1
  223. package/dist/api/backend-registry/active-store.cjs.map +1 -1
  224. package/dist/api/backend-registry/active-store.d.ts +11 -5
  225. package/dist/api/backend-registry/active-store.js +36 -27
  226. package/dist/api/backend-registry/active-store.js.map +1 -1
  227. package/dist/api/backend-registry/auth.cjs +1 -1
  228. package/dist/api/backend-registry/auth.cjs.map +1 -1
  229. package/dist/api/backend-registry/auth.js +3 -9
  230. package/dist/api/backend-registry/auth.js.map +1 -1
  231. package/dist/api/backend-registry/default-backend.cjs +1 -1
  232. package/dist/api/backend-registry/default-backend.cjs.map +1 -1
  233. package/dist/api/backend-registry/default-backend.d.ts +9 -16
  234. package/dist/api/backend-registry/default-backend.js +5 -4
  235. package/dist/api/backend-registry/default-backend.js.map +1 -1
  236. package/dist/api/backend-registry/storage.cjs +1 -1
  237. package/dist/api/backend-registry/storage.cjs.map +1 -1
  238. package/dist/api/backend-registry/storage.js +67 -34
  239. package/dist/api/backend-registry/storage.js.map +1 -1
  240. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  241. package/dist/api/cloud/conversation-service.api.d.ts +8 -13
  242. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  243. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  244. package/dist/api/cloud/organization-service.api.d.ts +1 -2
  245. package/dist/api/cloud/organization-service.api.js.map +1 -1
  246. package/dist/api/cloud/proxy.cjs +1 -1
  247. package/dist/api/cloud/proxy.cjs.map +1 -1
  248. package/dist/api/cloud/proxy.d.ts +6 -6
  249. package/dist/api/cloud/proxy.js +33 -24
  250. package/dist/api/cloud/proxy.js.map +1 -1
  251. package/dist/api/cloud/sandbox-service.api.cjs.map +1 -1
  252. package/dist/api/cloud/sandbox-service.api.d.ts +3 -3
  253. package/dist/api/cloud/sandbox-service.api.js.map +1 -1
  254. package/dist/api/cloud/secrets-service.api.cjs.map +1 -1
  255. package/dist/api/cloud/secrets-service.api.d.ts +3 -4
  256. package/dist/api/cloud/secrets-service.api.js.map +1 -1
  257. package/dist/api/cloud/settings-service.api.cjs +1 -1
  258. package/dist/api/cloud/settings-service.api.cjs.map +1 -1
  259. package/dist/api/cloud/settings-service.api.js +5 -1
  260. package/dist/api/cloud/settings-service.api.js.map +1 -1
  261. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  262. package/dist/api/cloud/skills-service.api.d.ts +5 -5
  263. package/dist/api/cloud/skills-service.api.js.map +1 -1
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  265. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  266. package/dist/api/conversation-service/agent-server-conversation-service.api.js +115 -108
  267. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  268. package/dist/api/device-flow-client.cjs +1 -1
  269. package/dist/api/device-flow-client.cjs.map +1 -1
  270. package/dist/api/device-flow-client.d.ts +3 -5
  271. package/dist/api/device-flow-client.js +55 -66
  272. package/dist/api/device-flow-client.js.map +1 -1
  273. package/dist/api/event-service/event-service.api.cjs +1 -1
  274. package/dist/api/event-service/event-service.api.cjs.map +1 -1
  275. package/dist/api/event-service/event-service.api.d.ts +3 -3
  276. package/dist/api/event-service/event-service.api.js +17 -17
  277. package/dist/api/event-service/event-service.api.js.map +1 -1
  278. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  279. package/dist/api/git-service/agent-server-git-service.api.js +11 -11
  280. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  281. package/dist/api/runtime-service/agent-server-runtime-service.js +6 -6
  282. package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.cjs +2 -2
  283. package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.js +10 -10
  284. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.cjs.map +1 -1
  285. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.d.ts +5 -5
  286. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.js.map +1 -1
  287. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +1 -1
  288. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  289. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +1 -1
  290. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  291. package/dist/components/features/automations/automation-action-button-classes.d.ts +2 -2
  292. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  293. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  294. package/dist/components/features/backends/backend-form-modal.d.ts +1 -0
  295. package/dist/components/features/backends/backend-form-modal.js +203 -140
  296. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  297. package/dist/components/features/backends/backend-selector.cjs +1 -1
  298. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  299. package/dist/components/features/backends/backend-selector.js +117 -105
  300. package/dist/components/features/backends/backend-selector.js.map +1 -1
  301. package/dist/components/features/backends/backend-status-dot.cjs +1 -1
  302. package/dist/components/features/backends/backend-status-dot.cjs.map +1 -1
  303. package/dist/components/features/backends/backend-status-dot.d.ts +1 -1
  304. package/dist/components/features/backends/backend-status-dot.js +1 -1
  305. package/dist/components/features/backends/backend-status-dot.js.map +1 -1
  306. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  307. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  308. package/dist/components/features/backends/manage-backends-modal.js +81 -70
  309. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  310. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  311. package/dist/components/features/chat/change-agent-button.cjs.map +1 -1
  312. package/dist/components/features/chat/change-agent-button.js +59 -57
  313. package/dist/components/features/chat/change-agent-button.js.map +1 -1
  314. package/dist/components/features/chat/change-agent-context-menu.cjs +1 -1
  315. package/dist/components/features/chat/change-agent-context-menu.cjs.map +1 -1
  316. package/dist/components/features/chat/change-agent-context-menu.d.ts +3 -1
  317. package/dist/components/features/chat/change-agent-context-menu.js +30 -25
  318. package/dist/components/features/chat/change-agent-context-menu.js.map +1 -1
  319. package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
  320. package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
  321. package/dist/components/features/chat/chat-add-file-button.js +39 -38
  322. package/dist/components/features/chat/chat-add-file-button.js.map +1 -1
  323. package/dist/components/features/chat/chat-message.cjs +1 -1
  324. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  325. package/dist/components/features/chat/chat-message.d.ts +2 -1
  326. package/dist/components/features/chat/chat-message.js +185 -57
  327. package/dist/components/features/chat/chat-message.js.map +1 -1
  328. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  329. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  330. package/dist/components/features/chat/components/chat-input-actions.js +113 -113
  331. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  332. package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
  333. package/dist/components/features/chat/components/chat-input-model.cjs.map +1 -1
  334. package/dist/components/features/chat/components/chat-input-model.js +52 -51
  335. package/dist/components/features/chat/components/chat-input-model.js.map +1 -1
  336. package/dist/components/features/chat/components/slash-command-menu.cjs +2 -2
  337. package/dist/components/features/chat/components/slash-command-menu.cjs.map +1 -1
  338. package/dist/components/features/chat/components/slash-command-menu.js +38 -34
  339. package/dist/components/features/chat/components/slash-command-menu.js.map +1 -1
  340. package/dist/components/features/chat/git-control-bar-pr-button.cjs +1 -1
  341. package/dist/components/features/chat/git-control-bar-pr-button.cjs.map +1 -1
  342. package/dist/components/features/chat/git-control-bar-pr-button.js +16 -15
  343. package/dist/components/features/chat/git-control-bar-pr-button.js.map +1 -1
  344. package/dist/components/features/chat/git-control-bar-pull-button.cjs +1 -1
  345. package/dist/components/features/chat/git-control-bar-pull-button.cjs.map +1 -1
  346. package/dist/components/features/chat/git-control-bar-pull-button.js +16 -15
  347. package/dist/components/features/chat/git-control-bar-pull-button.js.map +1 -1
  348. package/dist/components/features/chat/git-control-bar-push-button.cjs +1 -1
  349. package/dist/components/features/chat/git-control-bar-push-button.cjs.map +1 -1
  350. package/dist/components/features/chat/git-control-bar-push-button.js +16 -15
  351. package/dist/components/features/chat/git-control-bar-push-button.js.map +1 -1
  352. package/dist/components/features/chat/git-control-bar.cjs +1 -1
  353. package/dist/components/features/chat/git-control-bar.cjs.map +1 -1
  354. package/dist/components/features/chat/git-control-bar.js +63 -62
  355. package/dist/components/features/chat/git-control-bar.js.map +1 -1
  356. package/dist/components/features/chat/pending-user-messages.cjs +1 -1
  357. package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
  358. package/dist/components/features/chat/pending-user-messages.js +27 -23
  359. package/dist/components/features/chat/pending-user-messages.js.map +1 -1
  360. package/dist/components/features/chat/switch-profile-button.cjs +1 -1
  361. package/dist/components/features/chat/switch-profile-button.cjs.map +1 -1
  362. package/dist/components/features/chat/switch-profile-button.js +26 -25
  363. package/dist/components/features/chat/switch-profile-button.js.map +1 -1
  364. package/dist/components/features/chat/switch-profile-context-menu.cjs +1 -1
  365. package/dist/components/features/chat/switch-profile-context-menu.cjs.map +1 -1
  366. package/dist/components/features/chat/switch-profile-context-menu.js +77 -67
  367. package/dist/components/features/chat/switch-profile-context-menu.js.map +1 -1
  368. package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs +1 -1
  369. package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs.map +1 -1
  370. package/dist/components/features/context-menu/context-menu-icon-text-with-description.d.ts +2 -1
  371. package/dist/components/features/context-menu/context-menu-icon-text-with-description.js +3 -2
  372. package/dist/components/features/context-menu/context-menu-icon-text-with-description.js.map +1 -1
  373. package/dist/components/features/context-menu/context-menu-icon-text.cjs +1 -1
  374. package/dist/components/features/context-menu/context-menu-icon-text.cjs.map +1 -1
  375. package/dist/components/features/context-menu/context-menu-icon-text.d.ts +2 -1
  376. package/dist/components/features/context-menu/context-menu-icon-text.js +20 -10
  377. package/dist/components/features/context-menu/context-menu-icon-text.js.map +1 -1
  378. package/dist/components/features/context-menu/context-menu-list-item.cjs +1 -1
  379. package/dist/components/features/context-menu/context-menu-list-item.cjs.map +1 -1
  380. package/dist/components/features/context-menu/context-menu-list-item.js +10 -9
  381. package/dist/components/features/context-menu/context-menu-list-item.js.map +1 -1
  382. package/dist/components/features/controls/agent-status.cjs +1 -1
  383. package/dist/components/features/controls/agent-status.js +12 -12
  384. package/dist/components/features/controls/git-tools-submenu.cjs +1 -1
  385. package/dist/components/features/controls/git-tools-submenu.cjs.map +1 -1
  386. package/dist/components/features/controls/git-tools-submenu.js +1 -1
  387. package/dist/components/features/controls/git-tools-submenu.js.map +1 -1
  388. package/dist/components/features/controls/macros-submenu.cjs +1 -1
  389. package/dist/components/features/controls/macros-submenu.cjs.map +1 -1
  390. package/dist/components/features/controls/macros-submenu.js +1 -1
  391. package/dist/components/features/controls/macros-submenu.js.map +1 -1
  392. package/dist/components/features/controls/server-status-context-menu-icon-text.cjs +1 -1
  393. package/dist/components/features/controls/server-status-context-menu-icon-text.cjs.map +1 -1
  394. package/dist/components/features/controls/server-status-context-menu-icon-text.js +14 -15
  395. package/dist/components/features/controls/server-status-context-menu-icon-text.js.map +1 -1
  396. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  397. package/dist/components/features/controls/server-status-context-menu.js +4 -4
  398. package/dist/components/features/controls/server-status.cjs +1 -1
  399. package/dist/components/features/controls/server-status.js +7 -7
  400. package/dist/components/features/controls/tools-context-menu-icon-text.cjs +1 -1
  401. package/dist/components/features/controls/tools-context-menu-icon-text.cjs.map +1 -1
  402. package/dist/components/features/controls/tools-context-menu-icon-text.js +16 -16
  403. package/dist/components/features/controls/tools-context-menu-icon-text.js.map +1 -1
  404. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs +1 -1
  405. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs.map +1 -1
  406. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js +11 -11
  407. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js.map +1 -1
  408. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  409. package/dist/components/features/conversation/conversation-name-with-status.js +11 -11
  410. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  411. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  412. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +60 -47
  413. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  414. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
  415. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
  416. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +86 -82
  417. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
  418. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  419. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +4 -4
  420. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  421. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +9 -9
  422. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  423. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  424. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +93 -93
  425. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  426. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  427. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  428. package/dist/components/features/conversation-panel/conversation-panel.js +177 -177
  429. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  430. package/dist/components/features/conversation-panel/ellipsis-button.cjs +1 -1
  431. package/dist/components/features/conversation-panel/ellipsis-button.cjs.map +1 -1
  432. package/dist/components/features/conversation-panel/ellipsis-button.js +13 -13
  433. package/dist/components/features/conversation-panel/ellipsis-button.js.map +1 -1
  434. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
  435. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
  436. package/dist/components/features/conversation-panel/local-new-conversation-menu.js +57 -53
  437. package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
  438. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs +1 -1
  439. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs.map +1 -1
  440. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js +3 -2
  441. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js.map +1 -1
  442. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs +1 -1
  443. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs.map +1 -1
  444. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js +11 -8
  445. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js.map +1 -1
  446. package/dist/components/features/conversation-panel/system-message-modal/tab-content.cjs.map +1 -1
  447. package/dist/components/features/conversation-panel/system-message-modal/tab-content.d.ts +2 -5
  448. package/dist/components/features/conversation-panel/system-message-modal/tab-content.js.map +1 -1
  449. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  450. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  451. package/dist/components/features/files-tab/file-content-viewer.js +45 -42
  452. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  453. package/dist/components/features/home/llm-not-configured-banner.d.ts +11 -0
  454. package/dist/components/features/home/shared/dropdown-item.cjs +1 -1
  455. package/dist/components/features/home/shared/dropdown-item.cjs.map +1 -1
  456. package/dist/components/features/home/shared/dropdown-item.js +20 -16
  457. package/dist/components/features/home/shared/dropdown-item.js.map +1 -1
  458. package/dist/components/features/home/shared/generic-dropdown-menu.cjs +1 -1
  459. package/dist/components/features/home/shared/generic-dropdown-menu.cjs.map +1 -1
  460. package/dist/components/features/home/shared/generic-dropdown-menu.js +23 -22
  461. package/dist/components/features/home/shared/generic-dropdown-menu.js.map +1 -1
  462. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
  463. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs.map +1 -1
  464. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +103 -102
  465. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js.map +1 -1
  466. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
  467. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs.map +1 -1
  468. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +68 -67
  469. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js.map +1 -1
  470. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  471. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  472. package/dist/components/features/mcp-page/custom-server-editor.js +62 -60
  473. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  474. package/dist/components/features/mcp-page/index.cjs +1 -1
  475. package/dist/components/features/mcp-page/index.d.ts +1 -0
  476. package/dist/components/features/mcp-page/index.js +1 -0
  477. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  478. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  479. package/dist/components/features/mcp-page/install-server-modal.js +141 -121
  480. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  481. package/dist/components/features/mcp-page/save-as-secret-toggle.cjs +2 -0
  482. package/dist/components/features/mcp-page/save-as-secret-toggle.cjs.map +1 -0
  483. package/dist/components/features/mcp-page/save-as-secret-toggle.d.ts +7 -0
  484. package/dist/components/features/mcp-page/save-as-secret-toggle.js +50 -0
  485. package/dist/components/features/mcp-page/save-as-secret-toggle.js.map +1 -0
  486. package/dist/components/features/onboarding/onboarding-modal.d.ts +2 -2
  487. package/dist/components/features/onboarding/steps/check-backend-step.d.ts +1 -1
  488. package/dist/components/features/onboarding/steps/choose-agent-step.d.ts +2 -1
  489. package/dist/components/features/onboarding/steps/setup-acp-secrets-step.d.ts +19 -10
  490. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  491. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.d.ts +5 -0
  492. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -0
  493. package/dist/components/features/settings/llm-profiles/profile-actions-menu.cjs +1 -1
  494. package/dist/components/features/settings/llm-profiles/profile-actions-menu.js +1 -0
  495. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  496. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  497. package/dist/components/features/skills/extensions-navigation.js +1 -1
  498. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  499. package/dist/components/shared/buttons/back-nav-button.cjs +2 -0
  500. package/dist/components/shared/buttons/back-nav-button.cjs.map +1 -0
  501. package/dist/components/shared/buttons/back-nav-button.d.ts +17 -0
  502. package/dist/components/shared/buttons/back-nav-button.js +33 -0
  503. package/dist/components/shared/buttons/back-nav-button.js.map +1 -0
  504. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  505. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +5 -5
  506. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  507. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  508. package/dist/components/shared/filters/enum-filter-dropdown.js +32 -31
  509. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  510. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  511. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  512. package/dist/components/shared/modals/confirmation-modals/base-modal.js +14 -13
  513. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  514. package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
  515. package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
  516. package/dist/components/shared/modals/settings/settings-modal.js +17 -16
  517. package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
  518. package/dist/components/shared/text-shimmer.cjs +2 -0
  519. package/dist/components/shared/text-shimmer.cjs.map +1 -0
  520. package/dist/components/shared/text-shimmer.d.ts +11 -0
  521. package/dist/components/shared/text-shimmer.js +43 -0
  522. package/dist/components/shared/text-shimmer.js.map +1 -0
  523. package/dist/constants/acp-providers.cjs +1 -1
  524. package/dist/constants/acp-providers.cjs.map +1 -1
  525. package/dist/constants/acp-providers.d.ts +16 -3
  526. package/dist/constants/acp-providers.js +0 -1
  527. package/dist/constants/acp-providers.js.map +1 -1
  528. package/dist/contexts/active-backend-context.cjs +1 -1
  529. package/dist/contexts/active-backend-context.cjs.map +1 -1
  530. package/dist/contexts/active-backend-context.js +32 -32
  531. package/dist/contexts/active-backend-context.js.map +1 -1
  532. package/dist/hooks/chat/use-chat-input-logic.cjs +1 -1
  533. package/dist/hooks/chat/use-chat-input-logic.cjs.map +1 -1
  534. package/dist/hooks/chat/use-chat-input-logic.js +13 -6
  535. package/dist/hooks/chat/use-chat-input-logic.js.map +1 -1
  536. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs +2 -0
  537. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs.map +1 -0
  538. package/dist/hooks/mutation/use-save-fields-as-secrets.d.ts +9 -0
  539. package/dist/hooks/mutation/use-save-fields-as-secrets.js +24 -0
  540. package/dist/hooks/mutation/use-save-fields-as-secrets.js.map +1 -0
  541. package/dist/hooks/mutation/use-unified-start-conversation.cjs +1 -1
  542. package/dist/hooks/mutation/use-unified-start-conversation.js +8 -8
  543. package/dist/hooks/mutation/use-unified-stop-conversation.cjs +1 -1
  544. package/dist/hooks/mutation/use-unified-stop-conversation.js +15 -15
  545. package/dist/hooks/query/use-acp-auth-status.d.ts +36 -0
  546. package/dist/hooks/query/use-agent-settings-schema.cjs +1 -1
  547. package/dist/hooks/query/use-agent-settings-schema.cjs.map +1 -1
  548. package/dist/hooks/query/use-agent-settings-schema.js +26 -16
  549. package/dist/hooks/query/use-agent-settings-schema.js.map +1 -1
  550. package/dist/hooks/query/use-backends-health.cjs +1 -1
  551. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  552. package/dist/hooks/query/use-backends-health.d.ts +2 -0
  553. package/dist/hooks/query/use-backends-health.js +31 -21
  554. package/dist/hooks/query/use-backends-health.js.map +1 -1
  555. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  556. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  557. package/dist/hooks/query/use-paginated-conversations.js +15 -14
  558. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  559. package/dist/hooks/query/use-settings.cjs +1 -1
  560. package/dist/hooks/query/use-settings.cjs.map +1 -1
  561. package/dist/hooks/query/use-settings.js +65 -52
  562. package/dist/hooks/query/use-settings.js.map +1 -1
  563. package/dist/hooks/query/use-user-conversation.cjs +1 -1
  564. package/dist/hooks/query/use-user-conversation.cjs.map +1 -1
  565. package/dist/hooks/query/use-user-conversation.js +20 -11
  566. package/dist/hooks/query/use-user-conversation.js.map +1 -1
  567. package/dist/hooks/use-agent-state.cjs +1 -1
  568. package/dist/hooks/use-agent-state.js +13 -13
  569. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  570. package/dist/hooks/use-conversation-name-context-menu.js +10 -10
  571. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  572. package/dist/hooks/use-llm-configured.d.ts +25 -0
  573. package/dist/hooks/use-runtime-is-ready.cjs +1 -1
  574. package/dist/hooks/use-runtime-is-ready.js +5 -5
  575. package/dist/i18n/declaration.cjs +1 -1
  576. package/dist/i18n/declaration.cjs.map +1 -1
  577. package/dist/i18n/declaration.d.ts +19 -1
  578. package/dist/i18n/declaration.js +1 -1
  579. package/dist/i18n/declaration.js.map +1 -1
  580. package/dist/i18n/translation.cjs +3 -3
  581. package/dist/i18n/translation.cjs.map +1 -1
  582. package/dist/i18n/translation.js +321 -15
  583. package/dist/i18n/translation.js.map +1 -1
  584. package/dist/icons/stop-circle.cjs +1 -1
  585. package/dist/icons/stop-circle.cjs.map +1 -1
  586. package/dist/icons/stop-circle.js +7 -10
  587. package/dist/icons/stop-circle.js.map +1 -1
  588. package/dist/locales/ar/openhands.json +20 -2
  589. package/dist/locales/ca/openhands.json +20 -2
  590. package/dist/locales/de/openhands.json +20 -2
  591. package/dist/locales/en/openhands.json +20 -2
  592. package/dist/locales/es/openhands.json +20 -2
  593. package/dist/locales/fr/openhands.json +20 -2
  594. package/dist/locales/it/openhands.json +20 -2
  595. package/dist/locales/ja/openhands.json +20 -2
  596. package/dist/locales/ko-KR/openhands.json +20 -2
  597. package/dist/locales/no/openhands.json +20 -2
  598. package/dist/locales/pt/openhands.json +20 -2
  599. package/dist/locales/tr/openhands.json +20 -2
  600. package/dist/locales/uk/openhands.json +20 -2
  601. package/dist/locales/zh-CN/openhands.json +20 -2
  602. package/dist/locales/zh-TW/openhands.json +20 -2
  603. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs +2 -0
  604. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs.map +1 -0
  605. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
  606. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
  607. package/dist/package.cjs +1 -1
  608. package/dist/package.cjs.map +1 -1
  609. package/dist/package.js +1 -1
  610. package/dist/package.js.map +1 -1
  611. package/dist/routes/conversation.cjs +1 -1
  612. package/dist/routes/conversation.cjs.map +1 -1
  613. package/dist/routes/conversation.js +1 -1
  614. package/dist/routes/conversation.js.map +1 -1
  615. package/dist/routes/llm-settings.cjs +1 -1
  616. package/dist/routes/llm-settings.cjs.map +1 -1
  617. package/dist/routes/llm-settings.js +55 -54
  618. package/dist/routes/llm-settings.js.map +1 -1
  619. package/dist/routes/secrets-settings.cjs +1 -1
  620. package/dist/routes/secrets-settings.cjs.map +1 -1
  621. package/dist/routes/secrets-settings.js +19 -27
  622. package/dist/routes/secrets-settings.js.map +1 -1
  623. package/dist/stores/conversation-store.cjs +1 -1
  624. package/dist/stores/conversation-store.cjs.map +1 -1
  625. package/dist/stores/conversation-store.d.ts +4 -0
  626. package/dist/stores/conversation-store.js +6 -0
  627. package/dist/stores/conversation-store.js.map +1 -1
  628. package/dist/types/agent-server/core/events/acp-tool-call-event.d.ts +6 -4
  629. package/dist/types/agent-server/core/events/system-event.d.ts +5 -0
  630. package/dist/types/automation.d.ts +15 -0
  631. package/dist/types/settings.d.ts +3 -1
  632. package/dist/ui/combobox-caret.cjs +1 -1
  633. package/dist/ui/combobox-caret.cjs.map +1 -1
  634. package/dist/ui/combobox-caret.d.ts +1 -1
  635. package/dist/ui/combobox-caret.js +9 -8
  636. package/dist/ui/combobox-caret.js.map +1 -1
  637. package/dist/ui/context-menu.cjs +1 -1
  638. package/dist/ui/context-menu.cjs.map +1 -1
  639. package/dist/ui/context-menu.js +9 -8
  640. package/dist/ui/context-menu.js.map +1 -1
  641. package/dist/ui/dropdown/dropdown-menu.cjs +1 -1
  642. package/dist/ui/dropdown/dropdown-menu.cjs.map +1 -1
  643. package/dist/ui/dropdown/dropdown-menu.js +21 -17
  644. package/dist/ui/dropdown/dropdown-menu.js.map +1 -1
  645. package/dist/ui/dropdown/dropdown.cjs +1 -1
  646. package/dist/ui/dropdown/dropdown.cjs.map +1 -1
  647. package/dist/ui/dropdown/dropdown.js +2 -2
  648. package/dist/ui/dropdown/dropdown.js.map +1 -1
  649. package/dist/utils/automation-schedule.d.ts +1 -0
  650. package/dist/utils/dropdown-classes.cjs +2 -0
  651. package/dist/utils/dropdown-classes.cjs.map +1 -0
  652. package/dist/utils/dropdown-classes.d.ts +32 -0
  653. package/dist/utils/dropdown-classes.js +8 -0
  654. package/dist/utils/dropdown-classes.js.map +1 -0
  655. package/dist/utils/form-control-classes.cjs +1 -1
  656. package/dist/utils/form-control-classes.cjs.map +1 -1
  657. package/dist/utils/form-control-classes.d.ts +18 -2
  658. package/dist/utils/form-control-classes.js +4 -3
  659. package/dist/utils/form-control-classes.js.map +1 -1
  660. package/dist/utils/git-control-bar-classes.cjs +2 -0
  661. package/dist/utils/git-control-bar-classes.cjs.map +1 -0
  662. package/dist/utils/git-control-bar-classes.d.ts +4 -0
  663. package/dist/utils/git-control-bar-classes.js +14 -0
  664. package/dist/utils/git-control-bar-classes.js.map +1 -0
  665. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  666. package/dist/utils/handle-event-for-ui.d.ts +6 -3
  667. package/dist/utils/handle-event-for-ui.js.map +1 -1
  668. package/dist/utils/mobile-top-bar-icon-button-classes.cjs +1 -1
  669. package/dist/utils/mobile-top-bar-icon-button-classes.cjs.map +1 -1
  670. package/dist/utils/mobile-top-bar-icon-button-classes.js +3 -3
  671. package/dist/utils/mobile-top-bar-icon-button-classes.js.map +1 -1
  672. package/dist/utils/modal-classes.cjs +2 -0
  673. package/dist/utils/modal-classes.cjs.map +1 -0
  674. package/dist/utils/modal-classes.d.ts +8 -0
  675. package/dist/utils/modal-classes.js +7 -0
  676. package/dist/utils/modal-classes.js.map +1 -0
  677. package/dist/utils/openhands-llm.cjs +2 -0
  678. package/dist/utils/openhands-llm.cjs.map +1 -0
  679. package/dist/utils/openhands-llm.d.ts +2 -0
  680. package/dist/utils/openhands-llm.js +9 -0
  681. package/dist/utils/openhands-llm.js.map +1 -0
  682. package/dist/utils/redact-custom-secrets.cjs +2 -0
  683. package/dist/utils/redact-custom-secrets.cjs.map +1 -0
  684. package/dist/utils/redact-custom-secrets.d.ts +6 -0
  685. package/dist/utils/redact-custom-secrets.js +10 -0
  686. package/dist/utils/redact-custom-secrets.js.map +1 -0
  687. package/dist/utils/status.cjs +1 -1
  688. package/dist/utils/status.cjs.map +1 -1
  689. package/dist/utils/status.d.ts +2 -1
  690. package/dist/utils/status.js +9 -8
  691. package/dist/utils/status.js.map +1 -1
  692. package/dist/utils/system-message-adapter.cjs +1 -1
  693. package/dist/utils/system-message-adapter.cjs.map +1 -1
  694. package/dist/utils/system-message-adapter.js +10 -7
  695. package/dist/utils/system-message-adapter.js.map +1 -1
  696. package/dist/utils/utils.cjs +1 -1
  697. package/dist/utils/utils.cjs.map +1 -1
  698. package/dist/utils/utils.d.ts +2 -1
  699. package/dist/utils/utils.js +21 -20
  700. package/dist/utils/utils.js.map +1 -1
  701. package/package.json +1 -1
  702. package/scripts/dev-safe.mjs +3 -1
  703. package/scripts/dev-static.mjs +2 -2
  704. package/scripts/dev-with-automation.mjs +283 -108
  705. package/scripts/static-build.mjs +20 -19
  706. package/scripts/static-server.mjs +50 -3
  707. package/build/assets/acp-providers-CbiRekh9.js +0 -1
  708. package/build/assets/active-backend-context-cCM1vYYZ.js +0 -1
  709. package/build/assets/add-backend-modal-DIUQzMPa.js +0 -1
  710. package/build/assets/agent-server-client-options-Bc5ZorQZ.js +0 -1
  711. package/build/assets/agent-server-compatibility-BlkUsrX2.js +0 -1
  712. package/build/assets/agent-server-conversation-service.api-C2V5SlHu.js +0 -5
  713. package/build/assets/api-key-entry-screen-B2gynaCp.js +0 -1
  714. package/build/assets/automation-detail-DJvbVSYK.js +0 -1
  715. package/build/assets/automations-list-6FDbI5dc.js +0 -1
  716. package/build/assets/backend-form-modal-Dnk33xA_.js +0 -1
  717. package/build/assets/base-modal-_dYTw1ri.js +0 -1
  718. package/build/assets/brand-button-Br7f0kZJ.js +0 -1
  719. package/build/assets/browser-store-Couc4S5D.js +0 -1
  720. package/build/assets/clock-BRjCgHTc.js +0 -1
  721. package/build/assets/combobox-caret-to1O8irE.js +0 -1
  722. package/build/assets/context-menu-list-item-CWNFpuiC.js +0 -1
  723. package/build/assets/conversation-DVrKU0oz.js +0 -19
  724. package/build/assets/conversation-Dlys-D5A.js +0 -1
  725. package/build/assets/conversation-panel-iF09WjZ4.js +0 -1
  726. package/build/assets/conversation-service.api-CCfztilW.js +0 -1
  727. package/build/assets/conversation-state-store-u5jepov0.js +0 -1
  728. package/build/assets/conversation-store-Z5iMCRpc.js +0 -1
  729. package/build/assets/conversation-websocket-context-DhJhqUna.js +0 -3
  730. package/build/assets/declaration-BNMqORFE.js +0 -1
  731. package/build/assets/dist-BxBP7tFD.js +0 -1
  732. package/build/assets/edit-automation-modal-BGzR3nfZ.js +0 -1
  733. package/build/assets/ellipsis-button-ZyLMPURn.js +0 -1
  734. package/build/assets/entry.client-1VMHpktY.js +0 -2
  735. package/build/assets/enum-filter-dropdown-CEgCdu4A.js +0 -1
  736. package/build/assets/extensions-hub-C651jsVh.js +0 -1
  737. package/build/assets/files-tab-R5z0lLdY.js +0 -1
  738. package/build/assets/files-tab-store-CDyVTXNT.js +0 -1
  739. package/build/assets/git-control-bar-branch-button-COdRAYHb.js +0 -27
  740. package/build/assets/git-provider-icon-BzLbc0yC.js +0 -1
  741. package/build/assets/home-e-egNUXZ.js +0 -1
  742. package/build/assets/install-server-modal-DHlbgqVH.js +0 -1
  743. package/build/assets/launch-CshDse3e.js +0 -1
  744. package/build/assets/link-external-D2POYx4c.js +0 -1
  745. package/build/assets/llm-settings-Bql-vydt.js +0 -1
  746. package/build/assets/llm-settings-C_tal6Ds.js +0 -1
  747. package/build/assets/manage-backends-modal-l7RkKfwX.js +0 -1
  748. package/build/assets/manage-workspaces-modal-DhKF_8z3.js +0 -1
  749. package/build/assets/manifest-3bf30d69.js +0 -1
  750. package/build/assets/mcp-ByeBfdfU.js +0 -9
  751. package/build/assets/messages-D0rWot7s.js +0 -36
  752. package/build/assets/proxy-CxydCnis.js +0 -1
  753. package/build/assets/root-DHeCXo9N.css +0 -1
  754. package/build/assets/root-layout-Czo9Ma6Q.js +0 -2
  755. package/build/assets/secrets-service-BsnKFc2x.js +0 -1
  756. package/build/assets/secrets-settings-Bz_UohPJ.js +0 -1
  757. package/build/assets/settings-client-C73C7IgV.js +0 -1
  758. package/build/assets/settings-index-Dz0BmdJD.js +0 -1
  759. package/build/assets/settings-list-classes-Bf80tWtc.js +0 -1
  760. package/build/assets/settings-modal-Brzgh5Yw.js +0 -1
  761. package/build/assets/settings-service.api-CZ3uWx4v.js +0 -1
  762. package/build/assets/sidebar-mobile-menu-toggle-Do_aA9Zm.js +0 -1
  763. package/build/assets/skills-settings-DlA5hlXw.js +0 -2
  764. package/build/assets/status-hp6M6E7E.js +0 -1
  765. package/build/assets/use-agent-settings-schema-33Un7UF2.js +0 -1
  766. package/build/assets/use-is-authed-BggE5wPj.js +0 -1
  767. package/build/assets/use-llm-profiles-DDOol3gK.js +0 -1
  768. package/build/assets/use-runtime-is-ready-B7EF4BKU.js +0 -1
  769. package/build/assets/use-settings-DQIZmIov.js +0 -1
  770. package/build/assets/use-user-conversation-C6hrMMtn.js +0 -1
  771. package/build/assets/utils-i18rdUj2.js +0 -1
  772. package/build/assets/vendor~conversation-panel~conversation-a9SyrrhV.js +0 -1
  773. package/build/assets/vendor~conversation-panel~conversation~index-C23ZXO4R.js +0 -1
  774. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js +0 -1
  775. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DzIXV3Ui.js +0 -9
  776. /package/build/assets/{automation-IdgZq6ZK.js → automation-XDPAjiZi.js} +0 -0
  777. /package/build/assets/{color-themes-DSaoIL6A.js → color-themes-B9pm9c-R.js} +0 -0
  778. /package/build/assets/{common-DR1t-EeP.js → common-DqjLSBOt.js} +0 -0
  779. /package/build/assets/{conversation-local-storage-UYl-SX-r.js → conversation-local-storage-YmOVXxxW.js} +0 -0
  780. /package/build/assets/{dist-C6t0EXL7.js → dist-C3NfioQC.js} +0 -0
  781. /package/build/assets/{environment-switch-store-C4ulFJKp.js → environment-switch-store-CiurvTtK.js} +0 -0
  782. /package/build/assets/{health-store-BDC2rM-X.js → health-store-B5f0S2FY.js} +0 -0
  783. /package/build/assets/{map-provider-COBVzZYo.js → map-provider-BJ_8KZKU.js} +0 -0
  784. /package/build/assets/{middleware-BC9EwbB9.js → middleware-CfatjPYZ.js} +0 -0
  785. /package/build/assets/{objectWithoutPropertiesLoose-Du6eBn-V.js → objectWithoutPropertiesLoose-DSQKyRhw.js} +0 -0
  786. /package/build/assets/{react-Do0CT17Y.js → react-Dy05vyj5.js} +0 -0
  787. /package/build/assets/{sdk-settings-field-metadata-CBPmeqYa.js → sdk-settings-field-metadata-DQiaIBie.js} +0 -0
  788. /package/build/assets/{settings-D_H-qsRm.js → settings-DGY6n4J2.js} +0 -0
  789. /package/build/assets/{settings-like-page-layout-classes-I0BDBEoq.js → settings-like-page-layout-classes-D7YjdTd0.js} +0 -0
  790. /package/build/assets/{use-breakpoint-DbJ6FkQ-.js → use-breakpoint-DF_RiQ6s.js} +0 -0
  791. /package/build/assets/{use-click-outside-element-DffgWWoZ.js → use-click-outside-element-DhxCUyWl.js} +0 -0
  792. /package/build/assets/{v4-CNn21NXa.js → v4-khGvL7i2.js} +0 -0
  793. /package/build/assets/{vendor~browser-DDiZgqD3.js → vendor~browser-DisFGEp9.js} +0 -0
  794. /package/build/assets/{vendor~browser-tab-BgwV1mxF.js → vendor~browser-tab-BxhTtM9_.js} +0 -0
  795. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DbvX3OcM.js → vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js} +0 -0
  796. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-iOsylxCS.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-BClAMeFe.js} +0 -0
  797. /package/build/assets/{vendor~files-tab-BGKayPiK.js → vendor~files-tab-BtkpAiMX.js} +0 -0
  798. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BW6261Sb.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CyZ-3lDQ.js} +0 -0
  799. /package/build/assets/{vendor~home~mcp~automations-list-DoPfwaXj.js → vendor~home~mcp~automations-list-BgV86Sti.js} +0 -0
  800. /package/build/assets/{vendor~launch-vdeRTWFu.js → vendor~launch-BXgl67Re.js} +0 -0
  801. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-D9P8e98a.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-CLlsvdNP.js} +0 -0
  802. /package/build/assets/{vendor~terminal-DUrOWGFE.js → vendor~terminal-DZaJIY8A.js} +0 -0
@@ -10,17 +10,18 @@ import { useQuery as c } from "../../../node_modules/@tanstack/react-query/build
10
10
  import { getAgentServerClientOptions as l } from "../../../api/agent-server-client-options.js";
11
11
  import { ModalBackdrop as u } from "../../shared/modals/modal-backdrop.js";
12
12
  import { MODAL_MAX_WIDTH_VIEWPORT as d, modalWidthClassName as f } from "../../shared/modals/modal-body.js";
13
- import { ModalCloseButton as p } from "../../shared/modals/modal-close-button.js";
14
- import { BrandButton as m } from "../settings/brand-button.js";
15
- import { ConfirmationModal as h } from "../../shared/modals/confirmation-modal.js";
16
- import { useBackendsHealth as g } from "../../../hooks/query/use-backends-health.js";
17
- import { BackendStatusDot as _ } from "./backend-status-dot.js";
18
- import { BackendFormModal as v } from "./backend-form-modal.js";
19
- import y from "react";
20
- import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
13
+ import { modalTitleLgClassName as p } from "../../../utils/modal-classes.js";
14
+ import { ModalCloseButton as m } from "../../shared/modals/modal-close-button.js";
15
+ import { BrandButton as h } from "../settings/brand-button.js";
16
+ import { ConfirmationModal as g } from "../../shared/modals/confirmation-modal.js";
17
+ import { isInvalidBackendApiKeyHealthError as _, useBackendsHealth as v } from "../../../hooks/query/use-backends-health.js";
18
+ import { BackendStatusDot as y } from "./backend-status-dot.js";
19
+ import { BackendFormModal as b } from "./backend-form-modal.js";
20
+ import x from "react";
21
+ import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
21
22
  //#region src/components/features/backends/manage-backends-modal.tsx
22
- var C = "inline-flex cursor-pointer items-center justify-center rounded-md p-1 text-muted transition-colors hover:bg-interactive-hover hover:text-white";
23
- function w({ backend: n }) {
23
+ var T = "inline-flex cursor-pointer items-center justify-center rounded-md p-1 text-muted transition-colors hover:bg-interactive-hover hover:text-white";
24
+ function E({ backend: n }) {
24
25
  let { t: r } = e("openhands"), { data: i } = c({
25
26
  queryKey: [
26
27
  "backend-version",
@@ -36,56 +37,66 @@ function w({ backend: n }) {
36
37
  staleTime: 6e4,
37
38
  enabled: n.kind === "local"
38
39
  });
39
- return i ? /* @__PURE__ */ x("span", {
40
+ return i ? /* @__PURE__ */ C("span", {
40
41
  className: "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 text-[var(--oh-text-dim)]",
41
42
  "data-testid": `manage-backends-version-${n.name}`,
42
43
  children: r(t.BACKEND$VERSION_LABEL, { version: i })
43
44
  }) : null;
44
45
  }
45
- function T({ backend: n, health: r, onEdit: a, onRemove: s }) {
46
- let { t: c } = e("openhands");
47
- return /* @__PURE__ */ S("li", {
46
+ function D({ backend: r, health: a, onEdit: s, onRemove: c }) {
47
+ let { t: l } = e("openhands"), u = _(a?.lastError), d, f = "text-[var(--oh-muted)]";
48
+ u ? (d = l(t.AUTH$INVALID_KEY), f = "text-red-300") : a?.isConnected === !0 ? (d = l(t.ONBOARDING$BACKEND_STATUS_CONNECTED), f = "text-green-300") : a?.isConnected === !1 ? (d = l(t.ONBOARDING$BACKEND_STATUS_DISCONNECTED), f = "text-red-300") : d = l(t.ONBOARDING$BACKEND_STATUS_CHECKING);
49
+ let p = u ? !1 : a?.isConnected ?? null;
50
+ return /* @__PURE__ */ w("li", {
48
51
  className: "flex items-center gap-3 px-3 py-3",
49
- "data-testid": `manage-backends-row-${n.name}`,
52
+ "data-testid": `manage-backends-row-${r.name}`,
50
53
  children: [
51
- /* @__PURE__ */ x(_, { isConnected: r?.isConnected ?? null }),
52
- /* @__PURE__ */ S("div", {
54
+ /* @__PURE__ */ C(y, { isConnected: p }),
55
+ /* @__PURE__ */ w("div", {
53
56
  className: "flex min-w-0 flex-1 flex-col",
54
- children: [/* @__PURE__ */ S("div", {
55
- className: "flex min-w-0 items-center gap-2",
56
- children: [/* @__PURE__ */ x("span", {
57
- className: "truncate text-sm text-white",
58
- children: n.name
59
- }), /* @__PURE__ */ x(w, { backend: n })]
60
- }), /* @__PURE__ */ x("span", {
61
- className: "truncate text-xs text-[var(--oh-muted)]",
62
- children: n.host
63
- })]
57
+ children: [
58
+ /* @__PURE__ */ w("div", {
59
+ className: "flex min-w-0 items-center gap-2",
60
+ children: [/* @__PURE__ */ C("span", {
61
+ className: "truncate text-sm text-white",
62
+ children: r.name
63
+ }), /* @__PURE__ */ C(E, { backend: r })]
64
+ }),
65
+ /* @__PURE__ */ C("span", {
66
+ className: "truncate text-xs text-[var(--oh-muted)]",
67
+ children: r.host
68
+ }),
69
+ /* @__PURE__ */ C("span", {
70
+ "data-testid": `manage-backends-status-${r.name}`,
71
+ className: n("truncate text-xs", f),
72
+ children: d
73
+ })
74
+ ]
64
75
  }),
65
- /* @__PURE__ */ x("span", {
76
+ /* @__PURE__ */ C("span", {
66
77
  className: "px-2 py-1 rounded-full text-[11px] uppercase tracking-wide text-[var(--oh-text-tertiary)] bg-[var(--oh-surface)] border border-[var(--oh-border)]",
67
- children: n.kind === "cloud" ? c(t.BACKEND$KIND_CLOUD) : c(t.BACKEND$KIND_LOCAL)
78
+ children: r.kind === "cloud" ? l(t.BACKEND$KIND_CLOUD) : l(t.BACKEND$KIND_LOCAL)
68
79
  }),
69
- /* @__PURE__ */ S("div", {
80
+ /* @__PURE__ */ w("div", {
70
81
  className: "flex shrink-0 items-center gap-0.5",
71
- children: [/* @__PURE__ */ x("button", {
82
+ children: [/* @__PURE__ */ C("button", {
72
83
  type: "button",
73
- onClick: a,
74
- "aria-label": c(t.BACKEND$EDIT),
75
- "data-testid": `manage-backends-edit-${n.name}`,
76
- className: C,
77
- children: /* @__PURE__ */ x(i, {
84
+ onClick: s,
85
+ "aria-label": l(t.BACKEND$EDIT),
86
+ "data-testid": `manage-backends-edit-${r.name}`,
87
+ className: T,
88
+ children: /* @__PURE__ */ C(i, {
78
89
  "aria-hidden": !0,
79
90
  className: "size-4",
80
91
  strokeWidth: 2
81
92
  })
82
- }), /* @__PURE__ */ x("button", {
93
+ }), /* @__PURE__ */ C("button", {
83
94
  type: "button",
84
- onClick: s,
85
- "aria-label": c(t.BACKEND$REMOVE),
86
- "data-testid": `manage-backends-remove-${n.name}`,
87
- className: C,
88
- children: /* @__PURE__ */ x(o, {
95
+ onClick: c,
96
+ "aria-label": l(t.BACKEND$REMOVE),
97
+ "data-testid": `manage-backends-remove-${r.name}`,
98
+ className: T,
99
+ children: /* @__PURE__ */ C(o, {
89
100
  "aria-hidden": !0,
90
101
  className: "size-4",
91
102
  strokeWidth: 2
@@ -95,42 +106,42 @@ function T({ backend: n, health: r, onEdit: a, onRemove: s }) {
95
106
  ]
96
107
  });
97
108
  }
98
- function E({ onClose: i }) {
99
- let { t: o } = e("openhands"), { backends: s, removeBackend: c } = r(), l = g(s, { probeDisabledOnce: !0 }), [_, C] = y.useState(null), [w, E] = y.useState(null), [D, O] = y.useState(!1);
100
- return /* @__PURE__ */ S(b, { children: [
101
- /* @__PURE__ */ x(u, {
109
+ function O({ onClose: i }) {
110
+ let { t: o } = e("openhands"), { backends: s, removeBackend: c } = r(), l = v(s, { probeDisabledOnce: !0 }), [_, y] = x.useState(null), [T, E] = x.useState(null), [O, k] = x.useState(!1);
111
+ return /* @__PURE__ */ w(S, { children: [
112
+ /* @__PURE__ */ C(u, {
102
113
  onClose: i,
103
114
  "aria-label": o(t.BACKEND$MANAGE_TITLE),
104
- children: /* @__PURE__ */ S("div", {
115
+ children: /* @__PURE__ */ w("div", {
105
116
  "data-testid": "manage-backends-modal",
106
117
  className: n("relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl", f("lg"), d, "max-h-[70vh]"),
107
118
  children: [
108
- /* @__PURE__ */ x(p, {
119
+ /* @__PURE__ */ C(m, {
109
120
  onClose: i,
110
121
  testId: "close-manage-backends-modal"
111
122
  }),
112
- /* @__PURE__ */ x("div", {
123
+ /* @__PURE__ */ C("div", {
113
124
  className: "p-5 pr-12",
114
- children: /* @__PURE__ */ x("h2", {
115
- className: "text-lg font-semibold",
125
+ children: /* @__PURE__ */ C("h2", {
126
+ className: p,
116
127
  children: o(t.BACKEND$MANAGE_TITLE)
117
128
  })
118
129
  }),
119
- /* @__PURE__ */ x("div", {
130
+ /* @__PURE__ */ C("div", {
120
131
  className: "flex min-h-0 flex-1 flex-col px-5",
121
- children: /* @__PURE__ */ x("div", {
132
+ children: /* @__PURE__ */ C("div", {
122
133
  className: "flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always",
123
134
  "data-testid": "manage-backends-list",
124
- children: s.length === 0 ? /* @__PURE__ */ x("p", {
135
+ children: s.length === 0 ? /* @__PURE__ */ C("p", {
125
136
  className: "px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]",
126
137
  children: o(t.BACKEND$MANAGE_EMPTY)
127
- }) : /* @__PURE__ */ x("ul", {
138
+ }) : /* @__PURE__ */ C("ul", {
128
139
  className: "divide-y divide-[var(--oh-border)]",
129
- children: s.map((e) => /* @__PURE__ */ x(T, {
140
+ children: s.map((e) => /* @__PURE__ */ C(D, {
130
141
  backend: e,
131
142
  health: l[e.id],
132
143
  onEdit: () => E(e),
133
- onRemove: () => C({
144
+ onRemove: () => y({
134
145
  id: e.id,
135
146
  name: e.name
136
147
  })
@@ -138,19 +149,19 @@ function E({ onClose: i }) {
138
149
  })
139
150
  })
140
151
  }),
141
- /* @__PURE__ */ S("div", {
152
+ /* @__PURE__ */ w("div", {
142
153
  className: "flex justify-end gap-2 p-5",
143
- children: [/* @__PURE__ */ x(m, {
154
+ children: [/* @__PURE__ */ C(h, {
144
155
  type: "button",
145
156
  variant: "secondary",
146
- onClick: () => O(!0),
157
+ onClick: () => k(!0),
147
158
  testId: "manage-backends-add",
148
- startContent: /* @__PURE__ */ x(a, {
159
+ startContent: /* @__PURE__ */ C(a, {
149
160
  width: 14,
150
161
  height: 14
151
162
  }),
152
163
  children: o(t.BACKEND$ADD)
153
- }), /* @__PURE__ */ x(m, {
164
+ }), /* @__PURE__ */ C(h, {
154
165
  type: "button",
155
166
  variant: "primary",
156
167
  onClick: i,
@@ -161,25 +172,25 @@ function E({ onClose: i }) {
161
172
  ]
162
173
  })
163
174
  }),
164
- D ? /* @__PURE__ */ x(v, {
175
+ O ? /* @__PURE__ */ C(b, {
165
176
  mode: "add",
166
- onClose: () => O(!1)
177
+ onClose: () => k(!1)
167
178
  }) : null,
168
- w ? /* @__PURE__ */ x(v, {
179
+ T ? /* @__PURE__ */ C(b, {
169
180
  mode: "edit",
170
- backend: w,
181
+ backend: T,
171
182
  onClose: () => E(null)
172
183
  }) : null,
173
- _ ? /* @__PURE__ */ x(h, {
184
+ _ ? /* @__PURE__ */ C(g, {
174
185
  text: o(t.BACKEND$REMOVE_CONFIRMATION, { name: _.name }),
175
186
  onConfirm: () => {
176
- _ && (c(_.id), C(null));
187
+ _ && (c(_.id), y(null));
177
188
  },
178
- onCancel: () => C(null)
189
+ onCancel: () => y(null)
179
190
  }) : null
180
191
  ] });
181
192
  }
182
193
  //#endregion
183
- export { E as ManageBackendsModal };
194
+ export { O as ManageBackendsModal };
184
195
 
185
196
  //# sourceMappingURL=manage-backends-modal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manage-backends-modal.js","names":[],"sources":["../../../../src/components/features/backends/manage-backends-modal.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Pencil, Plus, Trash2 } from \"lucide-react\";\n\nimport { ServerClient } from \"@openhands/typescript-client/clients\";\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ConfirmationModal } from \"#/components/shared/modals/confirmation-modal\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport {\n MODAL_MAX_WIDTH_VIEWPORT,\n modalWidthClassName,\n} from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport {\n useBackendsHealth,\n type BackendHealth,\n} from \"#/hooks/query/use-backends-health\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport { BackendFormModal } from \"./backend-form-modal\";\nimport { BackendStatusDot } from \"./backend-status-dot\";\n\nconst ROW_ACTION_BUTTON_CLASS =\n \"inline-flex cursor-pointer items-center justify-center rounded-md p-1 text-muted transition-colors hover:bg-interactive-hover hover:text-white\";\n\nfunction BackendVersion({ backend }: { backend: Backend }) {\n const { t } = useTranslation(\"openhands\");\n const { data: version } = useQuery({\n queryKey: [\"backend-version\", backend.host, backend.apiKey],\n queryFn: async () => {\n const info = await new ServerClient(\n getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: 5000,\n }),\n ).getServerInfo();\n return info.version ?? null;\n },\n retry: false,\n staleTime: 60_000,\n enabled: backend.kind === \"local\",\n });\n\n if (!version) return null;\n\n return (\n <span\n className=\"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 text-[var(--oh-text-dim)]\"\n data-testid={`manage-backends-version-${backend.name}`}\n >\n {t(I18nKey.BACKEND$VERSION_LABEL, { version })}\n </span>\n );\n}\n\ninterface ManageBackendsModalProps {\n onClose: () => void;\n}\n\ninterface PendingRemoval {\n id: string;\n name: string;\n}\n\ninterface BackendRowProps {\n backend: Backend;\n health: BackendHealth | undefined;\n onEdit: () => void;\n onRemove: () => void;\n}\n\nfunction BackendRow({ backend, health, onEdit, onRemove }: BackendRowProps) {\n const { t } = useTranslation(\"openhands\");\n\n return (\n <li\n className=\"flex items-center gap-3 px-3 py-3\"\n data-testid={`manage-backends-row-${backend.name}`}\n >\n <BackendStatusDot isConnected={health?.isConnected ?? null} />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-sm text-white\">{backend.name}</span>\n <BackendVersion backend={backend} />\n </div>\n <span className=\"truncate text-xs text-[var(--oh-muted)]\">\n {backend.host}\n </span>\n </div>\n <span className=\"px-2 py-1 rounded-full text-[11px] uppercase tracking-wide text-[var(--oh-text-tertiary)] bg-[var(--oh-surface)] border border-[var(--oh-border)]\">\n {backend.kind === \"cloud\"\n ? t(I18nKey.BACKEND$KIND_CLOUD)\n : t(I18nKey.BACKEND$KIND_LOCAL)}\n </span>\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={onEdit}\n aria-label={t(I18nKey.BACKEND$EDIT)}\n data-testid={`manage-backends-edit-${backend.name}`}\n className={ROW_ACTION_BUTTON_CLASS}\n >\n <Pencil aria-hidden className=\"size-4\" strokeWidth={2} />\n </button>\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={t(I18nKey.BACKEND$REMOVE)}\n data-testid={`manage-backends-remove-${backend.name}`}\n className={ROW_ACTION_BUTTON_CLASS}\n >\n <Trash2 aria-hidden className=\"size-4\" strokeWidth={2} />\n </button>\n </div>\n </li>\n );\n}\n\nexport function ManageBackendsModal({ onClose }: ManageBackendsModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { backends, removeBackend } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends, {\n probeDisabledOnce: true,\n });\n const [pendingRemoval, setPendingRemoval] =\n React.useState<PendingRemoval | null>(null);\n const [editingBackend, setEditingBackend] = React.useState<Backend | null>(\n null,\n );\n const [showAddForm, setShowAddForm] = React.useState(false);\n\n const handleConfirmRemoval = () => {\n if (!pendingRemoval) return;\n removeBackend(pendingRemoval.id);\n setPendingRemoval(null);\n };\n\n return (\n <>\n <ModalBackdrop\n onClose={onClose}\n aria-label={t(I18nKey.BACKEND$MANAGE_TITLE)}\n >\n <div\n data-testid=\"manage-backends-modal\"\n className={cn(\n \"relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl\",\n modalWidthClassName(\"lg\"),\n MODAL_MAX_WIDTH_VIEWPORT,\n \"max-h-[70vh]\",\n )}\n >\n <ModalCloseButton\n onClose={onClose}\n testId=\"close-manage-backends-modal\"\n />\n <div className=\"p-5 pr-12\">\n <h2 className=\"text-lg font-semibold\">\n {t(I18nKey.BACKEND$MANAGE_TITLE)}\n </h2>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col px-5\">\n <div\n className=\"flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always\"\n data-testid=\"manage-backends-list\"\n >\n {backends.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]\">\n {t(I18nKey.BACKEND$MANAGE_EMPTY)}\n </p>\n ) : (\n <ul className=\"divide-y divide-[var(--oh-border)]\">\n {backends.map((backend) => (\n <BackendRow\n key={backend.id}\n backend={backend}\n health={healthByBackendId[backend.id]}\n onEdit={() => setEditingBackend(backend)}\n onRemove={() =>\n setPendingRemoval({\n id: backend.id,\n name: backend.name,\n })\n }\n />\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 p-5\">\n <BrandButton\n type=\"button\"\n variant=\"secondary\"\n onClick={() => setShowAddForm(true)}\n testId=\"manage-backends-add\"\n startContent={<Plus width={14} height={14} />}\n >\n {t(I18nKey.BACKEND$ADD)}\n </BrandButton>\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={onClose}\n testId=\"manage-backends-done\"\n >\n {t(I18nKey.HOME$DONE)}\n </BrandButton>\n </div>\n </div>\n </ModalBackdrop>\n\n {showAddForm ? (\n <BackendFormModal mode=\"add\" onClose={() => setShowAddForm(false)} />\n ) : null}\n\n {editingBackend ? (\n <BackendFormModal\n mode=\"edit\"\n backend={editingBackend}\n onClose={() => setEditingBackend(null)}\n />\n ) : null}\n\n {pendingRemoval ? (\n <ConfirmationModal\n text={t(I18nKey.BACKEND$REMOVE_CONFIRMATION, {\n name: pendingRemoval.name,\n })}\n onConfirm={handleConfirmRemoval}\n onCancel={() => setPendingRemoval(null)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"manage-backends-modal.js","names":[],"sources":["../../../../src/components/features/backends/manage-backends-modal.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Pencil, Plus, Trash2 } from \"lucide-react\";\n\nimport { ServerClient } from \"@openhands/typescript-client/clients\";\nimport { type Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { ConfirmationModal } from \"#/components/shared/modals/confirmation-modal\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport {\n MODAL_MAX_WIDTH_VIEWPORT,\n modalWidthClassName,\n} from \"#/components/shared/modals/modal-body\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport {\n isInvalidBackendApiKeyHealthError,\n useBackendsHealth,\n type BackendHealth,\n} from \"#/hooks/query/use-backends-health\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport { modalTitleLgClassName } from \"#/utils/modal-classes\";\nimport { BackendFormModal } from \"./backend-form-modal\";\nimport { BackendStatusDot } from \"./backend-status-dot\";\n\nconst ROW_ACTION_BUTTON_CLASS =\n \"inline-flex cursor-pointer items-center justify-center rounded-md p-1 text-muted transition-colors hover:bg-interactive-hover hover:text-white\";\n\nfunction BackendVersion({ backend }: { backend: Backend }) {\n const { t } = useTranslation(\"openhands\");\n const { data: version } = useQuery({\n queryKey: [\"backend-version\", backend.host, backend.apiKey],\n queryFn: async () => {\n const info = await new ServerClient(\n getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: 5000,\n }),\n ).getServerInfo();\n return info.version ?? null;\n },\n retry: false,\n staleTime: 60_000,\n enabled: backend.kind === \"local\",\n });\n\n if (!version) return null;\n\n return (\n <span\n className=\"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 text-[var(--oh-text-dim)]\"\n data-testid={`manage-backends-version-${backend.name}`}\n >\n {t(I18nKey.BACKEND$VERSION_LABEL, { version })}\n </span>\n );\n}\n\ninterface ManageBackendsModalProps {\n onClose: () => void;\n}\n\ninterface PendingRemoval {\n id: string;\n name: string;\n}\n\ninterface BackendRowProps {\n backend: Backend;\n health: BackendHealth | undefined;\n onEdit: () => void;\n onRemove: () => void;\n}\n\nfunction BackendRow({ backend, health, onEdit, onRemove }: BackendRowProps) {\n const { t } = useTranslation(\"openhands\");\n const isInvalidApiKey = isInvalidBackendApiKeyHealthError(health?.lastError);\n let statusLabel: string;\n let statusClassName = \"text-[var(--oh-muted)]\";\n\n if (isInvalidApiKey) {\n statusLabel = t(I18nKey.AUTH$INVALID_KEY);\n statusClassName = \"text-red-300\";\n } else if (health?.isConnected === true) {\n statusLabel = t(I18nKey.ONBOARDING$BACKEND_STATUS_CONNECTED);\n statusClassName = \"text-green-300\";\n } else if (health?.isConnected === false) {\n statusLabel = t(I18nKey.ONBOARDING$BACKEND_STATUS_DISCONNECTED);\n statusClassName = \"text-red-300\";\n } else {\n statusLabel = t(I18nKey.ONBOARDING$BACKEND_STATUS_CHECKING);\n }\n const dotStatus = isInvalidApiKey ? false : (health?.isConnected ?? null);\n\n return (\n <li\n className=\"flex items-center gap-3 px-3 py-3\"\n data-testid={`manage-backends-row-${backend.name}`}\n >\n <BackendStatusDot isConnected={dotStatus} />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-sm text-white\">{backend.name}</span>\n <BackendVersion backend={backend} />\n </div>\n <span className=\"truncate text-xs text-[var(--oh-muted)]\">\n {backend.host}\n </span>\n <span\n data-testid={`manage-backends-status-${backend.name}`}\n className={cn(\"truncate text-xs\", statusClassName)}\n >\n {statusLabel}\n </span>\n </div>\n <span className=\"px-2 py-1 rounded-full text-[11px] uppercase tracking-wide text-[var(--oh-text-tertiary)] bg-[var(--oh-surface)] border border-[var(--oh-border)]\">\n {backend.kind === \"cloud\"\n ? t(I18nKey.BACKEND$KIND_CLOUD)\n : t(I18nKey.BACKEND$KIND_LOCAL)}\n </span>\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={onEdit}\n aria-label={t(I18nKey.BACKEND$EDIT)}\n data-testid={`manage-backends-edit-${backend.name}`}\n className={ROW_ACTION_BUTTON_CLASS}\n >\n <Pencil aria-hidden className=\"size-4\" strokeWidth={2} />\n </button>\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={t(I18nKey.BACKEND$REMOVE)}\n data-testid={`manage-backends-remove-${backend.name}`}\n className={ROW_ACTION_BUTTON_CLASS}\n >\n <Trash2 aria-hidden className=\"size-4\" strokeWidth={2} />\n </button>\n </div>\n </li>\n );\n}\n\nexport function ManageBackendsModal({ onClose }: ManageBackendsModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { backends, removeBackend } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends, {\n probeDisabledOnce: true,\n });\n const [pendingRemoval, setPendingRemoval] =\n React.useState<PendingRemoval | null>(null);\n const [editingBackend, setEditingBackend] = React.useState<Backend | null>(\n null,\n );\n const [showAddForm, setShowAddForm] = React.useState(false);\n\n const handleConfirmRemoval = () => {\n if (!pendingRemoval) return;\n removeBackend(pendingRemoval.id);\n setPendingRemoval(null);\n };\n\n return (\n <>\n <ModalBackdrop\n onClose={onClose}\n aria-label={t(I18nKey.BACKEND$MANAGE_TITLE)}\n >\n <div\n data-testid=\"manage-backends-modal\"\n className={cn(\n \"relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl\",\n modalWidthClassName(\"lg\"),\n MODAL_MAX_WIDTH_VIEWPORT,\n \"max-h-[70vh]\",\n )}\n >\n <ModalCloseButton\n onClose={onClose}\n testId=\"close-manage-backends-modal\"\n />\n <div className=\"p-5 pr-12\">\n <h2 className={modalTitleLgClassName}>\n {t(I18nKey.BACKEND$MANAGE_TITLE)}\n </h2>\n </div>\n\n <div className=\"flex min-h-0 flex-1 flex-col px-5\">\n <div\n className=\"flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always\"\n data-testid=\"manage-backends-list\"\n >\n {backends.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]\">\n {t(I18nKey.BACKEND$MANAGE_EMPTY)}\n </p>\n ) : (\n <ul className=\"divide-y divide-[var(--oh-border)]\">\n {backends.map((backend) => (\n <BackendRow\n key={backend.id}\n backend={backend}\n health={healthByBackendId[backend.id]}\n onEdit={() => setEditingBackend(backend)}\n onRemove={() =>\n setPendingRemoval({\n id: backend.id,\n name: backend.name,\n })\n }\n />\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 p-5\">\n <BrandButton\n type=\"button\"\n variant=\"secondary\"\n onClick={() => setShowAddForm(true)}\n testId=\"manage-backends-add\"\n startContent={<Plus width={14} height={14} />}\n >\n {t(I18nKey.BACKEND$ADD)}\n </BrandButton>\n <BrandButton\n type=\"button\"\n variant=\"primary\"\n onClick={onClose}\n testId=\"manage-backends-done\"\n >\n {t(I18nKey.HOME$DONE)}\n </BrandButton>\n </div>\n </div>\n </ModalBackdrop>\n\n {showAddForm ? (\n <BackendFormModal mode=\"add\" onClose={() => setShowAddForm(false)} />\n ) : null}\n\n {editingBackend ? (\n <BackendFormModal\n mode=\"edit\"\n backend={editingBackend}\n onClose={() => setEditingBackend(null)}\n />\n ) : null}\n\n {pendingRemoval ? (\n <ConfirmationModal\n text={t(I18nKey.BACKEND$REMOVE_CONFIRMATION, {\n name: pendingRemoval.name,\n })}\n onConfirm={handleConfirmRemoval}\n onCancel={() => setPendingRemoval(null)}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +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(`../../../types/agent-state.cjs`),i=require(`../../../utils/utils.cjs`),a=require(`../../../hooks/use-conversation-id.cjs`),o=require(`../../../stores/conversation-store.cjs`),s=require(`../../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),c=require(`../../../hooks/query/use-active-conversation.cjs`),l=require(`../../../hooks/use-agent-state.cjs`),u=require(`../../shared/buttons/styled-tooltip.cjs`),d=require(`../../../hooks/use-unified-websocket-status.cjs`),f=require(`../../../hooks/query/use-sub-conversation-task-polling.cjs`),p=require(`../../../ui/typography.cjs`),m=require(`../../../ui/combobox-caret.cjs`),h=require(`../../../icons/lesson-plan.cjs`),g=require(`../../../icons/code-pill.cjs`),_=require(`./change-agent-context-menu.cjs`),v=require(`../../../hooks/use-handle-plan-click.cjs`);let y=require(`react`);y=e.__toESM(y,1);let b=require(`react/jsx-runtime`);function x(){let[e,x]=(0,y.useState)(!1),{conversationMode:S,setConversationMode:C,subConversationTaskId:w}=o.useConversationStore(),{conversationId:T}=a.useOptionalConversationId(),E=!T,D=d.useUnifiedWebSocketStatus()===`OPEN`,{curAgentState:O}=l.useAgentState(),{t:k}=t.useTranslation(`openhands`),A=O===r.AgentState.RUNNING,{data:j}=c.useActiveConversation(),M=s.useQueryClient(),N=(0,y.useRef)(null),{taskStatus:P,subConversationId:F}=f.useSubConversationTaskPolling(w,j?.id||null);(0,y.useEffect)(()=>{P===`READY`&&F&&j?.id&&w&&N.current!==w&&(N.current=w,M.invalidateQueries({queryKey:[`user`,`conversation`,j.id]}))},[P,F,j?.id,w,M]);let{handlePlanClick:I,isCreatingConversation:L}=v.useHandlePlanClick();(0,y.useEffect)(()=>{(A||!D)&&e&&x(!1)},[A,e,D]);let R=E||A||L||!D;(0,y.useEffect)(()=>{if(R)return;let e=e=>{if(e.shiftKey&&e.key===`Tab`){e.preventDefault(),e.stopPropagation();let t=S===`code`?`plan`:`code`;t===`plan`?I(e):C(t)}};return document.addEventListener(`keydown`,e),()=>{document.removeEventListener(`keydown`,e)}},[R,S,C,I]);let z=t=>{t.preventDefault(),t.stopPropagation(),x(!e)},B=e=>{e.preventDefault(),e.stopPropagation(),C(`code`)},V=S===`code`,H=(0,y.useMemo)(()=>k(V?n.I18nKey.COMMON$CODE:n.I18nKey.COMMON$PLAN),[V,k]),U=(0,y.useMemo)(()=>V?(0,b.jsx)(g.CodePillIcon,{className:`h-[11px] w-[11px] shrink-0`}):(0,b.jsx)(h.default,{width:18,height:18,color:`currentColor`}),[V]),W=(0,b.jsxs)(`div`,{className:`relative`,children:[(0,b.jsxs)(`button`,{type:`button`,onClick:z,disabled:R,className:i.cn(`flex items-center rounded-[100px] transition-[border-color,color,opacity]`,V?`border border-transparent text-[var(--oh-muted)]`:`border border-[#597FF4] bg-[#4A67BD]`,!R&&V&&`cursor-pointer hover:text-white hover:bg-white/10`,!R&&!V&&`cursor-pointer text-white hover:bg-white/10`,R&&i.cn(`opacity-50 cursor-not-allowed`,V&&`border-transparent`)),children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-1 pl-1.5`,children:[U,(0,b.jsx)(p.Typography.Text,{className:`text-2.75 not-italic font-normal leading-5`,children:H})]}),(0,b.jsx)(m.ComboboxCaretInline,{isOpen:e})]}),e&&(0,b.jsx)(_.ChangeAgentContextMenu,{onClose:()=>x(!1),onCodeClick:B,onPlanClick:I})]});return E?(0,b.jsx)(u.StyledTooltip,{content:k(n.I18nKey.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION),placement:`top`,children:W}):W}exports.ChangeAgentButton=x;
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(`../../../types/agent-state.cjs`),i=require(`../../../utils/utils.cjs`),a=require(`../../../hooks/use-conversation-id.cjs`),o=require(`../../../stores/conversation-store.cjs`),s=require(`../../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),c=require(`../../../hooks/query/use-active-conversation.cjs`),l=require(`../../../hooks/use-agent-state.cjs`),u=require(`../../../utils/form-control-classes.cjs`),d=require(`../../shared/buttons/styled-tooltip.cjs`),f=require(`../../../hooks/use-unified-websocket-status.cjs`),p=require(`../../../hooks/query/use-sub-conversation-task-polling.cjs`),m=require(`../../../ui/typography.cjs`),h=require(`../../../ui/combobox-caret.cjs`),g=require(`../../../icons/lesson-plan.cjs`),_=require(`../../../icons/code-pill.cjs`),v=require(`./change-agent-context-menu.cjs`),y=require(`../../../hooks/use-handle-plan-click.cjs`);let b=require(`react`);b=e.__toESM(b,1);let x=require(`react/jsx-runtime`);function S(){let[e,S]=(0,b.useState)(!1),{conversationMode:C,setConversationMode:w,subConversationTaskId:T}=o.useConversationStore(),{conversationId:E}=a.useOptionalConversationId(),D=!E,O=f.useUnifiedWebSocketStatus()===`OPEN`,{curAgentState:k}=l.useAgentState(),{t:A}=t.useTranslation(`openhands`),j=k===r.AgentState.RUNNING,{data:M}=c.useActiveConversation(),N=s.useQueryClient(),P=(0,b.useRef)(null),{taskStatus:F,subConversationId:I}=p.useSubConversationTaskPolling(T,M?.id||null);(0,b.useEffect)(()=>{F===`READY`&&I&&M?.id&&T&&P.current!==T&&(P.current=T,N.invalidateQueries({queryKey:[`user`,`conversation`,M.id]}))},[F,I,M?.id,T,N]);let{handlePlanClick:L,isCreatingConversation:R}=y.useHandlePlanClick();(0,b.useEffect)(()=>{(j||!O)&&e&&S(!1)},[j,e,O]);let z=D||j||R||!O;(0,b.useEffect)(()=>{if(z)return;let e=e=>{if(e.shiftKey&&e.key===`Tab`){e.preventDefault(),e.stopPropagation();let t=C===`code`?`plan`:`code`;t===`plan`?L(e):w(t)}};return document.addEventListener(`keydown`,e),()=>{document.removeEventListener(`keydown`,e)}},[z,C,w,L]);let B=t=>{t.preventDefault(),t.stopPropagation(),S(!e)},V=e=>{e.preventDefault(),e.stopPropagation(),w(`code`)},H=C===`code`,U=(0,b.useMemo)(()=>A(H?n.I18nKey.COMMON$CODE:n.I18nKey.COMMON$PLAN),[H,A]),W=(0,b.useMemo)(()=>H?(0,x.jsx)(_.CodePillIcon,{className:`h-[11px] w-[11px] shrink-0`}):(0,x.jsx)(g.default,{width:18,height:18,color:`currentColor`}),[H]),G=(0,x.jsxs)(`div`,{className:`relative`,children:[(0,x.jsxs)(`button`,{type:`button`,onClick:B,disabled:z,className:i.cn(`flex items-center rounded-[100px]`,u.formControlTransitionClassName,H?`border border-transparent text-[var(--oh-muted)]`:`border border-[#597FF4] bg-[#4A67BD]`,!z&&H&&i.cn(`cursor-pointer`,`hover:text-white hover:bg-white/10`),!z&&!H&&`cursor-pointer text-white hover:bg-[#597FF4]`,z&&i.cn(`opacity-50 cursor-not-allowed`,H&&`border-transparent`)),children:[(0,x.jsxs)(`div`,{className:`flex items-center gap-1 pl-1.5`,children:[W,(0,x.jsx)(m.Typography.Text,{className:`text-2.75 not-italic font-normal leading-5`,children:U})]}),(0,x.jsx)(h.ComboboxCaretInline,{isOpen:e})]}),e&&(0,x.jsx)(v.ChangeAgentContextMenu,{activeMode:C,onClose:()=>S(!1),onCodeClick:V,onPlanClick:L})]});return D?(0,x.jsx)(d.StyledTooltip,{content:A(n.I18nKey.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION),placement:`top`,children:G}):G}exports.ChangeAgentButton=S;
2
2
  //# sourceMappingURL=change-agent-button.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"change-agent-button.cjs","names":[],"sources":["../../../../src/components/features/chat/change-agent-button.tsx"],"sourcesContent":["import React, { useMemo, useEffect, useState, useRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ComboboxCaretInline } from \"#/ui/combobox-caret\";\nimport LessonPlanIcon from \"#/icons/lesson-plan.svg?react\";\nimport { CodePillIcon } from \"#/icons/code-pill\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { ChangeAgentContextMenu } from \"./change-agent-context-menu\";\nimport { cn } from \"#/utils/utils\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useSubConversationTaskPolling } from \"#/hooks/query/use-sub-conversation-task-polling\";\nimport { useHandlePlanClick } from \"#/hooks/use-handle-plan-click\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\n\nexport function ChangeAgentButton() {\n const [contextMenuOpen, setContextMenuOpen] = useState<boolean>(false);\n\n const { conversationMode, setConversationMode, subConversationTaskId } =\n useConversationStore();\n\n const { conversationId } = useOptionalConversationId();\n\n const isHomePage = !conversationId;\n\n const webSocketStatus = useUnifiedWebSocketStatus();\n\n const isWebSocketConnected = webSocketStatus === \"OPEN\";\n\n const { curAgentState } = useAgentState();\n\n const { t } = useTranslation(\"openhands\");\n\n const isAgentRunning = curAgentState === AgentState.RUNNING;\n\n const { data: conversation } = useActiveConversation();\n\n const queryClient = useQueryClient();\n\n // Track the last invalidated task ID to prevent duplicate invalidations\n const lastInvalidatedTaskIdRef = useRef<string | null>(null);\n\n // Poll sub-conversation task status\n const { taskStatus, subConversationId } = useSubConversationTaskPolling(\n subConversationTaskId,\n conversation?.id || null,\n );\n\n // Invalidate parent conversation cache when task is ready (only once per task)\n useEffect(() => {\n if (\n taskStatus === \"READY\" &&\n subConversationId &&\n conversation?.id &&\n subConversationTaskId &&\n lastInvalidatedTaskIdRef.current !== subConversationTaskId\n ) {\n // Mark this task as invalidated to prevent duplicate calls\n lastInvalidatedTaskIdRef.current = subConversationTaskId;\n // Invalidate the parent conversation to refetch with updated sub_conversation_ids\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversation\", conversation.id],\n });\n }\n }, [\n taskStatus,\n subConversationId,\n conversation?.id,\n subConversationTaskId,\n queryClient,\n ]);\n\n // Get handlePlanClick and isCreatingConversation from custom hook\n const { handlePlanClick, isCreatingConversation } = useHandlePlanClick();\n\n // Close context menu when agent starts running\n useEffect(() => {\n if ((isAgentRunning || !isWebSocketConnected) && contextMenuOpen) {\n setContextMenuOpen(false);\n }\n }, [isAgentRunning, contextMenuOpen, isWebSocketConnected]);\n\n const isButtonDisabled =\n isHomePage ||\n isAgentRunning ||\n isCreatingConversation ||\n !isWebSocketConnected;\n\n // Handle Shift + Tab keyboard shortcut to cycle through modes\n useEffect(() => {\n if (isButtonDisabled) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // Check for Shift + Tab combination\n if (event.shiftKey && event.key === \"Tab\") {\n // Prevent default tab navigation behavior\n event.preventDefault();\n event.stopPropagation();\n\n // Cycle between modes: code -> plan -> code\n const nextMode = conversationMode === \"code\" ? \"plan\" : \"code\";\n if (nextMode === \"plan\") {\n handlePlanClick(event);\n } else {\n setConversationMode(nextMode);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n isButtonDisabled,\n conversationMode,\n setConversationMode,\n handlePlanClick,\n ]);\n\n const handleButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setContextMenuOpen(!contextMenuOpen);\n };\n\n const handleCodeClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConversationMode(\"code\");\n };\n\n const isExecutionAgent = conversationMode === \"code\";\n\n const buttonLabel = useMemo(() => {\n if (isExecutionAgent) {\n return t(I18nKey.COMMON$CODE);\n }\n return t(I18nKey.COMMON$PLAN);\n }, [isExecutionAgent, t]);\n\n const buttonIcon = useMemo(() => {\n if (isExecutionAgent) {\n return <CodePillIcon className=\"h-[11px] w-[11px] shrink-0\" />;\n }\n return <LessonPlanIcon width={18} height={18} color=\"currentColor\" />;\n }, [isExecutionAgent]);\n\n const button = (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={handleButtonClick}\n disabled={isButtonDisabled}\n className={cn(\n \"flex items-center rounded-[100px] transition-[border-color,color,opacity]\",\n isExecutionAgent\n ? \"border border-transparent text-[var(--oh-muted)]\"\n : \"border border-[#597FF4] bg-[#4A67BD]\",\n !isButtonDisabled &&\n isExecutionAgent &&\n \"cursor-pointer hover:text-white hover:bg-white/10\",\n !isButtonDisabled &&\n !isExecutionAgent &&\n \"cursor-pointer text-white hover:bg-white/10\",\n isButtonDisabled &&\n cn(\n \"opacity-50 cursor-not-allowed\",\n isExecutionAgent && \"border-transparent\",\n ),\n )}\n >\n <div className=\"flex items-center gap-1 pl-1.5\">\n {buttonIcon}\n <Typography.Text className=\"text-2.75 not-italic font-normal leading-5\">\n {buttonLabel}\n </Typography.Text>\n </div>\n <ComboboxCaretInline isOpen={contextMenuOpen} />\n </button>\n {contextMenuOpen && (\n <ChangeAgentContextMenu\n onClose={() => setContextMenuOpen(false)}\n onCodeClick={handleCodeClick}\n onPlanClick={handlePlanClick}\n />\n )}\n </div>\n );\n\n if (isHomePage) {\n return (\n <StyledTooltip\n content={t(I18nKey.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION)}\n placement=\"top\"\n >\n {button}\n </StyledTooltip>\n );\n }\n\n return button;\n}\n"],"mappings":"0kCAoBA,SAAgB,GAAoB,CAClC,GAAM,CAAC,EAAiB,IAAA,EAAA,EAAA,UAAwC,GAAM,CAEhE,CAAE,mBAAkB,sBAAqB,yBAC7C,EAAA,sBAAsB,CAElB,CAAE,kBAAmB,EAAA,2BAA2B,CAEhD,EAAa,CAAC,EAId,EAFkB,EAAA,2BAEK,GAAoB,OAE3C,CAAE,iBAAkB,EAAA,eAAe,CAEnC,CAAE,KAAM,EAAA,eAAe,YAAY,CAEnC,EAAiB,IAAkB,EAAA,WAAW,QAE9C,CAAE,KAAM,GAAiB,EAAA,uBAAuB,CAEhD,EAAc,EAAA,gBAAgB,CAG9B,GAAA,EAAA,EAAA,QAAiD,KAAK,CAGtD,CAAE,aAAY,qBAAsB,EAAA,8BACxC,EACA,GAAc,IAAM,KACrB,EAGD,EAAA,EAAA,eAAgB,CAEZ,IAAe,SACf,GACA,GAAc,IACd,GACA,EAAyB,UAAY,IAGrC,EAAyB,QAAU,EAEnC,EAAY,kBAAkB,CAC5B,SAAU,CAAC,OAAQ,eAAgB,EAAa,GAAG,CACpD,CAAC,GAEH,CACD,EACA,EACA,GAAc,GACd,EACA,EACD,CAAC,CAGF,GAAM,CAAE,kBAAiB,0BAA2B,EAAA,oBAAoB,EAGxE,EAAA,EAAA,eAAgB,EACT,GAAkB,CAAC,IAAyB,GAC/C,EAAmB,GAAM,EAE1B,CAAC,EAAgB,EAAiB,EAAqB,CAAC,CAE3D,IAAM,EACJ,GACA,GACA,GACA,CAAC,GAGH,EAAA,EAAA,eAAgB,CACd,GAAI,EACF,OAGF,IAAM,EAAiB,GAAyB,CAE9C,GAAI,EAAM,UAAY,EAAM,MAAQ,MAAO,CAEzC,EAAM,gBAAgB,CACtB,EAAM,iBAAiB,CAGvB,IAAM,EAAW,IAAqB,OAAS,OAAS,OACpD,IAAa,OACf,EAAgB,EAAM,CAEtB,EAAoB,EAAS,GAOnC,OAFA,SAAS,iBAAiB,UAAW,EAAc,KAEtC,CACX,SAAS,oBAAoB,UAAW,EAAc,GAEvD,CACD,EACA,EACA,EACA,EACD,CAAC,CAEF,IAAM,EAAqB,GAA+C,CACxE,EAAM,gBAAgB,CACtB,EAAM,iBAAiB,CACvB,EAAmB,CAAC,EAAgB,EAGhC,EAAmB,GAA+C,CACtE,EAAM,gBAAgB,CACtB,EAAM,iBAAiB,CACvB,EAAoB,OAAO,EAGvB,EAAmB,IAAqB,OAExC,GAAA,EAAA,EAAA,aAEK,EADL,EACO,EAAA,QAAQ,YAEV,EAAA,QAAQ,YAFc,CAG9B,CAAC,EAAkB,EAAE,CAAC,CAEnB,GAAA,EAAA,EAAA,aACA,GACK,EAAA,EAAA,KAAC,EAAA,aAAD,CAAc,UAAU,6BAA+B,CAAA,EAEzD,EAAA,EAAA,KAAC,EAAA,QAAD,CAAgB,MAAO,GAAI,OAAQ,GAAI,MAAM,eAAiB,CAAA,CACpE,CAAC,EAAiB,CAAC,CAEhB,GACJ,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oBAAf,EACE,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,QAAS,EACT,SAAU,EACV,UAAW,EAAA,GACT,4EACA,EACI,mDACA,uCACJ,CAAC,GACC,GACA,oDACF,CAAC,GACC,CAAC,GACD,8CACF,GACE,EAAA,GACE,gCACA,GAAoB,qBACrB,CACJ,UApBH,EAsBE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,CACG,GACD,EAAA,EAAA,KAAC,EAAA,WAAW,KAAZ,CAAiB,UAAU,sDACxB,EACe,CAAA,CACd,IACN,EAAA,EAAA,KAAC,EAAA,oBAAD,CAAqB,OAAQ,EAAmB,CAAA,CACzC,GACR,IACC,EAAA,EAAA,KAAC,EAAA,uBAAD,CACE,YAAe,EAAmB,GAAM,CACxC,YAAa,EACb,YAAa,EACb,CAAA,CAEA,GAcR,OAXI,GAEA,EAAA,EAAA,KAAC,EAAA,cAAD,CACE,QAAS,EAAE,EAAA,QAAQ,uCAAuC,CAC1D,UAAU,eAET,EACa,CAAA,CAIb"}
1
+ {"version":3,"file":"change-agent-button.cjs","names":[],"sources":["../../../../src/components/features/chat/change-agent-button.tsx"],"sourcesContent":["import React, { useMemo, useEffect, useState, useRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ComboboxCaretInline } from \"#/ui/combobox-caret\";\nimport LessonPlanIcon from \"#/icons/lesson-plan.svg?react\";\nimport { CodePillIcon } from \"#/icons/code-pill\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { ChangeAgentContextMenu } from \"./change-agent-context-menu\";\nimport { cn } from \"#/utils/utils\";\nimport {\n formControlMutedHoverClassName,\n formControlTransitionClassName,\n} from \"#/utils/form-control-classes\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useSubConversationTaskPolling } from \"#/hooks/query/use-sub-conversation-task-polling\";\nimport { useHandlePlanClick } from \"#/hooks/use-handle-plan-click\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\n\nexport function ChangeAgentButton() {\n const [contextMenuOpen, setContextMenuOpen] = useState<boolean>(false);\n\n const { conversationMode, setConversationMode, subConversationTaskId } =\n useConversationStore();\n\n const { conversationId } = useOptionalConversationId();\n\n const isHomePage = !conversationId;\n\n const webSocketStatus = useUnifiedWebSocketStatus();\n\n const isWebSocketConnected = webSocketStatus === \"OPEN\";\n\n const { curAgentState } = useAgentState();\n\n const { t } = useTranslation(\"openhands\");\n\n const isAgentRunning = curAgentState === AgentState.RUNNING;\n\n const { data: conversation } = useActiveConversation();\n\n const queryClient = useQueryClient();\n\n // Track the last invalidated task ID to prevent duplicate invalidations\n const lastInvalidatedTaskIdRef = useRef<string | null>(null);\n\n // Poll sub-conversation task status\n const { taskStatus, subConversationId } = useSubConversationTaskPolling(\n subConversationTaskId,\n conversation?.id || null,\n );\n\n // Invalidate parent conversation cache when task is ready (only once per task)\n useEffect(() => {\n if (\n taskStatus === \"READY\" &&\n subConversationId &&\n conversation?.id &&\n subConversationTaskId &&\n lastInvalidatedTaskIdRef.current !== subConversationTaskId\n ) {\n // Mark this task as invalidated to prevent duplicate calls\n lastInvalidatedTaskIdRef.current = subConversationTaskId;\n // Invalidate the parent conversation to refetch with updated sub_conversation_ids\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversation\", conversation.id],\n });\n }\n }, [\n taskStatus,\n subConversationId,\n conversation?.id,\n subConversationTaskId,\n queryClient,\n ]);\n\n // Get handlePlanClick and isCreatingConversation from custom hook\n const { handlePlanClick, isCreatingConversation } = useHandlePlanClick();\n\n // Close context menu when agent starts running\n useEffect(() => {\n if ((isAgentRunning || !isWebSocketConnected) && contextMenuOpen) {\n setContextMenuOpen(false);\n }\n }, [isAgentRunning, contextMenuOpen, isWebSocketConnected]);\n\n const isButtonDisabled =\n isHomePage ||\n isAgentRunning ||\n isCreatingConversation ||\n !isWebSocketConnected;\n\n // Handle Shift + Tab keyboard shortcut to cycle through modes\n useEffect(() => {\n if (isButtonDisabled) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // Check for Shift + Tab combination\n if (event.shiftKey && event.key === \"Tab\") {\n // Prevent default tab navigation behavior\n event.preventDefault();\n event.stopPropagation();\n\n // Cycle between modes: code -> plan -> code\n const nextMode = conversationMode === \"code\" ? \"plan\" : \"code\";\n if (nextMode === \"plan\") {\n handlePlanClick(event);\n } else {\n setConversationMode(nextMode);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n isButtonDisabled,\n conversationMode,\n setConversationMode,\n handlePlanClick,\n ]);\n\n const handleButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setContextMenuOpen(!contextMenuOpen);\n };\n\n const handleCodeClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConversationMode(\"code\");\n };\n\n const isExecutionAgent = conversationMode === \"code\";\n\n const buttonLabel = useMemo(() => {\n if (isExecutionAgent) {\n return t(I18nKey.COMMON$CODE);\n }\n return t(I18nKey.COMMON$PLAN);\n }, [isExecutionAgent, t]);\n\n const buttonIcon = useMemo(() => {\n if (isExecutionAgent) {\n return <CodePillIcon className=\"h-[11px] w-[11px] shrink-0\" />;\n }\n return <LessonPlanIcon width={18} height={18} color=\"currentColor\" />;\n }, [isExecutionAgent]);\n\n const button = (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={handleButtonClick}\n disabled={isButtonDisabled}\n className={cn(\n \"flex items-center rounded-[100px]\",\n formControlTransitionClassName,\n isExecutionAgent\n ? \"border border-transparent text-[var(--oh-muted)]\"\n : \"border border-[#597FF4] bg-[#4A67BD]\",\n !isButtonDisabled &&\n isExecutionAgent &&\n cn(\"cursor-pointer\", formControlMutedHoverClassName),\n !isButtonDisabled &&\n !isExecutionAgent &&\n \"cursor-pointer text-white hover:bg-[#597FF4]\",\n isButtonDisabled &&\n cn(\n \"opacity-50 cursor-not-allowed\",\n isExecutionAgent && \"border-transparent\",\n ),\n )}\n >\n <div className=\"flex items-center gap-1 pl-1.5\">\n {buttonIcon}\n <Typography.Text className=\"text-2.75 not-italic font-normal leading-5\">\n {buttonLabel}\n </Typography.Text>\n </div>\n <ComboboxCaretInline isOpen={contextMenuOpen} />\n </button>\n {contextMenuOpen && (\n <ChangeAgentContextMenu\n activeMode={conversationMode}\n onClose={() => setContextMenuOpen(false)}\n onCodeClick={handleCodeClick}\n onPlanClick={handlePlanClick}\n />\n )}\n </div>\n );\n\n if (isHomePage) {\n return (\n <StyledTooltip\n content={t(I18nKey.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION)}\n placement=\"top\"\n >\n {button}\n </StyledTooltip>\n );\n }\n\n return button;\n}\n"],"mappings":"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"}
@@ -7,95 +7,97 @@ import { useConversationStore as a } from "../../../stores/conversation-store.js
7
7
  import { useQueryClient as o } from "../../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
8
8
  import { useActiveConversation as s } from "../../../hooks/query/use-active-conversation.js";
9
9
  import { useAgentState as c } from "../../../hooks/use-agent-state.js";
10
- import { StyledTooltip as l } from "../../shared/buttons/styled-tooltip.js";
11
- import { useUnifiedWebSocketStatus as u } from "../../../hooks/use-unified-websocket-status.js";
12
- import { useSubConversationTaskPolling as d } from "../../../hooks/query/use-sub-conversation-task-polling.js";
13
- import { Typography as f } from "../../../ui/typography.js";
14
- import { ComboboxCaretInline as p } from "../../../ui/combobox-caret.js";
15
- import m from "../../../icons/lesson-plan.js";
16
- import { CodePillIcon as h } from "../../../icons/code-pill.js";
17
- import { ChangeAgentContextMenu as g } from "./change-agent-context-menu.js";
18
- import { useHandlePlanClick as _ } from "../../../hooks/use-handle-plan-click.js";
19
- import { useEffect as v, useMemo as y, useRef as b, useState as x } from "react";
20
- import { jsx as S, jsxs as C } from "react/jsx-runtime";
10
+ import { formControlTransitionClassName as l } from "../../../utils/form-control-classes.js";
11
+ import { StyledTooltip as u } from "../../shared/buttons/styled-tooltip.js";
12
+ import { useUnifiedWebSocketStatus as d } from "../../../hooks/use-unified-websocket-status.js";
13
+ import { useSubConversationTaskPolling as f } from "../../../hooks/query/use-sub-conversation-task-polling.js";
14
+ import { Typography as p } from "../../../ui/typography.js";
15
+ import { ComboboxCaretInline as m } from "../../../ui/combobox-caret.js";
16
+ import h from "../../../icons/lesson-plan.js";
17
+ import { CodePillIcon as g } from "../../../icons/code-pill.js";
18
+ import { ChangeAgentContextMenu as _ } from "./change-agent-context-menu.js";
19
+ import { useHandlePlanClick as v } from "../../../hooks/use-handle-plan-click.js";
20
+ import { useEffect as y, useMemo as b, useRef as x, useState as S } from "react";
21
+ import { jsx as C, jsxs as w } from "react/jsx-runtime";
21
22
  //#region src/components/features/chat/change-agent-button.tsx
22
- function w() {
23
- let [w, T] = x(!1), { conversationMode: E, setConversationMode: D, subConversationTaskId: O } = a(), { conversationId: k } = i(), A = !k, j = u() === "OPEN", { curAgentState: M } = c(), { t: N } = e("openhands"), P = M === n.RUNNING, { data: F } = s(), I = o(), L = b(null), { taskStatus: R, subConversationId: z } = d(O, F?.id || null);
24
- v(() => {
25
- R === "READY" && z && F?.id && O && L.current !== O && (L.current = O, I.invalidateQueries({ queryKey: [
23
+ function T() {
24
+ let [T, E] = S(!1), { conversationMode: D, setConversationMode: O, subConversationTaskId: k } = a(), { conversationId: A } = i(), j = !A, M = d() === "OPEN", { curAgentState: N } = c(), { t: P } = e("openhands"), F = N === n.RUNNING, { data: I } = s(), L = o(), R = x(null), { taskStatus: z, subConversationId: B } = f(k, I?.id || null);
25
+ y(() => {
26
+ z === "READY" && B && I?.id && k && R.current !== k && (R.current = k, L.invalidateQueries({ queryKey: [
26
27
  "user",
27
28
  "conversation",
28
- F.id
29
+ I.id
29
30
  ] }));
30
31
  }, [
31
- R,
32
32
  z,
33
- F?.id,
34
- O,
35
- I
33
+ B,
34
+ I?.id,
35
+ k,
36
+ L
36
37
  ]);
37
- let { handlePlanClick: B, isCreatingConversation: V } = _();
38
- v(() => {
39
- (P || !j) && w && T(!1);
38
+ let { handlePlanClick: V, isCreatingConversation: H } = v();
39
+ y(() => {
40
+ (F || !M) && T && E(!1);
40
41
  }, [
41
- P,
42
- w,
43
- j
42
+ F,
43
+ T,
44
+ M
44
45
  ]);
45
- let H = A || P || V || !j;
46
- v(() => {
47
- if (H) return;
46
+ let U = j || F || H || !M;
47
+ y(() => {
48
+ if (U) return;
48
49
  let e = (e) => {
49
50
  if (e.shiftKey && e.key === "Tab") {
50
51
  e.preventDefault(), e.stopPropagation();
51
- let t = E === "code" ? "plan" : "code";
52
- t === "plan" ? B(e) : D(t);
52
+ let t = D === "code" ? "plan" : "code";
53
+ t === "plan" ? V(e) : O(t);
53
54
  }
54
55
  };
55
56
  return document.addEventListener("keydown", e), () => {
56
57
  document.removeEventListener("keydown", e);
57
58
  };
58
59
  }, [
59
- H,
60
- E,
60
+ U,
61
61
  D,
62
- B
62
+ O,
63
+ V
63
64
  ]);
64
- let U = (e) => {
65
- e.preventDefault(), e.stopPropagation(), T(!w);
66
- }, W = (e) => {
67
- e.preventDefault(), e.stopPropagation(), D("code");
68
- }, G = E === "code", K = y(() => N(G ? t.COMMON$CODE : t.COMMON$PLAN), [G, N]), q = y(() => G ? /* @__PURE__ */ S(h, { className: "h-[11px] w-[11px] shrink-0" }) : /* @__PURE__ */ S(m, {
65
+ let W = (e) => {
66
+ e.preventDefault(), e.stopPropagation(), E(!T);
67
+ }, G = (e) => {
68
+ e.preventDefault(), e.stopPropagation(), O("code");
69
+ }, K = D === "code", q = b(() => P(K ? t.COMMON$CODE : t.COMMON$PLAN), [K, P]), J = b(() => K ? /* @__PURE__ */ C(g, { className: "h-[11px] w-[11px] shrink-0" }) : /* @__PURE__ */ C(h, {
69
70
  width: 18,
70
71
  height: 18,
71
72
  color: "currentColor"
72
- }), [G]), J = /* @__PURE__ */ C("div", {
73
+ }), [K]), Y = /* @__PURE__ */ w("div", {
73
74
  className: "relative",
74
- children: [/* @__PURE__ */ C("button", {
75
+ children: [/* @__PURE__ */ w("button", {
75
76
  type: "button",
76
- onClick: U,
77
- disabled: H,
78
- className: r("flex items-center rounded-[100px] transition-[border-color,color,opacity]", G ? "border border-transparent text-[var(--oh-muted)]" : "border border-[#597FF4] bg-[#4A67BD]", !H && G && "cursor-pointer hover:text-white hover:bg-white/10", !H && !G && "cursor-pointer text-white hover:bg-white/10", H && r("opacity-50 cursor-not-allowed", G && "border-transparent")),
79
- children: [/* @__PURE__ */ C("div", {
77
+ onClick: W,
78
+ disabled: U,
79
+ className: r("flex items-center rounded-[100px]", l, K ? "border border-transparent text-[var(--oh-muted)]" : "border border-[#597FF4] bg-[#4A67BD]", !U && K && r("cursor-pointer", "hover:text-white hover:bg-white/10"), !U && !K && "cursor-pointer text-white hover:bg-[#597FF4]", U && r("opacity-50 cursor-not-allowed", K && "border-transparent")),
80
+ children: [/* @__PURE__ */ w("div", {
80
81
  className: "flex items-center gap-1 pl-1.5",
81
- children: [q, /* @__PURE__ */ S(f.Text, {
82
+ children: [J, /* @__PURE__ */ C(p.Text, {
82
83
  className: "text-2.75 not-italic font-normal leading-5",
83
- children: K
84
+ children: q
84
85
  })]
85
- }), /* @__PURE__ */ S(p, { isOpen: w })]
86
- }), w && /* @__PURE__ */ S(g, {
87
- onClose: () => T(!1),
88
- onCodeClick: W,
89
- onPlanClick: B
86
+ }), /* @__PURE__ */ C(m, { isOpen: T })]
87
+ }), T && /* @__PURE__ */ C(_, {
88
+ activeMode: D,
89
+ onClose: () => E(!1),
90
+ onCodeClick: G,
91
+ onPlanClick: V
90
92
  })]
91
93
  });
92
- return A ? /* @__PURE__ */ S(l, {
93
- content: N(t.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION),
94
+ return j ? /* @__PURE__ */ C(u, {
95
+ content: P(t.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION),
94
96
  placement: "top",
95
- children: J
96
- }) : J;
97
+ children: Y
98
+ }) : Y;
97
99
  }
98
100
  //#endregion
99
- export { w as ChangeAgentButton };
101
+ export { T as ChangeAgentButton };
100
102
 
101
103
  //# sourceMappingURL=change-agent-button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"change-agent-button.js","names":[],"sources":["../../../../src/components/features/chat/change-agent-button.tsx"],"sourcesContent":["import React, { useMemo, useEffect, useState, useRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ComboboxCaretInline } from \"#/ui/combobox-caret\";\nimport LessonPlanIcon from \"#/icons/lesson-plan.svg?react\";\nimport { CodePillIcon } from \"#/icons/code-pill\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { ChangeAgentContextMenu } from \"./change-agent-context-menu\";\nimport { cn } from \"#/utils/utils\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useSubConversationTaskPolling } from \"#/hooks/query/use-sub-conversation-task-polling\";\nimport { useHandlePlanClick } from \"#/hooks/use-handle-plan-click\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\n\nexport function ChangeAgentButton() {\n const [contextMenuOpen, setContextMenuOpen] = useState<boolean>(false);\n\n const { conversationMode, setConversationMode, subConversationTaskId } =\n useConversationStore();\n\n const { conversationId } = useOptionalConversationId();\n\n const isHomePage = !conversationId;\n\n const webSocketStatus = useUnifiedWebSocketStatus();\n\n const isWebSocketConnected = webSocketStatus === \"OPEN\";\n\n const { curAgentState } = useAgentState();\n\n const { t } = useTranslation(\"openhands\");\n\n const isAgentRunning = curAgentState === AgentState.RUNNING;\n\n const { data: conversation } = useActiveConversation();\n\n const queryClient = useQueryClient();\n\n // Track the last invalidated task ID to prevent duplicate invalidations\n const lastInvalidatedTaskIdRef = useRef<string | null>(null);\n\n // Poll sub-conversation task status\n const { taskStatus, subConversationId } = useSubConversationTaskPolling(\n subConversationTaskId,\n conversation?.id || null,\n );\n\n // Invalidate parent conversation cache when task is ready (only once per task)\n useEffect(() => {\n if (\n taskStatus === \"READY\" &&\n subConversationId &&\n conversation?.id &&\n subConversationTaskId &&\n lastInvalidatedTaskIdRef.current !== subConversationTaskId\n ) {\n // Mark this task as invalidated to prevent duplicate calls\n lastInvalidatedTaskIdRef.current = subConversationTaskId;\n // Invalidate the parent conversation to refetch with updated sub_conversation_ids\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversation\", conversation.id],\n });\n }\n }, [\n taskStatus,\n subConversationId,\n conversation?.id,\n subConversationTaskId,\n queryClient,\n ]);\n\n // Get handlePlanClick and isCreatingConversation from custom hook\n const { handlePlanClick, isCreatingConversation } = useHandlePlanClick();\n\n // Close context menu when agent starts running\n useEffect(() => {\n if ((isAgentRunning || !isWebSocketConnected) && contextMenuOpen) {\n setContextMenuOpen(false);\n }\n }, [isAgentRunning, contextMenuOpen, isWebSocketConnected]);\n\n const isButtonDisabled =\n isHomePage ||\n isAgentRunning ||\n isCreatingConversation ||\n !isWebSocketConnected;\n\n // Handle Shift + Tab keyboard shortcut to cycle through modes\n useEffect(() => {\n if (isButtonDisabled) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // Check for Shift + Tab combination\n if (event.shiftKey && event.key === \"Tab\") {\n // Prevent default tab navigation behavior\n event.preventDefault();\n event.stopPropagation();\n\n // Cycle between modes: code -> plan -> code\n const nextMode = conversationMode === \"code\" ? \"plan\" : \"code\";\n if (nextMode === \"plan\") {\n handlePlanClick(event);\n } else {\n setConversationMode(nextMode);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n isButtonDisabled,\n conversationMode,\n setConversationMode,\n handlePlanClick,\n ]);\n\n const handleButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setContextMenuOpen(!contextMenuOpen);\n };\n\n const handleCodeClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConversationMode(\"code\");\n };\n\n const isExecutionAgent = conversationMode === \"code\";\n\n const buttonLabel = useMemo(() => {\n if (isExecutionAgent) {\n return t(I18nKey.COMMON$CODE);\n }\n return t(I18nKey.COMMON$PLAN);\n }, [isExecutionAgent, t]);\n\n const buttonIcon = useMemo(() => {\n if (isExecutionAgent) {\n return <CodePillIcon className=\"h-[11px] w-[11px] shrink-0\" />;\n }\n return <LessonPlanIcon width={18} height={18} color=\"currentColor\" />;\n }, [isExecutionAgent]);\n\n const button = (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={handleButtonClick}\n disabled={isButtonDisabled}\n className={cn(\n \"flex items-center rounded-[100px] transition-[border-color,color,opacity]\",\n isExecutionAgent\n ? \"border border-transparent text-[var(--oh-muted)]\"\n : \"border border-[#597FF4] bg-[#4A67BD]\",\n !isButtonDisabled &&\n isExecutionAgent &&\n \"cursor-pointer hover:text-white hover:bg-white/10\",\n !isButtonDisabled &&\n !isExecutionAgent &&\n \"cursor-pointer text-white hover:bg-white/10\",\n isButtonDisabled &&\n cn(\n \"opacity-50 cursor-not-allowed\",\n isExecutionAgent && \"border-transparent\",\n ),\n )}\n >\n <div className=\"flex items-center gap-1 pl-1.5\">\n {buttonIcon}\n <Typography.Text className=\"text-2.75 not-italic font-normal leading-5\">\n {buttonLabel}\n </Typography.Text>\n </div>\n <ComboboxCaretInline isOpen={contextMenuOpen} />\n </button>\n {contextMenuOpen && (\n <ChangeAgentContextMenu\n onClose={() => setContextMenuOpen(false)}\n onCodeClick={handleCodeClick}\n onPlanClick={handlePlanClick}\n />\n )}\n </div>\n );\n\n if (isHomePage) {\n return (\n <StyledTooltip\n content={t(I18nKey.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION)}\n placement=\"top\"\n >\n {button}\n </StyledTooltip>\n );\n }\n\n return button;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,IAAoB;CAClC,IAAM,CAAC,GAAiB,KAAsB,EAAkB,GAAM,EAEhE,EAAE,qBAAkB,wBAAqB,6BAC7C,GAAsB,EAElB,EAAE,sBAAmB,GAA2B,EAEhD,IAAa,CAAC,GAId,IAFkB,GAEK,KAAoB,QAE3C,EAAE,qBAAkB,GAAe,EAEnC,EAAE,SAAM,EAAe,YAAY,EAEnC,IAAiB,MAAkB,EAAW,SAE9C,EAAE,MAAM,MAAiB,GAAuB,EAEhD,IAAc,GAAgB,EAG9B,IAA2B,EAAsB,KAAK,EAGtD,EAAE,eAAY,yBAAsB,EACxC,GACA,GAAc,MAAM,KACrB;AAGD,SAAgB;AACd,EACE,MAAe,WACf,KACA,GAAc,MACd,KACA,EAAyB,YAAY,MAGrC,EAAyB,UAAU,GAEnC,EAAY,kBAAkB,EAC5B,UAAU;GAAC;GAAQ;GAAgB,EAAa;GAAG,EACpD,CAAC;IAEH;EACD;EACA;EACA,GAAc;EACd;EACA;EACD,CAAC;CAGF,IAAM,EAAE,oBAAiB,8BAA2B,GAAoB;AAGxE,SAAgB;AACd,GAAK,KAAkB,CAAC,MAAyB,KAC/C,EAAmB,GAAM;IAE1B;EAAC;EAAgB;EAAiB;EAAqB,CAAC;CAE3D,IAAM,IACJ,KACA,KACA,KACA,CAAC;AAGH,SAAgB;AACd,MAAI,EACF;EAGF,IAAM,KAAiB,MAAyB;AAE9C,OAAI,EAAM,YAAY,EAAM,QAAQ,OAAO;AAGzC,IADA,EAAM,gBAAgB,EACtB,EAAM,iBAAiB;IAGvB,IAAM,IAAW,MAAqB,SAAS,SAAS;AACxD,IAAI,MAAa,SACf,EAAgB,EAAM,GAEtB,EAAoB,EAAS;;;AAOnC,SAFA,SAAS,iBAAiB,WAAW,EAAc,QAEtC;AACX,YAAS,oBAAoB,WAAW,EAAc;;IAEvD;EACD;EACA;EACA;EACA;EACD,CAAC;CAEF,IAAM,KAAqB,MAA+C;AAGxE,EAFA,EAAM,gBAAgB,EACtB,EAAM,iBAAiB,EACvB,EAAmB,CAAC,EAAgB;IAGhC,KAAmB,MAA+C;AAGtE,EAFA,EAAM,gBAAgB,EACtB,EAAM,iBAAiB,EACvB,EAAoB,OAAO;IAGvB,IAAmB,MAAqB,QAExC,IAAc,QAET,EADL,IACO,EAAQ,cAEV,EAAQ,YAFc,EAG9B,CAAC,GAAkB,EAAE,CAAC,EAEnB,IAAa,QACb,IACK,kBAAC,GAAD,EAAc,WAAU,8BAA+B,CAAA,GAEzD,kBAAC,GAAD;EAAgB,OAAO;EAAI,QAAQ;EAAI,OAAM;EAAiB,CAAA,EACpE,CAAC,EAAiB,CAAC,EAEhB,IACJ,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,UAAU;GACV,WAAW,EACT,6EACA,IACI,qDACA,wCACJ,CAAC,KACC,KACA,qDACF,CAAC,KACC,CAAC,KACD,+CACF,KACE,EACE,iCACA,KAAoB,qBACrB,CACJ;aApBH,CAsBE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,GACD,kBAAC,EAAW,MAAZ;KAAiB,WAAU;eACxB;KACe,CAAA,CACd;OACN,kBAAC,GAAD,EAAqB,QAAQ,GAAmB,CAAA,CACzC;MACR,KACC,kBAAC,GAAD;GACE,eAAe,EAAmB,GAAM;GACxC,aAAa;GACb,aAAa;GACb,CAAA,CAEA;;AAcR,QAXI,IAEA,kBAAC,GAAD;EACE,SAAS,EAAE,EAAQ,uCAAuC;EAC1D,WAAU;YAET;EACa,CAAA,GAIb"}
1
+ {"version":3,"file":"change-agent-button.js","names":[],"sources":["../../../../src/components/features/chat/change-agent-button.tsx"],"sourcesContent":["import React, { useMemo, useEffect, useState, useRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Typography } from \"#/ui/typography\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ComboboxCaretInline } from \"#/ui/combobox-caret\";\nimport LessonPlanIcon from \"#/icons/lesson-plan.svg?react\";\nimport { CodePillIcon } from \"#/icons/code-pill\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { ChangeAgentContextMenu } from \"./change-agent-context-menu\";\nimport { cn } from \"#/utils/utils\";\nimport {\n formControlMutedHoverClassName,\n formControlTransitionClassName,\n} from \"#/utils/form-control-classes\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useSubConversationTaskPolling } from \"#/hooks/query/use-sub-conversation-task-polling\";\nimport { useHandlePlanClick } from \"#/hooks/use-handle-plan-click\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\n\nexport function ChangeAgentButton() {\n const [contextMenuOpen, setContextMenuOpen] = useState<boolean>(false);\n\n const { conversationMode, setConversationMode, subConversationTaskId } =\n useConversationStore();\n\n const { conversationId } = useOptionalConversationId();\n\n const isHomePage = !conversationId;\n\n const webSocketStatus = useUnifiedWebSocketStatus();\n\n const isWebSocketConnected = webSocketStatus === \"OPEN\";\n\n const { curAgentState } = useAgentState();\n\n const { t } = useTranslation(\"openhands\");\n\n const isAgentRunning = curAgentState === AgentState.RUNNING;\n\n const { data: conversation } = useActiveConversation();\n\n const queryClient = useQueryClient();\n\n // Track the last invalidated task ID to prevent duplicate invalidations\n const lastInvalidatedTaskIdRef = useRef<string | null>(null);\n\n // Poll sub-conversation task status\n const { taskStatus, subConversationId } = useSubConversationTaskPolling(\n subConversationTaskId,\n conversation?.id || null,\n );\n\n // Invalidate parent conversation cache when task is ready (only once per task)\n useEffect(() => {\n if (\n taskStatus === \"READY\" &&\n subConversationId &&\n conversation?.id &&\n subConversationTaskId &&\n lastInvalidatedTaskIdRef.current !== subConversationTaskId\n ) {\n // Mark this task as invalidated to prevent duplicate calls\n lastInvalidatedTaskIdRef.current = subConversationTaskId;\n // Invalidate the parent conversation to refetch with updated sub_conversation_ids\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversation\", conversation.id],\n });\n }\n }, [\n taskStatus,\n subConversationId,\n conversation?.id,\n subConversationTaskId,\n queryClient,\n ]);\n\n // Get handlePlanClick and isCreatingConversation from custom hook\n const { handlePlanClick, isCreatingConversation } = useHandlePlanClick();\n\n // Close context menu when agent starts running\n useEffect(() => {\n if ((isAgentRunning || !isWebSocketConnected) && contextMenuOpen) {\n setContextMenuOpen(false);\n }\n }, [isAgentRunning, contextMenuOpen, isWebSocketConnected]);\n\n const isButtonDisabled =\n isHomePage ||\n isAgentRunning ||\n isCreatingConversation ||\n !isWebSocketConnected;\n\n // Handle Shift + Tab keyboard shortcut to cycle through modes\n useEffect(() => {\n if (isButtonDisabled) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // Check for Shift + Tab combination\n if (event.shiftKey && event.key === \"Tab\") {\n // Prevent default tab navigation behavior\n event.preventDefault();\n event.stopPropagation();\n\n // Cycle between modes: code -> plan -> code\n const nextMode = conversationMode === \"code\" ? \"plan\" : \"code\";\n if (nextMode === \"plan\") {\n handlePlanClick(event);\n } else {\n setConversationMode(nextMode);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n isButtonDisabled,\n conversationMode,\n setConversationMode,\n handlePlanClick,\n ]);\n\n const handleButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setContextMenuOpen(!contextMenuOpen);\n };\n\n const handleCodeClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setConversationMode(\"code\");\n };\n\n const isExecutionAgent = conversationMode === \"code\";\n\n const buttonLabel = useMemo(() => {\n if (isExecutionAgent) {\n return t(I18nKey.COMMON$CODE);\n }\n return t(I18nKey.COMMON$PLAN);\n }, [isExecutionAgent, t]);\n\n const buttonIcon = useMemo(() => {\n if (isExecutionAgent) {\n return <CodePillIcon className=\"h-[11px] w-[11px] shrink-0\" />;\n }\n return <LessonPlanIcon width={18} height={18} color=\"currentColor\" />;\n }, [isExecutionAgent]);\n\n const button = (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={handleButtonClick}\n disabled={isButtonDisabled}\n className={cn(\n \"flex items-center rounded-[100px]\",\n formControlTransitionClassName,\n isExecutionAgent\n ? \"border border-transparent text-[var(--oh-muted)]\"\n : \"border border-[#597FF4] bg-[#4A67BD]\",\n !isButtonDisabled &&\n isExecutionAgent &&\n cn(\"cursor-pointer\", formControlMutedHoverClassName),\n !isButtonDisabled &&\n !isExecutionAgent &&\n \"cursor-pointer text-white hover:bg-[#597FF4]\",\n isButtonDisabled &&\n cn(\n \"opacity-50 cursor-not-allowed\",\n isExecutionAgent && \"border-transparent\",\n ),\n )}\n >\n <div className=\"flex items-center gap-1 pl-1.5\">\n {buttonIcon}\n <Typography.Text className=\"text-2.75 not-italic font-normal leading-5\">\n {buttonLabel}\n </Typography.Text>\n </div>\n <ComboboxCaretInline isOpen={contextMenuOpen} />\n </button>\n {contextMenuOpen && (\n <ChangeAgentContextMenu\n activeMode={conversationMode}\n onClose={() => setContextMenuOpen(false)}\n onCodeClick={handleCodeClick}\n onPlanClick={handlePlanClick}\n />\n )}\n </div>\n );\n\n if (isHomePage) {\n return (\n <StyledTooltip\n content={t(I18nKey.CHANGE_AGENT$SWITCH_AFTER_CONVERSATION)}\n placement=\"top\"\n >\n {button}\n </StyledTooltip>\n );\n }\n\n return button;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAgB,IAAoB;CAClC,IAAM,CAAC,GAAiB,KAAsB,EAAkB,GAAM,EAEhE,EAAE,qBAAkB,wBAAqB,6BAC7C,GAAsB,EAElB,EAAE,sBAAmB,GAA2B,EAEhD,IAAa,CAAC,GAId,IAFkB,GAEK,KAAoB,QAE3C,EAAE,qBAAkB,GAAe,EAEnC,EAAE,SAAM,EAAe,YAAY,EAEnC,IAAiB,MAAkB,EAAW,SAE9C,EAAE,MAAM,MAAiB,GAAuB,EAEhD,IAAc,GAAgB,EAG9B,IAA2B,EAAsB,KAAK,EAGtD,EAAE,eAAY,yBAAsB,EACxC,GACA,GAAc,MAAM,KACrB;AAGD,SAAgB;AACd,EACE,MAAe,WACf,KACA,GAAc,MACd,KACA,EAAyB,YAAY,MAGrC,EAAyB,UAAU,GAEnC,EAAY,kBAAkB,EAC5B,UAAU;GAAC;GAAQ;GAAgB,EAAa;GAAG,EACpD,CAAC;IAEH;EACD;EACA;EACA,GAAc;EACd;EACA;EACD,CAAC;CAGF,IAAM,EAAE,oBAAiB,8BAA2B,GAAoB;AAGxE,SAAgB;AACd,GAAK,KAAkB,CAAC,MAAyB,KAC/C,EAAmB,GAAM;IAE1B;EAAC;EAAgB;EAAiB;EAAqB,CAAC;CAE3D,IAAM,IACJ,KACA,KACA,KACA,CAAC;AAGH,SAAgB;AACd,MAAI,EACF;EAGF,IAAM,KAAiB,MAAyB;AAE9C,OAAI,EAAM,YAAY,EAAM,QAAQ,OAAO;AAGzC,IADA,EAAM,gBAAgB,EACtB,EAAM,iBAAiB;IAGvB,IAAM,IAAW,MAAqB,SAAS,SAAS;AACxD,IAAI,MAAa,SACf,EAAgB,EAAM,GAEtB,EAAoB,EAAS;;;AAOnC,SAFA,SAAS,iBAAiB,WAAW,EAAc,QAEtC;AACX,YAAS,oBAAoB,WAAW,EAAc;;IAEvD;EACD;EACA;EACA;EACA;EACD,CAAC;CAEF,IAAM,KAAqB,MAA+C;AAGxE,EAFA,EAAM,gBAAgB,EACtB,EAAM,iBAAiB,EACvB,EAAmB,CAAC,EAAgB;IAGhC,KAAmB,MAA+C;AAGtE,EAFA,EAAM,gBAAgB,EACtB,EAAM,iBAAiB,EACvB,EAAoB,OAAO;IAGvB,IAAmB,MAAqB,QAExC,IAAc,QAET,EADL,IACO,EAAQ,cAEV,EAAQ,YAFc,EAG9B,CAAC,GAAkB,EAAE,CAAC,EAEnB,IAAa,QACb,IACK,kBAAC,GAAD,EAAc,WAAU,8BAA+B,CAAA,GAEzD,kBAAC,GAAD;EAAgB,OAAO;EAAI,QAAQ;EAAI,OAAM;EAAiB,CAAA,EACpE,CAAC,EAAiB,CAAC,EAEhB,IACJ,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,UAAU;GACV,WAAW,EACT,qCACA,GACA,IACI,qDACA,wCACJ,CAAC,KACC,KACA,EAAG,kBAAA,qCAAiD,EACtD,CAAC,KACC,CAAC,KACD,gDACF,KACE,EACE,iCACA,KAAoB,qBACrB,CACJ;aArBH,CAuBE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,GACD,kBAAC,EAAW,MAAZ;KAAiB,WAAU;eACxB;KACe,CAAA,CACd;OACN,kBAAC,GAAD,EAAqB,QAAQ,GAAmB,CAAA,CACzC;MACR,KACC,kBAAC,GAAD;GACE,YAAY;GACZ,eAAe,EAAmB,GAAM;GACxC,aAAa;GACb,aAAa;GACb,CAAA,CAEA;;AAcR,QAXI,IAEA,kBAAC,GAAD;EACE,SAAS,EAAE,EAAQ,uCAAuC;EAC1D,WAAU;YAET;EACa,CAAA,GAIb"}