@openhands/agent-canvas 1.0.0-beta.5 → 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 (879) 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-BQChv2rc.js → recommended-automations-launcher-uTyODuzB.js} +3 -3
  100. package/build/assets/{root-BgEbw3S0.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-CZSK-lT2.js +1 -0
  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 +150 -119
  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/@openhands/extensions/integrations/catalog/airtable.cjs +1 -1
  604. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs.map +1 -1
  605. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js +3 -1
  606. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js.map +1 -1
  607. package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.cjs +1 -1
  608. package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.cjs.map +1 -1
  609. package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.js +3 -1
  610. package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.js.map +1 -1
  611. package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.cjs +1 -1
  612. package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.cjs.map +1 -1
  613. package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.js +3 -1
  614. package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.js.map +1 -1
  615. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.cjs +1 -1
  616. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.cjs.map +1 -1
  617. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.js +3 -1
  618. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.js.map +1 -1
  619. package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.cjs +1 -1
  620. package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.cjs.map +1 -1
  621. package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.js +3 -1
  622. package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.js.map +1 -1
  623. package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.cjs +1 -1
  624. package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.cjs.map +1 -1
  625. package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.js +3 -1
  626. package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.js.map +1 -1
  627. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs +1 -1
  628. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs.map +1 -1
  629. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js +3 -1
  630. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js.map +1 -1
  631. package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.cjs +1 -1
  632. package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.cjs.map +1 -1
  633. package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.js +3 -1
  634. package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.js.map +1 -1
  635. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs +1 -1
  636. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs.map +1 -1
  637. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js +3 -1
  638. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js.map +1 -1
  639. package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.cjs +1 -1
  640. package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.cjs.map +1 -1
  641. package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.js +3 -1
  642. package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.js.map +1 -1
  643. package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.cjs +1 -1
  644. package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.cjs.map +1 -1
  645. package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.js +3 -1
  646. package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.js.map +1 -1
  647. package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.cjs +1 -1
  648. package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.cjs.map +1 -1
  649. package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.js +3 -1
  650. package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.js.map +1 -1
  651. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
  652. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
  653. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +3 -1
  654. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
  655. package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.cjs +1 -1
  656. package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.cjs.map +1 -1
  657. package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.js +2 -1
  658. package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.js.map +1 -1
  659. package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.cjs +1 -1
  660. package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.cjs.map +1 -1
  661. package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.js +2 -1
  662. package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.js.map +1 -1
  663. package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.cjs +1 -1
  664. package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.cjs.map +1 -1
  665. package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.js +3 -1
  666. package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.js.map +1 -1
  667. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs +1 -1
  668. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs.map +1 -1
  669. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js +8 -7
  670. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js.map +1 -1
  671. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs +1 -1
  672. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs.map +1 -1
  673. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js +2 -1
  674. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js.map +1 -1
  675. package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.cjs +1 -1
  676. package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.cjs.map +1 -1
  677. package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.js +4 -2
  678. package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.js.map +1 -1
  679. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs +2 -0
  680. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs.map +1 -0
  681. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
  682. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
  683. package/dist/package.cjs +1 -1
  684. package/dist/package.cjs.map +1 -1
  685. package/dist/package.js +2 -2
  686. package/dist/package.js.map +1 -1
  687. package/dist/routes/conversation.cjs +1 -1
  688. package/dist/routes/conversation.cjs.map +1 -1
  689. package/dist/routes/conversation.js +1 -1
  690. package/dist/routes/conversation.js.map +1 -1
  691. package/dist/routes/llm-settings.cjs +1 -1
  692. package/dist/routes/llm-settings.cjs.map +1 -1
  693. package/dist/routes/llm-settings.js +55 -54
  694. package/dist/routes/llm-settings.js.map +1 -1
  695. package/dist/routes/secrets-settings.cjs +1 -1
  696. package/dist/routes/secrets-settings.cjs.map +1 -1
  697. package/dist/routes/secrets-settings.js +19 -27
  698. package/dist/routes/secrets-settings.js.map +1 -1
  699. package/dist/stores/conversation-store.cjs +1 -1
  700. package/dist/stores/conversation-store.cjs.map +1 -1
  701. package/dist/stores/conversation-store.d.ts +4 -0
  702. package/dist/stores/conversation-store.js +6 -0
  703. package/dist/stores/conversation-store.js.map +1 -1
  704. package/dist/types/agent-server/core/events/acp-tool-call-event.d.ts +6 -4
  705. package/dist/types/agent-server/core/events/system-event.d.ts +5 -0
  706. package/dist/types/automation.d.ts +15 -0
  707. package/dist/types/settings.d.ts +3 -1
  708. package/dist/ui/combobox-caret.cjs +1 -1
  709. package/dist/ui/combobox-caret.cjs.map +1 -1
  710. package/dist/ui/combobox-caret.d.ts +1 -1
  711. package/dist/ui/combobox-caret.js +9 -8
  712. package/dist/ui/combobox-caret.js.map +1 -1
  713. package/dist/ui/context-menu.cjs +1 -1
  714. package/dist/ui/context-menu.cjs.map +1 -1
  715. package/dist/ui/context-menu.js +9 -8
  716. package/dist/ui/context-menu.js.map +1 -1
  717. package/dist/ui/dropdown/dropdown-menu.cjs +1 -1
  718. package/dist/ui/dropdown/dropdown-menu.cjs.map +1 -1
  719. package/dist/ui/dropdown/dropdown-menu.js +21 -17
  720. package/dist/ui/dropdown/dropdown-menu.js.map +1 -1
  721. package/dist/ui/dropdown/dropdown.cjs +1 -1
  722. package/dist/ui/dropdown/dropdown.cjs.map +1 -1
  723. package/dist/ui/dropdown/dropdown.js +2 -2
  724. package/dist/ui/dropdown/dropdown.js.map +1 -1
  725. package/dist/utils/automation-schedule.d.ts +1 -0
  726. package/dist/utils/dropdown-classes.cjs +2 -0
  727. package/dist/utils/dropdown-classes.cjs.map +1 -0
  728. package/dist/utils/dropdown-classes.d.ts +32 -0
  729. package/dist/utils/dropdown-classes.js +8 -0
  730. package/dist/utils/dropdown-classes.js.map +1 -0
  731. package/dist/utils/form-control-classes.cjs +1 -1
  732. package/dist/utils/form-control-classes.cjs.map +1 -1
  733. package/dist/utils/form-control-classes.d.ts +18 -2
  734. package/dist/utils/form-control-classes.js +4 -3
  735. package/dist/utils/form-control-classes.js.map +1 -1
  736. package/dist/utils/git-control-bar-classes.cjs +2 -0
  737. package/dist/utils/git-control-bar-classes.cjs.map +1 -0
  738. package/dist/utils/git-control-bar-classes.d.ts +4 -0
  739. package/dist/utils/git-control-bar-classes.js +14 -0
  740. package/dist/utils/git-control-bar-classes.js.map +1 -0
  741. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  742. package/dist/utils/handle-event-for-ui.d.ts +6 -3
  743. package/dist/utils/handle-event-for-ui.js.map +1 -1
  744. package/dist/utils/mobile-top-bar-icon-button-classes.cjs +1 -1
  745. package/dist/utils/mobile-top-bar-icon-button-classes.cjs.map +1 -1
  746. package/dist/utils/mobile-top-bar-icon-button-classes.js +3 -3
  747. package/dist/utils/mobile-top-bar-icon-button-classes.js.map +1 -1
  748. package/dist/utils/modal-classes.cjs +2 -0
  749. package/dist/utils/modal-classes.cjs.map +1 -0
  750. package/dist/utils/modal-classes.d.ts +8 -0
  751. package/dist/utils/modal-classes.js +7 -0
  752. package/dist/utils/modal-classes.js.map +1 -0
  753. package/dist/utils/openhands-llm.cjs +2 -0
  754. package/dist/utils/openhands-llm.cjs.map +1 -0
  755. package/dist/utils/openhands-llm.d.ts +2 -0
  756. package/dist/utils/openhands-llm.js +9 -0
  757. package/dist/utils/openhands-llm.js.map +1 -0
  758. package/dist/utils/redact-custom-secrets.cjs +2 -0
  759. package/dist/utils/redact-custom-secrets.cjs.map +1 -0
  760. package/dist/utils/redact-custom-secrets.d.ts +6 -0
  761. package/dist/utils/redact-custom-secrets.js +10 -0
  762. package/dist/utils/redact-custom-secrets.js.map +1 -0
  763. package/dist/utils/status.cjs +1 -1
  764. package/dist/utils/status.cjs.map +1 -1
  765. package/dist/utils/status.d.ts +2 -1
  766. package/dist/utils/status.js +9 -8
  767. package/dist/utils/status.js.map +1 -1
  768. package/dist/utils/system-message-adapter.cjs +1 -1
  769. package/dist/utils/system-message-adapter.cjs.map +1 -1
  770. package/dist/utils/system-message-adapter.js +10 -7
  771. package/dist/utils/system-message-adapter.js.map +1 -1
  772. package/dist/utils/utils.cjs +1 -1
  773. package/dist/utils/utils.cjs.map +1 -1
  774. package/dist/utils/utils.d.ts +2 -1
  775. package/dist/utils/utils.js +21 -20
  776. package/dist/utils/utils.js.map +1 -1
  777. package/package.json +2 -2
  778. package/scripts/dev-safe.mjs +3 -1
  779. package/scripts/dev-static.mjs +2 -2
  780. package/scripts/dev-with-automation.mjs +283 -108
  781. package/scripts/static-build.mjs +20 -19
  782. package/scripts/static-server.mjs +50 -3
  783. package/build/assets/acp-providers-CbiRekh9.js +0 -1
  784. package/build/assets/active-backend-context-cCM1vYYZ.js +0 -1
  785. package/build/assets/add-backend-modal-DIUQzMPa.js +0 -1
  786. package/build/assets/agent-server-client-options-Bc5ZorQZ.js +0 -1
  787. package/build/assets/agent-server-compatibility-BlkUsrX2.js +0 -1
  788. package/build/assets/agent-server-conversation-service.api-C2V5SlHu.js +0 -5
  789. package/build/assets/api-key-entry-screen-B2gynaCp.js +0 -1
  790. package/build/assets/automation-detail-DJvbVSYK.js +0 -1
  791. package/build/assets/automations-list-rMki-8au.js +0 -1
  792. package/build/assets/backend-form-modal-Dnk33xA_.js +0 -1
  793. package/build/assets/base-modal-_dYTw1ri.js +0 -1
  794. package/build/assets/brand-button-Br7f0kZJ.js +0 -1
  795. package/build/assets/browser-store-Couc4S5D.js +0 -1
  796. package/build/assets/clock-BRjCgHTc.js +0 -1
  797. package/build/assets/combobox-caret-to1O8irE.js +0 -1
  798. package/build/assets/context-menu-list-item-CWNFpuiC.js +0 -1
  799. package/build/assets/conversation-DVrKU0oz.js +0 -19
  800. package/build/assets/conversation-Dlys-D5A.js +0 -1
  801. package/build/assets/conversation-panel-iF09WjZ4.js +0 -1
  802. package/build/assets/conversation-service.api-CCfztilW.js +0 -1
  803. package/build/assets/conversation-state-store-u5jepov0.js +0 -1
  804. package/build/assets/conversation-store-Z5iMCRpc.js +0 -1
  805. package/build/assets/conversation-websocket-context-DhJhqUna.js +0 -3
  806. package/build/assets/declaration-BNMqORFE.js +0 -1
  807. package/build/assets/dist-BxBP7tFD.js +0 -1
  808. package/build/assets/edit-automation-modal-BGzR3nfZ.js +0 -1
  809. package/build/assets/ellipsis-button-ZyLMPURn.js +0 -1
  810. package/build/assets/entry.client-1VMHpktY.js +0 -2
  811. package/build/assets/enum-filter-dropdown-CEgCdu4A.js +0 -1
  812. package/build/assets/extensions-hub-C651jsVh.js +0 -1
  813. package/build/assets/files-tab-R5z0lLdY.js +0 -1
  814. package/build/assets/files-tab-store-CDyVTXNT.js +0 -1
  815. package/build/assets/git-control-bar-branch-button-COdRAYHb.js +0 -27
  816. package/build/assets/git-provider-icon-BzLbc0yC.js +0 -1
  817. package/build/assets/home-XxBpNOVq.js +0 -1
  818. package/build/assets/install-server-modal-f31_CLrW.js +0 -1
  819. package/build/assets/launch-CshDse3e.js +0 -1
  820. package/build/assets/link-external-D2POYx4c.js +0 -1
  821. package/build/assets/llm-settings-Bql-vydt.js +0 -1
  822. package/build/assets/llm-settings-C_tal6Ds.js +0 -1
  823. package/build/assets/manage-backends-modal-l7RkKfwX.js +0 -1
  824. package/build/assets/manage-workspaces-modal-DhKF_8z3.js +0 -1
  825. package/build/assets/manifest-d9077852.js +0 -1
  826. package/build/assets/mcp-D2onbwVk.js +0 -9
  827. package/build/assets/messages-D0rWot7s.js +0 -36
  828. package/build/assets/proxy-CxydCnis.js +0 -1
  829. package/build/assets/root-DHeCXo9N.css +0 -1
  830. package/build/assets/root-layout-Czo9Ma6Q.js +0 -2
  831. package/build/assets/secrets-service-BsnKFc2x.js +0 -1
  832. package/build/assets/secrets-settings-Bz_UohPJ.js +0 -1
  833. package/build/assets/settings-client-C73C7IgV.js +0 -1
  834. package/build/assets/settings-index-Dz0BmdJD.js +0 -1
  835. package/build/assets/settings-list-classes-Bf80tWtc.js +0 -1
  836. package/build/assets/settings-modal-Brzgh5Yw.js +0 -1
  837. package/build/assets/settings-service.api-CZ3uWx4v.js +0 -1
  838. package/build/assets/sidebar-mobile-menu-toggle-Do_aA9Zm.js +0 -1
  839. package/build/assets/skills-settings-DlA5hlXw.js +0 -2
  840. package/build/assets/status-hp6M6E7E.js +0 -1
  841. package/build/assets/use-agent-settings-schema-33Un7UF2.js +0 -1
  842. package/build/assets/use-is-authed-BggE5wPj.js +0 -1
  843. package/build/assets/use-llm-profiles-DDOol3gK.js +0 -1
  844. package/build/assets/use-runtime-is-ready-B7EF4BKU.js +0 -1
  845. package/build/assets/use-settings-DQIZmIov.js +0 -1
  846. package/build/assets/use-user-conversation-C6hrMMtn.js +0 -1
  847. package/build/assets/utils-i18rdUj2.js +0 -1
  848. package/build/assets/vendor~conversation-panel~conversation-a9SyrrhV.js +0 -1
  849. package/build/assets/vendor~conversation-panel~conversation~index-C23ZXO4R.js +0 -1
  850. package/build/assets/vendor~home~mcp~automations-list-Ccy2I0KU.js +0 -1
  851. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js +0 -1
  852. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DzIXV3Ui.js +0 -9
  853. /package/build/assets/{automation-IdgZq6ZK.js → automation-XDPAjiZi.js} +0 -0
  854. /package/build/assets/{color-themes-DSaoIL6A.js → color-themes-B9pm9c-R.js} +0 -0
  855. /package/build/assets/{common-DR1t-EeP.js → common-DqjLSBOt.js} +0 -0
  856. /package/build/assets/{conversation-local-storage-UYl-SX-r.js → conversation-local-storage-YmOVXxxW.js} +0 -0
  857. /package/build/assets/{dist-C6t0EXL7.js → dist-C3NfioQC.js} +0 -0
  858. /package/build/assets/{environment-switch-store-C4ulFJKp.js → environment-switch-store-CiurvTtK.js} +0 -0
  859. /package/build/assets/{health-store-BDC2rM-X.js → health-store-B5f0S2FY.js} +0 -0
  860. /package/build/assets/{map-provider-COBVzZYo.js → map-provider-BJ_8KZKU.js} +0 -0
  861. /package/build/assets/{middleware-BC9EwbB9.js → middleware-CfatjPYZ.js} +0 -0
  862. /package/build/assets/{objectWithoutPropertiesLoose-Du6eBn-V.js → objectWithoutPropertiesLoose-DSQKyRhw.js} +0 -0
  863. /package/build/assets/{react-Do0CT17Y.js → react-Dy05vyj5.js} +0 -0
  864. /package/build/assets/{sdk-settings-field-metadata-CBPmeqYa.js → sdk-settings-field-metadata-DQiaIBie.js} +0 -0
  865. /package/build/assets/{settings-D_H-qsRm.js → settings-DGY6n4J2.js} +0 -0
  866. /package/build/assets/{settings-like-page-layout-classes-I0BDBEoq.js → settings-like-page-layout-classes-D7YjdTd0.js} +0 -0
  867. /package/build/assets/{use-breakpoint-DbJ6FkQ-.js → use-breakpoint-DF_RiQ6s.js} +0 -0
  868. /package/build/assets/{use-click-outside-element-DffgWWoZ.js → use-click-outside-element-DhxCUyWl.js} +0 -0
  869. /package/build/assets/{v4-CNn21NXa.js → v4-khGvL7i2.js} +0 -0
  870. /package/build/assets/{vendor~browser-DDiZgqD3.js → vendor~browser-DisFGEp9.js} +0 -0
  871. /package/build/assets/{vendor~browser-tab-BgwV1mxF.js → vendor~browser-tab-BxhTtM9_.js} +0 -0
  872. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DbvX3OcM.js → vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js} +0 -0
  873. /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
  874. /package/build/assets/{vendor~files-tab-BGKayPiK.js → vendor~files-tab-BtkpAiMX.js} +0 -0
  875. /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
  876. /package/build/assets/{vendor~home~mcp~automations-list-DoPfwaXj.js → vendor~home~mcp~automations-list-BgV86Sti.js} +0 -0
  877. /package/build/assets/{vendor~launch-vdeRTWFu.js → vendor~launch-BXgl67Re.js} +0 -0
  878. /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
  879. /package/build/assets/{vendor~terminal-DUrOWGFE.js → vendor~terminal-DZaJIY8A.js} +0 -0
