@openhands/agent-canvas 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-DrjNsPOH.js → acp-providers-DcY_mKYa.js} +1 -1
  4. package/build/assets/active-backend-context-BnH4-L8h.js +2 -0
  5. package/build/assets/{agent-context-settings-CJUrcBut.js → agent-context-settings-D3peZkjX.js} +1 -1
  6. package/build/assets/{agent-profiles-service.api-Biieml2L.js → agent-profiles-service.api-DkeZaqIl.js} +1 -1
  7. package/build/assets/agent-profiles-settings-7yMWYjGF.js +1 -0
  8. package/build/assets/agent-server-client-options-EHB23gyx.js +1 -0
  9. package/build/assets/agent-server-config-C_x8Otd9.js +1 -0
  10. package/build/assets/agent-server-conversation-service.api-jiCopc2E.js +88 -0
  11. package/build/assets/{agent-settings-CpY3zObk.js → agent-settings-BF8hM6wb.js} +1 -1
  12. package/build/assets/agent-settings-YPutBAeR.js +1 -0
  13. package/build/assets/alert-banner-eYyqvHL3.js +1 -0
  14. package/build/assets/{api-error-message-Ve79qDcN.js → api-error-message-BXo0lCI5.js} +1 -1
  15. package/build/assets/api-key-entry-screen-CCBvBD8u.js +1 -0
  16. package/build/assets/app-settings-BtYDs-Be.js +1 -0
  17. package/build/assets/automation-detail-BxXhb_m2.js +3 -0
  18. package/build/assets/{automation-export-DxY47m3T.js → automation-export-BJsfi7n2.js} +1 -1
  19. package/build/assets/automation-git-sync-B7o_Nbl-.js +1 -0
  20. package/build/assets/automation-setup-route-qaJ6lLCf.js +3 -0
  21. package/build/assets/{automation-templates-4C4PM8K7.js → automation-templates-Bb98r-kx.js} +1 -1
  22. package/build/assets/automations-list-DEPVNud3.js +1 -0
  23. package/build/assets/{back-nav-button-B8tH0BEp.js → back-nav-button-B2yBiVMB.js} +1 -1
  24. package/build/assets/backend-form-modal-DxisQV_6.js +1 -0
  25. package/build/assets/backend-synced-settings-badge-DLEp6cq7.js +1 -0
  26. package/build/assets/badge-ehL-kgeO.js +1 -0
  27. package/build/assets/{base-modal-DTULovNc.js → base-modal-C1a0TsSx.js} +1 -1
  28. package/build/assets/{bot-CLMxGFaq.js → bot-ByolqPEr.js} +1 -1
  29. package/build/assets/{brand-button-DxPO4Lf8.js → brand-button-CUMfjb99.js} +1 -1
  30. package/build/assets/{browser-C-_qBasq.js → browser-SE24Tk8g.js} +6 -6
  31. package/build/assets/browser-tab-HjJxHA0V.js +1 -0
  32. package/build/assets/canvas-extension-page-BsUGBb1T.js +1 -0
  33. package/build/assets/canvas-extensions-C9Tm6s_E.js +1 -0
  34. package/build/assets/{canvas-extensions-runtime-DdnkgJXV.js → canvas-extensions-runtime-B8kxM4rO.js} +1 -1
  35. package/build/assets/{chat-send-button-B3SFSIg5.js → chat-send-button-CGvc2wpE.js} +1 -1
  36. package/build/assets/check-Bo8s5Ylg.js +1 -0
  37. package/build/assets/chevron-down-Cr6Fn_wS.js +1 -0
  38. package/build/assets/chevron-right-CfdfRn-8.js +1 -0
  39. package/build/assets/circle-check-5pH3qCji.js +1 -0
  40. package/build/assets/circle-plus-check-toggle-BDX_ctNs.js +1 -0
  41. package/build/assets/{cloud-funnel-analytics-BQanUEEC.js → cloud-funnel-analytics-D5uJ_4JE.js} +1 -1
  42. package/build/assets/{cog-VBlRo6iw.js → cog-CAEugqtV.js} +1 -1
  43. package/build/assets/command-menu-CQxs4mtX.js +1 -0
  44. package/build/assets/commits-tab-D0xgjipP.js +1 -0
  45. package/build/assets/{condenser-settings-eVKFMvap.js → condenser-settings-D63NJRBT.js} +1 -1
  46. package/build/assets/confirmation-modal-78sd9Vny.js +1 -0
  47. package/build/assets/{context-menu-list-item-DDROe12Z.js → context-menu-list-item-Cm7-7Y-7.js} +1 -1
  48. package/build/assets/{conversation-BnjJSFf5.js → conversation-B_nweu5p.js} +8 -8
  49. package/build/assets/conversation-edjzrv5w.js +1 -0
  50. package/build/assets/conversation-panel-edjzrv5w.js +1 -0
  51. package/build/assets/conversation-state-store-9D_3P7q4.js +1 -0
  52. package/build/assets/conversation-store-DC-JlJuq.js +6 -0
  53. package/build/assets/{conversation-tab-empty-state-DKlzAz5c.js → conversation-tab-empty-state-B3dpJXX0.js} +1 -1
  54. package/build/assets/copy-to-clipboard-button-B1ljgNxO.js +1 -0
  55. package/build/assets/device-verify-D5QRIS_x.js +1 -0
  56. package/build/assets/{dropdown-classes-B9kJVDIk.js → dropdown-classes-BGvOvW2_.js} +1 -1
  57. package/build/assets/edit-automation-modal-D_JWSmxT.js +1 -0
  58. package/build/assets/empty-state-FK_s1B60.js +1 -0
  59. package/build/assets/{entry.client-Ds8LVp-E.js → entry.client-BMafTpjO.js} +2 -2
  60. package/build/assets/enum-filter-dropdown-UNaom12H.js +1 -0
  61. package/build/assets/environment-switch-overlay-COibRUA-.js +1 -0
  62. package/build/assets/error-state-Cf8LRuuY.js +1 -0
  63. package/build/assets/extensions-hub-C_6ahIua.js +1 -0
  64. package/build/assets/extensions-navigation-C5GfpzFe.js +1 -0
  65. package/build/assets/{external-link-DQtv7eTh.js → external-link-Bd7Tga-1.js} +1 -1
  66. package/build/assets/files-tab-D5PPIWI1.js +1 -0
  67. package/build/assets/{form-control-classes-B-z85REi.js → form-control-classes-Dbq-7YP_.js} +1 -1
  68. package/build/assets/format-model-name-Dfh9Udrx.js +1 -0
  69. package/build/assets/get-git-path-jU2zjqIB.js +1 -0
  70. package/build/assets/git-repo-dropdown-BoDDWXfX.js +1 -0
  71. package/build/assets/git-repo-dropdown-uxlFw2gn.js +1 -0
  72. package/build/assets/highlighted-source-view-C7pAXrT0.js +1 -0
  73. package/build/assets/home-BM5_Wz_R.js +1 -0
  74. package/build/assets/home-Ivfm7KC4.js +1 -0
  75. package/build/assets/home-automation-run-tooltip-B1N2uO9p.js +1 -0
  76. package/build/assets/home-store-DCbei3DX.js +1 -0
  77. package/build/assets/hooks-service-Dnmhqc0Z.js +1 -0
  78. package/build/assets/index-home-td9BN2T3.js +1 -0
  79. package/build/assets/info-BcajzHn1.js +1 -0
  80. package/build/assets/install-server-modal-B81I-5OE.js +1 -0
  81. package/build/assets/kebab-menu-item-content-SCJBwZnp.js +1 -0
  82. package/build/assets/{key-CfXbJa8w.js → key-O84CMFHb.js} +1 -1
  83. package/build/assets/launch-ZLxI4opd.js +1 -0
  84. package/build/assets/list-filter-B8PQk3RA.js +1 -0
  85. package/build/assets/{list-todo-ByXMdY4W.js → list-todo-Caa8E1X_.js} +1 -1
  86. package/build/assets/llm-not-configured-banner-Dh_ajcM8.js +27 -0
  87. package/build/assets/llm-settings-CODhjQzy.js +1 -0
  88. package/build/assets/llm-settings-CZaXYgtw.js +1 -0
  89. package/build/assets/{llm-subscription-service-aDNBQ7Gq.js → llm-subscription-service-CgIDc38n.js} +1 -1
  90. package/build/assets/loader-circle-BxJgk73D.js +1 -0
  91. package/build/assets/{loading-spinner-DfHI77BA.js → loading-spinner-BeLV0IXf.js} +1 -1
  92. package/build/assets/manage-backends-modal-cMXqCb-B.js +1 -0
  93. package/build/assets/manifest-bfeccb98.js +1 -0
  94. package/build/assets/manifest-subpage-layout-CVZgVKoY.js +1 -0
  95. package/build/assets/{map-provider-DXvssjw9.js → map-provider-iRs80q_6.js} +1 -1
  96. package/build/assets/markdown-renderer-DyFl9-mL.js +8 -0
  97. package/build/assets/mcp-CraxoXQv.js +1 -0
  98. package/build/assets/{mcp-marketplace-utils-Cn_NIMWM.js → mcp-marketplace-utils-C7PYr293.js} +1 -1
  99. package/build/assets/mcp-page-CteH_K0N.js +9 -0
  100. package/build/assets/messages-Bk1xhbU2.js +41 -0
  101. package/build/assets/{modal-body-DJw4xBki.js → modal-body-C24WsdFb.js} +1 -1
  102. package/build/assets/{modal-classes-Dg0ngBPO.js → modal-classes-B0b9eiL8.js} +1 -1
  103. package/build/assets/modal-close-button-DfqfB2Nj.js +1 -0
  104. package/build/assets/{mouse-pointer-click-DEhsSUpu.js → mouse-pointer-click-BXlRN92t.js} +1 -1
  105. package/build/assets/onboarding-DXFBRqEy.js +1 -0
  106. package/build/assets/onboarding-modal-BT3Gx_sZ.js +1 -0
  107. package/build/assets/{organization-service.api-Cyg1Tn03.js → organization-service.api-B5CvmnYQ.js} +1 -1
  108. package/build/assets/{pencil-D5c47kyN.js → pencil-q-ihqDYv.js} +1 -1
  109. package/build/assets/{pin-C7vMagvf.js → pin-BdroVQdN.js} +1 -1
  110. package/build/assets/planner-tab-CstoOlAB.js +1 -0
  111. package/build/assets/{plug-CeaqeF6u.js → plug-7ACOEbMs.js} +1 -1
  112. package/build/assets/{plugins-management-service-Bh_pBuf-.js → plugins-management-service-5rqVPEGN.js} +1 -1
  113. package/build/assets/plus-C2e21TFC.js +1 -0
  114. package/build/assets/{profiles-service.api-BbOK0EkF.js → profiles-service.api-D1XKMgr0.js} +1 -1
  115. package/build/assets/providers-XmZ9HM4Q.js +1 -0
  116. package/build/assets/proxy-XP6U1Dhv.js +1 -0
  117. package/build/assets/{puzzle-DdAqbUrb.js → puzzle-LJYnuxKe.js} +1 -1
  118. package/build/assets/react-BX7IV650.js +1 -0
  119. package/build/assets/recommended-automations-launcher-DEHRKIAg.js +1 -0
  120. package/build/assets/{refresh-cw-DEQdPCpH.js → refresh-cw-BtdC3T8P.js} +1 -1
  121. package/build/assets/root-CM6IZHlg.css +1 -0
  122. package/build/assets/root-DdFkodKW.js +2 -0
  123. package/build/assets/root-layout-DUquNZTU.js +2 -0
  124. package/build/assets/schema-field-Y3F8JvXd.js +1 -0
  125. package/build/assets/sdk-section-page-CNZTLwH9.js +1 -0
  126. package/build/assets/secret-form-9-BoGA40.js +1 -0
  127. package/build/assets/{secrets-service-Cr8g8xuv.js → secrets-service-BOIsfD9j.js} +1 -1
  128. package/build/assets/secrets-settings-CBJgFr42.js +1 -0
  129. package/build/assets/settings-D4hdToD4.js +1 -0
  130. package/build/assets/settings-dropdown-input-DBvsZ7-Q.js +1 -0
  131. package/build/assets/settings-index-DeQphyBK.js +1 -0
  132. package/build/assets/settings-input-dVuzapBA.js +1 -0
  133. package/build/assets/{settings-list-classes-Ds4jPBHK.js → settings-list-classes-DhAPuXm6.js} +1 -1
  134. package/build/assets/settings-modal-tHiJ8iYV.js +1 -0
  135. package/build/assets/settings-nav-GAQjW1a-.js +16 -0
  136. package/build/assets/{settings-service.api-9_xdv_mh.js → settings-service.api-C1vZH9Vh.js} +1 -1
  137. package/build/assets/settings-switch-DDd1cQ8t.js +1 -0
  138. package/build/assets/{settings-utils-8GIIgOQL.js → settings-utils-BTaaRhLZ.js} +1 -1
  139. package/build/assets/shared-conversation-Cyg7m7ns.js +1 -0
  140. package/build/assets/{shield-check-DO7wa_eu.js → shield-check-C3Rl0NF8.js} +1 -1
  141. package/build/assets/{sidebar-layout-EPfWxk11.js → sidebar-layout-DH0E-5KW.js} +1 -1
  142. package/build/assets/sidebar-mobile-menu-toggle-CQ4iky__.js +1 -0
  143. package/build/assets/{sidebar-nav-link-_t4_Ef-9.js → sidebar-nav-link-oLQiKUBu.js} +1 -1
  144. package/build/assets/{sidebar-onboarding-checklist-storage-DbDX-Wvj.js → sidebar-onboarding-checklist-storage-TfvNNnnr.js} +1 -1
  145. package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
  146. package/build/assets/skill-card-pill-row-DfjIfj0K.js +1 -0
  147. package/build/assets/{skill-filter-BBeZ4JEP.js → skill-filter-DsNLmn76.js} +2 -2
  148. package/build/assets/{skill-icon-badge-BDhQ-tQ0.js → skill-icon-badge-0MK_68Nc.js} +1 -1
  149. package/build/assets/skill-scope-BE-H9TSZ.js +1 -0
  150. package/build/assets/skills-plugins-vzSdxSk_.js +1 -0
  151. package/build/assets/skills-settings-BiPOH9H9.js +1 -0
  152. package/build/assets/{styled-tooltip-Pd22BIvr.js → styled-tooltip-CejG0rqv.js} +1 -1
  153. package/build/assets/task-list-tab-OkZSqnTp.js +1 -0
  154. package/build/assets/{terminal-onXx0_Qz.js → terminal-Dph60VFZ.js} +1 -1
  155. package/build/assets/{toggle-switch-lwQtxDcm.js → toggle-switch-B2uXaAUS.js} +1 -1
  156. package/build/assets/{trash-2-ZhKuTLiz.js → trash-2-Bb40zQzs.js} +1 -1
  157. package/build/assets/trash-Ckh7yCaB.js +1 -0
  158. package/build/assets/{triangle-alert-BajLPpQg.js → triangle-alert-DEdu-b_L.js} +1 -1
  159. package/build/assets/{typography-HLLg_FAn.js → typography-DgcLGdHk.js} +1 -1
  160. package/build/assets/usage-tab-MCmNRAnR.js +1 -0
  161. package/build/assets/use-acp-credential-form-ychoGqjC.js +1 -0
  162. package/build/assets/{use-activate-agent-profile-BLKML6vQ.js → use-activate-agent-profile-8L8Xdghy.js} +1 -1
  163. package/build/assets/use-agent-profiles-Bi8hSkze.js +1 -0
  164. package/build/assets/{use-automation-health-BZkQNEA8.js → use-automation-health-U99vvHxx.js} +1 -1
  165. package/build/assets/{use-automation-permissions-B_RpvL-s.js → use-automation-permissions-Buus0R6h.js} +1 -1
  166. package/build/assets/{use-automations-Cg0PDIZr.js → use-automations-Bq5hVuv0.js} +1 -1
  167. package/build/assets/{use-can-manage-org-profiles-BbN6KfDr.js → use-can-manage-org-profiles-MzIeEV8F.js} +1 -1
  168. package/build/assets/{use-canvas-extensions-CFUpHat6.js → use-canvas-extensions-Ca9KoVEm.js} +1 -1
  169. package/build/assets/{use-cloud-current-user-id-Dk0rjr63.js → use-cloud-current-user-id-B4ZLUZSa.js} +1 -1
  170. package/build/assets/{use-config-DpafU_QP.js → use-config-l5tkDHyD.js} +1 -1
  171. package/build/assets/{use-create-conversation-1YgmAHt-.js → use-create-conversation-i_PdFdIs.js} +1 -1
  172. package/build/assets/use-create-secret-CjWq0J4O.js +1 -0
  173. package/build/assets/use-free-models-gCsJ5BV0.js +1 -0
  174. package/build/assets/{use-get-secrets-CQ4b0qK8.js → use-get-secrets-CMTuWEp_.js} +1 -1
  175. package/build/assets/use-is-authed-A2Yinlt0.js +1 -0
  176. package/build/assets/{use-launch-skill-in-chat-DeYa1tFM.js → use-launch-skill-in-chat-QbXDhiHr.js} +1 -1
  177. package/build/assets/use-llm-configured-Dl4zg8ht.js +1 -0
  178. package/build/assets/use-llm-profiles-SWsuFmFu.js +1 -0
  179. package/build/assets/{use-manifest-capabilities-AOWGcu0j.js → use-manifest-capabilities-CdqYfUAC.js} +1 -1
  180. package/build/assets/{use-onboarding-completion-CoINurkm.js → use-onboarding-completion-Xl63ZvzQ.js} +1 -1
  181. package/build/assets/{use-pinned-home-route-D6krwXjy.js → use-pinned-home-route-BXDIUaxQ.js} +1 -1
  182. package/build/assets/{use-plugins-marketplace-mLsIDhBv.js → use-plugins-marketplace-BIIaPiaB.js} +1 -1
  183. package/build/assets/use-save-agent-profile-D-ZHHE94.js +1 -0
  184. package/build/assets/{use-save-settings-3U5K9-8x.js → use-save-settings-Dapkf4cC.js} +1 -1
  185. package/build/assets/{use-settings-Dn00UISA.js → use-settings-C2KKQKVC.js} +1 -1
  186. package/build/assets/use-settings-nav-items-TOc0Rsfd.js +1 -0
  187. package/build/assets/{use-tracking-B9prBsrq.js → use-tracking-j4uo9VEW.js} +1 -1
  188. package/build/assets/{use-user-conversation-ZWlXtbZb.js → use-user-conversation-5UFqMoO4.js} +1 -1
  189. package/build/assets/{useInfiniteQuery-BzrRqjLg.js → useInfiniteQuery-CtSRG7uW.js} +1 -1
  190. package/build/assets/{useMutation-CJuK90oc.js → useMutation-Cszf8mKy.js} +1 -1
  191. package/build/assets/useQueries-pUohFMSP.js +1 -0
  192. package/build/assets/useQuery-DAAacS7O.js +1 -0
  193. package/build/assets/useTranslation-CCgUjPJF.js +1 -0
  194. package/build/assets/utils-BgLSZdyy.js +1 -0
  195. package/build/assets/{vendor~conversation-panel~conversation-4eJ0tml3.js → vendor~conversation-panel~conversation-C22sJuWZ.js} +1 -1
  196. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BXXGJNDU.js +185 -0
  197. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-40UR63Gt.js +1 -0
  198. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js → vendor~index-home~home~conversation-panel~conversation-UTl7gUo9.js} +1 -1
  199. package/build/assets/{vendor~root-layout-n8XCEXG8.js → vendor~root-layout-CcdIqs-C.js} +1 -1
  200. package/build/assets/{vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js → vendor~root-layout~conversation-panel~conversation-C3EBV3kp.js} +1 -1
  201. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BCe0JJVy.js +1 -0
  202. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BGGbPcYh.js} +1 -1
  203. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js} +1 -1
  204. package/build/assets/{verification-settings-u2POabjH.js → verification-settings-DdBpaVPz.js} +1 -1
  205. package/build/assets/{wrench-CkgI4rxA.js → wrench-B8Wg_nbp.js} +1 -1
  206. package/build/assets/{x-By6qCmtY.js → x-CX8lVGwm.js} +1 -1
  207. package/build/index.html +4 -4
  208. package/build/locales/ar/openhands.json +6 -2
  209. package/build/locales/ca/openhands.json +6 -2
  210. package/build/locales/de/openhands.json +6 -2
  211. package/build/locales/en/openhands.json +6 -2
  212. package/build/locales/es/openhands.json +6 -2
  213. package/build/locales/fr/openhands.json +6 -2
  214. package/build/locales/it/openhands.json +6 -2
  215. package/build/locales/ja/openhands.json +6 -2
  216. package/build/locales/ko-KR/openhands.json +6 -2
  217. package/build/locales/no/openhands.json +6 -2
  218. package/build/locales/pt/openhands.json +6 -2
  219. package/build/locales/tr/openhands.json +6 -2
  220. package/build/locales/uk/openhands.json +6 -2
  221. package/build/locales/zh-CN/openhands.json +6 -2
  222. package/build/locales/zh-TW/openhands.json +6 -2
  223. package/config/defaults.json +1 -1
  224. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  225. package/dist/api/cloud/organization-service.api.d.ts +9 -1
  226. package/dist/api/cloud/organization-service.api.js.map +1 -1
  227. package/dist/api/config-service/config-service.api.cjs +1 -1
  228. package/dist/api/config-service/config-service.api.cjs.map +1 -1
  229. package/dist/api/config-service/config-service.api.js +6 -2
  230. package/dist/api/config-service/config-service.api.js.map +1 -1
  231. package/dist/api/config-service/config-service.types.d.ts +13 -0
  232. package/dist/components/features/automations/automation-card.cjs +1 -1
  233. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  234. package/dist/components/features/automations/automation-card.js +39 -38
  235. package/dist/components/features/automations/automation-card.js.map +1 -1
  236. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  237. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  238. package/dist/components/features/automations/automation-list-row.js +73 -72
  239. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  240. package/dist/components/features/automations/build-automation-menu-items.cjs +1 -1
  241. package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -1
  242. package/dist/components/features/automations/build-automation-menu-items.d.ts +3 -1
  243. package/dist/components/features/automations/build-automation-menu-items.js +12 -11
  244. package/dist/components/features/automations/build-automation-menu-items.js.map +1 -1
  245. package/dist/components/features/automations/detail/configuration-section.d.ts +7 -1
  246. package/dist/components/features/automations/detail/detail-header.d.ts +8 -5
  247. package/dist/components/features/backends/backend-selector.cjs +1 -1
  248. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  249. package/dist/components/features/backends/backend-selector.js +112 -112
  250. package/dist/components/features/backends/backend-selector.js.map +1 -1
  251. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  252. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  253. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +62 -61
  254. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  255. package/dist/components/features/chat/model-messages.cjs +1 -1
  256. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  257. package/dist/components/features/chat/model-messages.js +27 -26
  258. package/dist/components/features/chat/model-messages.js.map +1 -1
  259. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  260. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  261. package/dist/components/features/conversation-panel/budget-display.d.ts +1 -2
  262. package/dist/components/features/conversation-panel/budget-display.js +12 -19
  263. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  264. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  265. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  266. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +45 -44
  267. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  268. package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +1 -2
  269. package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +0 -1
  270. package/dist/components/features/images/image-lightbox.cjs +2 -0
  271. package/dist/components/features/images/image-lightbox.cjs.map +1 -0
  272. package/dist/components/features/images/image-lightbox.d.ts +11 -0
  273. package/dist/components/features/images/image-lightbox.js +37 -0
  274. package/dist/components/features/images/image-lightbox.js.map +1 -0
  275. package/dist/components/features/images/image-preview.cjs +1 -1
  276. package/dist/components/features/images/image-preview.cjs.map +1 -1
  277. package/dist/components/features/images/image-preview.d.ts +2 -1
  278. package/dist/components/features/images/image-preview.js +33 -13
  279. package/dist/components/features/images/image-preview.js.map +1 -1
  280. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +3 -4
  281. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  282. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  283. package/dist/components/features/settings/cloud-settings-link.d.ts +3 -1
  284. package/dist/components/features/settings/cloud-settings-link.js +22 -21
  285. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  286. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  287. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -1
  288. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  289. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -1
  290. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  291. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  292. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +2 -1
  293. package/dist/components/features/sidebar/sidebar-rail-body.js +143 -142
  294. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  295. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  296. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  297. package/dist/components/features/sidebar/sidebar.js +28 -27
  298. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  299. package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
  300. package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
  301. package/dist/components/providers/agent-server-ui-providers.js +33 -29
  302. package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
  303. package/dist/components/shared/buttons/remove-button.cjs +1 -1
  304. package/dist/components/shared/buttons/remove-button.cjs.map +1 -1
  305. package/dist/components/shared/buttons/remove-button.d.ts +2 -1
  306. package/dist/components/shared/buttons/remove-button.js +2 -1
  307. package/dist/components/shared/buttons/remove-button.js.map +1 -1
  308. package/dist/components/shared/free-models-note.cjs +2 -0
  309. package/dist/components/shared/free-models-note.cjs.map +1 -0
  310. package/dist/components/shared/free-models-note.d.ts +3 -0
  311. package/dist/components/shared/free-models-note.js +20 -0
  312. package/dist/components/shared/free-models-note.js.map +1 -0
  313. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  314. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  315. package/dist/components/shared/modals/settings/model-selector.js +102 -112
  316. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  317. package/dist/config/defaults.cjs +1 -1
  318. package/dist/config/defaults.cjs.map +1 -1
  319. package/dist/config/defaults.js +1 -1
  320. package/dist/config/defaults.js.map +1 -1
  321. package/dist/constants/acp-providers.cjs.map +1 -1
  322. package/dist/constants/acp-providers.d.ts +12 -0
  323. package/dist/constants/acp-providers.js.map +1 -1
  324. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  325. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  326. package/dist/hooks/chat/use-slash-command.js +63 -62
  327. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  328. package/dist/hooks/query/use-free-models.cjs +2 -0
  329. package/dist/hooks/query/use-free-models.cjs.map +1 -0
  330. package/dist/hooks/query/use-free-models.d.ts +23 -0
  331. package/dist/hooks/query/use-free-models.js +67 -0
  332. package/dist/hooks/query/use-free-models.js.map +1 -0
  333. package/dist/hooks/query/use-local-git-info.cjs.map +1 -1
  334. package/dist/hooks/query/use-local-git-info.js.map +1 -1
  335. package/dist/hooks/query/use-provider-models.cjs +1 -1
  336. package/dist/hooks/query/use-provider-models.cjs.map +1 -1
  337. package/dist/hooks/query/use-provider-models.js +34 -25
  338. package/dist/hooks/query/use-provider-models.js.map +1 -1
  339. package/dist/hooks/query/use-search-providers.cjs +1 -1
  340. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  341. package/dist/hooks/query/use-search-providers.js +31 -19
  342. package/dist/hooks/query/use-search-providers.js.map +1 -1
  343. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  344. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  345. package/dist/hooks/use-home-automation-actions.d.ts +1 -2
  346. package/dist/hooks/use-home-automation-actions.js +0 -1
  347. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  348. package/dist/i18n/declaration.cjs +1 -1
  349. package/dist/i18n/declaration.cjs.map +1 -1
  350. package/dist/i18n/declaration.d.ts +6 -2
  351. package/dist/i18n/declaration.js +1 -1
  352. package/dist/i18n/declaration.js.map +1 -1
  353. package/dist/i18n/translation.cjs +2 -2
  354. package/dist/i18n/translation.cjs.map +1 -1
  355. package/dist/i18n/translation.js +85 -17
  356. package/dist/i18n/translation.js.map +1 -1
  357. package/dist/locales/ar/openhands.json +6 -2
  358. package/dist/locales/ca/openhands.json +6 -2
  359. package/dist/locales/de/openhands.json +6 -2
  360. package/dist/locales/en/openhands.json +6 -2
  361. package/dist/locales/es/openhands.json +6 -2
  362. package/dist/locales/fr/openhands.json +6 -2
  363. package/dist/locales/it/openhands.json +6 -2
  364. package/dist/locales/ja/openhands.json +6 -2
  365. package/dist/locales/ko-KR/openhands.json +6 -2
  366. package/dist/locales/no/openhands.json +6 -2
  367. package/dist/locales/pt/openhands.json +6 -2
  368. package/dist/locales/tr/openhands.json +6 -2
  369. package/dist/locales/uk/openhands.json +6 -2
  370. package/dist/locales/zh-CN/openhands.json +6 -2
  371. package/dist/locales/zh-TW/openhands.json +6 -2
  372. package/dist/package.cjs +1 -1
  373. package/dist/package.cjs.map +1 -1
  374. package/dist/package.js +1 -1
  375. package/dist/package.js.map +1 -1
  376. package/dist/routes/app-settings.cjs +1 -1
  377. package/dist/routes/app-settings.cjs.map +1 -1
  378. package/dist/routes/app-settings.js +52 -47
  379. package/dist/routes/app-settings.js.map +1 -1
  380. package/dist/routes/llm-settings.cjs +1 -1
  381. package/dist/routes/llm-settings.cjs.map +1 -1
  382. package/dist/routes/llm-settings.js +137 -145
  383. package/dist/routes/llm-settings.js.map +1 -1
  384. package/dist/stores/free-models-store.cjs +2 -0
  385. package/dist/stores/free-models-store.cjs.map +1 -0
  386. package/dist/stores/free-models-store.d.ts +30 -0
  387. package/dist/stores/free-models-store.js +22 -0
  388. package/dist/stores/free-models-store.js.map +1 -0
  389. package/dist/utils/format-model-name.cjs +1 -1
  390. package/dist/utils/format-model-name.cjs.map +1 -1
  391. package/dist/utils/format-model-name.d.ts +27 -6
  392. package/dist/utils/format-model-name.js +14 -6
  393. package/dist/utils/format-model-name.js.map +1 -1
  394. package/package.json +1 -1
  395. package/build/assets/active-backend-context-rZiLJRUc.js +0 -2
  396. package/build/assets/agent-profiles-settings-x6RvPsq7.js +0 -1
  397. package/build/assets/agent-server-client-options-BikiNwTa.js +0 -1
  398. package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +0 -88
  399. package/build/assets/agent-settings-BJyovpJ_.js +0 -1
  400. package/build/assets/alert-banner-vARz1idS.js +0 -1
  401. package/build/assets/api-key-entry-screen-CsMuBhoP.js +0 -1
  402. package/build/assets/app-settings-BaJ7nfHt.js +0 -1
  403. package/build/assets/automation-detail-CVoGDrKq.js +0 -3
  404. package/build/assets/automation-git-sync-CRMP9Bbm.js +0 -1
  405. package/build/assets/automation-setup-route-072beLz1.js +0 -3
  406. package/build/assets/automations-list-xuqTSQL4.js +0 -1
  407. package/build/assets/backend-form-modal-0aJmWdsa.js +0 -1
  408. package/build/assets/backend-synced-settings-badge-B7rKWBir.js +0 -1
  409. package/build/assets/badge-CcGx2TaV.js +0 -1
  410. package/build/assets/browser-tab-DZanIw5m.js +0 -1
  411. package/build/assets/canvas-extension-page-o_cWgE9B.js +0 -1
  412. package/build/assets/canvas-extensions-DSgNlCha.js +0 -1
  413. package/build/assets/check-fDEfgSzj.js +0 -1
  414. package/build/assets/chevron-down-CFrWHqu8.js +0 -1
  415. package/build/assets/chevron-right-C5roOrJu.js +0 -1
  416. package/build/assets/circle-check-ClTzJTdb.js +0 -1
  417. package/build/assets/circle-plus-check-toggle-Fr-h-mbL.js +0 -1
  418. package/build/assets/command-menu-BT3Ia5Ru.js +0 -1
  419. package/build/assets/commits-tab-2jhtaohl.js +0 -1
  420. package/build/assets/confirmation-modal-gIFHeZt6.js +0 -1
  421. package/build/assets/conversation-DZ578rOX.js +0 -1
  422. package/build/assets/conversation-panel-DZ578rOX.js +0 -1
  423. package/build/assets/conversation-state-store-D1_G_9I-.js +0 -1
  424. package/build/assets/conversation-store-DVVfkCsk.js +0 -6
  425. package/build/assets/copy-to-clipboard-button-B3w0X7WH.js +0 -1
  426. package/build/assets/device-verify-BfkCzyFB.js +0 -1
  427. package/build/assets/edit-automation-modal-BwhJ39JT.js +0 -1
  428. package/build/assets/empty-state-RZz0OfnY.js +0 -1
  429. package/build/assets/enum-filter-dropdown-C4pW0ORd.js +0 -1
  430. package/build/assets/environment-switch-overlay-P2ZAuzov.js +0 -1
  431. package/build/assets/error-state-B_5cgNPJ.js +0 -1
  432. package/build/assets/extensions-hub-DsaUr4ca.js +0 -1
  433. package/build/assets/extensions-navigation-CRMZd-FE.js +0 -1
  434. package/build/assets/files-tab-CCgAcVdc.js +0 -1
  435. package/build/assets/format-model-name-CasAP3nd.js +0 -1
  436. package/build/assets/get-git-path-EHrSDxTM.js +0 -1
  437. package/build/assets/git-repo-dropdown-D2WEQ97X.js +0 -1
  438. package/build/assets/git-repo-dropdown-DVeCUUXG.js +0 -1
  439. package/build/assets/highlighted-source-view-DjHO3SdW.js +0 -1
  440. package/build/assets/home-BorS_vdS.js +0 -1
  441. package/build/assets/home-aIMbHw5M.js +0 -1
  442. package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +0 -1
  443. package/build/assets/home-store-DyXz0w6d.js +0 -1
  444. package/build/assets/hooks-service-C6dpRtZM.js +0 -1
  445. package/build/assets/index-home-zKFuKK2B.js +0 -1
  446. package/build/assets/info-CTIdjttz.js +0 -1
  447. package/build/assets/install-server-modal-DUiZMc8u.js +0 -1
  448. package/build/assets/kebab-menu-item-content-mm04SBD3.js +0 -1
  449. package/build/assets/launch-BSIf9KEg.js +0 -1
  450. package/build/assets/list-filter-CNpqTWVY.js +0 -1
  451. package/build/assets/llm-not-configured-banner-z_QRSeV0.js +0 -27
  452. package/build/assets/llm-settings-B-5AHMiX.js +0 -1
  453. package/build/assets/llm-settings-B3SjHDmA.js +0 -1
  454. package/build/assets/loader-circle-Dex47vVW.js +0 -1
  455. package/build/assets/manage-backends-modal-q1NdFisr.js +0 -1
  456. package/build/assets/manifest-8920b615.js +0 -1
  457. package/build/assets/manifest-subpage-layout-BQQy5ipR.js +0 -1
  458. package/build/assets/markdown-renderer-rivLvYh-.js +0 -8
  459. package/build/assets/mcp-CEXDhQWn.js +0 -1
  460. package/build/assets/mcp-page-LGYIICMG.js +0 -9
  461. package/build/assets/messages-DUSeANAh.js +0 -41
  462. package/build/assets/modal-close-button-B9j4nasm.js +0 -1
  463. package/build/assets/onboarding-BjFebfs5.js +0 -1
  464. package/build/assets/onboarding-modal-DDTjOpyd.js +0 -1
  465. package/build/assets/planner-tab-D8f2Y3rn.js +0 -1
  466. package/build/assets/plus-B3wvU06-.js +0 -1
  467. package/build/assets/providers-2gIIkz2N.js +0 -1
  468. package/build/assets/proxy-CBgMd2zf.js +0 -1
  469. package/build/assets/recommended-automations-launcher-YLAQTp4s.js +0 -1
  470. package/build/assets/root-Bye_XmEL.js +0 -2
  471. package/build/assets/root-Cnwwzgo0.css +0 -1
  472. package/build/assets/root-layout-CSAwxBGM.js +0 -2
  473. package/build/assets/schema-field-CK0xYNbO.js +0 -1
  474. package/build/assets/sdk-section-page-Da73Rs_o.js +0 -1
  475. package/build/assets/secret-form-CB2VwYYg.js +0 -1
  476. package/build/assets/secrets-settings-Bh0udeKv.js +0 -1
  477. package/build/assets/settings-DmyIgRxO.js +0 -1
  478. package/build/assets/settings-dropdown-input-DVpyD87C.js +0 -1
  479. package/build/assets/settings-index-BSJUFmjE.js +0 -1
  480. package/build/assets/settings-input-C0dd8Utu.js +0 -1
  481. package/build/assets/settings-modal-yStgEh2o.js +0 -1
  482. package/build/assets/settings-switch-B78Khmyz.js +0 -1
  483. package/build/assets/shared-conversation-DM96X4KV.js +0 -1
  484. package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +0 -1
  485. package/build/assets/sidebar-store-CSDFK0W5.js +0 -1
  486. package/build/assets/skill-card-pill-row-989y15jV.js +0 -1
  487. package/build/assets/skill-scope-Dz3kPH3P.js +0 -1
  488. package/build/assets/skills-plugins-e3CYGdUJ.js +0 -1
  489. package/build/assets/skills-settings-3e-FuHw_.js +0 -1
  490. package/build/assets/task-list-tab-3Jg8ywch.js +0 -1
  491. package/build/assets/trash-B6OIe4yX.js +0 -1
  492. package/build/assets/usage-tab-Cm-9j3UK.js +0 -1
  493. package/build/assets/use-acp-credential-form-BARcvjYE.js +0 -1
  494. package/build/assets/use-agent-profiles-1P91KSXz.js +0 -1
  495. package/build/assets/use-create-secret-D8p9ybQj.js +0 -1
  496. package/build/assets/use-is-authed-BRPjCRKM.js +0 -1
  497. package/build/assets/use-llm-configured-DGm8FiRR.js +0 -1
  498. package/build/assets/use-llm-profiles-BTTtpW4z.js +0 -1
  499. package/build/assets/use-save-agent-profile-CxyO9YG-.js +0 -1
  500. package/build/assets/use-settings-nav-items-vrjxTqcu.js +0 -16
  501. package/build/assets/useQueries-CykmpT-a.js +0 -1
  502. package/build/assets/useQuery-S6j94er1.js +0 -1
  503. package/build/assets/utils-BOco8mxR.js +0 -1
  504. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +0 -185
  505. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js +0 -1
  506. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js +0 -1
  507. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +0 -1