@@ -3,32 +3,33 @@ import { I18nKey as t } from "../../../i18n/declaration.js";
3
3
  import { cn as n, getGitPullPrompt as r } from "../../../utils/utils.js";
4
4
  import { useTracking as i } from "../../../hooks/use-tracking.js";
5
5
  import a from "../../../icons/u-arrow-down.js";
6
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ import { gitControlBarActionButtonClassName as o, gitControlBarActionIconColor as s, gitControlBarActionLabelClassName as c } from "../../../utils/git-control-bar-classes.js";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
8
  //#region src/components/features/chat/git-control-bar-pull-button.tsx
8
- function c({ onSuggestionsClick: c, hasRepository: l, providerTokensReady: u, isConversationReady: d = !0 }) {
9
- let { t: f } = e("openhands"), { trackPullButtonClick: p } = i(), m = u && l && d;
10
- return /* @__PURE__ */ s("button", {
9
+ function d({ onSuggestionsClick: d, hasRepository: f, providerTokensReady: p, isConversationReady: m = !0 }) {
10
+ let { t: h } = e("openhands"), { trackPullButtonClick: g } = i(), _ = p && f && m;
11
+ return /* @__PURE__ */ u("button", {
11
12
  type: "button",
12
13
  onClick: () => {
13
- p(), c(r());
14
+ g(), d(r());
14
15
  },
15
- disabled: !m,
16
- className: n("flex flex-row gap-1 items-center justify-center px-0.5 py-1 rounded-[100px] w-[76px] min-w-[76px]", m ? "bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer" : "bg-[rgba(71,74,84,0.50)] cursor-not-allowed"),
17
- children: [/* @__PURE__ */ o("div", {
16
+ disabled: !_,
17
+ className: n(o(_), "px-0.5 py-1 w-[76px] min-w-[76px]"),
18
+ children: [/* @__PURE__ */ l("div", {
18
19
  className: "w-3 h-3 flex items-center justify-center",
19
- children: /* @__PURE__ */ o(a, {
20
+ children: /* @__PURE__ */ l(a, {
20
21
  width: 12,
21
22
  height: 12,
22
- color: "white"
23
+ color: s(_)
23
24
  })
24
- }), /* @__PURE__ */ o("div", {
25
- className: "font-normal text-white text-sm leading-5 max-w-[76px] truncate",
26
- title: f(t.COMMON$PULL),
27
- children: f(t.COMMON$PULL)
25
+ }), /* @__PURE__ */ l("div", {
26
+ className: n(c, "max-w-[76px]"),
27
+ title: h(t.COMMON$PULL),
28
+ children: h(t.COMMON$PULL)
28
29
  })]
29
30
  });
30
31
  }
31
32
  //#endregion
32
- export { c as GitControlBarPullButton };
33
+ export { d as GitControlBarPullButton };
33
34
 
34
35
  //# sourceMappingURL=git-control-bar-pull-button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-control-bar-pull-button.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-pull-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowDownIcon from \"#/icons/u-arrow-down.svg?react\";\nimport { cn, getGitPullPrompt } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPullButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPullButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n isConversationReady = true,\n}: GitControlBarPullButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPullButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePullClick = () => {\n trackPullButtonClick();\n onSuggestionsClick(getGitPullPrompt());\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePullClick}\n disabled={!isButtonEnabled}\n className={cn(\n \"flex flex-row gap-1 items-center justify-center px-0.5 py-1 rounded-[100px] w-[76px] min-w-[76px]\",\n isButtonEnabled\n ? \"bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer\"\n : \"bg-[rgba(71,74,84,0.50)] cursor-not-allowed\",\n )}\n >\n <div className=\"w-3 h-3 flex items-center justify-center\">\n <ArrowDownIcon width={12} height={12} color=\"white\" />\n </div>\n <div\n className=\"font-normal text-white text-sm leading-5 max-w-[76px] truncate\"\n title={t(I18nKey.COMMON$PULL)}\n >\n {t(I18nKey.COMMON$PULL)}\n </div>\n </button>\n );\n}\n"],"mappings":";;;;;;;AAaA,SAAgB,EAAwB,EACtC,uBACA,kBACA,wBACA,yBAAsB,MACS;CAC/B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,4BAAyB,GAAa,EAExC,IACJ,KAAuB,KAAiB;AAO1C,QACE,kBAAC,UAAD;EACE,MAAK;EACL,eAR0B;AAE5B,GADA,GAAsB,EACtB,EAAmB,GAAkB,CAAC;;EAOpC,UAAU,CAAC;EACX,WAAW,EACT,qGACA,IACI,4DACA,8CACL;YATH,CAWE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IAAe,OAAO;IAAI,QAAQ;IAAI,OAAM;IAAU,CAAA;GAClD,CAAA,EACN,kBAAC,OAAD;GACE,WAAU;GACV,OAAO,EAAE,EAAQ,YAAY;aAE5B,EAAE,EAAQ,YAAY;GACnB,CAAA,CACC"}
1
+ {"version":3,"file":"git-control-bar-pull-button.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-pull-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowDownIcon from \"#/icons/u-arrow-down.svg?react\";\nimport { cn, getGitPullPrompt } from \"#/utils/utils\";\nimport {\n gitControlBarActionButtonClassName,\n gitControlBarActionIconColor,\n gitControlBarActionLabelClassName,\n} from \"#/utils/git-control-bar-classes\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPullButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPullButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n isConversationReady = true,\n}: GitControlBarPullButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPullButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePullClick = () => {\n trackPullButtonClick();\n onSuggestionsClick(getGitPullPrompt());\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePullClick}\n disabled={!isButtonEnabled}\n className={cn(\n gitControlBarActionButtonClassName(isButtonEnabled),\n \"px-0.5 py-1 w-[76px] min-w-[76px]\",\n )}\n >\n <div className=\"w-3 h-3 flex items-center justify-center\">\n <ArrowDownIcon\n width={12}\n height={12}\n color={gitControlBarActionIconColor(isButtonEnabled)}\n />\n </div>\n <div\n className={cn(gitControlBarActionLabelClassName, \"max-w-[76px]\")}\n title={t(I18nKey.COMMON$PULL)}\n >\n {t(I18nKey.COMMON$PULL)}\n </div>\n </button>\n );\n}\n"],"mappings":";;;;;;;;AAkBA,SAAgB,EAAwB,EACtC,uBACA,kBACA,wBACA,yBAAsB,MACS;CAC/B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,4BAAyB,GAAa,EAExC,IACJ,KAAuB,KAAiB;AAO1C,QACE,kBAAC,UAAD;EACE,MAAK;EACL,eAR0B;AAE5B,GADA,GAAsB,EACtB,EAAmB,GAAkB,CAAC;;EAOpC,UAAU,CAAC;EACX,WAAW,EACT,EAAmC,EAAgB,EACnD,oCACD;YAPH,CASE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,OAAO,EAA6B,EAAgB;IACpD,CAAA;GACE,CAAA,EACN,kBAAC,OAAD;GACE,WAAW,EAAG,GAAmC,eAAe;GAChE,OAAO,EAAE,EAAQ,YAAY;aAE5B,EAAE,EAAQ,YAAY;GACnB,CAAA,CACC"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../../hooks/use-tracking.cjs`),i=require(`../../../icons/u-arrow-up.cjs`);let a=require(`react/jsx-runtime`);function o({onSuggestionsClick:o,hasRepository:s,providerTokensReady:c,currentGitProvider:l,isConversationReady:u=!0}){let{t:d}=e.useTranslation(`openhands`),{trackPushButtonClick:f}=r.useTracking(),p=c&&s&&u;return(0,a.jsxs)(`button`,{type:`button`,onClick:()=>{f(),o(n.getGitPushPrompt(l))},disabled:!p,className:n.cn(`flex flex-row gap-1 items-center justify-center px-2 py-1 rounded-[100px] w-[77px] min-w-[77px]`,p?`bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer`:`bg-[rgba(71,74,84,0.50)] cursor-not-allowed`),children:[(0,a.jsx)(`div`,{className:`w-3 h-3 flex items-center justify-center`,children:(0,a.jsx)(i.default,{width:12,height:12,color:`white`})}),(0,a.jsx)(`div`,{className:`font-normal text-white text-sm leading-5 max-w-[77px] truncate`,title:d(t.I18nKey.COMMON$PUSH),children:d(t.I18nKey.COMMON$PUSH)})]})}exports.GitControlBarPushButton=o;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../../hooks/use-tracking.cjs`),i=require(`../../../icons/u-arrow-up.cjs`),a=require(`../../../utils/git-control-bar-classes.cjs`);let o=require(`react/jsx-runtime`);function s({onSuggestionsClick:s,hasRepository:c,providerTokensReady:l,currentGitProvider:u,isConversationReady:d=!0}){let{t:f}=e.useTranslation(`openhands`),{trackPushButtonClick:p}=r.useTracking(),m=l&&c&&d;return(0,o.jsxs)(`button`,{type:`button`,onClick:()=>{p(),s(n.getGitPushPrompt(u))},disabled:!m,className:n.cn(a.gitControlBarActionButtonClassName(m),`px-2 py-1 w-[77px] min-w-[77px]`),children:[(0,o.jsx)(`div`,{className:`w-3 h-3 flex items-center justify-center`,children:(0,o.jsx)(i.default,{width:12,height:12,color:a.gitControlBarActionIconColor(m)})}),(0,o.jsx)(`div`,{className:n.cn(a.gitControlBarActionLabelClassName,`max-w-[77px]`),title:f(t.I18nKey.COMMON$PUSH),children:f(t.I18nKey.COMMON$PUSH)})]})}exports.GitControlBarPushButton=s;
2
2
  //# sourceMappingURL=git-control-bar-push-button.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-control-bar-push-button.cjs","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-push-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowUpIcon from \"#/icons/u-arrow-up.svg?react\";\nimport { cn, getGitPushPrompt } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPushButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n currentGitProvider: Provider;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPushButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n currentGitProvider,\n isConversationReady = true,\n}: GitControlBarPushButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPushButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePushClick = () => {\n trackPushButtonClick();\n onSuggestionsClick(getGitPushPrompt(currentGitProvider));\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePushClick}\n disabled={!isButtonEnabled}\n className={cn(\n \"flex flex-row gap-1 items-center justify-center px-2 py-1 rounded-[100px] w-[77px] min-w-[77px]\",\n isButtonEnabled\n ? \"bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer\"\n : \"bg-[rgba(71,74,84,0.50)] cursor-not-allowed\",\n )}\n >\n <div className=\"w-3 h-3 flex items-center justify-center\">\n <ArrowUpIcon width={12} height={12} color=\"white\" />\n </div>\n <div\n className=\"font-normal text-white text-sm leading-5 max-w-[77px] truncate\"\n title={t(I18nKey.COMMON$PUSH)}\n >\n {t(I18nKey.COMMON$PUSH)}\n </div>\n </button>\n );\n}\n"],"mappings":"iVAeA,SAAgB,EAAwB,CACtC,qBACA,gBACA,sBACA,qBACA,sBAAsB,IACS,CAC/B,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,wBAAyB,EAAA,aAAa,CAExC,EACJ,GAAuB,GAAiB,EAO1C,OACE,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,YAR0B,CAC5B,GAAsB,CACtB,EAAmB,EAAA,iBAAiB,EAAmB,CAAC,EAOtD,SAAU,CAAC,EACX,UAAW,EAAA,GACT,kGACA,EACI,0DACA,8CACL,UATH,EAWE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qDACb,EAAA,EAAA,KAAC,EAAA,QAAD,CAAa,MAAO,GAAI,OAAQ,GAAI,MAAM,QAAU,CAAA,CAChD,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CACE,UAAU,iEACV,MAAO,EAAE,EAAA,QAAQ,YAAY,UAE5B,EAAE,EAAA,QAAQ,YAAY,CACnB,CAAA,CACC"}
1
+ {"version":3,"file":"git-control-bar-push-button.cjs","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-push-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowUpIcon from \"#/icons/u-arrow-up.svg?react\";\nimport { cn, getGitPushPrompt } from \"#/utils/utils\";\nimport {\n gitControlBarActionButtonClassName,\n gitControlBarActionIconColor,\n gitControlBarActionLabelClassName,\n} from \"#/utils/git-control-bar-classes\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPushButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n currentGitProvider: Provider;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPushButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n currentGitProvider,\n isConversationReady = true,\n}: GitControlBarPushButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPushButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePushClick = () => {\n trackPushButtonClick();\n onSuggestionsClick(getGitPushPrompt(currentGitProvider));\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePushClick}\n disabled={!isButtonEnabled}\n className={cn(\n gitControlBarActionButtonClassName(isButtonEnabled),\n \"px-2 py-1 w-[77px] min-w-[77px]\",\n )}\n >\n <div className=\"w-3 h-3 flex items-center justify-center\">\n <ArrowUpIcon\n width={12}\n height={12}\n color={gitControlBarActionIconColor(isButtonEnabled)}\n />\n </div>\n <div\n className={cn(gitControlBarActionLabelClassName, \"max-w-[77px]\")}\n title={t(I18nKey.COMMON$PUSH)}\n >\n {t(I18nKey.COMMON$PUSH)}\n </div>\n </button>\n );\n}\n"],"mappings":"yYAoBA,SAAgB,EAAwB,CACtC,qBACA,gBACA,sBACA,qBACA,sBAAsB,IACS,CAC/B,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,wBAAyB,EAAA,aAAa,CAExC,EACJ,GAAuB,GAAiB,EAO1C,OACE,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,YAR0B,CAC5B,GAAsB,CACtB,EAAmB,EAAA,iBAAiB,EAAmB,CAAC,EAOtD,SAAU,CAAC,EACX,UAAW,EAAA,GACT,EAAA,mCAAmC,EAAgB,CACnD,kCACD,UAPH,EASE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qDACb,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,MAAO,GACP,OAAQ,GACR,MAAO,EAAA,6BAA6B,EAAgB,CACpD,CAAA,CACE,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,EAAA,GAAG,EAAA,kCAAmC,eAAe,CAChE,MAAO,EAAE,EAAA,QAAQ,YAAY,UAE5B,EAAE,EAAA,QAAQ,YAAY,CACnB,CAAA,CACC"}
@@ -3,32 +3,33 @@ import { I18nKey as t } from "../../../i18n/declaration.js";
3
3
  import { cn as n, getGitPushPrompt as r } from "../../../utils/utils.js";
4
4
  import { useTracking as i } from "../../../hooks/use-tracking.js";
5
5
  import a from "../../../icons/u-arrow-up.js";
6
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ import { gitControlBarActionButtonClassName as o, gitControlBarActionIconColor as s, gitControlBarActionLabelClassName as c } from "../../../utils/git-control-bar-classes.js";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
8
  //#region src/components/features/chat/git-control-bar-push-button.tsx
8
- function c({ onSuggestionsClick: c, hasRepository: l, providerTokensReady: u, currentGitProvider: d, isConversationReady: f = !0 }) {
9
- let { t: p } = e("openhands"), { trackPushButtonClick: m } = i(), h = u && l && f;
10
- return /* @__PURE__ */ s("button", {
9
+ function d({ onSuggestionsClick: d, hasRepository: f, providerTokensReady: p, currentGitProvider: m, isConversationReady: h = !0 }) {
10
+ let { t: g } = e("openhands"), { trackPushButtonClick: _ } = i(), v = p && f && h;
11
+ return /* @__PURE__ */ u("button", {
11
12
  type: "button",
12
13
  onClick: () => {
13
- m(), c(r(d));
14
+ _(), d(r(m));
14
15
  },
15
- disabled: !h,
16
- className: n("flex flex-row gap-1 items-center justify-center px-2 py-1 rounded-[100px] w-[77px] min-w-[77px]", h ? "bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer" : "bg-[rgba(71,74,84,0.50)] cursor-not-allowed"),
17
- children: [/* @__PURE__ */ o("div", {
16
+ disabled: !v,
17
+ className: n(o(v), "px-2 py-1 w-[77px] min-w-[77px]"),
18
+ children: [/* @__PURE__ */ l("div", {
18
19
  className: "w-3 h-3 flex items-center justify-center",
19
- children: /* @__PURE__ */ o(a, {
20
+ children: /* @__PURE__ */ l(a, {
20
21
  width: 12,
21
22
  height: 12,
22
- color: "white"
23
+ color: s(v)
23
24
  })
24
- }), /* @__PURE__ */ o("div", {
25
- className: "font-normal text-white text-sm leading-5 max-w-[77px] truncate",
26
- title: p(t.COMMON$PUSH),
27
- children: p(t.COMMON$PUSH)
25
+ }), /* @__PURE__ */ l("div", {
26
+ className: n(c, "max-w-[77px]"),
27
+ title: g(t.COMMON$PUSH),
28
+ children: g(t.COMMON$PUSH)
28
29
  })]
29
30
  });
30
31
  }
31
32
  //#endregion
32
- export { c as GitControlBarPushButton };
33
+ export { d as GitControlBarPushButton };
33
34
 
34
35
  //# sourceMappingURL=git-control-bar-push-button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-control-bar-push-button.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-push-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowUpIcon from \"#/icons/u-arrow-up.svg?react\";\nimport { cn, getGitPushPrompt } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPushButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n currentGitProvider: Provider;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPushButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n currentGitProvider,\n isConversationReady = true,\n}: GitControlBarPushButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPushButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePushClick = () => {\n trackPushButtonClick();\n onSuggestionsClick(getGitPushPrompt(currentGitProvider));\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePushClick}\n disabled={!isButtonEnabled}\n className={cn(\n \"flex flex-row gap-1 items-center justify-center px-2 py-1 rounded-[100px] w-[77px] min-w-[77px]\",\n isButtonEnabled\n ? \"bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer\"\n : \"bg-[rgba(71,74,84,0.50)] cursor-not-allowed\",\n )}\n >\n <div className=\"w-3 h-3 flex items-center justify-center\">\n <ArrowUpIcon width={12} height={12} color=\"white\" />\n </div>\n <div\n className=\"font-normal text-white text-sm leading-5 max-w-[77px] truncate\"\n title={t(I18nKey.COMMON$PUSH)}\n >\n {t(I18nKey.COMMON$PUSH)}\n </div>\n </button>\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,EAAwB,EACtC,uBACA,kBACA,wBACA,uBACA,yBAAsB,MACS;CAC/B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,4BAAyB,GAAa,EAExC,IACJ,KAAuB,KAAiB;AAO1C,QACE,kBAAC,UAAD;EACE,MAAK;EACL,eAR0B;AAE5B,GADA,GAAsB,EACtB,EAAmB,EAAiB,EAAmB,CAAC;;EAOtD,UAAU,CAAC;EACX,WAAW,EACT,mGACA,IACI,4DACA,8CACL;YATH,CAWE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IAAa,OAAO;IAAI,QAAQ;IAAI,OAAM;IAAU,CAAA;GAChD,CAAA,EACN,kBAAC,OAAD;GACE,WAAU;GACV,OAAO,EAAE,EAAQ,YAAY;aAE5B,EAAE,EAAQ,YAAY;GACnB,CAAA,CACC"}
1
+ {"version":3,"file":"git-control-bar-push-button.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar-push-button.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport ArrowUpIcon from \"#/icons/u-arrow-up.svg?react\";\nimport { cn, getGitPushPrompt } from \"#/utils/utils\";\nimport {\n gitControlBarActionButtonClassName,\n gitControlBarActionIconColor,\n gitControlBarActionLabelClassName,\n} from \"#/utils/git-control-bar-classes\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface GitControlBarPushButtonProps {\n onSuggestionsClick: (value: string) => void;\n hasRepository: boolean;\n providerTokensReady: boolean;\n currentGitProvider: Provider;\n isConversationReady?: boolean;\n}\n\nexport function GitControlBarPushButton({\n onSuggestionsClick,\n hasRepository,\n providerTokensReady,\n currentGitProvider,\n isConversationReady = true,\n}: GitControlBarPushButtonProps) {\n const { t } = useTranslation(\"openhands\");\n const { trackPushButtonClick } = useTracking();\n\n const isButtonEnabled =\n providerTokensReady && hasRepository && isConversationReady;\n\n const handlePushClick = () => {\n trackPushButtonClick();\n onSuggestionsClick(getGitPushPrompt(currentGitProvider));\n };\n\n return (\n <button\n type=\"button\"\n onClick={handlePushClick}\n disabled={!isButtonEnabled}\n className={cn(\n gitControlBarActionButtonClassName(isButtonEnabled),\n \"px-2 py-1 w-[77px] min-w-[77px]\",\n )}\n >\n <div className=\"w-3 h-3 flex items-center justify-center\">\n <ArrowUpIcon\n width={12}\n height={12}\n color={gitControlBarActionIconColor(isButtonEnabled)}\n />\n </div>\n <div\n className={cn(gitControlBarActionLabelClassName, \"max-w-[77px]\")}\n title={t(I18nKey.COMMON$PUSH)}\n >\n {t(I18nKey.COMMON$PUSH)}\n </div>\n </button>\n );\n}\n"],"mappings":";;;;;;;;AAoBA,SAAgB,EAAwB,EACtC,uBACA,kBACA,wBACA,uBACA,yBAAsB,MACS;CAC/B,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,4BAAyB,GAAa,EAExC,IACJ,KAAuB,KAAiB;AAO1C,QACE,kBAAC,UAAD;EACE,MAAK;EACL,eAR0B;AAE5B,GADA,GAAsB,EACtB,EAAmB,EAAiB,EAAmB,CAAC;;EAOtD,UAAU,CAAC;EACX,WAAW,EACT,EAAmC,EAAgB,EACnD,kCACD;YAPH,CASE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,OAAO,EAA6B,EAAgB;IACpD,CAAA;GACE,CAAA,EACN,kBAAC,OAAD;GACE,WAAW,EAAG,GAAmC,eAAe;GAChE,OAAO,EAAE,EAAQ,YAAY;aAE5B,EAAE,EAAQ,YAAY;GACnB,CAAA,CACC"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../hooks/use-conversation-id.cjs`),r=require(`../../../contexts/active-backend-context.cjs`),i=require(`../../../utils/custom-toast-handlers.cjs`),a=require(`../../../stores/optimistic-user-message-store.cjs`),o=require(`../../../api/conversation-metadata-store.cjs`),s=require(`../../../hooks/use-send-message.cjs`),c=require(`../../../hooks/query/use-active-conversation.cjs`),l=require(`../../../hooks/query/use-task-polling.cjs`),ee=require(`../../../hooks/use-unified-websocket-status.cjs`),te=require(`../../../hooks/mutation/use-create-conversation.cjs`),ne=require(`../../../hooks/use-user-providers.cjs`),re=require(`./git-control-bar-repo-button.cjs`),ie=require(`./git-control-bar-branch-button.cjs`),ae=require(`./git-control-bar-pull-button.cjs`),u=require(`./git-control-bar-push-button.cjs`),d=require(`./git-control-bar-pr-button.cjs`),f=require(`../../../hooks/query/use-local-git-info.cjs`),p=require(`../../../hooks/mutation/use-update-conversation-repository.cjs`),m=require(`./git-control-bar-tooltip-wrapper.cjs`),h=require(`../../../stores/home-store.cjs`),g=require(`./open-repository-modal.cjs`),_=require(`../../../context/scroll-context.cjs`);let v=require(`react`),y=require(`react/jsx-runtime`);function b({onSuggestionsClick:b}){let{t:x}=e.useTranslation(`openhands`),{conversationId:S}=n.useConversationId(),[oe,C]=(0,v.useState)(!1),[w,T]=(0,v.useState)(!1),E=(0,v.useRef)(null),{addRecentRepository:D}=h.useHomeStore(),O=a.useOptimisticUserMessageStore(e=>e.enqueuePendingMessage),k=a.useOptimisticUserMessageStore(e=>e.markPendingMessageError),{backend:A}=r.useActiveBackend(),j=A.kind===`local`,{providers:M}=ne.useUserProviders(),N=j||M.length>0,{data:P}=c.useActiveConversation(),{repositoryInfo:F}=l.useTaskPolling(),{data:I}=f.useLocalGitInfo(),L=ee.useUnifiedWebSocketStatus(),R=(0,v.useRef)(L);(0,v.useEffect)(()=>{R.current=L},[L]);let{send:z}=s.useSendMessage(),B=(0,v.useRef)(z);(0,v.useEffect)(()=>{B.current=z},[z]);let V=_.useOptionalScrollContext(),{mutate:H}=p.useUpdateConversationRepository(),{mutate:se,isPending:ce}=te.useCreateConversation(),U=P?.selected_repository||F?.selectedRepository,W=P?.git_provider||F?.gitProvider,G=P?.selected_branch||F?.selectedBranch,K=U||I?.repository||void 0,q=W||I?.provider,J=G||I?.branch||void 0,Y=(P?.id?o.getStoredConversationMetadata(P.id):null)?.selected_workspace??null,X=Y&&Y.replace(/\/+$/,``).split(`/`).pop()||null,Z=!!K&&!!q,Q=!!P&&L===`OPEN`;(0,v.useEffect)(()=>{if(!w)return;let e=e=>{E.current&&!E.current.contains(e.target)&&T(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[w]),(0,v.useEffect)(()=>{if(!w)return;let e=e=>{e.key===`Escape`&&T(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[w]);let le=(e,n)=>{S&&(D(e),H({conversationId:S,repository:e.full_name,branch:n.name,gitProvider:e.git_provider},{onSuccess:()=>{if(R.current!==`OPEN`){i.displayErrorToast(x(t.I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED));return}let r=e.git_provider.charAt(0).toUpperCase()+e.git_provider.slice(1),a=`Clone ${e.full_name} from ${r} and checkout branch ${n.name}.`,o=S?O({conversationId:S,text:a}):null;V?.scrollDomToBottom(),Promise.resolve(B.current({action:`message`,args:{content:a,timestamp:new Date().toISOString()}})).catch(e=>{o&&k(o,e instanceof Error?e.message:`Failed to send message`)})}}))},$=!j||!!K||!!X,ue=j&&!Z;return $||J||Z?(0,y.jsxs)(`div`,{className:`flex flex-row items-center`,children:[(0,y.jsxs)(`div`,{className:`flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide`,children:[$?(0,y.jsx)(re.GitControlBarRepoButton,{selectedRepository:K,gitProvider:q,workspaceName:X,onClick:()=>C(!0),disabled:!Q||ue}):null,J?(0,y.jsx)(ie.GitControlBarBranchButton,{selectedBranch:J,selectedRepository:K,gitProvider:q}):null,Z?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m.GitControlBarTooltipWrapper,{tooltipMessage:x(t.I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT),testId:`git-control-bar-pull-button-tooltip`,shouldShowTooltip:!Z,children:(0,y.jsx)(ae.GitControlBarPullButton,{onSuggestionsClick:b,hasRepository:Z,providerTokensReady:N,isConversationReady:Q})}),(0,y.jsx)(m.GitControlBarTooltipWrapper,{tooltipMessage:x(t.I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT),testId:`git-control-bar-push-button-tooltip`,shouldShowTooltip:!Z,children:(0,y.jsx)(u.GitControlBarPushButton,{onSuggestionsClick:b,hasRepository:Z,providerTokensReady:N,currentGitProvider:q,isConversationReady:Q})}),(0,y.jsx)(m.GitControlBarTooltipWrapper,{tooltipMessage:x(t.I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT),testId:`git-control-bar-pr-button-tooltip`,shouldShowTooltip:!Z,children:(0,y.jsx)(d.GitControlBarPrButton,{onSuggestionsClick:b,hasRepository:Z,providerTokensReady:N,currentGitProvider:q,isConversationReady:Q})})]}):null]}),(0,y.jsx)(g.OpenRepositoryModal,{isOpen:oe,onClose:()=>C(!1),onLaunch:le,defaultProvider:q})]}):null}exports.GitControlBar=b;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../hooks/use-conversation-id.cjs`),r=require(`../../../contexts/active-backend-context.cjs`),i=require(`../../../utils/custom-toast-handlers.cjs`),a=require(`../../../stores/optimistic-user-message-store.cjs`),o=require(`../../../api/conversation-metadata-store.cjs`),s=require(`../../../contexts/conversation-websocket-context.cjs`),c=require(`../../../hooks/use-send-message.cjs`),ee=require(`../../../hooks/query/use-active-conversation.cjs`),te=require(`../../../hooks/query/use-task-polling.cjs`),ne=require(`../../../hooks/use-unified-websocket-status.cjs`),l=require(`../../../hooks/mutation/use-create-conversation.cjs`),u=require(`../../../hooks/use-user-providers.cjs`),d=require(`./git-control-bar-repo-button.cjs`),f=require(`./git-control-bar-branch-button.cjs`),p=require(`./git-control-bar-pull-button.cjs`),m=require(`./git-control-bar-push-button.cjs`),h=require(`./git-control-bar-pr-button.cjs`),re=require(`../../../hooks/query/use-local-git-info.cjs`),ie=require(`../../../hooks/mutation/use-update-conversation-repository.cjs`),g=require(`./git-control-bar-tooltip-wrapper.cjs`),ae=require(`../../../stores/home-store.cjs`),oe=require(`./open-repository-modal.cjs`),se=require(`../../../context/scroll-context.cjs`);let _=require(`react`),v=require(`react/jsx-runtime`);function y({onSuggestionsClick:y}){let{t:b}=e.useTranslation(`openhands`),{conversationId:x}=n.useConversationId(),[S,C]=(0,_.useState)(!1),[w,T]=(0,_.useState)(!1),E=(0,_.useRef)(null),{addRecentRepository:D}=ae.useHomeStore(),O=a.useOptimisticUserMessageStore(e=>e.enqueuePendingMessage),k=a.useOptimisticUserMessageStore(e=>e.markPendingMessageError),{backend:A}=r.useActiveBackend(),j=A.kind===`local`,{providers:M}=u.useUserProviders(),N=j||M.length>0,{data:P}=ee.useActiveConversation(),{repositoryInfo:F}=te.useTaskPolling(),{data:I}=re.useLocalGitInfo(),L=ne.useUnifiedWebSocketStatus(),R=s.useConversationWebSocket()?.isLoadingHistory??!1,z=(0,_.useRef)(L);(0,_.useEffect)(()=>{z.current=L},[L]);let{send:B}=c.useSendMessage(),V=(0,_.useRef)(B);(0,_.useEffect)(()=>{V.current=B},[B]);let ce=se.useOptionalScrollContext(),{mutate:H}=ie.useUpdateConversationRepository(),{mutate:le,isPending:ue}=l.useCreateConversation(),U=P?.selected_repository||F?.selectedRepository,W=P?.git_provider||F?.gitProvider,G=P?.selected_branch||F?.selectedBranch,K=U||I?.repository||void 0,q=W||I?.provider,J=G||I?.branch||void 0,Y=(P?.id?o.getStoredConversationMetadata(P.id):null)?.selected_workspace??null,X=Y&&Y.replace(/\/+$/,``).split(`/`).pop()||null,Z=!!K&&!!q,Q=!!P&&L===`OPEN`&&!R;(0,_.useEffect)(()=>{if(!w)return;let e=e=>{E.current&&!E.current.contains(e.target)&&T(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[w]),(0,_.useEffect)(()=>{if(!w)return;let e=e=>{e.key===`Escape`&&T(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[w]);let de=(e,n)=>{x&&(D(e),H({conversationId:x,repository:e.full_name,branch:n.name,gitProvider:e.git_provider},{onSuccess:()=>{if(z.current!==`OPEN`){i.displayErrorToast(b(t.I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED));return}let r=e.git_provider.charAt(0).toUpperCase()+e.git_provider.slice(1),a=`Clone ${e.full_name} from ${r} and checkout branch ${n.name}.`,o=x?O({conversationId:x,text:a}):null;ce?.scrollDomToBottom(),Promise.resolve(V.current({action:`message`,args:{content:a,timestamp:new Date().toISOString()}})).catch(e=>{o&&k(o,e instanceof Error?e.message:`Failed to send message`)})}}))},$=!j||!!K||!!X,fe=j&&!Z;return $||J||Z?(0,v.jsxs)(`div`,{className:`flex flex-row items-center`,children:[(0,v.jsxs)(`div`,{className:`flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide`,children:[$?(0,v.jsx)(d.GitControlBarRepoButton,{selectedRepository:K,gitProvider:q,workspaceName:X,onClick:()=>C(!0),disabled:!Q||fe}):null,J?(0,v.jsx)(f.GitControlBarBranchButton,{selectedBranch:J,selectedRepository:K,gitProvider:q}):null,Z?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(g.GitControlBarTooltipWrapper,{tooltipMessage:b(t.I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT),testId:`git-control-bar-pull-button-tooltip`,shouldShowTooltip:!Z,children:(0,v.jsx)(p.GitControlBarPullButton,{onSuggestionsClick:y,hasRepository:Z,providerTokensReady:N,isConversationReady:Q})}),(0,v.jsx)(g.GitControlBarTooltipWrapper,{tooltipMessage:b(t.I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT),testId:`git-control-bar-push-button-tooltip`,shouldShowTooltip:!Z,children:(0,v.jsx)(m.GitControlBarPushButton,{onSuggestionsClick:y,hasRepository:Z,providerTokensReady:N,currentGitProvider:q,isConversationReady:Q})}),(0,v.jsx)(g.GitControlBarTooltipWrapper,{tooltipMessage:b(t.I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT),testId:`git-control-bar-pr-button-tooltip`,shouldShowTooltip:!Z,children:(0,v.jsx)(h.GitControlBarPrButton,{onSuggestionsClick:y,hasRepository:Z,providerTokensReady:N,currentGitProvider:q,isConversationReady:Q})})]}):null]}),(0,v.jsx)(oe.OpenRepositoryModal,{isOpen:S,onClose:()=>C(!1),onLaunch:de,defaultProvider:q})]}):null}exports.GitControlBar=y;
2
2
  //# sourceMappingURL=git-control-bar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-control-bar.cjs","names":[],"sources":["../../../../src/components/features/chat/git-control-bar.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitControlBarRepoButton } from \"./git-control-bar-repo-button\";\nimport { GitControlBarBranchButton } from \"./git-control-bar-branch-button\";\nimport { GitControlBarPullButton } from \"./git-control-bar-pull-button\";\nimport { GitControlBarPushButton } from \"./git-control-bar-push-button\";\nimport { GitControlBarPrButton } from \"./git-control-bar-pr-button\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useLocalGitInfo } from \"#/hooks/query/use-local-git-info\";\nimport { useTaskPolling } from \"#/hooks/query/use-task-polling\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { useUpdateConversationRepository } from \"#/hooks/mutation/use-update-conversation-repository\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GitControlBarTooltipWrapper } from \"./git-control-bar-tooltip-wrapper\";\nimport { OpenRepositoryModal } from \"./open-repository-modal\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { useHomeStore } from \"#/stores/home-store\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\nimport { useOptionalScrollContext } from \"#/context/scroll-context\";\n\ninterface GitControlBarProps {\n onSuggestionsClick: (value: string) => void;\n}\n\nexport function GitControlBar({ onSuggestionsClick }: GitControlBarProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const [isOpenRepoModalOpen, setIsOpenRepoModalOpen] = useState(false);\n const [isWorkspaceMenuOpen, setIsWorkspaceMenuOpen] = useState(false);\n const workspaceMenuContainerRef = useRef<HTMLDivElement>(null);\n const { addRecentRepository } = useHomeStore();\n const enqueuePendingMessage = useOptimisticUserMessageStore(\n (state) => state.enqueuePendingMessage,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const { backend } = useActiveBackend();\n const isLocalBackend = backend.kind === \"local\";\n const { providers } = useUserProviders();\n const providerTokensReady = isLocalBackend || providers.length > 0;\n\n const { data: conversation } = useActiveConversation();\n const { repositoryInfo } = useTaskPolling();\n const { data: localGitInfo } = useLocalGitInfo();\n const webSocketStatus = useUnifiedWebSocketStatus();\n const webSocketStatusRef = useRef(webSocketStatus);\n useEffect(() => {\n webSocketStatusRef.current = webSocketStatus;\n }, [webSocketStatus]);\n const { send } = useSendMessage();\n const sendRef = useRef(send);\n useEffect(() => {\n sendRef.current = send;\n }, [send]);\n const scrollContext = useOptionalScrollContext();\n const { mutate: updateRepository } = useUpdateConversationRepository();\n const { mutate: _createConversation, isPending: _isCreatingConversation } =\n useCreateConversation();\n\n // Priority: conversation data > task data > locally-detected git info.\n // The local fallback runs `git remote get-url origin` / `git rev-parse --abbrev-ref HEAD`\n // in the conversation's working dir so local-workspace conversations can\n // still display a repo and branch in the control bar.\n const conversationRepository =\n conversation?.selected_repository || repositoryInfo?.selectedRepository;\n const conversationProvider = (conversation?.git_provider ||\n repositoryInfo?.gitProvider) as Provider | undefined;\n const conversationBranch =\n conversation?.selected_branch || repositoryInfo?.selectedBranch;\n\n const selectedRepository =\n conversationRepository || localGitInfo?.repository || undefined;\n const gitProvider = (conversationProvider ||\n localGitInfo?.provider) as Provider;\n const selectedBranch =\n conversationBranch || localGitInfo?.branch || undefined;\n\n // For folder-only conversations (no remote repo), surface the basename of\n // the originally attached workspace path so the button reads e.g. \"test\"\n // rather than \"No Repo Connected\". `selected_workspace` is recorded at\n // conversation creation; we prefer it over `workspace.working_dir` because\n // the latter may point at a worktree subdir.\n const storedMetadata = conversation?.id\n ? getStoredConversationMetadata(conversation.id)\n : null;\n const workspacePath = storedMetadata?.selected_workspace ?? null;\n const workspaceName = workspacePath\n ? workspacePath.replace(/\\/+$/, \"\").split(\"/\").pop() || null\n : null;\n\n // Enable git actions whenever a repository and provider are known, including\n // local conversations where repo metadata is inferred from git remotes.\n const hasRepository = !!selectedRepository && !!gitProvider;\n\n // Enable buttons only when conversation exists and WS is connected\n const isConversationReady = !!conversation && webSocketStatus === \"OPEN\";\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onMouseDown = (event: MouseEvent) => {\n if (\n workspaceMenuContainerRef.current &&\n !workspaceMenuContainerRef.current.contains(event.target as Node)\n ) {\n setIsWorkspaceMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [isWorkspaceMenuOpen]);\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsWorkspaceMenuOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isWorkspaceMenuOpen]);\n\n const handleLaunchRepository = (\n repository: GitRepository,\n branch: Branch,\n ) => {\n if (!conversationId) return;\n\n // Persist to recent repositories list (matches home page behavior)\n addRecentRepository(repository);\n\n // Note: We update repository metadata first, then send clone command.\n // The clone command is sent to the agent via WebSocket (fire-and-forget).\n // If cloning fails, the agent will report the error in the chat,\n // and the user can retry or change the repository.\n // This is a trade-off: immediate UI feedback vs. strict atomicity.\n updateRepository(\n {\n conversationId,\n repository: repository.full_name,\n branch: branch.name,\n gitProvider: repository.git_provider,\n },\n {\n onSuccess: () => {\n // Use ref to read the latest WebSocket status (avoids stale closure)\n if (webSocketStatusRef.current !== \"OPEN\") {\n displayErrorToast(\n t(I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED),\n );\n return;\n }\n\n // Send clone command to agent after metadata is updated\n // Use ref to always call the latest send function (avoids stale closure\n // where V1 sendMessage holds a reference to a now-closed WebSocket)\n // Include git provider in prompt so agent clones from correct source\n const providerName =\n repository.git_provider.charAt(0).toUpperCase() +\n repository.git_provider.slice(1);\n const clonePrompt = `Clone ${repository.full_name} from ${providerName} and checkout branch ${branch.name}.`;\n const pendingId = conversationId\n ? enqueuePendingMessage({ conversationId, text: clonePrompt })\n : null;\n // Pull chat back to the bottom so the optimistic \"Clone …\" bubble\n // is visible even if the user had scrolled up.\n scrollContext?.scrollDomToBottom();\n // `send` returns a Promise; surface a failed send by flipping the\n // matching pending entry to \"error\" so the user gets the retry link\n // rather than a perpetual \"Sending…\" bubble.\n Promise.resolve(\n sendRef.current({\n action: \"message\",\n args: {\n content: clonePrompt,\n timestamp: new Date().toISOString(),\n },\n }),\n ).catch((error) => {\n if (!pendingId) return;\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(pendingId, errorMessage);\n });\n },\n },\n );\n };\n\n // Local backends never use the remote-repo \"Connect Repo\" CTA, so suppress the\n // empty-state button there. A repo or workspace label inferred from local git\n // metadata is still informational and stays visible.\n const showRepoButton =\n !isLocalBackend || !!selectedRepository || !!workspaceName;\n // On a local backend the informational pill (e.g. workspace name, or a repo\n // detected without a recognized provider) should not open the remote-repo\n // modal — that flow is cloud-only. Disable the button in that case so the\n // click is a no-op. Linkable repos render as <a> and ignore `disabled`.\n const isRepoButtonInert = isLocalBackend && !hasRepository;\n\n // True when the bar will render at least one chip (cloud always shows\n // \"Open Repository\"; local needs a repo or a workspace name; selected\n // branch or push/pull/PR also count). When false, the bar has nothing to\n // show — return null so the wrapper above collapses to its natural padding\n // instead of leaving an empty DOM node below the chat input.\n const hasAnyContent = showRepoButton || !!selectedBranch || hasRepository;\n if (!hasAnyContent) return null;\n\n return (\n <div className=\"flex flex-row items-center\">\n <div className=\"flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide\">\n {showRepoButton ? (\n <GitControlBarRepoButton\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n workspaceName={workspaceName}\n onClick={() => setIsOpenRepoModalOpen(true)}\n disabled={!isConversationReady || isRepoButtonInert}\n />\n ) : null}\n\n {selectedBranch ? (\n <GitControlBarBranchButton\n selectedBranch={selectedBranch}\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n />\n ) : null}\n\n {hasRepository ? (\n <>\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pull-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPullButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-push-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPushButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pr-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPrButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n </>\n ) : null}\n </div>\n\n <OpenRepositoryModal\n isOpen={isOpenRepoModalOpen}\n onClose={() => setIsOpenRepoModalOpen(false)}\n onLaunch={handleLaunchRepository}\n defaultProvider={gitProvider}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"git-control-bar.cjs","names":[],"sources":["../../../../src/components/features/chat/git-control-bar.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitControlBarRepoButton } from \"./git-control-bar-repo-button\";\nimport { GitControlBarBranchButton } from \"./git-control-bar-branch-button\";\nimport { GitControlBarPullButton } from \"./git-control-bar-pull-button\";\nimport { GitControlBarPushButton } from \"./git-control-bar-push-button\";\nimport { GitControlBarPrButton } from \"./git-control-bar-pr-button\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useLocalGitInfo } from \"#/hooks/query/use-local-git-info\";\nimport { useTaskPolling } from \"#/hooks/query/use-task-polling\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useConversationWebSocket } from \"#/contexts/conversation-websocket-context\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { useUpdateConversationRepository } from \"#/hooks/mutation/use-update-conversation-repository\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GitControlBarTooltipWrapper } from \"./git-control-bar-tooltip-wrapper\";\nimport { OpenRepositoryModal } from \"./open-repository-modal\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { useHomeStore } from \"#/stores/home-store\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\nimport { useOptionalScrollContext } from \"#/context/scroll-context\";\n\ninterface GitControlBarProps {\n onSuggestionsClick: (value: string) => void;\n}\n\nexport function GitControlBar({ onSuggestionsClick }: GitControlBarProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const [isOpenRepoModalOpen, setIsOpenRepoModalOpen] = useState(false);\n const [isWorkspaceMenuOpen, setIsWorkspaceMenuOpen] = useState(false);\n const workspaceMenuContainerRef = useRef<HTMLDivElement>(null);\n const { addRecentRepository } = useHomeStore();\n const enqueuePendingMessage = useOptimisticUserMessageStore(\n (state) => state.enqueuePendingMessage,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const { backend } = useActiveBackend();\n const isLocalBackend = backend.kind === \"local\";\n const { providers } = useUserProviders();\n const providerTokensReady = isLocalBackend || providers.length > 0;\n\n const { data: conversation } = useActiveConversation();\n const { repositoryInfo } = useTaskPolling();\n const { data: localGitInfo } = useLocalGitInfo();\n const webSocketStatus = useUnifiedWebSocketStatus();\n const conversationWebSocket = useConversationWebSocket();\n const isLoadingHistory = conversationWebSocket?.isLoadingHistory ?? false;\n const webSocketStatusRef = useRef(webSocketStatus);\n useEffect(() => {\n webSocketStatusRef.current = webSocketStatus;\n }, [webSocketStatus]);\n const { send } = useSendMessage();\n const sendRef = useRef(send);\n useEffect(() => {\n sendRef.current = send;\n }, [send]);\n const scrollContext = useOptionalScrollContext();\n const { mutate: updateRepository } = useUpdateConversationRepository();\n const { mutate: _createConversation, isPending: _isCreatingConversation } =\n useCreateConversation();\n\n // Priority: conversation data > task data > locally-detected git info.\n // The local fallback runs `git remote get-url origin` / `git rev-parse --abbrev-ref HEAD`\n // in the conversation's working dir so local-workspace conversations can\n // still display a repo and branch in the control bar.\n const conversationRepository =\n conversation?.selected_repository || repositoryInfo?.selectedRepository;\n const conversationProvider = (conversation?.git_provider ||\n repositoryInfo?.gitProvider) as Provider | undefined;\n const conversationBranch =\n conversation?.selected_branch || repositoryInfo?.selectedBranch;\n\n const selectedRepository =\n conversationRepository || localGitInfo?.repository || undefined;\n const gitProvider = (conversationProvider ||\n localGitInfo?.provider) as Provider;\n const selectedBranch =\n conversationBranch || localGitInfo?.branch || undefined;\n\n // For folder-only conversations (no remote repo), surface the basename of\n // the originally attached workspace path so the button reads e.g. \"test\"\n // rather than \"No Repo Connected\". `selected_workspace` is recorded at\n // conversation creation; we prefer it over `workspace.working_dir` because\n // the latter may point at a worktree subdir.\n const storedMetadata = conversation?.id\n ? getStoredConversationMetadata(conversation.id)\n : null;\n const workspacePath = storedMetadata?.selected_workspace ?? null;\n const workspaceName = workspacePath\n ? workspacePath.replace(/\\/+$/, \"\").split(\"/\").pop() || null\n : null;\n\n // Enable git actions whenever a repository and provider are known, including\n // local conversations where repo metadata is inferred from git remotes.\n const hasRepository = !!selectedRepository && !!gitProvider;\n\n // Enable buttons only when conversation exists, WS is connected, and the\n // initial history preload has finished (matches chat-interface loading gate).\n const isConversationReady =\n !!conversation && webSocketStatus === \"OPEN\" && !isLoadingHistory;\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onMouseDown = (event: MouseEvent) => {\n if (\n workspaceMenuContainerRef.current &&\n !workspaceMenuContainerRef.current.contains(event.target as Node)\n ) {\n setIsWorkspaceMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [isWorkspaceMenuOpen]);\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsWorkspaceMenuOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isWorkspaceMenuOpen]);\n\n const handleLaunchRepository = (\n repository: GitRepository,\n branch: Branch,\n ) => {\n if (!conversationId) return;\n\n // Persist to recent repositories list (matches home page behavior)\n addRecentRepository(repository);\n\n // Note: We update repository metadata first, then send clone command.\n // The clone command is sent to the agent via WebSocket (fire-and-forget).\n // If cloning fails, the agent will report the error in the chat,\n // and the user can retry or change the repository.\n // This is a trade-off: immediate UI feedback vs. strict atomicity.\n updateRepository(\n {\n conversationId,\n repository: repository.full_name,\n branch: branch.name,\n gitProvider: repository.git_provider,\n },\n {\n onSuccess: () => {\n // Use ref to read the latest WebSocket status (avoids stale closure)\n if (webSocketStatusRef.current !== \"OPEN\") {\n displayErrorToast(\n t(I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED),\n );\n return;\n }\n\n // Send clone command to agent after metadata is updated\n // Use ref to always call the latest send function (avoids stale closure\n // where V1 sendMessage holds a reference to a now-closed WebSocket)\n // Include git provider in prompt so agent clones from correct source\n const providerName =\n repository.git_provider.charAt(0).toUpperCase() +\n repository.git_provider.slice(1);\n const clonePrompt = `Clone ${repository.full_name} from ${providerName} and checkout branch ${branch.name}.`;\n const pendingId = conversationId\n ? enqueuePendingMessage({ conversationId, text: clonePrompt })\n : null;\n // Pull chat back to the bottom so the optimistic \"Clone …\" bubble\n // is visible even if the user had scrolled up.\n scrollContext?.scrollDomToBottom();\n // `send` returns a Promise; surface a failed send by flipping the\n // matching pending entry to \"error\" so the user gets the retry link\n // rather than a perpetual \"Sending…\" bubble.\n Promise.resolve(\n sendRef.current({\n action: \"message\",\n args: {\n content: clonePrompt,\n timestamp: new Date().toISOString(),\n },\n }),\n ).catch((error) => {\n if (!pendingId) return;\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(pendingId, errorMessage);\n });\n },\n },\n );\n };\n\n // Local backends never use the remote-repo \"Connect Repo\" CTA, so suppress the\n // empty-state button there. A repo or workspace label inferred from local git\n // metadata is still informational and stays visible.\n const showRepoButton =\n !isLocalBackend || !!selectedRepository || !!workspaceName;\n // On a local backend the informational pill (e.g. workspace name, or a repo\n // detected without a recognized provider) should not open the remote-repo\n // modal — that flow is cloud-only. Disable the button in that case so the\n // click is a no-op. Linkable repos render as <a> and ignore `disabled`.\n const isRepoButtonInert = isLocalBackend && !hasRepository;\n\n // True when the bar will render at least one chip (cloud always shows\n // \"Open Repository\"; local needs a repo or a workspace name; selected\n // branch or push/pull/PR also count). When false, the bar has nothing to\n // show — return null so the wrapper above collapses to its natural padding\n // instead of leaving an empty DOM node below the chat input.\n const hasAnyContent = showRepoButton || !!selectedBranch || hasRepository;\n if (!hasAnyContent) return null;\n\n return (\n <div className=\"flex flex-row items-center\">\n <div className=\"flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide\">\n {showRepoButton ? (\n <GitControlBarRepoButton\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n workspaceName={workspaceName}\n onClick={() => setIsOpenRepoModalOpen(true)}\n disabled={!isConversationReady || isRepoButtonInert}\n />\n ) : null}\n\n {selectedBranch ? (\n <GitControlBarBranchButton\n selectedBranch={selectedBranch}\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n />\n ) : null}\n\n {hasRepository ? (\n <>\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pull-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPullButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-push-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPushButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pr-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPrButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n </>\n ) : null}\n </div>\n\n <OpenRepositoryModal\n isOpen={isOpenRepoModalOpen}\n onClose={() => setIsOpenRepoModalOpen(false)}\n onLaunch={handleLaunchRepository}\n defaultProvider={gitProvider}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -2,137 +2,138 @@ import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es
2
2
  import { I18nKey as t } from "../../../i18n/declaration.js";
3
3
  import { useConversationId as n } from "../../../hooks/use-conversation-id.js";
4
4
  import { useActiveBackend as r } from "../../../contexts/active-backend-context.js";
5
- import { displayErrorToast as ee } from "../../../utils/custom-toast-handlers.js";
6
- import { useOptimisticUserMessageStore as i } from "../../../stores/optimistic-user-message-store.js";
7
- import { getStoredConversationMetadata as a } from "../../../api/conversation-metadata-store.js";
8
- import { useSendMessage as te } from "../../../hooks/use-send-message.js";
9
- import { useActiveConversation as o } from "../../../hooks/query/use-active-conversation.js";
10
- import { useTaskPolling as ne } from "../../../hooks/query/use-task-polling.js";
11
- import { useUnifiedWebSocketStatus as re } from "../../../hooks/use-unified-websocket-status.js";
12
- import { useCreateConversation as s } from "../../../hooks/mutation/use-create-conversation.js";
13
- import { useUserProviders as c } from "../../../hooks/use-user-providers.js";
14
- import { GitControlBarRepoButton as ie } from "./git-control-bar-repo-button.js";
15
- import { GitControlBarBranchButton as ae } from "./git-control-bar-branch-button.js";
16
- import { GitControlBarPullButton as l } from "./git-control-bar-pull-button.js";
17
- import { GitControlBarPushButton as u } from "./git-control-bar-push-button.js";
18
- import { GitControlBarPrButton as d } from "./git-control-bar-pr-button.js";
19
- import { useLocalGitInfo as f } from "../../../hooks/query/use-local-git-info.js";
20
- import { useUpdateConversationRepository as p } from "../../../hooks/mutation/use-update-conversation-repository.js";
21
- import { GitControlBarTooltipWrapper as m } from "./git-control-bar-tooltip-wrapper.js";
22
- import { useHomeStore as h } from "../../../stores/home-store.js";
23
- import { OpenRepositoryModal as oe } from "./open-repository-modal.js";
24
- import { useOptionalScrollContext as se } from "../../../context/scroll-context.js";
25
- import { useEffect as g, useRef as _, useState as v } from "react";
26
- import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
5
+ import { displayErrorToast as i } from "../../../utils/custom-toast-handlers.js";
6
+ import { useOptimisticUserMessageStore as a } from "../../../stores/optimistic-user-message-store.js";
7
+ import { getStoredConversationMetadata as o } from "../../../api/conversation-metadata-store.js";
8
+ import { useConversationWebSocket as s } from "../../../contexts/conversation-websocket-context.js";
9
+ import { useSendMessage as c } from "../../../hooks/use-send-message.js";
10
+ import { useActiveConversation as ee } from "../../../hooks/query/use-active-conversation.js";
11
+ import { useTaskPolling as te } from "../../../hooks/query/use-task-polling.js";
12
+ import { useUnifiedWebSocketStatus as ne } from "../../../hooks/use-unified-websocket-status.js";
13
+ import { useCreateConversation as re } from "../../../hooks/mutation/use-create-conversation.js";
14
+ import { useUserProviders as ie } from "../../../hooks/use-user-providers.js";
15
+ import { GitControlBarRepoButton as ae } from "./git-control-bar-repo-button.js";
16
+ import { GitControlBarBranchButton as oe } from "./git-control-bar-branch-button.js";
17
+ import { GitControlBarPullButton as se } from "./git-control-bar-pull-button.js";
18
+ import { GitControlBarPushButton as l } from "./git-control-bar-push-button.js";
19
+ import { GitControlBarPrButton as u } from "./git-control-bar-pr-button.js";
20
+ import { useLocalGitInfo as d } from "../../../hooks/query/use-local-git-info.js";
21
+ import { useUpdateConversationRepository as f } from "../../../hooks/mutation/use-update-conversation-repository.js";
22
+ import { GitControlBarTooltipWrapper as p } from "./git-control-bar-tooltip-wrapper.js";
23
+ import { useHomeStore as m } from "../../../stores/home-store.js";
24
+ import { OpenRepositoryModal as h } from "./open-repository-modal.js";
25
+ import { useOptionalScrollContext as g } from "../../../context/scroll-context.js";
26
+ import { useEffect as _, useRef as v, useState as y } from "react";
27
+ import { Fragment as ce, jsx as b, jsxs as x } from "react/jsx-runtime";
27
28
  //#region src/components/features/chat/git-control-bar.tsx
28
29
  function S({ onSuggestionsClick: S }) {
29
- let { t: C } = e("openhands"), { conversationId: w } = n(), [T, E] = v(!1), [D, O] = v(!1), k = _(null), { addRecentRepository: A } = h(), j = i((e) => e.enqueuePendingMessage), M = i((e) => e.markPendingMessageError), { backend: N } = r(), P = N.kind === "local", { providers: F } = c(), I = P || F.length > 0, { data: L } = o(), { repositoryInfo: R } = ne(), { data: z } = f(), B = re(), V = _(B);
30
- g(() => {
31
- V.current = B;
32
- }, [B]);
33
- let { send: H } = te(), U = _(H);
34
- g(() => {
30
+ let { t: C } = e("openhands"), { conversationId: w } = n(), [le, T] = y(!1), [E, D] = y(!1), O = v(null), { addRecentRepository: k } = m(), A = a((e) => e.enqueuePendingMessage), j = a((e) => e.markPendingMessageError), { backend: M } = r(), N = M.kind === "local", { providers: P } = ie(), F = N || P.length > 0, { data: I } = ee(), { repositoryInfo: L } = te(), { data: R } = d(), z = ne(), B = s()?.isLoadingHistory ?? !1, V = v(z);
31
+ _(() => {
32
+ V.current = z;
33
+ }, [z]);
34
+ let { send: H } = c(), U = v(H);
35
+ _(() => {
35
36
  U.current = H;
36
37
  }, [H]);
37
- let W = se(), { mutate: G } = p(), { mutate: ce, isPending: le } = s(), ue = L?.selected_repository || R?.selectedRepository, de = L?.git_provider || R?.gitProvider, fe = L?.selected_branch || R?.selectedBranch, K = ue || z?.repository || void 0, q = de || z?.provider, J = fe || z?.branch || void 0, Y = (L?.id ? a(L.id) : null)?.selected_workspace ?? null, X = Y && Y.replace(/\/+$/, "").split("/").pop() || null, Z = !!K && !!q, Q = !!L && B === "OPEN";
38
- g(() => {
39
- if (!D) return;
38
+ let W = g(), { mutate: ue } = f(), { mutate: de, isPending: fe } = re(), pe = I?.selected_repository || L?.selectedRepository, me = I?.git_provider || L?.gitProvider, G = I?.selected_branch || L?.selectedBranch, K = pe || R?.repository || void 0, q = me || R?.provider, J = G || R?.branch || void 0, Y = (I?.id ? o(I.id) : null)?.selected_workspace ?? null, X = Y && Y.replace(/\/+$/, "").split("/").pop() || null, Z = !!K && !!q, Q = !!I && z === "OPEN" && !B;
39
+ _(() => {
40
+ if (!E) return;
40
41
  let e = (e) => {
41
- k.current && !k.current.contains(e.target) && O(!1);
42
+ O.current && !O.current.contains(e.target) && D(!1);
42
43
  };
43
44
  return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
44
- }, [D]), g(() => {
45
- if (!D) return;
45
+ }, [E]), _(() => {
46
+ if (!E) return;
46
47
  let e = (e) => {
47
- e.key === "Escape" && O(!1);
48
+ e.key === "Escape" && D(!1);
48
49
  };
49
50
  return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
50
- }, [D]);
51
- let pe = (e, n) => {
52
- w && (A(e), G({
51
+ }, [E]);
52
+ let he = (e, n) => {
53
+ w && (k(e), ue({
53
54
  conversationId: w,
54
55
  repository: e.full_name,
55
56
  branch: n.name,
56
57
  gitProvider: e.git_provider
57
58
  }, { onSuccess: () => {
58
59
  if (V.current !== "OPEN") {
59
- ee(C(t.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED));
60
+ i(C(t.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED));
60
61
  return;
61
62
  }
62
- let r = e.git_provider.charAt(0).toUpperCase() + e.git_provider.slice(1), i = `Clone ${e.full_name} from ${r} and checkout branch ${n.name}.`, a = w ? j({
63
+ let r = e.git_provider.charAt(0).toUpperCase() + e.git_provider.slice(1), a = `Clone ${e.full_name} from ${r} and checkout branch ${n.name}.`, o = w ? A({
63
64
  conversationId: w,
64
- text: i
65
+ text: a
65
66
  }) : null;
66
67
  W?.scrollDomToBottom(), Promise.resolve(U.current({
67
68
  action: "message",
68
69
  args: {
69
- content: i,
70
+ content: a,
70
71
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
71
72
  }
72
73
  })).catch((e) => {
73
- a && M(a, e instanceof Error ? e.message : "Failed to send message");
74
+ o && j(o, e instanceof Error ? e.message : "Failed to send message");
74
75
  });
75
76
  } }));
76
- }, $ = !P || !!K || !!X;
77
+ }, $ = !N || !!K || !!X;
77
78
  return $ || J || Z ? /* @__PURE__ */ x("div", {
78
79
  className: "flex flex-row items-center",
79
80
  children: [/* @__PURE__ */ x("div", {
80
81
  className: "flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide",
81
82
  children: [
82
- $ ? /* @__PURE__ */ b(ie, {
83
+ $ ? /* @__PURE__ */ b(ae, {
83
84
  selectedRepository: K,
84
85
  gitProvider: q,
85
86
  workspaceName: X,
86
- onClick: () => E(!0),
87
- disabled: !Q || P && !Z
87
+ onClick: () => T(!0),
88
+ disabled: !Q || N && !Z
88
89
  }) : null,
89
- J ? /* @__PURE__ */ b(ae, {
90
+ J ? /* @__PURE__ */ b(oe, {
90
91
  selectedBranch: J,
91
92
  selectedRepository: K,
92
93
  gitProvider: q
93
94
  }) : null,
94
- Z ? /* @__PURE__ */ x(y, { children: [
95
- /* @__PURE__ */ b(m, {
95
+ Z ? /* @__PURE__ */ x(ce, { children: [
96
+ /* @__PURE__ */ b(p, {
96
97
  tooltipMessage: C(t.COMMON$GIT_TOOLS_DISABLED_CONTENT),
97
98
  testId: "git-control-bar-pull-button-tooltip",
98
99
  shouldShowTooltip: !Z,
99
- children: /* @__PURE__ */ b(l, {
100
+ children: /* @__PURE__ */ b(se, {
100
101
  onSuggestionsClick: S,
101
102
  hasRepository: Z,
102
- providerTokensReady: I,
103
+ providerTokensReady: F,
103
104
  isConversationReady: Q
104
105
  })
105
106
  }),
106
- /* @__PURE__ */ b(m, {
107
+ /* @__PURE__ */ b(p, {
107
108
  tooltipMessage: C(t.COMMON$GIT_TOOLS_DISABLED_CONTENT),
108
109
  testId: "git-control-bar-push-button-tooltip",
109
110
  shouldShowTooltip: !Z,
110
- children: /* @__PURE__ */ b(u, {
111
+ children: /* @__PURE__ */ b(l, {
111
112
  onSuggestionsClick: S,
112
113
  hasRepository: Z,
113
- providerTokensReady: I,
114
+ providerTokensReady: F,
114
115
  currentGitProvider: q,
115
116
  isConversationReady: Q
116
117
  })
117
118
  }),
118
- /* @__PURE__ */ b(m, {
119
+ /* @__PURE__ */ b(p, {
119
120
  tooltipMessage: C(t.COMMON$GIT_TOOLS_DISABLED_CONTENT),
120
121
  testId: "git-control-bar-pr-button-tooltip",
121
122
  shouldShowTooltip: !Z,
122
- children: /* @__PURE__ */ b(d, {
123
+ children: /* @__PURE__ */ b(u, {
123
124
  onSuggestionsClick: S,
124
125
  hasRepository: Z,
125
- providerTokensReady: I,
126
+ providerTokensReady: F,
126
127
  currentGitProvider: q,
127
128
  isConversationReady: Q
128
129
  })
129
130
  })
130
131
  ] }) : null
131
132
  ]
132
- }), /* @__PURE__ */ b(oe, {
133
- isOpen: T,
134
- onClose: () => E(!1),
135
- onLaunch: pe,
133
+ }), /* @__PURE__ */ b(h, {
134
+ isOpen: le,
135
+ onClose: () => T(!1),
136
+ onLaunch: he,
136
137
  defaultProvider: q
137
138
  })]
138
139
  }) : null;
@@ -1 +1 @@
1
- {"version":3,"file":"git-control-bar.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitControlBarRepoButton } from \"./git-control-bar-repo-button\";\nimport { GitControlBarBranchButton } from \"./git-control-bar-branch-button\";\nimport { GitControlBarPullButton } from \"./git-control-bar-pull-button\";\nimport { GitControlBarPushButton } from \"./git-control-bar-push-button\";\nimport { GitControlBarPrButton } from \"./git-control-bar-pr-button\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useLocalGitInfo } from \"#/hooks/query/use-local-git-info\";\nimport { useTaskPolling } from \"#/hooks/query/use-task-polling\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { useUpdateConversationRepository } from \"#/hooks/mutation/use-update-conversation-repository\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GitControlBarTooltipWrapper } from \"./git-control-bar-tooltip-wrapper\";\nimport { OpenRepositoryModal } from \"./open-repository-modal\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { useHomeStore } from \"#/stores/home-store\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\nimport { useOptionalScrollContext } from \"#/context/scroll-context\";\n\ninterface GitControlBarProps {\n onSuggestionsClick: (value: string) => void;\n}\n\nexport function GitControlBar({ onSuggestionsClick }: GitControlBarProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const [isOpenRepoModalOpen, setIsOpenRepoModalOpen] = useState(false);\n const [isWorkspaceMenuOpen, setIsWorkspaceMenuOpen] = useState(false);\n const workspaceMenuContainerRef = useRef<HTMLDivElement>(null);\n const { addRecentRepository } = useHomeStore();\n const enqueuePendingMessage = useOptimisticUserMessageStore(\n (state) => state.enqueuePendingMessage,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const { backend } = useActiveBackend();\n const isLocalBackend = backend.kind === \"local\";\n const { providers } = useUserProviders();\n const providerTokensReady = isLocalBackend || providers.length > 0;\n\n const { data: conversation } = useActiveConversation();\n const { repositoryInfo } = useTaskPolling();\n const { data: localGitInfo } = useLocalGitInfo();\n const webSocketStatus = useUnifiedWebSocketStatus();\n const webSocketStatusRef = useRef(webSocketStatus);\n useEffect(() => {\n webSocketStatusRef.current = webSocketStatus;\n }, [webSocketStatus]);\n const { send } = useSendMessage();\n const sendRef = useRef(send);\n useEffect(() => {\n sendRef.current = send;\n }, [send]);\n const scrollContext = useOptionalScrollContext();\n const { mutate: updateRepository } = useUpdateConversationRepository();\n const { mutate: _createConversation, isPending: _isCreatingConversation } =\n useCreateConversation();\n\n // Priority: conversation data > task data > locally-detected git info.\n // The local fallback runs `git remote get-url origin` / `git rev-parse --abbrev-ref HEAD`\n // in the conversation's working dir so local-workspace conversations can\n // still display a repo and branch in the control bar.\n const conversationRepository =\n conversation?.selected_repository || repositoryInfo?.selectedRepository;\n const conversationProvider = (conversation?.git_provider ||\n repositoryInfo?.gitProvider) as Provider | undefined;\n const conversationBranch =\n conversation?.selected_branch || repositoryInfo?.selectedBranch;\n\n const selectedRepository =\n conversationRepository || localGitInfo?.repository || undefined;\n const gitProvider = (conversationProvider ||\n localGitInfo?.provider) as Provider;\n const selectedBranch =\n conversationBranch || localGitInfo?.branch || undefined;\n\n // For folder-only conversations (no remote repo), surface the basename of\n // the originally attached workspace path so the button reads e.g. \"test\"\n // rather than \"No Repo Connected\". `selected_workspace` is recorded at\n // conversation creation; we prefer it over `workspace.working_dir` because\n // the latter may point at a worktree subdir.\n const storedMetadata = conversation?.id\n ? getStoredConversationMetadata(conversation.id)\n : null;\n const workspacePath = storedMetadata?.selected_workspace ?? null;\n const workspaceName = workspacePath\n ? workspacePath.replace(/\\/+$/, \"\").split(\"/\").pop() || null\n : null;\n\n // Enable git actions whenever a repository and provider are known, including\n // local conversations where repo metadata is inferred from git remotes.\n const hasRepository = !!selectedRepository && !!gitProvider;\n\n // Enable buttons only when conversation exists and WS is connected\n const isConversationReady = !!conversation && webSocketStatus === \"OPEN\";\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onMouseDown = (event: MouseEvent) => {\n if (\n workspaceMenuContainerRef.current &&\n !workspaceMenuContainerRef.current.contains(event.target as Node)\n ) {\n setIsWorkspaceMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [isWorkspaceMenuOpen]);\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsWorkspaceMenuOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isWorkspaceMenuOpen]);\n\n const handleLaunchRepository = (\n repository: GitRepository,\n branch: Branch,\n ) => {\n if (!conversationId) return;\n\n // Persist to recent repositories list (matches home page behavior)\n addRecentRepository(repository);\n\n // Note: We update repository metadata first, then send clone command.\n // The clone command is sent to the agent via WebSocket (fire-and-forget).\n // If cloning fails, the agent will report the error in the chat,\n // and the user can retry or change the repository.\n // This is a trade-off: immediate UI feedback vs. strict atomicity.\n updateRepository(\n {\n conversationId,\n repository: repository.full_name,\n branch: branch.name,\n gitProvider: repository.git_provider,\n },\n {\n onSuccess: () => {\n // Use ref to read the latest WebSocket status (avoids stale closure)\n if (webSocketStatusRef.current !== \"OPEN\") {\n displayErrorToast(\n t(I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED),\n );\n return;\n }\n\n // Send clone command to agent after metadata is updated\n // Use ref to always call the latest send function (avoids stale closure\n // where V1 sendMessage holds a reference to a now-closed WebSocket)\n // Include git provider in prompt so agent clones from correct source\n const providerName =\n repository.git_provider.charAt(0).toUpperCase() +\n repository.git_provider.slice(1);\n const clonePrompt = `Clone ${repository.full_name} from ${providerName} and checkout branch ${branch.name}.`;\n const pendingId = conversationId\n ? enqueuePendingMessage({ conversationId, text: clonePrompt })\n : null;\n // Pull chat back to the bottom so the optimistic \"Clone …\" bubble\n // is visible even if the user had scrolled up.\n scrollContext?.scrollDomToBottom();\n // `send` returns a Promise; surface a failed send by flipping the\n // matching pending entry to \"error\" so the user gets the retry link\n // rather than a perpetual \"Sending…\" bubble.\n Promise.resolve(\n sendRef.current({\n action: \"message\",\n args: {\n content: clonePrompt,\n timestamp: new Date().toISOString(),\n },\n }),\n ).catch((error) => {\n if (!pendingId) return;\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(pendingId, errorMessage);\n });\n },\n },\n );\n };\n\n // Local backends never use the remote-repo \"Connect Repo\" CTA, so suppress the\n // empty-state button there. A repo or workspace label inferred from local git\n // metadata is still informational and stays visible.\n const showRepoButton =\n !isLocalBackend || !!selectedRepository || !!workspaceName;\n // On a local backend the informational pill (e.g. workspace name, or a repo\n // detected without a recognized provider) should not open the remote-repo\n // modal — that flow is cloud-only. Disable the button in that case so the\n // click is a no-op. Linkable repos render as <a> and ignore `disabled`.\n const isRepoButtonInert = isLocalBackend && !hasRepository;\n\n // True when the bar will render at least one chip (cloud always shows\n // \"Open Repository\"; local needs a repo or a workspace name; selected\n // branch or push/pull/PR also count). When false, the bar has nothing to\n // show — return null so the wrapper above collapses to its natural padding\n // instead of leaving an empty DOM node below the chat input.\n const hasAnyContent = showRepoButton || !!selectedBranch || hasRepository;\n if (!hasAnyContent) return null;\n\n return (\n <div className=\"flex flex-row items-center\">\n <div className=\"flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide\">\n {showRepoButton ? (\n <GitControlBarRepoButton\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n workspaceName={workspaceName}\n onClick={() => setIsOpenRepoModalOpen(true)}\n disabled={!isConversationReady || isRepoButtonInert}\n />\n ) : null}\n\n {selectedBranch ? (\n <GitControlBarBranchButton\n selectedBranch={selectedBranch}\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n />\n ) : null}\n\n {hasRepository ? (\n <>\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pull-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPullButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-push-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPushButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pr-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPrButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n </>\n ) : null}\n </div>\n\n <OpenRepositoryModal\n isOpen={isOpenRepoModalOpen}\n onClose={() => setIsOpenRepoModalOpen(false)}\n onLaunch={handleLaunchRepository}\n defaultProvider={gitProvider}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"git-control-bar.js","names":[],"sources":["../../../../src/components/features/chat/git-control-bar.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitControlBarRepoButton } from \"./git-control-bar-repo-button\";\nimport { GitControlBarBranchButton } from \"./git-control-bar-branch-button\";\nimport { GitControlBarPullButton } from \"./git-control-bar-pull-button\";\nimport { GitControlBarPushButton } from \"./git-control-bar-push-button\";\nimport { GitControlBarPrButton } from \"./git-control-bar-pr-button\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useLocalGitInfo } from \"#/hooks/query/use-local-git-info\";\nimport { useTaskPolling } from \"#/hooks/query/use-task-polling\";\nimport { useUnifiedWebSocketStatus } from \"#/hooks/use-unified-websocket-status\";\nimport { useConversationWebSocket } from \"#/contexts/conversation-websocket-context\";\nimport { useSendMessage } from \"#/hooks/use-send-message\";\nimport { useUpdateConversationRepository } from \"#/hooks/mutation/use-update-conversation-repository\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { Provider } from \"#/types/settings\";\nimport { Branch, GitRepository } from \"#/types/git\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { GitControlBarTooltipWrapper } from \"./git-control-bar-tooltip-wrapper\";\nimport { OpenRepositoryModal } from \"./open-repository-modal\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { useHomeStore } from \"#/stores/home-store\";\nimport { useOptimisticUserMessageStore } from \"#/stores/optimistic-user-message-store\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useUserProviders } from \"#/hooks/use-user-providers\";\nimport { useOptionalScrollContext } from \"#/context/scroll-context\";\n\ninterface GitControlBarProps {\n onSuggestionsClick: (value: string) => void;\n}\n\nexport function GitControlBar({ onSuggestionsClick }: GitControlBarProps) {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const [isOpenRepoModalOpen, setIsOpenRepoModalOpen] = useState(false);\n const [isWorkspaceMenuOpen, setIsWorkspaceMenuOpen] = useState(false);\n const workspaceMenuContainerRef = useRef<HTMLDivElement>(null);\n const { addRecentRepository } = useHomeStore();\n const enqueuePendingMessage = useOptimisticUserMessageStore(\n (state) => state.enqueuePendingMessage,\n );\n const markPendingMessageError = useOptimisticUserMessageStore(\n (state) => state.markPendingMessageError,\n );\n const { backend } = useActiveBackend();\n const isLocalBackend = backend.kind === \"local\";\n const { providers } = useUserProviders();\n const providerTokensReady = isLocalBackend || providers.length > 0;\n\n const { data: conversation } = useActiveConversation();\n const { repositoryInfo } = useTaskPolling();\n const { data: localGitInfo } = useLocalGitInfo();\n const webSocketStatus = useUnifiedWebSocketStatus();\n const conversationWebSocket = useConversationWebSocket();\n const isLoadingHistory = conversationWebSocket?.isLoadingHistory ?? false;\n const webSocketStatusRef = useRef(webSocketStatus);\n useEffect(() => {\n webSocketStatusRef.current = webSocketStatus;\n }, [webSocketStatus]);\n const { send } = useSendMessage();\n const sendRef = useRef(send);\n useEffect(() => {\n sendRef.current = send;\n }, [send]);\n const scrollContext = useOptionalScrollContext();\n const { mutate: updateRepository } = useUpdateConversationRepository();\n const { mutate: _createConversation, isPending: _isCreatingConversation } =\n useCreateConversation();\n\n // Priority: conversation data > task data > locally-detected git info.\n // The local fallback runs `git remote get-url origin` / `git rev-parse --abbrev-ref HEAD`\n // in the conversation's working dir so local-workspace conversations can\n // still display a repo and branch in the control bar.\n const conversationRepository =\n conversation?.selected_repository || repositoryInfo?.selectedRepository;\n const conversationProvider = (conversation?.git_provider ||\n repositoryInfo?.gitProvider) as Provider | undefined;\n const conversationBranch =\n conversation?.selected_branch || repositoryInfo?.selectedBranch;\n\n const selectedRepository =\n conversationRepository || localGitInfo?.repository || undefined;\n const gitProvider = (conversationProvider ||\n localGitInfo?.provider) as Provider;\n const selectedBranch =\n conversationBranch || localGitInfo?.branch || undefined;\n\n // For folder-only conversations (no remote repo), surface the basename of\n // the originally attached workspace path so the button reads e.g. \"test\"\n // rather than \"No Repo Connected\". `selected_workspace` is recorded at\n // conversation creation; we prefer it over `workspace.working_dir` because\n // the latter may point at a worktree subdir.\n const storedMetadata = conversation?.id\n ? getStoredConversationMetadata(conversation.id)\n : null;\n const workspacePath = storedMetadata?.selected_workspace ?? null;\n const workspaceName = workspacePath\n ? workspacePath.replace(/\\/+$/, \"\").split(\"/\").pop() || null\n : null;\n\n // Enable git actions whenever a repository and provider are known, including\n // local conversations where repo metadata is inferred from git remotes.\n const hasRepository = !!selectedRepository && !!gitProvider;\n\n // Enable buttons only when conversation exists, WS is connected, and the\n // initial history preload has finished (matches chat-interface loading gate).\n const isConversationReady =\n !!conversation && webSocketStatus === \"OPEN\" && !isLoadingHistory;\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onMouseDown = (event: MouseEvent) => {\n if (\n workspaceMenuContainerRef.current &&\n !workspaceMenuContainerRef.current.contains(event.target as Node)\n ) {\n setIsWorkspaceMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [isWorkspaceMenuOpen]);\n\n useEffect(() => {\n if (!isWorkspaceMenuOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsWorkspaceMenuOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isWorkspaceMenuOpen]);\n\n const handleLaunchRepository = (\n repository: GitRepository,\n branch: Branch,\n ) => {\n if (!conversationId) return;\n\n // Persist to recent repositories list (matches home page behavior)\n addRecentRepository(repository);\n\n // Note: We update repository metadata first, then send clone command.\n // The clone command is sent to the agent via WebSocket (fire-and-forget).\n // If cloning fails, the agent will report the error in the chat,\n // and the user can retry or change the repository.\n // This is a trade-off: immediate UI feedback vs. strict atomicity.\n updateRepository(\n {\n conversationId,\n repository: repository.full_name,\n branch: branch.name,\n gitProvider: repository.git_provider,\n },\n {\n onSuccess: () => {\n // Use ref to read the latest WebSocket status (avoids stale closure)\n if (webSocketStatusRef.current !== \"OPEN\") {\n displayErrorToast(\n t(I18nKey.CONVERSATION$CLONE_COMMAND_FAILED_DISCONNECTED),\n );\n return;\n }\n\n // Send clone command to agent after metadata is updated\n // Use ref to always call the latest send function (avoids stale closure\n // where V1 sendMessage holds a reference to a now-closed WebSocket)\n // Include git provider in prompt so agent clones from correct source\n const providerName =\n repository.git_provider.charAt(0).toUpperCase() +\n repository.git_provider.slice(1);\n const clonePrompt = `Clone ${repository.full_name} from ${providerName} and checkout branch ${branch.name}.`;\n const pendingId = conversationId\n ? enqueuePendingMessage({ conversationId, text: clonePrompt })\n : null;\n // Pull chat back to the bottom so the optimistic \"Clone …\" bubble\n // is visible even if the user had scrolled up.\n scrollContext?.scrollDomToBottom();\n // `send` returns a Promise; surface a failed send by flipping the\n // matching pending entry to \"error\" so the user gets the retry link\n // rather than a perpetual \"Sending…\" bubble.\n Promise.resolve(\n sendRef.current({\n action: \"message\",\n args: {\n content: clonePrompt,\n timestamp: new Date().toISOString(),\n },\n }),\n ).catch((error) => {\n if (!pendingId) return;\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to send message\";\n markPendingMessageError(pendingId, errorMessage);\n });\n },\n },\n );\n };\n\n // Local backends never use the remote-repo \"Connect Repo\" CTA, so suppress the\n // empty-state button there. A repo or workspace label inferred from local git\n // metadata is still informational and stays visible.\n const showRepoButton =\n !isLocalBackend || !!selectedRepository || !!workspaceName;\n // On a local backend the informational pill (e.g. workspace name, or a repo\n // detected without a recognized provider) should not open the remote-repo\n // modal — that flow is cloud-only. Disable the button in that case so the\n // click is a no-op. Linkable repos render as <a> and ignore `disabled`.\n const isRepoButtonInert = isLocalBackend && !hasRepository;\n\n // True when the bar will render at least one chip (cloud always shows\n // \"Open Repository\"; local needs a repo or a workspace name; selected\n // branch or push/pull/PR also count). When false, the bar has nothing to\n // show — return null so the wrapper above collapses to its natural padding\n // instead of leaving an empty DOM node below the chat input.\n const hasAnyContent = showRepoButton || !!selectedBranch || hasRepository;\n if (!hasAnyContent) return null;\n\n return (\n <div className=\"flex flex-row items-center\">\n <div className=\"flex flex-row gap-2.5 items-center overflow-x-auto flex-nowrap relative scrollbar-hide\">\n {showRepoButton ? (\n <GitControlBarRepoButton\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n workspaceName={workspaceName}\n onClick={() => setIsOpenRepoModalOpen(true)}\n disabled={!isConversationReady || isRepoButtonInert}\n />\n ) : null}\n\n {selectedBranch ? (\n <GitControlBarBranchButton\n selectedBranch={selectedBranch}\n selectedRepository={selectedRepository}\n gitProvider={gitProvider}\n />\n ) : null}\n\n {hasRepository ? (\n <>\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pull-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPullButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-push-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPushButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n\n <GitControlBarTooltipWrapper\n tooltipMessage={t(I18nKey.COMMON$GIT_TOOLS_DISABLED_CONTENT)}\n testId=\"git-control-bar-pr-button-tooltip\"\n shouldShowTooltip={!hasRepository}\n >\n <GitControlBarPrButton\n onSuggestionsClick={onSuggestionsClick}\n hasRepository={hasRepository}\n providerTokensReady={providerTokensReady}\n currentGitProvider={gitProvider}\n isConversationReady={isConversationReady}\n />\n </GitControlBarTooltipWrapper>\n </>\n ) : null}\n </div>\n\n <OpenRepositoryModal\n isOpen={isOpenRepoModalOpen}\n onClose={() => setIsOpenRepoModalOpen(false)}\n onLaunch={handleLaunchRepository}\n defaultProvider={gitProvider}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../hooks/use-conversation-id.cjs`),n=require(`../../../stores/optimistic-user-message-store.cjs`),r=require(`../../../hooks/use-send-message.cjs`),i=require(`../../../utils/pending-task-message-link.cjs`),a=require(`../../../services/chat-service.cjs`),o=require(`./chat-message.cjs`),s=require(`../images/image-carousel.cjs`);let c=require(`react`);c=e.__toESM(c,1);let l=require(`react/jsx-runtime`);function u(){let{conversationId:e}=t.useOptionalConversationId(),u=n.useOptimisticUserMessageStore(e=>e.pendingMessages),d=n.useOptimisticUserMessageStore(e=>e.markPendingMessageError),f=n.useOptimisticUserMessageStore(e=>e.markPendingMessageSending),{send:p}=r.useSendMessage(),m=c.default.useMemo(()=>e?u.filter(t=>i.matchesPendingConversationId(e,t.conversationId)):[],[u,e]),h=c.default.useCallback(async e=>{let t=n.useOptimisticUserMessageStore.getState().pendingMessages.find(t=>t.id===e);if(t){f(e);try{await p(a.createChatMessage(t.text,t.imageUrls,t.fileUrls,t.timestamp))}catch(t){d(e,t instanceof Error?t.message:`Failed to send message`)}}},[p,d,f]);return m.length===0?null:(0,l.jsx)(l.Fragment,{children:m.map(e=>(0,l.jsx)(o.ChatMessage,{type:`user`,message:e.text,pendingStatus:e.status,onRetry:e.status===`error`?()=>h(e.id):void 0,children:e.imageUrls.length>0&&(0,l.jsx)(s.ImageCarousel,{size:`small`,images:e.imageUrls})},e.id))})}exports.PendingUserMessages=u;
1
+ const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../hooks/use-conversation-id.cjs`),n=require(`../../../stores/conversation-store.cjs`),r=require(`../../../stores/optimistic-user-message-store.cjs`),i=require(`../../../hooks/use-send-message.cjs`),a=require(`../../../utils/pending-task-message-link.cjs`),o=require(`../../../services/chat-service.cjs`),s=require(`./chat-message.cjs`),c=require(`../images/image-carousel.cjs`);let l=require(`react`);l=e.__toESM(l,1);let u=require(`react/jsx-runtime`);function d(){let{conversationId:e}=t.useOptionalConversationId(),d=r.useOptimisticUserMessageStore(e=>e.pendingMessages),f=r.useOptimisticUserMessageStore(e=>e.markPendingMessageError),p=r.useOptimisticUserMessageStore(e=>e.markPendingMessageSending),m=r.useOptimisticUserMessageStore(e=>e.removePendingMessage),h=n.useConversationStore(e=>e.restoreMessageToInputIfEmpty),{send:g}=i.useSendMessage(),_=l.default.useMemo(()=>e?d.filter(t=>a.matchesPendingConversationId(e,t.conversationId)):[],[d,e]),v=l.default.useCallback(async e=>{let t=r.useOptimisticUserMessageStore.getState().pendingMessages.find(t=>t.id===e);if(t){p(e);try{await g(o.createChatMessage(t.text,t.imageUrls,t.fileUrls,t.timestamp))}catch(t){f(e,t instanceof Error?t.message:`Failed to send message`)}}},[g,f,p]),y=l.default.useCallback((e,t)=>{h(t),m(e)},[h,m]);return _.length===0?null:(0,u.jsx)(u.Fragment,{children:_.map(e=>(0,u.jsx)(s.ChatMessage,{type:`user`,message:e.text,pendingStatus:e.status,onRetry:e.status===`error`?()=>v(e.id):void 0,onStop:e.status===`sending`?()=>y(e.id,e.text):void 0,children:e.imageUrls.length>0&&(0,u.jsx)(c.ImageCarousel,{size:`small`,images:e.imageUrls})},e.id))})}exports.PendingUserMessages=d;
2
2
  //# sourceMappingURL=pending-user-messages.cjs.map