@@ -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/status.cjs"),r=require("../../../../utils/utils.cjs"),i=require("../../../../constants/acp-providers.cjs"),a=require("../../../../api/agent-server-adapter.cjs"),o=require("../../../../utils/format-model-name.cjs"),s=require("../../../../utils/format-time-delta.cjs"),c=require("../../../shared/agent-brand-icon.cjs"),l=require("./conversation-card-meta-chip.cjs"),u=require("./conversation-repo-link.cjs"),d=require("./no-repository.cjs"),f=require("./conversation-tag-chips.cjs");let p=require("react/jsx-runtime");function m({selectedRepository:m,lastUpdatedAt:h,createdAt:g,executionStatus:_,workspaceWorkingDir:v,showRepositoryMetadata:y=!0,showTimestamp:b=!0,llmModel:x,showAgentChip:S=!1,agentKind:C=null,acpServer:w=null,tags:T=null,showTags:E=!1,isArchived:D=!1}){let{t:O}=e.useTranslation(`openhands`),k=n.isExecutionPaused(_),A=null;if(S)if(C===`acp`){let e=i.getAcpProviderDisplayName(w)??O(t.I18nKey.CONVERSATION$ACP_AGENT_GENERIC),n=i.labelForAcpModel(w,x),r=n??e;A={kind:i.resolveAcpProviderIcon(w),text:r,tooltip:n?`${e} · ${n}`:e}}else x&&(A={kind:`openhands`,text:o.formatNativeModelName(x)??x,tooltip:x});let j=_===void 0?void 0:`pl-[26px]`,M=E?a.getDisplayConversationTags(T):[];return(0,p.jsxs)(`div`,{className:r.cn(`flex flex-col gap-0.5 mt-0.5 w-full min-w-0`,k&&`opacity-60`),children:[(0,p.jsxs)(`div`,{className:r.cn(`flex flex-row items-center gap-2 w-full min-w-0`,y&&j),children:[y&&(m?.selected_repository?(0,p.jsx)(u.ConversationRepoLink,{selectedRepository:m}):(0,p.jsx)(d.NoRepository,{workspaceWorkingDir:v})),(0,p.jsx)(`div`,{className:`flex items-center gap-2 shrink-0 ml-auto`,children:b&&(g??h)&&(0,p.jsx)(`p`,{className:`text-xs text-[var(--oh-muted)] text-right`,children:(0,p.jsx)(`time`,{children:`${s.formatTimeDelta(h??g)} ${O(t.I18nKey.CONVERSATION$AGO)}`})})})]}),A?(0,p.jsx)(`div`,{className:j,children:(0,p.jsxs)(`span`,{"data-testid":`conversation-card-agent-chip`,className:l.CONVERSATION_CARD_META_CHIP_CLASSNAME,title:A.tooltip,children:[(0,p.jsx)(`span`,{className:`inline-flex h-4 shrink-0 items-center justify-center [&_svg]:block`,"aria-hidden":!0,children:(0,p.jsx)(c.AgentBrandIcon,{kind:A.kind,size:12})}),(0,p.jsx)(`span`,{className:`truncate leading-4`,children:A.text})]})}):null,D?(0,p.jsx)(`div`,{className:j,children:(0,p.jsx)(`span`,{"data-testid":`conversation-card-archived-chip`,className:l.CONVERSATION_CARD_META_CHIP_CLASSNAME,children:O(t.I18nKey.COMMON$ARCHIVED)})}):null,M.length>0?(0,p.jsx)(`div`,{className:j,children:(0,p.jsx)(f.ConversationTagChips,{tags:M})}):null]})}exports.ConversationCardFooter=m;
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/status.cjs"),r=require("../../../../utils/utils.cjs"),i=require("../../../../constants/acp-providers.cjs"),a=require("../../../../api/agent-server-adapter.cjs"),o=require("../../../../hooks/query/use-free-models.cjs"),s=require("../../../../utils/format-model-name.cjs"),c=require("../../../../utils/format-time-delta.cjs"),l=require("../../../shared/agent-brand-icon.cjs"),u=require("./conversation-card-meta-chip.cjs"),d=require("./conversation-repo-link.cjs"),f=require("./no-repository.cjs"),p=require("./conversation-tag-chips.cjs");let m=require("react/jsx-runtime");function h({selectedRepository:h,lastUpdatedAt:g,createdAt:_,executionStatus:v,workspaceWorkingDir:y,showRepositoryMetadata:b=!0,showTimestamp:x=!0,llmModel:S,showAgentChip:C=!1,agentKind:w=null,acpServer:T=null,tags:E=null,showTags:D=!1,isArchived:O=!1}){let{t:k}=e.useTranslation(`openhands`),A=o.useFreeModels(),j=n.isExecutionPaused(v),M=null;if(C)if(w===`acp`){let e=i.getAcpProviderDisplayName(T)??k(t.I18nKey.CONVERSATION$ACP_AGENT_GENERIC),n=i.labelForAcpModel(T,S),r=n??e;M={kind:i.resolveAcpProviderIcon(T),text:r,tooltip:n?`${e} · ${n}`:e}}else S&&(M={kind:`openhands`,text:s.formatNativeModelName(S,A)??S,tooltip:S});let N=v===void 0?void 0:`pl-[26px]`,P=D?a.getDisplayConversationTags(E):[];return(0,m.jsxs)(`div`,{className:r.cn(`flex flex-col gap-0.5 mt-0.5 w-full min-w-0`,j&&`opacity-60`),children:[(0,m.jsxs)(`div`,{className:r.cn(`flex flex-row items-center gap-2 w-full min-w-0`,b&&N),children:[b&&(h?.selected_repository?(0,m.jsx)(d.ConversationRepoLink,{selectedRepository:h}):(0,m.jsx)(f.NoRepository,{workspaceWorkingDir:y})),(0,m.jsx)(`div`,{className:`flex items-center gap-2 shrink-0 ml-auto`,children:x&&(_??g)&&(0,m.jsx)(`p`,{className:`text-xs text-[var(--oh-muted)] text-right`,children:(0,m.jsx)(`time`,{children:`${c.formatTimeDelta(g??_)} ${k(t.I18nKey.CONVERSATION$AGO)}`})})})]}),M?(0,m.jsx)(`div`,{className:N,children:(0,m.jsxs)(`span`,{"data-testid":`conversation-card-agent-chip`,className:u.CONVERSATION_CARD_META_CHIP_CLASSNAME,title:M.tooltip,children:[(0,m.jsx)(`span`,{className:`inline-flex h-4 shrink-0 items-center justify-center [&_svg]:block`,"aria-hidden":!0,children:(0,m.jsx)(l.AgentBrandIcon,{kind:M.kind,size:12})}),(0,m.jsx)(`span`,{className:`truncate leading-4`,children:M.text})]})}):null,O?(0,m.jsx)(`div`,{className:N,children:(0,m.jsx)(`span`,{"data-testid":`conversation-card-archived-chip`,className:u.CONVERSATION_CARD_META_CHIP_CLASSNAME,children:k(t.I18nKey.COMMON$ARCHIVED)})}):null,P.length>0?(0,m.jsx)(`div`,{className:N,children:(0,m.jsx)(p.ConversationTagChips,{tags:P})}):null]})}exports.ConversationCardFooter=h;
2
2
  //# sourceMappingURL=conversation-card-footer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-card-footer.cjs","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-card-footer.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { RepositorySelection } from \"#/api/open-hands.types\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { isExecutionPaused } from \"#/utils/status\";\nimport {\n getAcpProviderDisplayName,\n labelForAcpModel,\n resolveAcpProviderIcon,\n} from \"#/constants/acp-providers\";\nimport { formatNativeModelName } from \"#/utils/format-model-name\";\nimport {\n AgentBrandIcon,\n type AgentBrandIconKind,\n} from \"#/components/shared/agent-brand-icon\";\nimport { getDisplayConversationTags } from \"#/api/agent-server-adapter\";\nimport { ConversationRepoLink } from \"./conversation-repo-link\";\nimport { NoRepository } from \"./no-repository\";\nimport { ConversationTagChips } from \"./conversation-tag-chips\";\nimport { CONVERSATION_CARD_META_CHIP_CLASSNAME } from \"./conversation-card-meta-chip\";\n\ninterface ConversationCardFooterProps {\n selectedRepository: RepositorySelection | null;\n lastUpdatedAt: string;\n createdAt?: string;\n executionStatus?: ExecutionStatus | null;\n workspaceWorkingDir?: string | null;\n showRepositoryMetadata?: boolean;\n showTimestamp?: boolean;\n llmModel?: string | null;\n /**\n * Whether to render the agent/model chip. Wired to the conversation\n * panel's \"LLM model\" toggle; gates the chip uniformly\n * for both ACP and OpenHands cards.\n */\n showAgentChip?: boolean;\n /**\n * High-level kind of the conversation's agent. Drives the chip's icon:\n * the OpenHands logo for native conversations and the resolved ACP brand\n * mark for ACP conversations. Defensive against stray ``acpServer``\n * values reaching an OpenHands card.\n */\n agentKind?: \"openhands\" | \"acp\" | null;\n /**\n * Registry key of the ACP CLI server (``\"claude-code\"`` / ``\"codex\"`` /\n * ``\"gemini-cli\"`` / unknown / null). Resolved to a human display name\n * via {@link getAcpProviderDisplayName}; unknown / null falls back to\n * a generic \"ACP\" label so a Custom-command preset still produces a\n * useful chip.\n */\n acpServer?: string | null;\n /**\n * Server-side conversation tags (``AppConversation.tags``). Non-reserved\n * entries render as value-only chips so API-/automation-born\n * conversations can surface attribution (e.g. ``origin: slack`` → ``slack``).\n */\n tags?: Record<string, string> | null;\n /**\n * Whether to render the tag-chip row. Wired to the conversation panel's\n * \"Tags\" toggle.\n */\n showTags?: boolean;\n /**\n * Marks the conversation as archived. Archived rows are hidden from the list\n * unless the panel's \"Show archived\" toggle is on, so the chip is what tells\n * the user why an otherwise ordinary row is visible.\n */\n isArchived?: boolean;\n}\n\nexport function ConversationCardFooter({\n selectedRepository,\n lastUpdatedAt,\n createdAt,\n executionStatus,\n workspaceWorkingDir,\n showRepositoryMetadata = true,\n showTimestamp = true,\n llmModel,\n showAgentChip = false,\n agentKind = null,\n acpServer = null,\n tags = null,\n showTags = false,\n isArchived = false,\n}: ConversationCardFooterProps) {\n const { t } = useTranslation(\"openhands\");\n\n const isPaused = isExecutionPaused(executionStatus);\n\n // Single inline chip per conversation: [brand mark] {model text}. Gated by\n // the conversation panel's \"LLM model\" toggle and applied\n // uniformly to both kinds — OpenHands shows the logo + ``agent.llm.model``;\n // ACP shows the provider brand mark + model resolved through PR 730's\n // adapter chain, falling back to the provider display name when no model is\n // available so the chip never collapses to icon-only.\n let chip: {\n kind: AgentBrandIconKind;\n text: string;\n tooltip: string;\n } | null = null;\n if (showAgentChip) {\n if (agentKind === \"acp\") {\n const providerName =\n getAcpProviderDisplayName(acpServer) ??\n t(I18nKey.CONVERSATION$ACP_AGENT_GENERIC);\n // Prefer the provider's picker label (e.g. \"Claude Opus 4.7\") over the\n // raw ``acp_model`` ID; falls back to the raw ID for custom overrides\n // and to the provider name when there's no model at all.\n const modelLabel = labelForAcpModel(acpServer, llmModel);\n const text = modelLabel ?? providerName;\n chip = {\n kind: resolveAcpProviderIcon(acpServer),\n text,\n tooltip: modelLabel ? `${providerName} · ${modelLabel}` : providerName,\n };\n } else if (llmModel) {\n // Strip the routing prefix (e.g. \"anthropic/claude-…\" → \"claude-…\") for\n // the chip text; keep the full routing string in the tooltip.\n chip = {\n kind: \"openhands\",\n text: formatNativeModelName(llmModel) ?? llmModel,\n tooltip: llmModel,\n };\n }\n }\n\n // Match title text start: 18px status column + gap-2 (8px).\n const metadataIndentClass =\n executionStatus !== undefined ? \"pl-[26px]\" : undefined;\n\n const displayTags = showTags ? getDisplayConversationTags(tags) : [];\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-0.5 mt-0.5 w-full min-w-0\",\n isPaused && \"opacity-60\",\n )}\n >\n <div\n className={cn(\n \"flex flex-row items-center gap-2 w-full min-w-0\",\n showRepositoryMetadata && metadataIndentClass,\n )}\n >\n {showRepositoryMetadata &&\n (selectedRepository?.selected_repository ? (\n <ConversationRepoLink selectedRepository={selectedRepository} />\n ) : (\n <NoRepository workspaceWorkingDir={workspaceWorkingDir} />\n ))}\n <div className=\"flex items-center gap-2 shrink-0 ml-auto\">\n {showTimestamp && (createdAt ?? lastUpdatedAt) && (\n <p className=\"text-xs text-[var(--oh-muted)] text-right\">\n <time>\n {`${formatTimeDelta(lastUpdatedAt ?? createdAt)} ${t(I18nKey.CONVERSATION$AGO)}`}\n </time>\n </p>\n )}\n </div>\n </div>\n {chip ? (\n <div className={metadataIndentClass}>\n <span\n data-testid=\"conversation-card-agent-chip\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n title={chip.tooltip}\n >\n {/* Same line-height slot as tag chips; width flexes for the wider OpenHands mark. */}\n <span\n className=\"inline-flex h-4 shrink-0 items-center justify-center [&_svg]:block\"\n aria-hidden\n >\n <AgentBrandIcon kind={chip.kind} size={12} />\n </span>\n <span className=\"truncate leading-4\">{chip.text}</span>\n </span>\n </div>\n ) : null}\n {isArchived ? (\n <div className={metadataIndentClass}>\n <span\n data-testid=\"conversation-card-archived-chip\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n >\n {t(I18nKey.COMMON$ARCHIVED)}\n </span>\n </div>\n ) : null}\n {displayTags.length > 0 ? (\n <div className={metadataIndentClass}>\n <ConversationTagChips tags={displayTags} />\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"0tBAwEA,SAAgB,EAAuB,CACrC,qBACA,gBACA,YACA,kBACA,sBACA,yBAAyB,GACzB,gBAAgB,GAChB,WACA,gBAAgB,GAChB,YAAY,KACZ,YAAY,KACZ,OAAO,KACP,WAAW,GACX,aAAa,IACiB,CAC9B,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAElC,EAAW,EAAA,kBAAkB,CAAe,EAQ9C,EAIO,KACX,GAAI,KACE,IAAc,MAAO,CACvB,IAAM,EACJ,EAAA,0BAA0B,CAAS,GACnC,EAAE,EAAA,QAAQ,8BAA8B,EAIpC,EAAa,EAAA,iBAAiB,EAAW,CAAQ,EACjD,EAAO,GAAc,EAC3B,EAAO,CACL,KAAM,EAAA,uBAAuB,CAAS,EACtC,OACA,QAAS,EAAa,GAAG,EAAa,KAAK,IAAe,CAC5D,CACF,MAAW,IAGT,EAAO,CACL,KAAM,YACN,KAAM,EAAA,sBAAsB,CAAQ,GAAK,EACzC,QAAS,CACX,GAKJ,IAAM,EACJ,IAAoB,IAAA,GAA0B,IAAA,GAAd,YAE5B,EAAc,EAAW,EAAA,2BAA2B,CAAI,EAAI,CAAC,EAEnE,OACE,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,8CACA,GAAY,YACd,WAJF,EAME,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,kDACA,GAA0B,CAC5B,WAJF,CAMG,IACE,GAAoB,qBACnB,EAAA,EAAA,KAAC,EAAA,qBAAD,CAA0C,oBAAqB,CAAA,GAE/D,EAAA,EAAA,KAAC,EAAA,aAAD,CAAmC,qBAAsB,CAAA,IAE7D,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,oDACZ,IAAkB,GAAa,KAC9B,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,sDACX,EAAA,EAAA,KAAC,OAAD,CAAA,SACG,GAAG,EAAA,gBAAgB,GAAiB,CAAS,EAAE,GAAG,EAAE,EAAA,QAAQ,gBAAgB,GACzE,CAAA,CACL,CAAA,CAEF,CAAA,CACF,IACJ,GACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,YACd,EAAA,EAAA,MAAC,OAAD,CACE,cAAY,+BACZ,UAAW,EAAA,sCACX,MAAO,EAAK,iBAHd,EAME,EAAA,EAAA,KAAC,OAAD,CACE,UAAU,qEACV,cAAA,aAEA,EAAA,EAAA,KAAC,EAAA,eAAD,CAAgB,KAAM,EAAK,KAAM,KAAM,EAAK,CAAA,CACxC,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,8BAAsB,EAAK,IAAW,CAAA,CAClD,GACH,CAAA,EACH,KACH,GACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,YACd,EAAA,EAAA,KAAC,OAAD,CACE,cAAY,kCACZ,UAAW,EAAA,+CAEV,EAAE,EAAA,QAAQ,eAAe,CACtB,CAAA,CACH,CAAA,EACH,KACH,EAAY,OAAS,GACpB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,YACd,EAAA,EAAA,KAAC,EAAA,qBAAD,CAAsB,KAAM,CAAc,CAAA,CACvC,CAAA,EACH,IACD,GAET"}
1
+ {"version":3,"file":"conversation-card-footer.cjs","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-card-footer.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { RepositorySelection } from \"#/api/open-hands.types\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { isExecutionPaused } from \"#/utils/status\";\nimport {\n getAcpProviderDisplayName,\n labelForAcpModel,\n resolveAcpProviderIcon,\n} from \"#/constants/acp-providers\";\nimport { useFreeModels } from \"#/hooks/query/use-free-models\";\nimport { formatNativeModelName } from \"#/utils/format-model-name\";\nimport {\n AgentBrandIcon,\n type AgentBrandIconKind,\n} from \"#/components/shared/agent-brand-icon\";\nimport { getDisplayConversationTags } from \"#/api/agent-server-adapter\";\nimport { ConversationRepoLink } from \"./conversation-repo-link\";\nimport { NoRepository } from \"./no-repository\";\nimport { ConversationTagChips } from \"./conversation-tag-chips\";\nimport { CONVERSATION_CARD_META_CHIP_CLASSNAME } from \"./conversation-card-meta-chip\";\n\ninterface ConversationCardFooterProps {\n selectedRepository: RepositorySelection | null;\n lastUpdatedAt: string;\n createdAt?: string;\n executionStatus?: ExecutionStatus | null;\n workspaceWorkingDir?: string | null;\n showRepositoryMetadata?: boolean;\n showTimestamp?: boolean;\n llmModel?: string | null;\n /**\n * Whether to render the agent/model chip. Wired to the conversation\n * panel's \"LLM model\" toggle; gates the chip uniformly\n * for both ACP and OpenHands cards.\n */\n showAgentChip?: boolean;\n /**\n * High-level kind of the conversation's agent. Drives the chip's icon:\n * the OpenHands logo for native conversations and the resolved ACP brand\n * mark for ACP conversations. Defensive against stray ``acpServer``\n * values reaching an OpenHands card.\n */\n agentKind?: \"openhands\" | \"acp\" | null;\n /**\n * Registry key of the ACP CLI server (``\"claude-code\"`` / ``\"codex\"`` /\n * ``\"gemini-cli\"`` / unknown / null). Resolved to a human display name\n * via {@link getAcpProviderDisplayName}; unknown / null falls back to\n * a generic \"ACP\" label so a Custom-command preset still produces a\n * useful chip.\n */\n acpServer?: string | null;\n /**\n * Server-side conversation tags (``AppConversation.tags``). Non-reserved\n * entries render as value-only chips so API-/automation-born\n * conversations can surface attribution (e.g. ``origin: slack`` → ``slack``).\n */\n tags?: Record<string, string> | null;\n /**\n * Whether to render the tag-chip row. Wired to the conversation panel's\n * \"Tags\" toggle.\n */\n showTags?: boolean;\n /**\n * Marks the conversation as archived. Archived rows are hidden from the list\n * unless the panel's \"Show archived\" toggle is on, so the chip is what tells\n * the user why an otherwise ordinary row is visible.\n */\n isArchived?: boolean;\n}\n\nexport function ConversationCardFooter({\n selectedRepository,\n lastUpdatedAt,\n createdAt,\n executionStatus,\n workspaceWorkingDir,\n showRepositoryMetadata = true,\n showTimestamp = true,\n llmModel,\n showAgentChip = false,\n agentKind = null,\n acpServer = null,\n tags = null,\n showTags = false,\n isArchived = false,\n}: ConversationCardFooterProps) {\n const { t } = useTranslation(\"openhands\");\n const freeModels = useFreeModels();\n\n const isPaused = isExecutionPaused(executionStatus);\n\n // Single inline chip per conversation: [brand mark] {model text}. Gated by\n // the conversation panel's \"LLM model\" toggle and applied\n // uniformly to both kinds — OpenHands shows the logo + ``agent.llm.model``;\n // ACP shows the provider brand mark + model resolved through PR 730's\n // adapter chain, falling back to the provider display name when no model is\n // available so the chip never collapses to icon-only.\n let chip: {\n kind: AgentBrandIconKind;\n text: string;\n tooltip: string;\n } | null = null;\n if (showAgentChip) {\n if (agentKind === \"acp\") {\n const providerName =\n getAcpProviderDisplayName(acpServer) ??\n t(I18nKey.CONVERSATION$ACP_AGENT_GENERIC);\n // Prefer the provider's picker label (e.g. \"Claude Opus 4.7\") over the\n // raw ``acp_model`` ID; falls back to the raw ID for custom overrides\n // and to the provider name when there's no model at all.\n const modelLabel = labelForAcpModel(acpServer, llmModel);\n const text = modelLabel ?? providerName;\n chip = {\n kind: resolveAcpProviderIcon(acpServer),\n text,\n tooltip: modelLabel ? `${providerName} · ${modelLabel}` : providerName,\n };\n } else if (llmModel) {\n // Strip the routing prefix (e.g. \"anthropic/claude-…\" → \"claude-…\") for\n // the chip text; keep the full routing string in the tooltip.\n chip = {\n kind: \"openhands\",\n text: formatNativeModelName(llmModel, freeModels) ?? llmModel,\n tooltip: llmModel,\n };\n }\n }\n\n // Match title text start: 18px status column + gap-2 (8px).\n const metadataIndentClass =\n executionStatus !== undefined ? \"pl-[26px]\" : undefined;\n\n const displayTags = showTags ? getDisplayConversationTags(tags) : [];\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-0.5 mt-0.5 w-full min-w-0\",\n isPaused && \"opacity-60\",\n )}\n >\n <div\n className={cn(\n \"flex flex-row items-center gap-2 w-full min-w-0\",\n showRepositoryMetadata && metadataIndentClass,\n )}\n >\n {showRepositoryMetadata &&\n (selectedRepository?.selected_repository ? (\n <ConversationRepoLink selectedRepository={selectedRepository} />\n ) : (\n <NoRepository workspaceWorkingDir={workspaceWorkingDir} />\n ))}\n <div className=\"flex items-center gap-2 shrink-0 ml-auto\">\n {showTimestamp && (createdAt ?? lastUpdatedAt) && (\n <p className=\"text-xs text-[var(--oh-muted)] text-right\">\n <time>\n {`${formatTimeDelta(lastUpdatedAt ?? createdAt)} ${t(I18nKey.CONVERSATION$AGO)}`}\n </time>\n </p>\n )}\n </div>\n </div>\n {chip ? (\n <div className={metadataIndentClass}>\n <span\n data-testid=\"conversation-card-agent-chip\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n title={chip.tooltip}\n >\n {/* Same line-height slot as tag chips; width flexes for the wider OpenHands mark. */}\n <span\n className=\"inline-flex h-4 shrink-0 items-center justify-center [&_svg]:block\"\n aria-hidden\n >\n <AgentBrandIcon kind={chip.kind} size={12} />\n </span>\n <span className=\"truncate leading-4\">{chip.text}</span>\n </span>\n </div>\n ) : null}\n {isArchived ? (\n <div className={metadataIndentClass}>\n <span\n data-testid=\"conversation-card-archived-chip\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n >\n {t(I18nKey.COMMON$ARCHIVED)}\n </span>\n </div>\n ) : null}\n {displayTags.length > 0 ? (\n <div className={metadataIndentClass}>\n <ConversationTagChips tags={displayTags} />\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"mxBAyEA,SAAgB,EAAuB,CACrC,qBACA,gBACA,YACA,kBACA,sBACA,yBAAyB,GACzB,gBAAgB,GAChB,WACA,gBAAgB,GAChB,YAAY,KACZ,YAAY,KACZ,OAAO,KACP,WAAW,GACX,aAAa,IACiB,CAC9B,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,EAAa,EAAA,cAAc,EAE3B,EAAW,EAAA,kBAAkB,CAAe,EAQ9C,EAIO,KACX,GAAI,KACE,IAAc,MAAO,CACvB,IAAM,EACJ,EAAA,0BAA0B,CAAS,GACnC,EAAE,EAAA,QAAQ,8BAA8B,EAIpC,EAAa,EAAA,iBAAiB,EAAW,CAAQ,EACjD,EAAO,GAAc,EAC3B,EAAO,CACL,KAAM,EAAA,uBAAuB,CAAS,EACtC,OACA,QAAS,EAAa,GAAG,EAAa,KAAK,IAAe,CAC5D,CACF,MAAW,IAGT,EAAO,CACL,KAAM,YACN,KAAM,EAAA,sBAAsB,EAAU,CAAU,GAAK,EACrD,QAAS,CACX,GAKJ,IAAM,EACJ,IAAoB,IAAA,GAA0B,IAAA,GAAd,YAE5B,EAAc,EAAW,EAAA,2BAA2B,CAAI,EAAI,CAAC,EAEnE,OACE,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,8CACA,GAAY,YACd,WAJF,EAME,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,kDACA,GAA0B,CAC5B,WAJF,CAMG,IACE,GAAoB,qBACnB,EAAA,EAAA,KAAC,EAAA,qBAAD,CAA0C,oBAAqB,CAAA,GAE/D,EAAA,EAAA,KAAC,EAAA,aAAD,CAAmC,qBAAsB,CAAA,IAE7D,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,oDACZ,IAAkB,GAAa,KAC9B,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,sDACX,EAAA,EAAA,KAAC,OAAD,CAAA,SACG,GAAG,EAAA,gBAAgB,GAAiB,CAAS,EAAE,GAAG,EAAE,EAAA,QAAQ,gBAAgB,GACzE,CAAA,CACL,CAAA,CAEF,CAAA,CACF,IACJ,GACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,YACd,EAAA,EAAA,MAAC,OAAD,CACE,cAAY,+BACZ,UAAW,EAAA,sCACX,MAAO,EAAK,iBAHd,EAME,EAAA,EAAA,KAAC,OAAD,CACE,UAAU,qEACV,cAAA,aAEA,EAAA,EAAA,KAAC,EAAA,eAAD,CAAgB,KAAM,EAAK,KAAM,KAAM,EAAK,CAAA,CACxC,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,8BAAsB,EAAK,IAAW,CAAA,CAClD,GACH,CAAA,EACH,KACH,GACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,YACd,EAAA,EAAA,KAAC,OAAD,CACE,cAAY,kCACZ,UAAW,EAAA,+CAEV,EAAE,EAAA,QAAQ,eAAe,CACtB,CAAA,CACH,CAAA,EACH,KACH,EAAY,OAAS,GACpB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,YACd,EAAA,EAAA,KAAC,EAAA,qBAAD,CAAsB,KAAM,CAAc,CAAA,CACvC,CAAA,EACH,IACD,GAET"}
@@ -4,78 +4,79 @@ import { isExecutionPaused as n } from "../../../../utils/status.js";
4
4
  import { cn as r } from "../../../../utils/utils.js";
5
5
  import { getAcpProviderDisplayName as i, labelForAcpModel as a, resolveAcpProviderIcon as o } from "../../../../constants/acp-providers.js";
6
6
  import { getDisplayConversationTags as s } from "../../../../api/agent-server-adapter.js";
7
- import { formatNativeModelName as c } from "../../../../utils/format-model-name.js";
8
- import { formatTimeDelta as l } from "../../../../utils/format-time-delta.js";
9
- import { AgentBrandIcon as u } from "../../../shared/agent-brand-icon.js";
10
- import { CONVERSATION_CARD_META_CHIP_CLASSNAME as d } from "./conversation-card-meta-chip.js";
11
- import { ConversationRepoLink as f } from "./conversation-repo-link.js";
12
- import { NoRepository as p } from "./no-repository.js";
13
- import { ConversationTagChips as m } from "./conversation-tag-chips.js";
14
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
7
+ import { useFreeModels as c } from "../../../../hooks/query/use-free-models.js";
8
+ import { formatNativeModelName as l } from "../../../../utils/format-model-name.js";
9
+ import { formatTimeDelta as u } from "../../../../utils/format-time-delta.js";
10
+ import { AgentBrandIcon as d } from "../../../shared/agent-brand-icon.js";
11
+ import { CONVERSATION_CARD_META_CHIP_CLASSNAME as f } from "./conversation-card-meta-chip.js";
12
+ import { ConversationRepoLink as p } from "./conversation-repo-link.js";
13
+ import { NoRepository as m } from "./no-repository.js";
14
+ import { ConversationTagChips as h } from "./conversation-tag-chips.js";
15
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
15
16
  //#region src/components/features/conversation-panel/conversation-card/conversation-card-footer.tsx
16
- function _({ selectedRepository: _, lastUpdatedAt: v, createdAt: y, executionStatus: b, workspaceWorkingDir: x, showRepositoryMetadata: S = !0, showTimestamp: C = !0, llmModel: w, showAgentChip: T = !1, agentKind: E = null, acpServer: D = null, tags: O = null, showTags: k = !1, isArchived: A = !1 }) {
17
- let { t: j } = e("openhands"), M = n(b), N = null;
18
- if (T) if (E === "acp") {
19
- let e = i(D) ?? j(t.CONVERSATION$ACP_AGENT_GENERIC), n = a(D, w), r = n ?? e;
20
- N = {
21
- kind: o(D),
17
+ function v({ selectedRepository: v, lastUpdatedAt: y, createdAt: b, executionStatus: x, workspaceWorkingDir: S, showRepositoryMetadata: C = !0, showTimestamp: w = !0, llmModel: T, showAgentChip: E = !1, agentKind: D = null, acpServer: O = null, tags: k = null, showTags: A = !1, isArchived: j = !1 }) {
18
+ let { t: M } = e("openhands"), N = c(), P = n(x), F = null;
19
+ if (E) if (D === "acp") {
20
+ let e = i(O) ?? M(t.CONVERSATION$ACP_AGENT_GENERIC), n = a(O, T), r = n ?? e;
21
+ F = {
22
+ kind: o(O),
22
23
  text: r,
23
24
  tooltip: n ? `${e} · ${n}` : e
24
25
  };
25
- } else w && (N = {
26
+ } else T && (F = {
26
27
  kind: "openhands",
27
- text: c(w) ?? w,
28
- tooltip: w
28
+ text: l(T, N) ?? T,
29
+ tooltip: T
29
30
  });
30
- let P = b === void 0 ? void 0 : "pl-[26px]", F = k ? s(O) : [];
31
- return /* @__PURE__ */ g("div", {
32
- className: r("flex flex-col gap-0.5 mt-0.5 w-full min-w-0", M && "opacity-60"),
31
+ let I = x === void 0 ? void 0 : "pl-[26px]", L = A ? s(k) : [];
32
+ return /* @__PURE__ */ _("div", {
33
+ className: r("flex flex-col gap-0.5 mt-0.5 w-full min-w-0", P && "opacity-60"),
33
34
  children: [
34
- /* @__PURE__ */ g("div", {
35
- className: r("flex flex-row items-center gap-2 w-full min-w-0", S && P),
36
- children: [S && (_?.selected_repository ? /* @__PURE__ */ h(f, { selectedRepository: _ }) : /* @__PURE__ */ h(p, { workspaceWorkingDir: x })), /* @__PURE__ */ h("div", {
35
+ /* @__PURE__ */ _("div", {
36
+ className: r("flex flex-row items-center gap-2 w-full min-w-0", C && I),
37
+ children: [C && (v?.selected_repository ? /* @__PURE__ */ g(p, { selectedRepository: v }) : /* @__PURE__ */ g(m, { workspaceWorkingDir: S })), /* @__PURE__ */ g("div", {
37
38
  className: "flex items-center gap-2 shrink-0 ml-auto",
38
- children: C && (y ?? v) && /* @__PURE__ */ h("p", {
39
+ children: w && (b ?? y) && /* @__PURE__ */ g("p", {
39
40
  className: "text-xs text-[var(--oh-muted)] text-right",
40
- children: /* @__PURE__ */ h("time", { children: `${l(v ?? y)} ${j(t.CONVERSATION$AGO)}` })
41
+ children: /* @__PURE__ */ g("time", { children: `${u(y ?? b)} ${M(t.CONVERSATION$AGO)}` })
41
42
  })
42
43
  })]
43
44
  }),
44
- N ? /* @__PURE__ */ h("div", {
45
- className: P,
46
- children: /* @__PURE__ */ g("span", {
45
+ F ? /* @__PURE__ */ g("div", {
46
+ className: I,
47
+ children: /* @__PURE__ */ _("span", {
47
48
  "data-testid": "conversation-card-agent-chip",
48
- className: d,
49
- title: N.tooltip,
50
- children: [/* @__PURE__ */ h("span", {
49
+ className: f,
50
+ title: F.tooltip,
51
+ children: [/* @__PURE__ */ g("span", {
51
52
  className: "inline-flex h-4 shrink-0 items-center justify-center [&_svg]:block",
52
53
  "aria-hidden": !0,
53
- children: /* @__PURE__ */ h(u, {
54
- kind: N.kind,
54
+ children: /* @__PURE__ */ g(d, {
55
+ kind: F.kind,
55
56
  size: 12
56
57
  })
57
- }), /* @__PURE__ */ h("span", {
58
+ }), /* @__PURE__ */ g("span", {
58
59
  className: "truncate leading-4",
59
- children: N.text
60
+ children: F.text
60
61
  })]
61
62
  })
62
63
  }) : null,
63
- A ? /* @__PURE__ */ h("div", {
64
- className: P,
65
- children: /* @__PURE__ */ h("span", {
64
+ j ? /* @__PURE__ */ g("div", {
65
+ className: I,
66
+ children: /* @__PURE__ */ g("span", {
66
67
  "data-testid": "conversation-card-archived-chip",
67
- className: d,
68
- children: j(t.COMMON$ARCHIVED)
68
+ className: f,
69
+ children: M(t.COMMON$ARCHIVED)
69
70
  })
70
71
  }) : null,
71
- F.length > 0 ? /* @__PURE__ */ h("div", {
72
- className: P,
73
- children: /* @__PURE__ */ h(m, { tags: F })
72
+ L.length > 0 ? /* @__PURE__ */ g("div", {
73
+ className: I,
74
+ children: /* @__PURE__ */ g(h, { tags: L })
74
75
  }) : null
75
76
  ]
76
77
  });
77
78
  }
78
79
  //#endregion
79
- export { _ as ConversationCardFooter };
80
+ export { v as ConversationCardFooter };
80
81
 
81
82
  //# sourceMappingURL=conversation-card-footer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-card-footer.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-card-footer.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { RepositorySelection } from \"#/api/open-hands.types\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { isExecutionPaused } from \"#/utils/status\";\nimport {\n getAcpProviderDisplayName,\n labelForAcpModel,\n resolveAcpProviderIcon,\n} from \"#/constants/acp-providers\";\nimport { formatNativeModelName } from \"#/utils/format-model-name\";\nimport {\n AgentBrandIcon,\n type AgentBrandIconKind,\n} from \"#/components/shared/agent-brand-icon\";\nimport { getDisplayConversationTags } from \"#/api/agent-server-adapter\";\nimport { ConversationRepoLink } from \"./conversation-repo-link\";\nimport { NoRepository } from \"./no-repository\";\nimport { ConversationTagChips } from \"./conversation-tag-chips\";\nimport { CONVERSATION_CARD_META_CHIP_CLASSNAME } from \"./conversation-card-meta-chip\";\n\ninterface ConversationCardFooterProps {\n selectedRepository: RepositorySelection | null;\n lastUpdatedAt: string;\n createdAt?: string;\n executionStatus?: ExecutionStatus | null;\n workspaceWorkingDir?: string | null;\n showRepositoryMetadata?: boolean;\n showTimestamp?: boolean;\n llmModel?: string | null;\n /**\n * Whether to render the agent/model chip. Wired to the conversation\n * panel's \"LLM model\" toggle; gates the chip uniformly\n * for both ACP and OpenHands cards.\n */\n showAgentChip?: boolean;\n /**\n * High-level kind of the conversation's agent. Drives the chip's icon:\n * the OpenHands logo for native conversations and the resolved ACP brand\n * mark for ACP conversations. Defensive against stray ``acpServer``\n * values reaching an OpenHands card.\n */\n agentKind?: \"openhands\" | \"acp\" | null;\n /**\n * Registry key of the ACP CLI server (``\"claude-code\"`` / ``\"codex\"`` /\n * ``\"gemini-cli\"`` / unknown / null). Resolved to a human display name\n * via {@link getAcpProviderDisplayName}; unknown / null falls back to\n * a generic \"ACP\" label so a Custom-command preset still produces a\n * useful chip.\n */\n acpServer?: string | null;\n /**\n * Server-side conversation tags (``AppConversation.tags``). Non-reserved\n * entries render as value-only chips so API-/automation-born\n * conversations can surface attribution (e.g. ``origin: slack`` → ``slack``).\n */\n tags?: Record<string, string> | null;\n /**\n * Whether to render the tag-chip row. Wired to the conversation panel's\n * \"Tags\" toggle.\n */\n showTags?: boolean;\n /**\n * Marks the conversation as archived. Archived rows are hidden from the list\n * unless the panel's \"Show archived\" toggle is on, so the chip is what tells\n * the user why an otherwise ordinary row is visible.\n */\n isArchived?: boolean;\n}\n\nexport function ConversationCardFooter({\n selectedRepository,\n lastUpdatedAt,\n createdAt,\n executionStatus,\n workspaceWorkingDir,\n showRepositoryMetadata = true,\n showTimestamp = true,\n llmModel,\n showAgentChip = false,\n agentKind = null,\n acpServer = null,\n tags = null,\n showTags = false,\n isArchived = false,\n}: ConversationCardFooterProps) {\n const { t } = useTranslation(\"openhands\");\n\n const isPaused = isExecutionPaused(executionStatus);\n\n // Single inline chip per conversation: [brand mark] {model text}. Gated by\n // the conversation panel's \"LLM model\" toggle and applied\n // uniformly to both kinds — OpenHands shows the logo + ``agent.llm.model``;\n // ACP shows the provider brand mark + model resolved through PR 730's\n // adapter chain, falling back to the provider display name when no model is\n // available so the chip never collapses to icon-only.\n let chip: {\n kind: AgentBrandIconKind;\n text: string;\n tooltip: string;\n } | null = null;\n if (showAgentChip) {\n if (agentKind === \"acp\") {\n const providerName =\n getAcpProviderDisplayName(acpServer) ??\n t(I18nKey.CONVERSATION$ACP_AGENT_GENERIC);\n // Prefer the provider's picker label (e.g. \"Claude Opus 4.7\") over the\n // raw ``acp_model`` ID; falls back to the raw ID for custom overrides\n // and to the provider name when there's no model at all.\n const modelLabel = labelForAcpModel(acpServer, llmModel);\n const text = modelLabel ?? providerName;\n chip = {\n kind: resolveAcpProviderIcon(acpServer),\n text,\n tooltip: modelLabel ? `${providerName} · ${modelLabel}` : providerName,\n };\n } else if (llmModel) {\n // Strip the routing prefix (e.g. \"anthropic/claude-…\" → \"claude-…\") for\n // the chip text; keep the full routing string in the tooltip.\n chip = {\n kind: \"openhands\",\n text: formatNativeModelName(llmModel) ?? llmModel,\n tooltip: llmModel,\n };\n }\n }\n\n // Match title text start: 18px status column + gap-2 (8px).\n const metadataIndentClass =\n executionStatus !== undefined ? \"pl-[26px]\" : undefined;\n\n const displayTags = showTags ? getDisplayConversationTags(tags) : [];\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-0.5 mt-0.5 w-full min-w-0\",\n isPaused && \"opacity-60\",\n )}\n >\n <div\n className={cn(\n \"flex flex-row items-center gap-2 w-full min-w-0\",\n showRepositoryMetadata && metadataIndentClass,\n )}\n >\n {showRepositoryMetadata &&\n (selectedRepository?.selected_repository ? (\n <ConversationRepoLink selectedRepository={selectedRepository} />\n ) : (\n <NoRepository workspaceWorkingDir={workspaceWorkingDir} />\n ))}\n <div className=\"flex items-center gap-2 shrink-0 ml-auto\">\n {showTimestamp && (createdAt ?? lastUpdatedAt) && (\n <p className=\"text-xs text-[var(--oh-muted)] text-right\">\n <time>\n {`${formatTimeDelta(lastUpdatedAt ?? createdAt)} ${t(I18nKey.CONVERSATION$AGO)}`}\n </time>\n </p>\n )}\n </div>\n </div>\n {chip ? (\n <div className={metadataIndentClass}>\n <span\n data-testid=\"conversation-card-agent-chip\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n title={chip.tooltip}\n >\n {/* Same line-height slot as tag chips; width flexes for the wider OpenHands mark. */}\n <span\n className=\"inline-flex h-4 shrink-0 items-center justify-center [&_svg]:block\"\n aria-hidden\n >\n <AgentBrandIcon kind={chip.kind} size={12} />\n </span>\n <span className=\"truncate leading-4\">{chip.text}</span>\n </span>\n </div>\n ) : null}\n {isArchived ? (\n <div className={metadataIndentClass}>\n <span\n data-testid=\"conversation-card-archived-chip\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n >\n {t(I18nKey.COMMON$ARCHIVED)}\n </span>\n </div>\n ) : null}\n {displayTags.length > 0 ? (\n <div className={metadataIndentClass}>\n <ConversationTagChips tags={displayTags} />\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAwEA,SAAgB,EAAuB,EACrC,uBACA,kBACA,cACA,oBACA,wBACA,4BAAyB,IACzB,mBAAgB,IAChB,aACA,mBAAgB,IAChB,eAAY,MACZ,eAAY,MACZ,UAAO,MACP,cAAW,IACX,gBAAa,MACiB;CAC9B,IAAM,EAAE,SAAM,EAAe,WAAW,GAElC,IAAW,EAAkB,CAAe,GAQ9C,IAIO;CACX,IAAI,OACE,MAAc,OAAO;EACvB,IAAM,IACJ,EAA0B,CAAS,KACnC,EAAE,EAAQ,8BAA8B,GAIpC,IAAa,EAAiB,GAAW,CAAQ,GACjD,IAAO,KAAc;EAC3B,IAAO;GACL,MAAM,EAAuB,CAAS;GACtC;GACA,SAAS,IAAa,GAAG,EAAa,KAAK,MAAe;EAC5D;CACF,OAAO,AAAI,MAGT,IAAO;EACL,MAAM;EACN,MAAM,EAAsB,CAAQ,KAAK;EACzC,SAAS;CACX;CAKJ,IAAM,IACJ,MAAoB,KAAA,IAA0B,KAAA,IAAd,aAE5B,IAAc,IAAW,EAA2B,CAAI,IAAI,CAAC;CAEnE,OACE,kBAAC,OAAD;EACE,WAAW,EACT,+CACA,KAAY,YACd;YAJF;GAME,kBAAC,OAAD;IACE,WAAW,EACT,mDACA,KAA0B,CAC5B;cAJF,CAMG,MACE,GAAoB,sBACnB,kBAAC,GAAD,EAA0C,sBAAqB,CAAA,IAE/D,kBAAC,GAAD,EAAmC,uBAAsB,CAAA,IAE7D,kBAAC,OAAD;KAAK,WAAU;eACZ,MAAkB,KAAa,MAC9B,kBAAC,KAAD;MAAG,WAAU;gBACX,kBAAC,QAAD,EAAA,UACG,GAAG,EAAgB,KAAiB,CAAS,EAAE,GAAG,EAAE,EAAQ,gBAAgB,IACzE,CAAA;KACL,CAAA;IAEF,CAAA,CACF;;GACJ,IACC,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,QAAD;KACE,eAAY;KACZ,WAAW;KACX,OAAO,EAAK;eAHd,CAME,kBAAC,QAAD;MACE,WAAU;MACV,eAAA;gBAEA,kBAAC,GAAD;OAAgB,MAAM,EAAK;OAAM,MAAM;MAAK,CAAA;KACxC,CAAA,GACN,kBAAC,QAAD;MAAM,WAAU;gBAAsB,EAAK;KAAW,CAAA,CAClD;;GACH,CAAA,IACH;GACH,IACC,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,QAAD;KACE,eAAY;KACZ,WAAW;eAEV,EAAE,EAAQ,eAAe;IACtB,CAAA;GACH,CAAA,IACH;GACH,EAAY,SAAS,IACpB,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,GAAD,EAAsB,MAAM,EAAc,CAAA;GACvC,CAAA,IACH;EACD;;AAET"}
1
+ {"version":3,"file":"conversation-card-footer.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-card-footer.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport { cn } from \"#/utils/utils\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { RepositorySelection } from \"#/api/open-hands.types\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\nimport { isExecutionPaused } from \"#/utils/status\";\nimport {\n getAcpProviderDisplayName,\n labelForAcpModel,\n resolveAcpProviderIcon,\n} from \"#/constants/acp-providers\";\nimport { useFreeModels } from \"#/hooks/query/use-free-models\";\nimport { formatNativeModelName } from \"#/utils/format-model-name\";\nimport {\n AgentBrandIcon,\n type AgentBrandIconKind,\n} from \"#/components/shared/agent-brand-icon\";\nimport { getDisplayConversationTags } from \"#/api/agent-server-adapter\";\nimport { ConversationRepoLink } from \"./conversation-repo-link\";\nimport { NoRepository } from \"./no-repository\";\nimport { ConversationTagChips } from \"./conversation-tag-chips\";\nimport { CONVERSATION_CARD_META_CHIP_CLASSNAME } from \"./conversation-card-meta-chip\";\n\ninterface ConversationCardFooterProps {\n selectedRepository: RepositorySelection | null;\n lastUpdatedAt: string;\n createdAt?: string;\n executionStatus?: ExecutionStatus | null;\n workspaceWorkingDir?: string | null;\n showRepositoryMetadata?: boolean;\n showTimestamp?: boolean;\n llmModel?: string | null;\n /**\n * Whether to render the agent/model chip. Wired to the conversation\n * panel's \"LLM model\" toggle; gates the chip uniformly\n * for both ACP and OpenHands cards.\n */\n showAgentChip?: boolean;\n /**\n * High-level kind of the conversation's agent. Drives the chip's icon:\n * the OpenHands logo for native conversations and the resolved ACP brand\n * mark for ACP conversations. Defensive against stray ``acpServer``\n * values reaching an OpenHands card.\n */\n agentKind?: \"openhands\" | \"acp\" | null;\n /**\n * Registry key of the ACP CLI server (``\"claude-code\"`` / ``\"codex\"`` /\n * ``\"gemini-cli\"`` / unknown / null). Resolved to a human display name\n * via {@link getAcpProviderDisplayName}; unknown / null falls back to\n * a generic \"ACP\" label so a Custom-command preset still produces a\n * useful chip.\n */\n acpServer?: string | null;\n /**\n * Server-side conversation tags (``AppConversation.tags``). Non-reserved\n * entries render as value-only chips so API-/automation-born\n * conversations can surface attribution (e.g. ``origin: slack`` → ``slack``).\n */\n tags?: Record<string, string> | null;\n /**\n * Whether to render the tag-chip row. Wired to the conversation panel's\n * \"Tags\" toggle.\n */\n showTags?: boolean;\n /**\n * Marks the conversation as archived. Archived rows are hidden from the list\n * unless the panel's \"Show archived\" toggle is on, so the chip is what tells\n * the user why an otherwise ordinary row is visible.\n */\n isArchived?: boolean;\n}\n\nexport function ConversationCardFooter({\n selectedRepository,\n lastUpdatedAt,\n createdAt,\n executionStatus,\n workspaceWorkingDir,\n showRepositoryMetadata = true,\n showTimestamp = true,\n llmModel,\n showAgentChip = false,\n agentKind = null,\n acpServer = null,\n tags = null,\n showTags = false,\n isArchived = false,\n}: ConversationCardFooterProps) {\n const { t } = useTranslation(\"openhands\");\n const freeModels = useFreeModels();\n\n const isPaused = isExecutionPaused(executionStatus);\n\n // Single inline chip per conversation: [brand mark] {model text}. Gated by\n // the conversation panel's \"LLM model\" toggle and applied\n // uniformly to both kinds — OpenHands shows the logo + ``agent.llm.model``;\n // ACP shows the provider brand mark + model resolved through PR 730's\n // adapter chain, falling back to the provider display name when no model is\n // available so the chip never collapses to icon-only.\n let chip: {\n kind: AgentBrandIconKind;\n text: string;\n tooltip: string;\n } | null = null;\n if (showAgentChip) {\n if (agentKind === \"acp\") {\n const providerName =\n getAcpProviderDisplayName(acpServer) ??\n t(I18nKey.CONVERSATION$ACP_AGENT_GENERIC);\n // Prefer the provider's picker label (e.g. \"Claude Opus 4.7\") over the\n // raw ``acp_model`` ID; falls back to the raw ID for custom overrides\n // and to the provider name when there's no model at all.\n const modelLabel = labelForAcpModel(acpServer, llmModel);\n const text = modelLabel ?? providerName;\n chip = {\n kind: resolveAcpProviderIcon(acpServer),\n text,\n tooltip: modelLabel ? `${providerName} · ${modelLabel}` : providerName,\n };\n } else if (llmModel) {\n // Strip the routing prefix (e.g. \"anthropic/claude-…\" → \"claude-…\") for\n // the chip text; keep the full routing string in the tooltip.\n chip = {\n kind: \"openhands\",\n text: formatNativeModelName(llmModel, freeModels) ?? llmModel,\n tooltip: llmModel,\n };\n }\n }\n\n // Match title text start: 18px status column + gap-2 (8px).\n const metadataIndentClass =\n executionStatus !== undefined ? \"pl-[26px]\" : undefined;\n\n const displayTags = showTags ? getDisplayConversationTags(tags) : [];\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-0.5 mt-0.5 w-full min-w-0\",\n isPaused && \"opacity-60\",\n )}\n >\n <div\n className={cn(\n \"flex flex-row items-center gap-2 w-full min-w-0\",\n showRepositoryMetadata && metadataIndentClass,\n )}\n >\n {showRepositoryMetadata &&\n (selectedRepository?.selected_repository ? (\n <ConversationRepoLink selectedRepository={selectedRepository} />\n ) : (\n <NoRepository workspaceWorkingDir={workspaceWorkingDir} />\n ))}\n <div className=\"flex items-center gap-2 shrink-0 ml-auto\">\n {showTimestamp && (createdAt ?? lastUpdatedAt) && (\n <p className=\"text-xs text-[var(--oh-muted)] text-right\">\n <time>\n {`${formatTimeDelta(lastUpdatedAt ?? createdAt)} ${t(I18nKey.CONVERSATION$AGO)}`}\n </time>\n </p>\n )}\n </div>\n </div>\n {chip ? (\n <div className={metadataIndentClass}>\n <span\n data-testid=\"conversation-card-agent-chip\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n title={chip.tooltip}\n >\n {/* Same line-height slot as tag chips; width flexes for the wider OpenHands mark. */}\n <span\n className=\"inline-flex h-4 shrink-0 items-center justify-center [&_svg]:block\"\n aria-hidden\n >\n <AgentBrandIcon kind={chip.kind} size={12} />\n </span>\n <span className=\"truncate leading-4\">{chip.text}</span>\n </span>\n </div>\n ) : null}\n {isArchived ? (\n <div className={metadataIndentClass}>\n <span\n data-testid=\"conversation-card-archived-chip\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n >\n {t(I18nKey.COMMON$ARCHIVED)}\n </span>\n </div>\n ) : null}\n {displayTags.length > 0 ? (\n <div className={metadataIndentClass}>\n <ConversationTagChips tags={displayTags} />\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAyEA,SAAgB,EAAuB,EACrC,uBACA,kBACA,cACA,oBACA,wBACA,4BAAyB,IACzB,mBAAgB,IAChB,aACA,mBAAgB,IAChB,eAAY,MACZ,eAAY,MACZ,UAAO,MACP,cAAW,IACX,gBAAa,MACiB;CAC9B,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAa,EAAc,GAE3B,IAAW,EAAkB,CAAe,GAQ9C,IAIO;CACX,IAAI,OACE,MAAc,OAAO;EACvB,IAAM,IACJ,EAA0B,CAAS,KACnC,EAAE,EAAQ,8BAA8B,GAIpC,IAAa,EAAiB,GAAW,CAAQ,GACjD,IAAO,KAAc;EAC3B,IAAO;GACL,MAAM,EAAuB,CAAS;GACtC;GACA,SAAS,IAAa,GAAG,EAAa,KAAK,MAAe;EAC5D;CACF,OAAO,AAAI,MAGT,IAAO;EACL,MAAM;EACN,MAAM,EAAsB,GAAU,CAAU,KAAK;EACrD,SAAS;CACX;CAKJ,IAAM,IACJ,MAAoB,KAAA,IAA0B,KAAA,IAAd,aAE5B,IAAc,IAAW,EAA2B,CAAI,IAAI,CAAC;CAEnE,OACE,kBAAC,OAAD;EACE,WAAW,EACT,+CACA,KAAY,YACd;YAJF;GAME,kBAAC,OAAD;IACE,WAAW,EACT,mDACA,KAA0B,CAC5B;cAJF,CAMG,MACE,GAAoB,sBACnB,kBAAC,GAAD,EAA0C,sBAAqB,CAAA,IAE/D,kBAAC,GAAD,EAAmC,uBAAsB,CAAA,IAE7D,kBAAC,OAAD;KAAK,WAAU;eACZ,MAAkB,KAAa,MAC9B,kBAAC,KAAD;MAAG,WAAU;gBACX,kBAAC,QAAD,EAAA,UACG,GAAG,EAAgB,KAAiB,CAAS,EAAE,GAAG,EAAE,EAAQ,gBAAgB,IACzE,CAAA;KACL,CAAA;IAEF,CAAA,CACF;;GACJ,IACC,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,QAAD;KACE,eAAY;KACZ,WAAW;KACX,OAAO,EAAK;eAHd,CAME,kBAAC,QAAD;MACE,WAAU;MACV,eAAA;gBAEA,kBAAC,GAAD;OAAgB,MAAM,EAAK;OAAM,MAAM;MAAK,CAAA;KACxC,CAAA,GACN,kBAAC,QAAD;MAAM,WAAU;gBAAsB,EAAK;KAAW,CAAA,CAClD;;GACH,CAAA,IACH;GACH,IACC,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,QAAD;KACE,eAAY;KACZ,WAAW;eAEV,EAAE,EAAQ,eAAe;IACtB,CAAA;GACH,CAAA,IACH;GACH,EAAY,SAAS,IACpB,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,GAAD,EAAsB,MAAM,EAAc,CAAA;GACvC,CAAA,IACH;EACD;;AAET"}
@@ -17,7 +17,6 @@ interface BuildHomeAutomationMenuItemsOptions {
17
17
  automation: Automation;
18
18
  t: (key: I18nKey) => string;
19
19
  canManage: boolean;
20
- canEdit: boolean;
21
20
  isRunPending: boolean;
22
21
  isCancelPending: boolean;
23
22
  canCancel: boolean;
@@ -35,5 +34,5 @@ interface BuildHomeAutomationMenuItemsOptions {
35
34
  * Home featured-automation kebab (pinned cards + activity rows):
36
35
  * quick actions first, separator, then pin/unpin.
37
36
  */
38
- export declare function buildHomeAutomationMenuItems({ automation, t, canManage, canEdit, isRunPending, isCancelPending, canCancel, testIdPrefix, pinTestId, isPinned, onRunNow, onCancelRun, onView, onEdit, onTurnOff, onTogglePin, }: BuildHomeAutomationMenuItemsOptions): HomeAutomationMenuEntry[];
37
+ export declare function buildHomeAutomationMenuItems({ automation, t, canManage, isRunPending, isCancelPending, canCancel, testIdPrefix, pinTestId, isPinned, onRunNow, onCancelRun, onView, onEdit, onTurnOff, onTogglePin, }: BuildHomeAutomationMenuItemsOptions): HomeAutomationMenuEntry[];
39
38
  export {};
@@ -6,7 +6,6 @@ interface BuildPinnedAutomationMenuItemsOptions {
6
6
  automation: Automation;
7
7
  t: (key: I18nKey) => string;
8
8
  canManage: boolean;
9
- canEdit: boolean;
10
9
  isRunPending: boolean;
11
10
  isCancelPending: boolean;
12
11
  canCancel: boolean;
@@ -0,0 +1,2 @@
1
+ const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../shared/modals/modal-backdrop.cjs"),i=require("../../shared/modals/modal-close-button.cjs");let a=require("react");a=e.__toESM(a,1);let o=require("react/jsx-runtime");function s({src:e,onClose:s}){let{t:c}=t.useTranslation(`openhands`);return a.default.useEffect(()=>{let e=e=>{e.key===`Escape`&&(e.stopPropagation(),s())};return document.addEventListener(`keydown`,e,!0),()=>document.removeEventListener(`keydown`,e,!0)},[s]),(0,o.jsx)(r.ModalBackdrop,{onClose:s,closeOnEscape:!1,"aria-label":c(n.I18nKey.IMAGE$FULL_SIZE_PREVIEW),children:(0,o.jsxs)(`div`,{"data-testid":`image-lightbox`,className:`relative`,children:[(0,o.jsx)(i.ModalCloseButton,{onClose:s,testId:`image-lightbox-close`,className:`bg-black/60 text-white hover:bg-black/80`}),(0,o.jsx)(`img`,{src:e,alt:c(n.I18nKey.IMAGE$FULL_SIZE_PREVIEW),className:`max-h-[90vh] max-w-[90vw] rounded-lg object-contain`})]})})}exports.ImageLightbox=s;
2
+ //# sourceMappingURL=image-lightbox.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-lightbox.cjs","names":[],"sources":["../../../../src/components/features/images/image-lightbox.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\ninterface ImageLightboxProps {\n src: string;\n onClose: () => void;\n}\n\n/**\n * Full-size overlay for an image attachment. The thumbnail is a CSS downscale\n * of the same source, so no refetch is needed.\n */\nexport function ImageLightbox({ src, onClose }: ImageLightboxProps) {\n const { t } = useTranslation(\"openhands\");\n\n // HeroUI consumes Escape on a document capture listener, so it never reaches\n // ModalBackdrop's window listener. Capture it here instead.\n React.useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.stopPropagation();\n onClose();\n };\n\n document.addEventListener(\"keydown\", handleEscape, true);\n return () => document.removeEventListener(\"keydown\", handleEscape, true);\n }, [onClose]);\n\n return (\n <ModalBackdrop\n onClose={onClose}\n closeOnEscape={false}\n aria-label={t(I18nKey.IMAGE$FULL_SIZE_PREVIEW)}\n >\n <div data-testid=\"image-lightbox\" className=\"relative\">\n <ModalCloseButton\n onClose={onClose}\n testId=\"image-lightbox-close\"\n className=\"bg-black/60 text-white hover:bg-black/80\"\n />\n <img\n src={src}\n alt={t(I18nKey.IMAGE$FULL_SIZE_PREVIEW)}\n className=\"max-h-[90vh] max-w-[90vw] rounded-lg object-contain\"\n />\n </div>\n </ModalBackdrop>\n );\n}\n"],"mappings":"yWAeA,SAAgB,EAAc,CAAE,MAAK,WAA+B,CAClE,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAexC,OAXA,EAAA,QAAM,cAAgB,CACpB,IAAM,EAAgB,GAAyB,CACzC,EAAM,MAAQ,WAClB,EAAM,gBAAgB,EACtB,EAAQ,EACV,EAGA,OADA,SAAS,iBAAiB,UAAW,EAAc,EAAI,MAC1C,SAAS,oBAAoB,UAAW,EAAc,EAAI,CACzE,EAAG,CAAC,CAAO,CAAC,GAGV,EAAA,EAAA,KAAC,EAAA,cAAD,CACW,UACT,cAAe,GACf,aAAY,EAAE,EAAA,QAAQ,uBAAuB,YAE7C,EAAA,EAAA,MAAC,MAAD,CAAK,cAAY,iBAAiB,UAAU,oBAA5C,EACE,EAAA,EAAA,KAAC,EAAA,iBAAD,CACW,UACT,OAAO,uBACP,UAAU,0CACX,CAAA,GACD,EAAA,EAAA,KAAC,MAAD,CACO,MACL,IAAK,EAAE,EAAA,QAAQ,uBAAuB,EACtC,UAAU,qDACX,CAAA,CACE,GACQ,CAAA,CAEnB"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface ImageLightboxProps {
3
+ src: string;
4
+ onClose: () => void;
5
+ }
6
+ /**
7
+ * Full-size overlay for an image attachment. The thumbnail is a CSS downscale
8
+ * of the same source, so no refetch is needed.
9
+ */
10
+ export declare function ImageLightbox({ src, onClose }: ImageLightboxProps): React.JSX.Element;
11
+ export {};
@@ -0,0 +1,37 @@
1
+ import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../../../i18n/declaration.js";
3
+ import { ModalBackdrop as n } from "../../shared/modals/modal-backdrop.js";
4
+ import { ModalCloseButton as r } from "../../shared/modals/modal-close-button.js";
5
+ import i from "react";
6
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
7
+ //#region src/components/features/images/image-lightbox.tsx
8
+ function s({ src: s, onClose: c }) {
9
+ let { t: l } = e("openhands");
10
+ return i.useEffect(() => {
11
+ let e = (e) => {
12
+ e.key === "Escape" && (e.stopPropagation(), c());
13
+ };
14
+ return document.addEventListener("keydown", e, !0), () => document.removeEventListener("keydown", e, !0);
15
+ }, [c]), /* @__PURE__ */ a(n, {
16
+ onClose: c,
17
+ closeOnEscape: !1,
18
+ "aria-label": l(t.IMAGE$FULL_SIZE_PREVIEW),
19
+ children: /* @__PURE__ */ o("div", {
20
+ "data-testid": "image-lightbox",
21
+ className: "relative",
22
+ children: [/* @__PURE__ */ a(r, {
23
+ onClose: c,
24
+ testId: "image-lightbox-close",
25
+ className: "bg-black/60 text-white hover:bg-black/80"
26
+ }), /* @__PURE__ */ a("img", {
27
+ src: s,
28
+ alt: l(t.IMAGE$FULL_SIZE_PREVIEW),
29
+ className: "max-h-[90vh] max-w-[90vw] rounded-lg object-contain"
30
+ })]
31
+ })
32
+ });
33
+ }
34
+ //#endregion
35
+ export { s as ImageLightbox };
36
+
37
+ //# sourceMappingURL=image-lightbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-lightbox.js","names":[],"sources":["../../../../src/components/features/images/image-lightbox.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalCloseButton } from \"#/components/shared/modals/modal-close-button\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\ninterface ImageLightboxProps {\n src: string;\n onClose: () => void;\n}\n\n/**\n * Full-size overlay for an image attachment. The thumbnail is a CSS downscale\n * of the same source, so no refetch is needed.\n */\nexport function ImageLightbox({ src, onClose }: ImageLightboxProps) {\n const { t } = useTranslation(\"openhands\");\n\n // HeroUI consumes Escape on a document capture listener, so it never reaches\n // ModalBackdrop's window listener. Capture it here instead.\n React.useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.stopPropagation();\n onClose();\n };\n\n document.addEventListener(\"keydown\", handleEscape, true);\n return () => document.removeEventListener(\"keydown\", handleEscape, true);\n }, [onClose]);\n\n return (\n <ModalBackdrop\n onClose={onClose}\n closeOnEscape={false}\n aria-label={t(I18nKey.IMAGE$FULL_SIZE_PREVIEW)}\n >\n <div data-testid=\"image-lightbox\" className=\"relative\">\n <ModalCloseButton\n onClose={onClose}\n testId=\"image-lightbox-close\"\n className=\"bg-black/60 text-white hover:bg-black/80\"\n />\n <img\n src={src}\n alt={t(I18nKey.IMAGE$FULL_SIZE_PREVIEW)}\n className=\"max-h-[90vh] max-w-[90vw] rounded-lg object-contain\"\n />\n </div>\n </ModalBackdrop>\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,EAAc,EAAE,QAAK,cAA+B;CAClE,IAAM,EAAE,SAAM,EAAe,WAAW;CAexC,OAXA,EAAM,gBAAgB;EACpB,IAAM,KAAgB,MAAyB;GACzC,EAAM,QAAQ,aAClB,EAAM,gBAAgB,GACtB,EAAQ;EACV;EAGA,OADA,SAAS,iBAAiB,WAAW,GAAc,EAAI,SAC1C,SAAS,oBAAoB,WAAW,GAAc,EAAI;CACzE,GAAG,CAAC,CAAO,CAAC,GAGV,kBAAC,GAAD;EACW;EACT,eAAe;EACf,cAAY,EAAE,EAAQ,uBAAuB;YAE7C,kBAAC,OAAD;GAAK,eAAY;GAAiB,WAAU;aAA5C,CACE,kBAAC,GAAD;IACW;IACT,QAAO;IACP,WAAU;GACX,CAAA,GACD,kBAAC,OAAD;IACO;IACL,KAAK,EAAE,EAAQ,uBAAuB;IACtC,WAAU;GACX,CAAA,CACE;;CACQ,CAAA;AAEnB"}
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../shared/buttons/remove-button.cjs"),t=require("./thumbnail.cjs");let n=require("react/jsx-runtime");function r({src:r,onRemove:i,size:a=`small`}){return(0,n.jsxs)(`div`,{"data-testid":`image-preview`,className:`relative w-fit shrink-0 py-1`,children:[(0,n.jsx)(t.Thumbnail,{src:r,size:a}),i&&(0,n.jsx)(e.RemoveButton,{onClick:i,className:`absolute right-[3px] top-[3px] cursor-pointer`})]})}exports.ImagePreview=r;
1
+ const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../shared/buttons/remove-button.cjs"),i=require("./image-lightbox.cjs"),a=require("./thumbnail.cjs");let o=require("react");o=e.__toESM(o,1);let s=require("react/jsx-runtime");function c({src:e,onRemove:c,size:l=`small`}){let{t:u}=t.useTranslation(`openhands`),[d,f]=o.default.useState(!1);return(0,s.jsxs)(`div`,{"data-testid":`image-preview`,className:`relative w-fit shrink-0 py-1`,children:[(0,s.jsx)(`button`,{type:`button`,"data-testid":`expand-image-button`,"aria-label":u(n.I18nKey.BUTTON$VIEW_FULL_SIZE_IMAGE),onClick:()=>f(!0),className:`block cursor-zoom-in rounded-sm transition-opacity hover:opacity-80`,children:(0,s.jsx)(a.Thumbnail,{src:e,size:l})}),c&&(0,s.jsx)(r.RemoveButton,{onClick:c,"aria-label":u(n.I18nKey.BUTTON$REMOVE_IMAGE),className:`absolute right-[3px] top-[3px] cursor-pointer`}),d&&(0,s.jsx)(i.ImageLightbox,{src:e,onClose:()=>f(!1)})]})}exports.ImagePreview=c;
2
2
  //# sourceMappingURL=image-preview.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-preview.cjs","names":[],"sources":["../../../../src/components/features/images/image-preview.tsx"],"sourcesContent":["import { RemoveButton } from \"#/components/shared/buttons/remove-button\";\nimport { Thumbnail } from \"./thumbnail\";\n\ninterface ImagePreviewProps {\n src: string;\n onRemove?: () => void;\n size?: \"small\" | \"large\";\n}\n\nexport function ImagePreview({\n src,\n onRemove,\n size = \"small\",\n}: ImagePreviewProps) {\n return (\n <div data-testid=\"image-preview\" className=\"relative w-fit shrink-0 py-1\">\n <Thumbnail src={src} size={size} />\n {onRemove && (\n <RemoveButton\n onClick={onRemove}\n className=\"absolute right-[3px] top-[3px] cursor-pointer\"\n />\n )}\n </div>\n );\n}\n"],"mappings":"6KASA,SAAgB,EAAa,CAC3B,MACA,WACA,OAAO,SACa,CACpB,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,cAAY,gBAAgB,UAAU,wCAA3C,EACE,EAAA,EAAA,KAAC,EAAA,UAAD,CAAgB,MAAW,MAAO,CAAA,EACjC,IACC,EAAA,EAAA,KAAC,EAAA,aAAD,CACE,QAAS,EACT,UAAU,+CACX,CAAA,CAEA,GAET"}
1
+ {"version":3,"file":"image-preview.cjs","names":[],"sources":["../../../../src/components/features/images/image-preview.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { RemoveButton } from \"#/components/shared/buttons/remove-button\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ImageLightbox } from \"./image-lightbox\";\nimport { Thumbnail } from \"./thumbnail\";\n\ninterface ImagePreviewProps {\n src: string;\n onRemove?: () => void;\n size?: \"small\" | \"large\";\n}\n\nexport function ImagePreview({\n src,\n onRemove,\n size = \"small\",\n}: ImagePreviewProps) {\n const { t } = useTranslation(\"openhands\");\n const [isExpanded, setIsExpanded] = React.useState(false);\n\n return (\n <div data-testid=\"image-preview\" className=\"relative w-fit shrink-0 py-1\">\n <button\n type=\"button\"\n data-testid=\"expand-image-button\"\n aria-label={t(I18nKey.BUTTON$VIEW_FULL_SIZE_IMAGE)}\n onClick={() => setIsExpanded(true)}\n className=\"block cursor-zoom-in rounded-sm transition-opacity hover:opacity-80\"\n >\n <Thumbnail src={src} size={size} />\n </button>\n {onRemove && (\n <RemoveButton\n onClick={onRemove}\n aria-label={t(I18nKey.BUTTON$REMOVE_IMAGE)}\n className=\"absolute right-[3px] top-[3px] cursor-pointer\"\n />\n )}\n {isExpanded && (\n <ImageLightbox src={src} onClose={() => setIsExpanded(false)} />\n )}\n </div>\n );\n}\n"],"mappings":"gXAaA,SAAgB,EAAa,CAC3B,MACA,WACA,OAAO,SACa,CACpB,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAC,EAAY,GAAiB,EAAA,QAAM,SAAS,EAAK,EAExD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,cAAY,gBAAgB,UAAU,wCAA3C,EACE,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,cAAY,sBACZ,aAAY,EAAE,EAAA,QAAQ,2BAA2B,EACjD,YAAe,EAAc,EAAI,EACjC,UAAU,gFAEV,EAAA,EAAA,KAAC,EAAA,UAAD,CAAgB,MAAW,MAAO,CAAA,CAC5B,CAAA,EACP,IACC,EAAA,EAAA,KAAC,EAAA,aAAD,CACE,QAAS,EACT,aAAY,EAAE,EAAA,QAAQ,mBAAmB,EACzC,UAAU,+CACX,CAAA,EAEF,IACC,EAAA,EAAA,KAAC,EAAA,cAAD,CAAoB,MAAK,YAAe,EAAc,EAAK,CAAI,CAAA,CAE9D,GAET"}
@@ -1,7 +1,8 @@
1
+ import React from "react";
1
2
  interface ImagePreviewProps {
2
3
  src: string;
3
4
  onRemove?: () => void;
4
5
  size?: "small" | "large";
5
6
  }
6
- export declare function ImagePreview({ src, onRemove, size, }: ImagePreviewProps): import("react").JSX.Element;
7
+ export declare function ImagePreview({ src, onRemove, size, }: ImagePreviewProps): React.JSX.Element;
7
8
  export {};
@@ -1,21 +1,41 @@
1
- import { RemoveButton as e } from "../../shared/buttons/remove-button.js";
2
- import { Thumbnail as t } from "./thumbnail.js";
3
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
1
+ import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../../../i18n/declaration.js";
3
+ import { RemoveButton as n } from "../../shared/buttons/remove-button.js";
4
+ import { ImageLightbox as r } from "./image-lightbox.js";
5
+ import { Thumbnail as i } from "./thumbnail.js";
6
+ import a from "react";
7
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
8
  //#region src/components/features/images/image-preview.tsx
5
- function i({ src: i, onRemove: a, size: o = "small" }) {
6
- return /* @__PURE__ */ r("div", {
9
+ function c({ src: c, onRemove: l, size: u = "small" }) {
10
+ let { t: d } = e("openhands"), [f, p] = a.useState(!1);
11
+ return /* @__PURE__ */ s("div", {
7
12
  "data-testid": "image-preview",
8
13
  className: "relative w-fit shrink-0 py-1",
9
- children: [/* @__PURE__ */ n(t, {
10
- src: i,
11
- size: o
12
- }), a && /* @__PURE__ */ n(e, {
13
- onClick: a,
14
- className: "absolute right-[3px] top-[3px] cursor-pointer"
15
- })]
14
+ children: [
15
+ /* @__PURE__ */ o("button", {
16
+ type: "button",
17
+ "data-testid": "expand-image-button",
18
+ "aria-label": d(t.BUTTON$VIEW_FULL_SIZE_IMAGE),
19
+ onClick: () => p(!0),
20
+ className: "block cursor-zoom-in rounded-sm transition-opacity hover:opacity-80",
21
+ children: /* @__PURE__ */ o(i, {
22
+ src: c,
23
+ size: u
24
+ })
25
+ }),
26
+ l && /* @__PURE__ */ o(n, {
27
+ onClick: l,
28
+ "aria-label": d(t.BUTTON$REMOVE_IMAGE),
29
+ className: "absolute right-[3px] top-[3px] cursor-pointer"
30
+ }),
31
+ f && /* @__PURE__ */ o(r, {
32
+ src: c,
33
+ onClose: () => p(!1)
34
+ })
35
+ ]
16
36
  });
17
37
  }
18
38
  //#endregion
19
- export { i as ImagePreview };
39
+ export { c as ImagePreview };
20
40
 
21
41
  //# sourceMappingURL=image-preview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-preview.js","names":[],"sources":["../../../../src/components/features/images/image-preview.tsx"],"sourcesContent":["import { RemoveButton } from \"#/components/shared/buttons/remove-button\";\nimport { Thumbnail } from \"./thumbnail\";\n\ninterface ImagePreviewProps {\n src: string;\n onRemove?: () => void;\n size?: \"small\" | \"large\";\n}\n\nexport function ImagePreview({\n src,\n onRemove,\n size = \"small\",\n}: ImagePreviewProps) {\n return (\n <div data-testid=\"image-preview\" className=\"relative w-fit shrink-0 py-1\">\n <Thumbnail src={src} size={size} />\n {onRemove && (\n <RemoveButton\n onClick={onRemove}\n className=\"absolute right-[3px] top-[3px] cursor-pointer\"\n />\n )}\n </div>\n );\n}\n"],"mappings":";;;;AASA,SAAgB,EAAa,EAC3B,QACA,aACA,UAAO,WACa;CACpB,OACE,kBAAC,OAAD;EAAK,eAAY;EAAgB,WAAU;YAA3C,CACE,kBAAC,GAAD;GAAgB;GAAW;EAAO,CAAA,GACjC,KACC,kBAAC,GAAD;GACE,SAAS;GACT,WAAU;EACX,CAAA,CAEA;;AAET"}
1
+ {"version":3,"file":"image-preview.js","names":[],"sources":["../../../../src/components/features/images/image-preview.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { RemoveButton } from \"#/components/shared/buttons/remove-button\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { ImageLightbox } from \"./image-lightbox\";\nimport { Thumbnail } from \"./thumbnail\";\n\ninterface ImagePreviewProps {\n src: string;\n onRemove?: () => void;\n size?: \"small\" | \"large\";\n}\n\nexport function ImagePreview({\n src,\n onRemove,\n size = \"small\",\n}: ImagePreviewProps) {\n const { t } = useTranslation(\"openhands\");\n const [isExpanded, setIsExpanded] = React.useState(false);\n\n return (\n <div data-testid=\"image-preview\" className=\"relative w-fit shrink-0 py-1\">\n <button\n type=\"button\"\n data-testid=\"expand-image-button\"\n aria-label={t(I18nKey.BUTTON$VIEW_FULL_SIZE_IMAGE)}\n onClick={() => setIsExpanded(true)}\n className=\"block cursor-zoom-in rounded-sm transition-opacity hover:opacity-80\"\n >\n <Thumbnail src={src} size={size} />\n </button>\n {onRemove && (\n <RemoveButton\n onClick={onRemove}\n aria-label={t(I18nKey.BUTTON$REMOVE_IMAGE)}\n className=\"absolute right-[3px] top-[3px] cursor-pointer\"\n />\n )}\n {isExpanded && (\n <ImageLightbox src={src} onClose={() => setIsExpanded(false)} />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAaA,SAAgB,EAAa,EAC3B,QACA,aACA,UAAO,WACa;CACpB,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,CAAC,GAAY,KAAiB,EAAM,SAAS,EAAK;CAExD,OACE,kBAAC,OAAD;EAAK,eAAY;EAAgB,WAAU;YAA3C;GACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAY;IACZ,cAAY,EAAE,EAAQ,2BAA2B;IACjD,eAAe,EAAc,EAAI;IACjC,WAAU;cAEV,kBAAC,GAAD;KAAgB;KAAW;IAAO,CAAA;GAC5B,CAAA;GACP,KACC,kBAAC,GAAD;IACE,SAAS;IACT,cAAY,EAAE,EAAQ,mBAAmB;IACzC,WAAU;GACX,CAAA;GAEF,KACC,kBAAC,GAAD;IAAoB;IAAK,eAAe,EAAc,EAAK;GAAI,CAAA;EAE9D;;AAET"}
@@ -4,10 +4,9 @@ interface SetupLlmStepProps {
4
4
  onNext: () => void;
5
5
  }
6
6
  /**
7
- * Pre-fills the LLM form with the OpenAI GPT-5.6 Sol default
8
- * (`openai/gpt-5.6-sol`), matching `DEFAULT_SETTINGS.llm_model`. The explicit
9
- * override marks the model dirty so the Next button persists the suggested
10
- * default immediately.
7
+ * Fallback when the backend has not exposed a DB-selected OpenHands default.
8
+ * The onboarding override still marks the model dirty so Next persists the
9
+ * suggested model immediately.
11
10
  */
12
11
  export declare const ONBOARDING_DEFAULT_LLM_MODEL = "openai/gpt-5.6-sol";
13
12
  /**
@@ -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("../../../node_modules/lucide-react/dist/esm/icons/cloud.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs"),i=require("../../../utils/utils.cjs"),a=require("../../../api/backend-registry/active-store.cjs"),o=require("../../../contexts/active-backend-context.cjs"),s=require("../sidebar/sidebar-layout.cjs");let c=require("react/jsx-runtime");function l(){let{t:l}=e.useTranslation(`openhands`),{active:u}=o.useActiveBackendContext(),{backend:d,orgId:f}=u;if(a.isNoBackend(d)||d.kind!==`cloud`)return null;let p=f?`?org=${encodeURIComponent(f)}`:``;return(0,c.jsxs)(`a`,{"data-testid":`settings-cloud-link`,href:`${d.host.replace(/\/+$/,``)}/settings${p}`,target:`_blank`,rel:`noopener noreferrer`,className:i.cn(s.sidebarNavRowClassName({collapsed:!1}),s.SIDEBAR_ROW_INTERACTIVE_CLASS.idle),children:[(0,c.jsx)(`span`,{className:s.SIDEBAR_ICON_SLOT_CLASS,children:(0,c.jsx)(n.Cloud,{className:`size-4 shrink-0`,"aria-hidden":!0})}),(0,c.jsx)(`span`,{className:i.cn(s.sidebarNavLabelClassName(!1),`flex-1`),children:l(t.I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}),(0,c.jsx)(r.ExternalLink,{className:`size-4 shrink-0 text-[var(--oh-muted)]`,"aria-hidden":!0})]})}exports.CloudSettingsLink=l;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../node_modules/lucide-react/dist/esm/icons/cloud.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs"),i=require("../../../utils/utils.cjs"),a=require("../../../api/agent-server-config.cjs"),o=require("../../../api/backend-registry/active-store.cjs"),s=require("../../../contexts/active-backend-context.cjs"),c=require("../sidebar/sidebar-layout.cjs");let l=require("react/jsx-runtime");function u(){let{t:u}=e.useTranslation(`openhands`),{active:d}=s.useActiveBackendContext(),{backend:f,orgId:p}=d;if(o.isNoBackend(f)||f.kind!==`cloud`)return null;let m=a.getLockedCloudHost()!==null,h=p?`?org=${encodeURIComponent(p)}`:``;return(0,l.jsxs)(`a`,{"data-testid":`settings-cloud-link`,href:`${f.host.replace(/\/+$/,``)}/settings${h}`,target:m?void 0:`_blank`,rel:m?void 0:`noopener noreferrer`,className:i.cn(c.sidebarNavRowClassName({collapsed:!1}),c.SIDEBAR_ROW_INTERACTIVE_CLASS.idle),children:[(0,l.jsx)(`span`,{className:c.SIDEBAR_ICON_SLOT_CLASS,children:(0,l.jsx)(n.Cloud,{className:`size-4 shrink-0`,"aria-hidden":!0})}),(0,l.jsx)(`span`,{className:i.cn(c.sidebarNavLabelClassName(!1),`flex-1`),children:u(t.I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}),!m&&(0,l.jsx)(r.ExternalLink,{className:`size-4 shrink-0 text-[var(--oh-muted)]`,"aria-hidden":!0})]})}exports.CloudSettingsLink=u;
2
2
  //# sourceMappingURL=cloud-settings-link.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-settings-link.cjs","names":[],"sources":["../../../../src/components/features/settings/cloud-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { Cloud, ExternalLink } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted settings page.\n */\nexport function CloudSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend, orgId } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n // `org` is consumed by the cloud settings loader so the page opens on the\n // org that is active here instead of the cloud's last-used org.\n const orgQuery = orgId ? `?org=${encodeURIComponent(orgId)}` : \"\";\n const cloudSettingsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings${orgQuery}`;\n\n return (\n <a\n data-testid=\"settings-cloud-link\"\n href={cloudSettingsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Cloud className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":"ojBAiBA,SAAgB,GAAoB,CAClC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAE,UAAW,EAAA,wBAAwB,EACrC,CAAE,UAAS,SAAU,EAE3B,GAAI,EAAA,YAAY,CAAO,GAAK,EAAQ,OAAS,QAAS,OAAO,KAI7D,IAAM,EAAW,EAAQ,QAAQ,mBAAmB,CAAK,IAAM,GAG/D,OACE,EAAA,EAAA,MAAC,IAAD,CACE,cAAY,sBACZ,KAAM,GALkB,EAAQ,KAAK,QAAQ,OAAQ,EAAE,EAAE,WAAW,IAMpE,OAAO,SACP,IAAI,sBACJ,UAAW,EAAA,GACT,EAAA,uBAAuB,CAAE,UAAW,EAAM,CAAC,EAC3C,EAAA,8BAA8B,IAChC,WARF,EAUE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,kCACf,EAAA,EAAA,KAAC,EAAA,MAAD,CAAO,UAAU,kBAAkB,cAAA,EAAa,CAAA,CAC5C,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,yBAAyB,EAAK,EAAG,QAAQ,WAC1D,EAAE,EAAA,QAAQ,4BAA4B,CACnC,CAAA,GACN,EAAA,EAAA,KAAC,EAAA,aAAD,CACE,UAAU,yCACV,cAAA,EACD,CAAA,CACA,GAEP"}
1
+ {"version":3,"file":"cloud-settings-link.cjs","names":[],"sources":["../../../../src/components/features/settings/cloud-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { Cloud, ExternalLink } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { getLockedCloudHost } from \"#/api/agent-server-config\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted settings page. Opens in the same tab when the canvas is locked to a\n * Cloud host (SaaS / self-hosted OHE): the settings page shares that host\n * with the canvas, so Back should return here (OHE-3242).\n */\nexport function CloudSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend, orgId } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n const isLockedToCloud = getLockedCloudHost() !== null;\n\n // `org` is consumed by the cloud settings loader so the page opens on the\n // org that is active here instead of the cloud's last-used org.\n const orgQuery = orgId ? `?org=${encodeURIComponent(orgId)}` : \"\";\n const cloudSettingsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings${orgQuery}`;\n\n return (\n <a\n data-testid=\"settings-cloud-link\"\n href={cloudSettingsUrl}\n target={isLockedToCloud ? undefined : \"_blank\"}\n rel={isLockedToCloud ? undefined : \"noopener noreferrer\"}\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Cloud className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}\n </span>\n {!isLockedToCloud && (\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n )}\n </a>\n );\n}\n"],"mappings":"smBAoBA,SAAgB,GAAoB,CAClC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAE,UAAW,EAAA,wBAAwB,EACrC,CAAE,UAAS,SAAU,EAE3B,GAAI,EAAA,YAAY,CAAO,GAAK,EAAQ,OAAS,QAAS,OAAO,KAE7D,IAAM,EAAkB,EAAA,mBAAmB,IAAM,KAI3C,EAAW,EAAQ,QAAQ,mBAAmB,CAAK,IAAM,GAG/D,OACE,EAAA,EAAA,MAAC,IAAD,CACE,cAAY,sBACZ,KAAM,GALkB,EAAQ,KAAK,QAAQ,OAAQ,EAAE,EAAE,WAAW,IAMpE,OAAQ,EAAkB,IAAA,GAAY,SACtC,IAAK,EAAkB,IAAA,GAAY,sBACnC,UAAW,EAAA,GACT,EAAA,uBAAuB,CAAE,UAAW,EAAM,CAAC,EAC3C,EAAA,8BAA8B,IAChC,WARF,EAUE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,kCACf,EAAA,EAAA,KAAC,EAAA,MAAD,CAAO,UAAU,kBAAkB,cAAA,EAAa,CAAA,CAC5C,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,yBAAyB,EAAK,EAAG,QAAQ,WAC1D,EAAE,EAAA,QAAQ,4BAA4B,CACnC,CAAA,EACL,CAAC,IACA,EAAA,EAAA,KAAC,EAAA,aAAD,CACE,UAAU,yCACV,cAAA,EACD,CAAA,CAEF,GAEP"}
@@ -1,5 +1,7 @@
1
1
  /**
2
2
  * Renders only for cloud backends — local backends have no equivalent
3
- * hosted settings page.
3
+ * hosted settings page. Opens in the same tab when the canvas is locked to a
4
+ * Cloud host (SaaS / self-hosted OHE): the settings page shares that host
5
+ * with the canvas, so Back should return here (OHE-3242).
4
6
  */
5
7
  export declare function CloudSettingsLink(): import("react").JSX.Element | null;
@@ -3,34 +3,35 @@ import { I18nKey as t } from "../../../i18n/declaration.js";
3
3
  import { Cloud as n } from "../../../node_modules/lucide-react/dist/esm/icons/cloud.js";
4
4
  import { ExternalLink as r } from "../../../node_modules/lucide-react/dist/esm/icons/external-link.js";
5
5
  import { cn as i } from "../../../utils/utils.js";
6
- import { isNoBackend as a } from "../../../api/backend-registry/active-store.js";
7
- import { useActiveBackendContext as o } from "../../../contexts/active-backend-context.js";
8
- import { SIDEBAR_ICON_SLOT_CLASS as s, SIDEBAR_ROW_INTERACTIVE_CLASS as c, sidebarNavLabelClassName as l, sidebarNavRowClassName as u } from "../sidebar/sidebar-layout.js";
9
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
6
+ import { getLockedCloudHost as a } from "../../../api/agent-server-config.js";
7
+ import { isNoBackend as o } from "../../../api/backend-registry/active-store.js";
8
+ import { useActiveBackendContext as s } from "../../../contexts/active-backend-context.js";
9
+ import { SIDEBAR_ICON_SLOT_CLASS as c, SIDEBAR_ROW_INTERACTIVE_CLASS as l, sidebarNavLabelClassName as u, sidebarNavRowClassName as d } from "../sidebar/sidebar-layout.js";
10
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
10
11
  //#region src/components/features/settings/cloud-settings-link.tsx
11
- function p() {
12
- let { t: p } = e("openhands"), { active: m } = o(), { backend: h, orgId: g } = m;
13
- if (a(h) || h.kind !== "cloud") return null;
14
- let _ = g ? `?org=${encodeURIComponent(g)}` : "";
15
- return /* @__PURE__ */ f("a", {
12
+ function m() {
13
+ let { t: m } = e("openhands"), { active: h } = s(), { backend: g, orgId: _ } = h;
14
+ if (o(g) || g.kind !== "cloud") return null;
15
+ let v = a() !== null, y = _ ? `?org=${encodeURIComponent(_)}` : "";
16
+ return /* @__PURE__ */ p("a", {
16
17
  "data-testid": "settings-cloud-link",
17
- href: `${h.host.replace(/\/+$/, "")}/settings${_}`,
18
- target: "_blank",
19
- rel: "noopener noreferrer",
20
- className: i(u({ collapsed: !1 }), c.idle),
18
+ href: `${g.host.replace(/\/+$/, "")}/settings${y}`,
19
+ target: v ? void 0 : "_blank",
20
+ rel: v ? void 0 : "noopener noreferrer",
21
+ className: i(d({ collapsed: !1 }), l.idle),
21
22
  children: [
22
- /* @__PURE__ */ d("span", {
23
- className: s,
24
- children: /* @__PURE__ */ d(n, {
23
+ /* @__PURE__ */ f("span", {
24
+ className: c,
25
+ children: /* @__PURE__ */ f(n, {
25
26
  className: "size-4 shrink-0",
26
27
  "aria-hidden": !0
27
28
  })
28
29
  }),
29
- /* @__PURE__ */ d("span", {
30
- className: i(l(!1), "flex-1"),
31
- children: p(t.SETTINGS$CLOUD_SETTINGS_LINK)
30
+ /* @__PURE__ */ f("span", {
31
+ className: i(u(!1), "flex-1"),
32
+ children: m(t.SETTINGS$CLOUD_SETTINGS_LINK)
32
33
  }),
33
- /* @__PURE__ */ d(r, {
34
+ !v && /* @__PURE__ */ f(r, {
34
35
  className: "size-4 shrink-0 text-[var(--oh-muted)]",
35
36
  "aria-hidden": !0
36
37
  })
@@ -38,6 +39,6 @@ function p() {
38
39
  });
39
40
  }
40
41
  //#endregion
41
- export { p as CloudSettingsLink };
42
+ export { m as CloudSettingsLink };
42
43
 
43
44
  //# sourceMappingURL=cloud-settings-link.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-settings-link.js","names":[],"sources":["../../../../src/components/features/settings/cloud-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { Cloud, ExternalLink } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted settings page.\n */\nexport function CloudSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend, orgId } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n // `org` is consumed by the cloud settings loader so the page opens on the\n // org that is active here instead of the cloud's last-used org.\n const orgQuery = orgId ? `?org=${encodeURIComponent(orgId)}` : \"\";\n const cloudSettingsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings${orgQuery}`;\n\n return (\n <a\n data-testid=\"settings-cloud-link\"\n href={cloudSettingsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Cloud className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,IAAoB;CAClC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,cAAW,EAAwB,GACrC,EAAE,YAAS,aAAU;CAE3B,IAAI,EAAY,CAAO,KAAK,EAAQ,SAAS,SAAS,OAAO;CAI7D,IAAM,IAAW,IAAQ,QAAQ,mBAAmB,CAAK,MAAM;CAG/D,OACE,kBAAC,KAAD;EACE,eAAY;EACZ,MAAM,GALkB,EAAQ,KAAK,QAAQ,QAAQ,EAAE,EAAE,WAAW;EAMpE,QAAO;EACP,KAAI;EACJ,WAAW,EACT,EAAuB,EAAE,WAAW,GAAM,CAAC,GAC3C,EAA8B,IAChC;YARF;GAUE,kBAAC,QAAD;IAAM,WAAW;cACf,kBAAC,GAAD;KAAO,WAAU;KAAkB,eAAA;IAAa,CAAA;GAC5C,CAAA;GACN,kBAAC,QAAD;IAAM,WAAW,EAAG,EAAyB,EAAK,GAAG,QAAQ;cAC1D,EAAE,EAAQ,4BAA4B;GACnC,CAAA;GACN,kBAAC,GAAD;IACE,WAAU;IACV,eAAA;GACD,CAAA;EACA;;AAEP"}
1
+ {"version":3,"file":"cloud-settings-link.js","names":[],"sources":["../../../../src/components/features/settings/cloud-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { Cloud, ExternalLink } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { getLockedCloudHost } from \"#/api/agent-server-config\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted settings page. Opens in the same tab when the canvas is locked to a\n * Cloud host (SaaS / self-hosted OHE): the settings page shares that host\n * with the canvas, so Back should return here (OHE-3242).\n */\nexport function CloudSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend, orgId } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n const isLockedToCloud = getLockedCloudHost() !== null;\n\n // `org` is consumed by the cloud settings loader so the page opens on the\n // org that is active here instead of the cloud's last-used org.\n const orgQuery = orgId ? `?org=${encodeURIComponent(orgId)}` : \"\";\n const cloudSettingsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings${orgQuery}`;\n\n return (\n <a\n data-testid=\"settings-cloud-link\"\n href={cloudSettingsUrl}\n target={isLockedToCloud ? undefined : \"_blank\"}\n rel={isLockedToCloud ? undefined : \"noopener noreferrer\"}\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Cloud className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}\n </span>\n {!isLockedToCloud && (\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n )}\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;;AAoBA,SAAgB,IAAoB;CAClC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,cAAW,EAAwB,GACrC,EAAE,YAAS,aAAU;CAE3B,IAAI,EAAY,CAAO,KAAK,EAAQ,SAAS,SAAS,OAAO;CAE7D,IAAM,IAAkB,EAAmB,MAAM,MAI3C,IAAW,IAAQ,QAAQ,mBAAmB,CAAK,MAAM;CAG/D,OACE,kBAAC,KAAD;EACE,eAAY;EACZ,MAAM,GALkB,EAAQ,KAAK,QAAQ,QAAQ,EAAE,EAAE,WAAW;EAMpE,QAAQ,IAAkB,KAAA,IAAY;EACtC,KAAK,IAAkB,KAAA,IAAY;EACnC,WAAW,EACT,EAAuB,EAAE,WAAW,GAAM,CAAC,GAC3C,EAA8B,IAChC;YARF;GAUE,kBAAC,QAAD;IAAM,WAAW;cACf,kBAAC,GAAD;KAAO,WAAU;KAAkB,eAAA;IAAa,CAAA;GAC5C,CAAA;GACN,kBAAC,QAAD;IAAM,WAAW,EAAG,EAAyB,EAAK,GAAG,QAAQ;cAC1D,EAAE,EAAQ,4BAA4B;GACnC,CAAA;GACL,CAAC,KACA,kBAAC,GAAD;IACE,WAAU;IACV,eAAA;GACD,CAAA;EAEF;;AAEP"}