@openhands/agent-canvas 1.0.0-beta.9 → 1.0.0-rc.2

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 (405) hide show
  1. package/README.md +2 -2
  2. package/README.windows.md +2 -2
  3. package/build/assets/{QueryClientProvider-w1cZWY41.js → QueryClientProvider-7oLZ1RtQ.js} +1 -1
  4. package/build/assets/{Trans-BJeYqz2A.js → Trans-rF21Jwln.js} +1 -1
  5. package/build/assets/{acp-providers-DJr8DlNG.js → acp-providers-DZEi8wDz.js} +1 -1
  6. package/build/assets/active-backend-context-CQTk4wD8.js +1 -0
  7. package/build/assets/add-backend-modal-CIfhseZn.js +1 -0
  8. package/build/assets/agent-server-client-options-Dvgeb3x4.js +1 -0
  9. package/build/assets/agent-server-compatibility-BANjmMTo.js +1 -0
  10. package/build/assets/agent-server-conversation-service.api-B82pNNTm.js +5 -0
  11. package/build/assets/{agent-settings-BXBaybB_.js → agent-settings-B6htMeS2.js} +1 -1
  12. package/build/assets/{alert-banner-NeUl1-PQ.js → alert-banner-D41ZKDZT.js} +1 -1
  13. package/build/assets/{analytics-consent-form-modal-CmWcFlc6.js → analytics-consent-form-modal-TINgM_jV.js} +1 -1
  14. package/build/assets/api-key-entry-screen-Di1vHgIU.js +1 -0
  15. package/build/assets/{app-settings-C-U6jONZ.js → app-settings-CjCa1MOB.js} +1 -1
  16. package/build/assets/automation-detail-DPoxzTdV.js +1 -0
  17. package/build/assets/{automations-list-BLJzAd-p.js → automations-list-DwUEe2Ea.js} +1 -1
  18. package/build/assets/{back-nav-button-DgkK0Ka6.js → back-nav-button-BDM9vr_o.js} +1 -1
  19. package/build/assets/backend-form-modal-B6q897ZX.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-BktJcGgH.js → backend-synced-settings-badge-BwTawSCE.js} +1 -1
  21. package/build/assets/{base-modal-DZCNv0A4.js → base-modal-Ba5WcNb6.js} +1 -1
  22. package/build/assets/{brand-button-LBFNic99.js → brand-button-BoiPxAGm.js} +1 -1
  23. package/build/assets/{browser-D08Sp3ZY.js → browser-DTei6kki.js} +1 -1
  24. package/build/assets/browser-store-BjhV_9wS.js +1 -0
  25. package/build/assets/{browser-tab-be3QvXg9.js → browser-tab-DiRTKik8.js} +1 -1
  26. package/build/assets/chat-send-button-06dIuWXm.js +1 -0
  27. package/build/assets/check-BDAbW7je.js +1 -0
  28. package/build/assets/{checkmark-Rmpruj7q.js → checkmark-BB7QCG5T.js} +1 -1
  29. package/build/assets/{chevron-down-KhWYEjeW.js → chevron-down-DUxWwzTm.js} +1 -1
  30. package/build/assets/{chevron-left-small-6nyFCWVQ.js → chevron-left-small-CuuwpRi9.js} +1 -1
  31. package/build/assets/{circle-plus-check-toggle-DquBwJ_6.js → circle-plus-check-toggle-B3_W6-nt.js} +1 -1
  32. package/build/assets/{close-D_o3d8QM.js → close-Cz0OAgTy.js} +1 -1
  33. package/build/assets/{code-tag-DhsjDB-v.js → code-tag-Cz9AIz-X.js} +1 -1
  34. package/build/assets/{color-themes-0biOprdo.js → color-themes-B9n7pBQl.js} +1 -1
  35. package/build/assets/{combobox-caret-CO7eozIY.js → combobox-caret-DwMmhrrA.js} +1 -1
  36. package/build/assets/{command-store-UzKGSUC2.js → command-store-DAd3K0d_.js} +1 -1
  37. package/build/assets/{condenser-settings-BulzYEuW.js → condenser-settings-DczjwkIp.js} +1 -1
  38. package/build/assets/{confirmation-modal-CMAtd9R0.js → confirmation-modal-C_lds1Tb.js} +1 -1
  39. package/build/assets/{context-menu-list-item-D0swnhFt.js → context-menu-list-item-DhG1Ln5m.js} +1 -1
  40. package/build/assets/conversation-CBlJiDaV.js +19 -0
  41. package/build/assets/conversation-Dss8XCN_.js +1 -0
  42. package/build/assets/conversation-panel-B5sVpsz5.js +1 -0
  43. package/build/assets/conversation-service.api-B4s-xIOK.js +1 -0
  44. package/build/assets/conversation-state-store-BUU90dVq.js +1 -0
  45. package/build/assets/{conversation-store-CC-isCnP.js → conversation-store-kHcewy1E.js} +1 -1
  46. package/build/assets/{conversation-tab-empty-state-DYjKsg_c.js → conversation-tab-empty-state-5bW9CQke.js} +1 -1
  47. package/build/assets/conversation-websocket-context-C2yKCqvj.js +3 -0
  48. package/build/assets/{copy-BM0RpLez.js → copy-CA1Dblua.js} +1 -1
  49. package/build/assets/{custom-toast-handlers-BohXx7uh.js → custom-toast-handlers-fgD4IYsu.js} +1 -1
  50. package/build/assets/{declaration-DaUdB2Wg.js → declaration-IA661TBv.js} +1 -1
  51. package/build/assets/{device-verify-DiEJqpJb.js → device-verify-BVl4GEvt.js} +1 -1
  52. package/build/assets/{dist-xtCm0O6P.js → dist-B-SKiGDl.js} +1 -1
  53. package/build/assets/dist-CBUfAk0Z.js +1 -0
  54. package/build/assets/{dropdown-classes-Vqz86I0R.js → dropdown-classes-lT1LUsbO.js} +1 -1
  55. package/build/assets/edit-automation-modal-kc_FzbzK.js +1 -0
  56. package/build/assets/ellipsis-button-DRRmCrWi.js +1 -0
  57. package/build/assets/{entry.client-BvKgdCQ9.js → entry.client-CWkbusD1.js} +2 -2
  58. package/build/assets/{enum-filter-dropdown-DdFgk0EM.js → enum-filter-dropdown-DlY0Q3fj.js} +1 -1
  59. package/build/assets/{environment-switch-overlay-CuBuZOaa.js → environment-switch-overlay-BrHKX6_Z.js} +1 -1
  60. package/build/assets/{extensions-hub-Dayqvv0n.js → extensions-hub-NbQnt-cn.js} +1 -1
  61. package/build/assets/extensions-navigation-oOk5yl8X.js +1 -0
  62. package/build/assets/{file-DwHCkWZT.js → file-DM0ihEsO.js} +1 -1
  63. package/build/assets/files-tab-mK7Mdyuf.js +1 -0
  64. package/build/assets/files-tab-store-QlUCuW8b.js +1 -0
  65. package/build/assets/{folder-2h1hR1Qb.js → folder-UGYUKpqb.js} +1 -1
  66. package/build/assets/git-control-bar-branch-button-C1qmab0K.js +27 -0
  67. package/build/assets/{globe-qFjFNG6J.js → globe-2otpEmVh.js} +1 -1
  68. package/build/assets/home-ChuA06Hv.js +1 -0
  69. package/build/assets/{i18n-zDndR1Ne.js → i18n-CyvU1o95.js} +1 -1
  70. package/build/assets/install-server-modal--lZ1HSHB.js +1 -0
  71. package/build/assets/{launch-I00QV8YT.js → launch-BADsYeGp.js} +1 -1
  72. package/build/assets/{lesson-plan-C18uB_56.js → lesson-plan-5O2tVbD1.js} +1 -1
  73. package/build/assets/{link-external-DtcdPFbw.js → link-external-kU6aFXU6.js} +1 -1
  74. package/build/assets/llm-client-BnqeDPua.js +1 -0
  75. package/build/assets/llm-settings-D477P0Lg.js +1 -0
  76. package/build/assets/llm-settings-DtlQ7i4C.js +1 -0
  77. package/build/assets/{loading-spinner-DNwR4--Z.js → loading-spinner-CFuA0UNt.js} +1 -1
  78. package/build/assets/manage-backends-modal-sH7l5NgI.js +1 -0
  79. package/build/assets/manifest-17af0b17.js +1 -0
  80. package/build/assets/{markdown-renderer-D6B-u2nM.js → markdown-renderer-CZq_UdmE.js} +1 -1
  81. package/build/assets/mcp-DdQ72_AO.js +9 -0
  82. package/build/assets/mcp-client-xEdbDxOL.js +1 -0
  83. package/build/assets/{messages-Bz9TWjlh.js → messages-luW9zf1w.js} +1 -1
  84. package/build/assets/{modal-backdrop-BDqI1zBV.js → modal-backdrop-B1si6TUd.js} +1 -1
  85. package/build/assets/{modal-body-CCLCqX1J.js → modal-body-2Po2nl1e.js} +1 -1
  86. package/build/assets/{modal-classes-DwTdT3IK.js → modal-classes-9XTtWCtF.js} +1 -1
  87. package/build/assets/{modal-close-button-gQgKqUf-.js → modal-close-button-BCvw9IUN.js} +1 -1
  88. package/build/assets/model-selector-DzQRgNGZ.js +1 -0
  89. package/build/assets/{navigation-context-aNGUUtdq.js → navigation-context-CszaA-CJ.js} +1 -1
  90. package/build/assets/{navigation-link-CYkF2y3K.js → navigation-link-DXg4oo29.js} +1 -1
  91. package/build/assets/onboarding-DCL9stdH.js +1 -0
  92. package/build/assets/{openhands-logo-CHmtDV-t.js → openhands-logo-B-IDE1ER.js} +1 -1
  93. package/build/assets/{option-service.api-CGNANEcT.js → option-service.api-DHOGfYKh.js} +1 -1
  94. package/build/assets/organization-service.api-D79cdERN.js +1 -0
  95. package/build/assets/path-utils-CNd_jqv_.js +1 -0
  96. package/build/assets/{pencil-Dr0b2jL1.js → pencil-COslZGUC.js} +1 -1
  97. package/build/assets/{plan-components--aLlpASH.js → plan-components-BRiIX8Wn.js} +1 -1
  98. package/build/assets/{planner-tab-B-5EeCEm.js → planner-tab-QBnZgIXd.js} +1 -1
  99. package/build/assets/plus-D8aJZRkD.js +1 -0
  100. package/build/assets/profiles-client-CesbAK-7.js +1 -0
  101. package/build/assets/{providers-DknP6O2g.js → providers-Bpq3xFRA.js} +1 -1
  102. package/build/assets/proxy-wIasY2Po.js +1 -0
  103. package/build/assets/{query-client-config-CWWGQWvw.js → query-client-config-CITeuHD7.js} +1 -1
  104. package/build/assets/{recommended-automations-launcher-BIul0osB.js → recommended-automations-launcher-B01jchhe.js} +1 -1
  105. package/build/assets/root-BBV8Ew9E.js +2 -0
  106. package/build/assets/root-layout-pQASEqtQ.js +2 -0
  107. package/build/assets/{sdk-section-page-VmtJWH3A.js → sdk-section-page-BQKe3asw.js} +1 -1
  108. package/build/assets/{sdk-settings-schema-DFievvEK.js → sdk-settings-schema-DoRnefvb.js} +1 -1
  109. package/build/assets/{search-BeVRXvX7.js → search-Cbh-hHBu.js} +1 -1
  110. package/build/assets/secrets-service-DEIB-Cfk.js +1 -0
  111. package/build/assets/{secrets-settings-BLMvCkKm.js → secrets-settings-D2EfzdpC.js} +1 -1
  112. package/build/assets/server-client-Cz8PyIbN.js +1 -0
  113. package/build/assets/settings-B7jVceyu.js +1 -0
  114. package/build/assets/settings-client-BUlG0Gzq.js +1 -0
  115. package/build/assets/{settings-dropdown-input-DA_pzHWE.js → settings-dropdown-input-BD7ziSoR.js} +1 -1
  116. package/build/assets/{settings-gear-aNebYlCy.js → settings-gear-xGs_SPgZ.js} +1 -1
  117. package/build/assets/{settings-index-CycvkOoq.js → settings-index-Xj0v9Oas.js} +1 -1
  118. package/build/assets/{settings-input-8y5p4kze.js → settings-input-CPr7vX81.js} +1 -1
  119. package/build/assets/{settings-list-classes-Qk7zl0Wu.js → settings-list-classes-CYDn4jUg.js} +1 -1
  120. package/build/assets/{settings-modal-nJYxCsyp.js → settings-modal-CDBy1S9S.js} +1 -1
  121. package/build/assets/{settings-section-header-context-B77tsYlx.js → settings-section-header-context-aD2iq1gD.js} +1 -1
  122. package/build/assets/settings-service.api-CTQ-LpAA.js +1 -0
  123. package/build/assets/{settings-switch-ba4DuiNO.js → settings-switch-CSHSqH99.js} +1 -1
  124. package/build/assets/{settings-utils-BxzHqLmZ.js → settings-utils-BCbzc6-u.js} +1 -1
  125. package/build/assets/shared-conversation-BHEbOdHj.js +1 -0
  126. package/build/assets/{sidebar-mobile-menu-toggle-C0mmabKj.js → sidebar-mobile-menu-toggle-YYPXGikp.js} +1 -1
  127. package/build/assets/{sidebar-nav-link-BsYdDFfb.js → sidebar-nav-link-CiXbBMQx.js} +1 -1
  128. package/build/assets/{sidebar-store-DnQAJAE5.js → sidebar-store-B76R2gP8.js} +1 -1
  129. package/build/assets/{skill-card-pill-row-BhUlGcYB.js → skill-card-pill-row-BXILn-GK.js} +1 -1
  130. package/build/assets/{skills-TYjOUQ2d.js → skills-CCaEu1KQ.js} +1 -1
  131. package/build/assets/skills-client-Cr9F5306.js +1 -0
  132. package/build/assets/{skills-plugins-D0pdqgKa.js → skills-plugins-Bs5HiF1O.js} +1 -1
  133. package/build/assets/{skills-settings-VqKTkmVl.js → skills-settings-CQYxMmWf.js} +1 -1
  134. package/build/assets/{styled-tooltip-TCp7svY3.js → styled-tooltip-DEr7oa0m.js} +1 -1
  135. package/build/assets/suspense-C9MBE_9N.js +1 -0
  136. package/build/assets/{switch-skeleton-cKrdaYGj.js → switch-skeleton-C87Tx3Tc.js} +1 -1
  137. package/build/assets/{task-list-tab-BiizRsY3.js → task-list-tab-R9N3Wd-U.js} +1 -1
  138. package/build/assets/telemetry-DCrd7gnV.js +2 -0
  139. package/build/assets/{terminal-CpgZx6go.js → terminal-BTM3UFcQ.js} +1 -1
  140. package/build/assets/{terminal-BSYITdM0.js → terminal-DQJ6IJUd.js} +1 -1
  141. package/build/assets/{toggle-switch-CUgOZqZu.js → toggle-switch-C-7juZ1u.js} +1 -1
  142. package/build/assets/{trash-2-CbVljPko.js → trash-2-DAKXV2Wm.js} +1 -1
  143. package/build/assets/{typography-Bvw0IxaN.js → typography-U1gkzkXo.js} +1 -1
  144. package/build/assets/{u-check-circle-half-DjpjzWu3.js → u-check-circle-half-CirnoxXG.js} +1 -1
  145. package/build/assets/{u-check-circle-u9QiS4Fr.js → u-check-circle-lbkXL2z4.js} +1 -1
  146. package/build/assets/{u-circuit-DlBlOwx9.js → u-circuit-Danff2ks.js} +1 -1
  147. package/build/assets/{u-edit-BIYzjs3v.js → u-edit-CH5nNya1.js} +1 -1
  148. package/build/assets/{use-active-conversation-q1wT8LI5.js → use-active-conversation-BY5F6A1G.js} +1 -1
  149. package/build/assets/use-agent-settings-schema-CsuMq16G.js +1 -0
  150. package/build/assets/{use-agent-state-CCHlVqvY.js → use-agent-state-DX5NKEa_.js} +1 -1
  151. package/build/assets/{use-cloud-current-user-id-BAKf91Zx.js → use-cloud-current-user-id-e1Pk7NxQ.js} +1 -1
  152. package/build/assets/use-config-DSzkljTq.js +1 -0
  153. package/build/assets/use-create-conversation-4iJytCT1.js +1 -0
  154. package/build/assets/{use-event-store-Cxqc45Sw.js → use-event-store-Rw1YbvLm.js} +1 -1
  155. package/build/assets/use-get-secrets-BMnFFBUx.js +1 -0
  156. package/build/assets/{use-handle-plan-click-Bfl0zIBr.js → use-handle-plan-click-DYd5a6zN.js} +1 -1
  157. package/build/assets/use-is-authed-DrocXcet.js +1 -0
  158. package/build/assets/{use-launch-skill-in-chat-3ydwpi_M.js → use-launch-skill-in-chat-BoqKmEHC.js} +1 -1
  159. package/build/assets/use-llm-profiles-BhZRf-NX.js +1 -0
  160. package/build/assets/use-runtime-is-ready-DP-KKHO6.js +1 -0
  161. package/build/assets/{use-save-settings-rE9aA29R.js → use-save-settings-hK6LYt0s.js} +1 -1
  162. package/build/assets/use-settings-Clf0Y_P3.js +1 -0
  163. package/build/assets/{use-settings-nav-items-C7MOWj09.js → use-settings-nav-items-oZ-BlOWX.js} +1 -1
  164. package/build/assets/use-skills-v8pQ02ze.js +1 -0
  165. package/build/assets/{use-task-list-YMkSzdDv.js → use-task-list-DydbuRFM.js} +1 -1
  166. package/build/assets/{use-tracking-DQYdZpxi.js → use-tracking-DQU60djN.js} +1 -1
  167. package/build/assets/use-unified-vscode-url-D2Buvmxj.js +1 -0
  168. package/build/assets/use-user-conversation-DwOGM1lc.js +1 -0
  169. package/build/assets/{useMutation-DDo48A8t.js → useMutation-7hG0GuPx.js} +1 -1
  170. package/build/assets/useQuery-JDs8UaWj.js +1 -0
  171. package/build/assets/{useTranslation-CEcjrme-.js → useTranslation-CbJtty1g.js} +1 -1
  172. package/build/assets/{utils-CdgBzLA7.js → utils-CVcuFUYj.js} +1 -1
  173. package/build/assets/{vendor~browser-DWk6fNtJ.js → vendor~browser-3J6WDaAB.js} +1 -1
  174. package/build/assets/{vendor~browser-tab-NZdVoI2Z.js → vendor~browser-tab-DYZ-OmbT.js} +1 -1
  175. package/build/assets/{vendor~conversation-panel~conversation-gp03cWZW.js → vendor~conversation-panel~conversation-DYHL7QoY.js} +1 -1
  176. package/build/assets/{vendor~conversation-panel~conversation~index-BZ5C6Xpz.js → vendor~conversation-panel~conversation~index-Be58Romv.js} +1 -1
  177. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~oli4dvxu-BodGsxSf.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~oli4dvxu-CBEOG8NF.js} +1 -1
  178. package/build/assets/{vendor~files-tab-Buz36Y-q.js → vendor~files-tab-Diy4WrQz.js} +1 -1
  179. package/build/assets/{vendor~home~conversation-panel~conversation-DG0H5SkJ.js → vendor~home~conversation-panel~conversation-DZ-F7J6T.js} +1 -1
  180. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Ceeqkj0k.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BighOCzm.js} +1 -1
  181. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9Il_wz8U.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CWwn0K2j.js} +1 -1
  182. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CXivI4Ym.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Cntsv2EN.js} +1 -1
  183. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B7I1ZxCx.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D13hiNGV.js} +1 -1
  184. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-1pTajrpX.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-dZ3D8RVL.js} +1 -1
  185. package/build/assets/{vendor~launch-DXL78kBf.js → vendor~launch-D65Vw0VZ.js} +1 -1
  186. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-CfAc3nMS.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-BJPgfJoU.js} +1 -1
  187. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-DkwcKRtv.js → vendor~root-layout~home~conversation-panel~conversation-Cg0nXqVs.js} +1 -1
  188. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DSqEbr0N.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-Dr8Ly0at.js} +1 -1
  189. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-BC9XTECT.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-DveauQfg.js} +1 -1
  190. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-D0XUSHNN.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~jpfhx3ls-BkicN-14.js} +2 -2
  191. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~jxrvuot9-Cwz6a1DC.js +48 -0
  192. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CcFtthyg.js → vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-C37jLHRk.js} +1 -1
  193. package/build/assets/{vendor~root-layout~home~mcp~automations-list-BnIlGhjl.js → vendor~root-layout~home~mcp~automations-list-BTTZ58Mb.js} +1 -1
  194. package/build/assets/{vendor~root-layout~home~mcp~automations-list-cNHi83v_.js → vendor~root-layout~home~mcp~automations-list-JQ-neDIa.js} +1 -1
  195. package/build/assets/{vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BGWUbqUq.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-CbuXadI-.js} +1 -1
  196. package/build/assets/{vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BuCSnjsW.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-UYEKKX0Y.js} +2 -2
  197. package/build/assets/{verification-settings-CIqtxWat.js → verification-settings-Rabe5TpK.js} +1 -1
  198. package/build/assets/{vscode-tab-DEt72yJX.js → vscode-tab-zLD5Z-PP.js} +1 -1
  199. package/build/assets/{waiting-for-runtime-message-DSjJfeoj.js → waiting-for-runtime-message-B1Dzhtj5.js} +1 -1
  200. package/build/assets/x-8AbJWTbX.js +1 -0
  201. package/build/assets/{x-mark-DsJ9tDD0.js → x-mark-CmcVOTk2.js} +1 -1
  202. package/build/index.html +4 -4
  203. package/build/locales/ar/openhands.json +1 -0
  204. package/build/locales/ca/openhands.json +1 -0
  205. package/build/locales/de/openhands.json +1 -0
  206. package/build/locales/en/openhands.json +1 -0
  207. package/build/locales/es/openhands.json +1 -0
  208. package/build/locales/fr/openhands.json +1 -0
  209. package/build/locales/it/openhands.json +1 -0
  210. package/build/locales/ja/openhands.json +1 -0
  211. package/build/locales/ko-KR/openhands.json +1 -0
  212. package/build/locales/no/openhands.json +1 -0
  213. package/build/locales/pt/openhands.json +1 -0
  214. package/build/locales/tr/openhands.json +1 -0
  215. package/build/locales/uk/openhands.json +1 -0
  216. package/build/locales/zh-CN/openhands.json +1 -0
  217. package/build/locales/zh-TW/openhands.json +1 -0
  218. package/dist/api/agent-server-adapter.cjs +2 -2
  219. package/dist/api/agent-server-adapter.cjs.map +1 -1
  220. package/dist/api/agent-server-adapter.js +6 -3
  221. package/dist/api/agent-server-adapter.js.map +1 -1
  222. package/dist/api/cloud/proxy.cjs +1 -1
  223. package/dist/api/cloud/proxy.cjs.map +1 -1
  224. package/dist/api/cloud/proxy.d.ts +18 -6
  225. package/dist/api/cloud/proxy.js +1 -1
  226. package/dist/api/cloud/proxy.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.d.ts +12 -0
  230. package/dist/api/config-service/config-service.api.js +55 -18
  231. package/dist/api/config-service/config-service.api.js.map +1 -1
  232. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  233. package/dist/api/conversation-metadata-store.d.ts +8 -0
  234. package/dist/api/conversation-metadata-store.js.map +1 -1
  235. package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +9 -0
  236. package/dist/components/features/chat/switch-profile-button.cjs +1 -1
  237. package/dist/components/features/chat/switch-profile-button.cjs.map +1 -1
  238. package/dist/components/features/chat/switch-profile-button.js +5 -5
  239. package/dist/components/features/chat/switch-profile-button.js.map +1 -1
  240. package/dist/components/features/conversation-panel/skills-modal.cjs +1 -1
  241. package/dist/components/features/conversation-panel/skills-modal.cjs.map +1 -1
  242. package/dist/components/features/conversation-panel/skills-modal.js +34 -37
  243. package/dist/components/features/conversation-panel/skills-modal.js.map +1 -1
  244. package/dist/components/features/settings/llm-profiles/profile-actions-menu.cjs +1 -1
  245. package/dist/components/features/settings/llm-profiles/profile-actions-menu.js +1 -0
  246. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  247. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  248. package/dist/components/features/skills/extensions-navigation.d.ts +0 -8
  249. package/dist/components/features/skills/extensions-navigation.js +34 -51
  250. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  251. package/dist/constants/acp-providers.cjs +1 -1
  252. package/dist/constants/acp-providers.js +1 -1
  253. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  254. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  255. package/dist/hooks/mutation/use-create-conversation.js +26 -14
  256. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  257. package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs +1 -1
  258. package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs.map +1 -1
  259. package/dist/hooks/mutation/use-switch-llm-profile-and-log.js +26 -15
  260. package/dist/hooks/mutation/use-switch-llm-profile-and-log.js.map +1 -1
  261. package/dist/hooks/query/use-verified-models.cjs +1 -1
  262. package/dist/hooks/query/use-verified-models.cjs.map +1 -1
  263. package/dist/hooks/query/use-verified-models.js +7 -6
  264. package/dist/hooks/query/use-verified-models.js.map +1 -1
  265. package/dist/i18n/declaration.cjs +1 -1
  266. package/dist/i18n/declaration.cjs.map +1 -1
  267. package/dist/i18n/declaration.d.ts +1 -0
  268. package/dist/i18n/declaration.js +1 -1
  269. package/dist/i18n/declaration.js.map +1 -1
  270. package/dist/i18n/translation.cjs +1 -1
  271. package/dist/i18n/translation.cjs.map +1 -1
  272. package/dist/i18n/translation.js +17 -0
  273. package/dist/i18n/translation.js.map +1 -1
  274. package/dist/index.cjs +1 -1
  275. package/dist/index.js +10 -10
  276. package/dist/lib/index.cjs +1 -1
  277. package/dist/lib/index.js +1 -1
  278. package/dist/locales/ar/openhands.json +1 -0
  279. package/dist/locales/ca/openhands.json +1 -0
  280. package/dist/locales/de/openhands.json +1 -0
  281. package/dist/locales/en/openhands.json +1 -0
  282. package/dist/locales/es/openhands.json +1 -0
  283. package/dist/locales/fr/openhands.json +1 -0
  284. package/dist/locales/it/openhands.json +1 -0
  285. package/dist/locales/ja/openhands.json +1 -0
  286. package/dist/locales/ko-KR/openhands.json +1 -0
  287. package/dist/locales/no/openhands.json +1 -0
  288. package/dist/locales/pt/openhands.json +1 -0
  289. package/dist/locales/tr/openhands.json +1 -0
  290. package/dist/locales/uk/openhands.json +1 -0
  291. package/dist/locales/zh-CN/openhands.json +1 -0
  292. package/dist/locales/zh-TW/openhands.json +1 -0
  293. package/dist/package.cjs +1 -1
  294. package/dist/package.cjs.map +1 -1
  295. package/dist/package.js +1 -1
  296. package/dist/package.js.map +1 -1
  297. package/dist/routes/mcp.cjs +1 -1
  298. package/dist/routes/mcp.cjs.map +1 -1
  299. package/dist/routes/mcp.d.ts +0 -1
  300. package/dist/routes/mcp.js +0 -1
  301. package/dist/routes/mcp.js.map +1 -1
  302. package/package.json +1 -1
  303. package/scripts/dev-safe.mjs +18 -2
  304. package/build/assets/acp-route-guard-A__sWgbc.js +0 -1
  305. package/build/assets/active-backend-context-I2w666XY.js +0 -1
  306. package/build/assets/add-backend-modal-BDBDBXsJ.js +0 -1
  307. package/build/assets/agent-server-client-options-9agOSarV.js +0 -1
  308. package/build/assets/agent-server-compatibility-B7QStIcH.js +0 -1
  309. package/build/assets/agent-server-conversation-service.api-Cagoqq1V.js +0 -5
  310. package/build/assets/api-key-entry-screen-ByXA4hXH.js +0 -1
  311. package/build/assets/automation-detail-Dbmgt974.js +0 -1
  312. package/build/assets/backend-form-modal-CeB983Sj.js +0 -1
  313. package/build/assets/browser-store-JRrcGdlk.js +0 -1
  314. package/build/assets/chat-send-button-5qz0zj6R.js +0 -1
  315. package/build/assets/check-CZhEL6rP.js +0 -1
  316. package/build/assets/conversation-BrjF2-Ky.js +0 -1
  317. package/build/assets/conversation-HgR_TTPE.js +0 -19
  318. package/build/assets/conversation-panel-BlRcO5AC.js +0 -1
  319. package/build/assets/conversation-service.api-B_Pdmwsa.js +0 -1
  320. package/build/assets/conversation-state-store-D-w0uurj.js +0 -1
  321. package/build/assets/conversation-websocket-context-G95yfL81.js +0 -3
  322. package/build/assets/dist-Bl-1K5Tv.js +0 -1
  323. package/build/assets/edit-automation-modal-CNZgSSiH.js +0 -1
  324. package/build/assets/extensions-navigation-yFLAU06N.js +0 -1
  325. package/build/assets/files-tab-CMredyYX.js +0 -1
  326. package/build/assets/files-tab-store-DLU28g8C.js +0 -1
  327. package/build/assets/git-control-bar-branch-button-D8blTNXh.js +0 -27
  328. package/build/assets/home-TrU0fLgG.js +0 -1
  329. package/build/assets/install-server-modal-D8Q0xZcN.js +0 -1
  330. package/build/assets/llm-client-BqyLKgUN.js +0 -1
  331. package/build/assets/llm-settings-C4R4HMUO.js +0 -1
  332. package/build/assets/llm-settings-Dq3w2cob.js +0 -1
  333. package/build/assets/manage-backends-modal-Ceo_SOcf.js +0 -1
  334. package/build/assets/manifest-8c2efa8a.js +0 -1
  335. package/build/assets/mcp-EvrLVTla.js +0 -9
  336. package/build/assets/model-selector-DoL0CL0_.js +0 -1
  337. package/build/assets/onboarding-DLr9jbKH.js +0 -1
  338. package/build/assets/organization-service.api-Dn74hBTH.js +0 -1
  339. package/build/assets/path-utils-BjxzIGLp.js +0 -1
  340. package/build/assets/plus-DT-M0FA1.js +0 -1
  341. package/build/assets/profiles-client-BrqNmaDV.js +0 -1
  342. package/build/assets/proxy-sRh0WKI7.js +0 -1
  343. package/build/assets/root-BietmyRa.js +0 -2
  344. package/build/assets/root-layout-BgPi-t57.js +0 -2
  345. package/build/assets/secrets-service-DVtlLWY8.js +0 -1
  346. package/build/assets/server-client-DYv_GHPl.js +0 -1
  347. package/build/assets/settings-CXvJUx_j.js +0 -1
  348. package/build/assets/settings-service.api-DxIEtvx6.js +0 -1
  349. package/build/assets/shared-conversation-x41nZQi7.js +0 -1
  350. package/build/assets/telemetry-3piyXm5H.js +0 -2
  351. package/build/assets/use-agent-settings-schema-Yxf7KGyG.js +0 -1
  352. package/build/assets/use-config-DwfigQ_Y.js +0 -1
  353. package/build/assets/use-create-conversation-BEzddjXn.js +0 -1
  354. package/build/assets/use-get-secrets-BlO1BfUo.js +0 -1
  355. package/build/assets/use-is-authed-hHndEep7.js +0 -1
  356. package/build/assets/use-llm-profiles-E-jjZMZw.js +0 -1
  357. package/build/assets/use-runtime-is-ready-DBWzvAmc.js +0 -1
  358. package/build/assets/use-settings-BPTbE7lg.js +0 -1
  359. package/build/assets/use-skills-QhoaIYGF.js +0 -1
  360. package/build/assets/use-unified-vscode-url-DFtNIC1Q.js +0 -1
  361. package/build/assets/use-user-conversation-BRAseenw.js +0 -1
  362. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-D8soyAAx.js +0 -48
  363. package/build/assets/vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~jaomi49z-Cw89stA6.js +0 -1
  364. package/build/assets/x-JOBEVLW0.js +0 -1
  365. package/dist/components/features/conversation-panel/skills-runtime-waiting-state.cjs +0 -2
  366. package/dist/components/features/conversation-panel/skills-runtime-waiting-state.cjs.map +0 -1
  367. package/dist/components/features/conversation-panel/skills-runtime-waiting-state.d.ts +0 -1
  368. package/dist/components/features/conversation-panel/skills-runtime-waiting-state.js +0 -21
  369. package/dist/components/features/conversation-panel/skills-runtime-waiting-state.js.map +0 -1
  370. package/dist/utils/acp-route-guard.cjs +0 -1
  371. package/dist/utils/acp-route-guard.d.ts +0 -26
  372. package/dist/utils/acp-route-guard.js +0 -4
  373. /package/build/assets/{agent-server-ui-style-scope-BwIZYdC1.js → agent-server-ui-style-scope-Bhc5vpWO.js} +0 -0
  374. /package/build/assets/{automation-DJ_3GeXD.js → automation-LZB0MjdV.js} +0 -0
  375. /package/build/assets/{common-DqjLSBOt.js → common-Cfviy7yT.js} +0 -0
  376. /package/build/assets/{context-CEQZwATj.js → context-BBqptpXX.js} +0 -0
  377. /package/build/assets/{conversation-local-storage-YmOVXxxW.js → conversation-local-storage-D5Tre_GA.js} +0 -0
  378. /package/build/assets/{createLucideIcon-Ddu8jDOQ.js → createLucideIcon-C9OEnwvX.js} +0 -0
  379. /package/build/assets/{environment-switch-store-CiurvTtK.js → environment-switch-store-BpKxp6Xq.js} +0 -0
  380. /package/build/assets/{git-status-mapper-DnL9OC8_.js → git-status-mapper-N4-7eaeC.js} +0 -0
  381. /package/build/assets/{handle-capture-consent-3XrjZ8wi.js → handle-capture-consent-OitMkDHc.js} +0 -0
  382. /package/build/assets/{health-store-B5f0S2FY.js → health-store-d-d2ssv4.js} +0 -0
  383. /package/build/assets/{iconBase-BVhFI-0E.js → iconBase-B_5IRYeZ.js} +0 -0
  384. /package/build/assets/{map-provider-C3Z5Dx2J.js → map-provider-BHow6ugd.js} +0 -0
  385. /package/build/assets/{middleware-CfatjPYZ.js → middleware-B5rcobhi.js} +0 -0
  386. /package/build/assets/{objectWithoutPropertiesLoose-DSQKyRhw.js → objectWithoutPropertiesLoose-B-IA9dU9.js} +0 -0
  387. /package/build/assets/{query-keys-tAsQcc_9.js → query-keys-CQaji0wJ.js} +0 -0
  388. /package/build/assets/{react-Dy05vyj5.js → react-CuAHzoGi.js} +0 -0
  389. /package/build/assets/{retrieve-axios-error-message-BY-yIkIq.js → retrieve-axios-error-message-DbnSBc_1.js} +0 -0
  390. /package/build/assets/{sdk-settings-field-metadata-C6KMD-jZ.js → sdk-settings-field-metadata-CtO73dY6.js} +0 -0
  391. /package/build/assets/{settings-DGY6n4J2.js → settings-KgLvVrSm.js} +0 -0
  392. /package/build/assets/{settings-like-page-layout-classes-DNg2vKSM.js → settings-like-page-layout-classes-GknosJgv.js} +0 -0
  393. /package/build/assets/{use-breakpoint-DpxHDmuH.js → use-breakpoint-2sN462wJ.js} +0 -0
  394. /package/build/assets/{use-click-outside-element-DhxCUyWl.js → use-click-outside-element-_vianyPb.js} +0 -0
  395. /package/build/assets/{v4-khGvL7i2.js → v4-BMWDcIWQ.js} +0 -0
  396. /package/build/assets/{vendor~browser-BDNLFng6.js → vendor~browser-C3GKF4mj.js} +0 -0
  397. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-D_hRW_zc.js → vendor~conversation-panel~conversation~alert-banner-DMcFTqbt.js} +0 -0
  398. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~j8sdb9mk-OFpe9fX_.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~j8sdb9mk-oCzr0-9g.js} +0 -0
  399. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~lpdshwee-BPuuVEqr.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~lpdshwee-CTmh4bwd.js} +0 -0
  400. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~skills-settings~m~o9nrx3fm-D44TR8hL.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~skills-settings~m~o9nrx3fm-87v-LliW.js} +0 -0
  401. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Dr3Ow7Ms.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTosGXG7.js} +0 -0
  402. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-B1TKKuuH.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ntycl9e1-DspdqGPW.js} +0 -0
  403. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~e9ykmtgh-Fa-nXZ4M.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~e9ykmtgh-DMH1jSwL.js} +0 -0
  404. /package/build/assets/{vendor~terminal-0ObOedYm.js → vendor~terminal-CnKZILnC.js} +0 -0
  405. /package/build/assets/{vscode-url-helper-BMq8JBhB.js → vscode-url-helper-CwQPl6QN.js} +0 -0
@@ -1,66 +1,63 @@
1
1
  import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
2
  import { I18nKey as t } from "../../../i18n/declaration.js";
3
- import { AgentState as n } from "../../../types/agent-state.js";
4
- import { getAgentServerWorkingDir as r } from "../../../api/agent-server-config.js";
5
- import { useAgentState as i } from "../../../hooks/use-agent-state.js";
6
- import { useConversationSkills as a } from "../../../hooks/query/use-conversation-skills.js";
7
- import { ModalBackdrop as o } from "../../shared/modals/modal-backdrop.js";
8
- import { ModalBody as s } from "../../shared/modals/modal-body.js";
9
- import { SKILL_SCOPE_ORDER as c, groupSkillsByScope as l } from "../../../utils/skill-scope.js";
10
- import { SkillsModalHeader as u } from "./skills-modal-header.js";
11
- import { SkillsModalSection as d } from "./skills-modal-section.js";
12
- import { SkillsRuntimeWaitingState as f } from "./skills-runtime-waiting-state.js";
13
- import { SkillsLoadingState as p } from "./skills-loading-state.js";
14
- import { SkillsEmptyState as m } from "./skills-empty-state.js";
15
- import { SkillItem as h } from "./skill-item.js";
16
- import { useMemo as g, useState as _ } from "react";
17
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
3
+ import { getAgentServerWorkingDir as n } from "../../../api/agent-server-config.js";
4
+ import { useConversationSkills as r } from "../../../hooks/query/use-conversation-skills.js";
5
+ import { ModalBackdrop as i } from "../../shared/modals/modal-backdrop.js";
6
+ import { ModalBody as a } from "../../shared/modals/modal-body.js";
7
+ import { SKILL_SCOPE_ORDER as o, groupSkillsByScope as s } from "../../../utils/skill-scope.js";
8
+ import { SkillsModalHeader as c } from "./skills-modal-header.js";
9
+ import { SkillsModalSection as l } from "./skills-modal-section.js";
10
+ import { SkillsLoadingState as u } from "./skills-loading-state.js";
11
+ import { SkillsEmptyState as d } from "./skills-empty-state.js";
12
+ import { SkillItem as f } from "./skill-item.js";
13
+ import { useMemo as p, useState as m } from "react";
14
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
18
15
  //#region src/components/features/conversation-panel/skills-modal.tsx
19
- var b = {
16
+ var _ = {
20
17
  project: t.SKILLS_MODAL$SECTION_PROJECT,
21
18
  personal: t.SKILLS_MODAL$SECTION_USER,
22
19
  public: t.SKILLS_MODAL$SECTION_PUBLIC
23
20
  };
24
- function x({ onClose: t }) {
25
- let { t: x } = e("openhands"), { curAgentState: S } = i(), C = r(), [w, T] = _({}), { data: E, isLoading: D, isError: O, refetch: k, isRefetching: A } = a(), j = g(() => E ? l(E, C) : null, [E, C]), M = (e) => {
26
- T((t) => ({
21
+ function v({ onClose: t }) {
22
+ let { t: v } = e("openhands"), y = n(), [b, x] = m({}), { data: S, isLoading: C, isError: w, refetch: T, isRefetching: E } = r(), D = p(() => S ? s(S, y) : null, [S, y]), O = (e) => {
23
+ x((t) => ({
27
24
  ...t,
28
25
  [e]: !t[e]
29
26
  }));
30
- }, N = ![n.LOADING, n.INIT].includes(S);
31
- return /* @__PURE__ */ v(o, {
27
+ };
28
+ return /* @__PURE__ */ h(i, {
32
29
  onClose: t,
33
- children: /* @__PURE__ */ y(s, {
30
+ children: /* @__PURE__ */ g(a, {
34
31
  width: "lg",
35
32
  className: "relative max-h-[80vh] flex flex-col items-start border border-[var(--oh-border)]",
36
33
  testID: "skills-modal",
37
- children: [/* @__PURE__ */ v(u, {
38
- isLoading: D,
39
- isRefetching: A,
40
- onRefresh: k,
34
+ children: [/* @__PURE__ */ h(c, {
35
+ isLoading: C,
36
+ isRefetching: E,
37
+ onRefresh: T,
41
38
  onClose: t
42
- }), /* @__PURE__ */ v("div", {
39
+ }), /* @__PURE__ */ h("div", {
43
40
  className: "w-full h-[60vh] overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always",
44
- children: N ? D ? /* @__PURE__ */ v(p, {}) : O || !E || E.length === 0 ? /* @__PURE__ */ v(m, { isError: O }) : j && /* @__PURE__ */ v("div", {
41
+ children: C ? /* @__PURE__ */ h(u, {}) : w || !S || S.length === 0 ? /* @__PURE__ */ h(d, { isError: w }) : D && /* @__PURE__ */ h("div", {
45
42
  className: "divide-y divide-[var(--oh-border)]",
46
- children: c.map((e) => {
47
- let t = j[e];
48
- return t.length === 0 ? null : /* @__PURE__ */ v(d, {
49
- title: x(b[e]),
43
+ children: o.map((e) => {
44
+ let t = D[e];
45
+ return t.length === 0 ? null : /* @__PURE__ */ h(l, {
46
+ title: v(_[e]),
50
47
  count: t.length,
51
- children: t.map((t) => /* @__PURE__ */ v(h, {
48
+ children: t.map((t) => /* @__PURE__ */ h(f, {
52
49
  skill: t,
53
- isExpanded: w[t.name] || !1,
54
- onToggle: M
50
+ isExpanded: b[t.name] || !1,
51
+ onToggle: O
55
52
  }, `${e}-${t.name}`))
56
53
  }, e);
57
54
  })
58
- }) : /* @__PURE__ */ v(f, {})
55
+ })
59
56
  })]
60
57
  })
61
58
  });
62
59
  }
63
60
  //#endregion
64
- export { x as SkillsModal };
61
+ export { v as SkillsModal };
65
62
 
66
63
  //# sourceMappingURL=skills-modal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills-modal.js","names":[],"sources":["../../../../src/components/features/conversation-panel/skills-modal.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalBody } from \"#/components/shared/modals/modal-body\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { getAgentServerWorkingDir } from \"#/api/agent-server-config\";\nimport { useConversationSkills } from \"#/hooks/query/use-conversation-skills\";\nimport { AgentState } from \"#/types/agent-state\";\nimport {\n groupSkillsByScope,\n SKILL_SCOPE_ORDER,\n type SkillScope,\n} from \"#/utils/skill-scope\";\nimport { SkillsModalHeader } from \"./skills-modal-header\";\nimport { SkillsModalSection } from \"./skills-modal-section\";\nimport { SkillsRuntimeWaitingState } from \"./skills-runtime-waiting-state\";\nimport { SkillsLoadingState } from \"./skills-loading-state\";\nimport { SkillsEmptyState } from \"./skills-empty-state\";\nimport { SkillItem } from \"./skill-item\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\n\ninterface SkillsModalProps {\n onClose: () => void;\n}\n\nconst SECTION_TITLE_KEY: Record<SkillScope, I18nKey> = {\n project: I18nKey.SKILLS_MODAL$SECTION_PROJECT,\n personal: I18nKey.SKILLS_MODAL$SECTION_USER,\n public: I18nKey.SKILLS_MODAL$SECTION_PUBLIC,\n};\n\nexport function SkillsModal({ onClose }: SkillsModalProps) {\n const { t } = useTranslation(\"openhands\");\n const { curAgentState } = useAgentState();\n const projectDir = getAgentServerWorkingDir();\n const [expandedAgents, setExpandedAgents] = useState<Record<string, boolean>>(\n {},\n );\n // Scope the catalog to this conversation's attached workspace so the listed\n // skills match the project skills actually loaded into the conversation.\n const {\n data: skills,\n isLoading,\n isError,\n refetch,\n isRefetching,\n } = useConversationSkills();\n\n const groupedSkills = useMemo(\n () => (skills ? groupSkillsByScope(skills, projectDir) : null),\n [skills, projectDir],\n );\n\n const toggleAgent = (agentName: string) => {\n setExpandedAgents((prev) => ({\n ...prev,\n [agentName]: !prev[agentName],\n }));\n };\n\n const isAgentReady = ![AgentState.LOADING, AgentState.INIT].includes(\n curAgentState,\n );\n\n return (\n <ModalBackdrop onClose={onClose}>\n <ModalBody\n width=\"lg\"\n className=\"relative max-h-[80vh] flex flex-col items-start border border-[var(--oh-border)]\"\n testID=\"skills-modal\"\n >\n <SkillsModalHeader\n isLoading={isLoading}\n isRefetching={isRefetching}\n onRefresh={refetch}\n onClose={onClose}\n />\n\n <div className=\"w-full h-[60vh] overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always\">\n {!isAgentReady ? (\n <SkillsRuntimeWaitingState />\n ) : isLoading ? (\n <SkillsLoadingState />\n ) : isError || !skills || skills.length === 0 ? (\n <SkillsEmptyState isError={isError} />\n ) : (\n groupedSkills && (\n <div className=\"divide-y divide-[var(--oh-border)]\">\n {SKILL_SCOPE_ORDER.map((scope) => {\n const scopedSkills = groupedSkills[scope];\n if (scopedSkills.length === 0) {\n return null;\n }\n\n return (\n <SkillsModalSection\n key={scope}\n title={t(SECTION_TITLE_KEY[scope])}\n count={scopedSkills.length}\n >\n {scopedSkills.map((skill) => {\n const isExpanded = expandedAgents[skill.name] || false;\n\n return (\n <SkillItem\n key={`${scope}-${skill.name}`}\n skill={skill}\n isExpanded={isExpanded}\n onToggle={toggleAgent}\n />\n );\n })}\n </SkillsModalSection>\n );\n })}\n </div>\n )\n )}\n </div>\n </ModalBody>\n </ModalBackdrop>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAyBA,IAAM,IAAiD;CACrD,SAAS,EAAQ;CACjB,UAAU,EAAQ;CAClB,QAAQ,EAAQ;CACjB;AAED,SAAgB,EAAY,EAAE,cAA6B;CACzD,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,qBAAkB,GAAe,EACnC,IAAa,GAA0B,EACvC,CAAC,GAAgB,KAAqB,EAC1C,EAAE,CACH,EAGK,EACJ,MAAM,GACN,cACA,YACA,YACA,oBACE,GAAuB,EAErB,IAAgB,QACb,IAAS,EAAmB,GAAQ,EAAW,GAAG,MACzD,CAAC,GAAQ,EAAW,CACrB,EAEK,KAAe,MAAsB;AACzC,KAAmB,OAAU;GAC3B,GAAG;IACF,IAAY,CAAC,EAAK;GACpB,EAAE;IAGC,IAAe,CAAC,CAAC,EAAW,SAAS,EAAW,KAAK,CAAC,SAC1D,EACD;AAED,QACE,kBAAC,GAAD;EAAwB;YACtB,kBAAC,GAAD;GACE,OAAM;GACN,WAAU;GACV,QAAO;aAHT,CAKE,kBAAC,GAAD;IACa;IACG;IACd,WAAW;IACF;IACT,CAAA,EAEF,kBAAC,OAAD;IAAK,WAAU;cACX,IAEE,IACF,kBAAC,GAAD,EAAsB,CAAA,GACpB,KAAW,CAAC,KAAU,EAAO,WAAW,IAC1C,kBAAC,GAAD,EAA2B,YAAW,CAAA,GAEtC,KACE,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAkB,KAAK,MAAU;MAChC,IAAM,IAAe,EAAc;AAKnC,aAJI,EAAa,WAAW,IACnB,OAIP,kBAAC,GAAD;OAEE,OAAO,EAAE,EAAkB,GAAO;OAClC,OAAO,EAAa;iBAEnB,EAAa,KAAK,MAIf,kBAAC,GAAD;QAES;QACK,YANG,EAAe,EAAM,SAAS;QAO7C,UAAU;QACV,EAJK,GAAG,EAAM,GAAG,EAAM,OAIvB,CAEJ;OACiB,EAhBd,EAgBc;OAEvB;KACE,CAAA,GAnCR,kBAAC,GAAD,EAA6B,CAAA;IAsC3B,CAAA,CACI;;EACE,CAAA"}
1
+ {"version":3,"file":"skills-modal.js","names":[],"sources":["../../../../src/components/features/conversation-panel/skills-modal.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ModalBackdrop } from \"#/components/shared/modals/modal-backdrop\";\nimport { ModalBody } from \"#/components/shared/modals/modal-body\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { getAgentServerWorkingDir } from \"#/api/agent-server-config\";\nimport { useConversationSkills } from \"#/hooks/query/use-conversation-skills\";\nimport {\n groupSkillsByScope,\n SKILL_SCOPE_ORDER,\n type SkillScope,\n} from \"#/utils/skill-scope\";\nimport { SkillsModalHeader } from \"./skills-modal-header\";\nimport { SkillsModalSection } from \"./skills-modal-section\";\nimport { SkillsLoadingState } from \"./skills-loading-state\";\nimport { SkillsEmptyState } from \"./skills-empty-state\";\nimport { SkillItem } from \"./skill-item\";\n\ninterface SkillsModalProps {\n onClose: () => void;\n}\n\nconst SECTION_TITLE_KEY: Record<SkillScope, I18nKey> = {\n project: I18nKey.SKILLS_MODAL$SECTION_PROJECT,\n personal: I18nKey.SKILLS_MODAL$SECTION_USER,\n public: I18nKey.SKILLS_MODAL$SECTION_PUBLIC,\n};\n\nexport function SkillsModal({ onClose }: SkillsModalProps) {\n const { t } = useTranslation(\"openhands\");\n const projectDir = getAgentServerWorkingDir();\n const [expandedAgents, setExpandedAgents] = useState<Record<string, boolean>>(\n {},\n );\n // Scope the catalog to this conversation's attached workspace so the listed\n // skills match the project skills actually loaded into the conversation.\n const {\n data: skills,\n isLoading,\n isError,\n refetch,\n isRefetching,\n } = useConversationSkills();\n\n const groupedSkills = useMemo(\n () => (skills ? groupSkillsByScope(skills, projectDir) : null),\n [skills, projectDir],\n );\n\n const toggleAgent = (agentName: string) => {\n setExpandedAgents((prev) => ({\n ...prev,\n [agentName]: !prev[agentName],\n }));\n };\n\n return (\n <ModalBackdrop onClose={onClose}>\n <ModalBody\n width=\"lg\"\n className=\"relative max-h-[80vh] flex flex-col items-start border border-[var(--oh-border)]\"\n testID=\"skills-modal\"\n >\n <SkillsModalHeader\n isLoading={isLoading}\n isRefetching={isRefetching}\n onRefresh={refetch}\n onClose={onClose}\n />\n\n <div className=\"w-full h-[60vh] overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always\">\n {isLoading ? (\n <SkillsLoadingState />\n ) : isError || !skills || skills.length === 0 ? (\n <SkillsEmptyState isError={isError} />\n ) : (\n groupedSkills && (\n <div className=\"divide-y divide-[var(--oh-border)]\">\n {SKILL_SCOPE_ORDER.map((scope) => {\n const scopedSkills = groupedSkills[scope];\n if (scopedSkills.length === 0) {\n return null;\n }\n\n return (\n <SkillsModalSection\n key={scope}\n title={t(SECTION_TITLE_KEY[scope])}\n count={scopedSkills.length}\n >\n {scopedSkills.map((skill) => {\n const isExpanded = expandedAgents[skill.name] || false;\n\n return (\n <SkillItem\n key={`${scope}-${skill.name}`}\n skill={skill}\n isExpanded={isExpanded}\n onToggle={toggleAgent}\n />\n );\n })}\n </SkillsModalSection>\n );\n })}\n </div>\n )\n )}\n </div>\n </ModalBody>\n </ModalBackdrop>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,IAAM,IAAiD;CACrD,SAAS,EAAQ;CACjB,UAAU,EAAQ;CAClB,QAAQ,EAAQ;CACjB;AAED,SAAgB,EAAY,EAAE,cAA6B;CACzD,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,IAAa,GAA0B,EACvC,CAAC,GAAgB,KAAqB,EAC1C,EAAE,CACH,EAGK,EACJ,MAAM,GACN,cACA,YACA,YACA,oBACE,GAAuB,EAErB,IAAgB,QACb,IAAS,EAAmB,GAAQ,EAAW,GAAG,MACzD,CAAC,GAAQ,EAAW,CACrB,EAEK,KAAe,MAAsB;AACzC,KAAmB,OAAU;GAC3B,GAAG;IACF,IAAY,CAAC,EAAK;GACpB,EAAE;;AAGL,QACE,kBAAC,GAAD;EAAwB;YACtB,kBAAC,GAAD;GACE,OAAM;GACN,WAAU;GACV,QAAO;aAHT,CAKE,kBAAC,GAAD;IACa;IACG;IACd,WAAW;IACF;IACT,CAAA,EAEF,kBAAC,OAAD;IAAK,WAAU;cACZ,IACC,kBAAC,GAAD,EAAsB,CAAA,GACpB,KAAW,CAAC,KAAU,EAAO,WAAW,IAC1C,kBAAC,GAAD,EAA2B,YAAW,CAAA,GAEtC,KACE,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAkB,KAAK,MAAU;MAChC,IAAM,IAAe,EAAc;AAKnC,aAJI,EAAa,WAAW,IACnB,OAIP,kBAAC,GAAD;OAEE,OAAO,EAAE,EAAkB,GAAO;OAClC,OAAO,EAAa;iBAEnB,EAAa,KAAK,MAIf,kBAAC,GAAD;QAES;QACK,YANG,EAAe,EAAM,SAAS;QAO7C,UAAU;QACV,EAJK,GAAG,EAAM,GAAG,EAAM,OAIvB,CAEJ;OACiB,EAhBd,EAgBc;OAEvB;KACE,CAAA;IAGN,CAAA,CACI;;EACE,CAAA"}
@@ -1 +1 @@
1
- const e=require(`../../../../_virtual/_rolldown/runtime.cjs`);require(`../../../../utils/utils.cjs`),require(`../../../../utils/dropdown-classes.cjs`),require(`../../../../icons/u-check-circle.cjs`),require(`../../../../icons/u-edit.cjs`),require(`../../../../icons/u-delete.cjs`),require(`../../conversation/conversation-name-context-menu-icon-text.cjs`),require(`react`),require(`react/jsx-runtime`);let t=require(`react-dom`);t=e.__toESM(t,1);
1
+ const e=require(`../../../../_virtual/_rolldown/runtime.cjs`);require(`../../../../utils/utils.cjs`),require(`../../../shared/buttons/styled-tooltip.cjs`),require(`../../../../utils/dropdown-classes.cjs`),require(`../../../../icons/u-check-circle.cjs`),require(`../../../../icons/u-edit.cjs`),require(`../../../../icons/u-delete.cjs`),require(`../../conversation/conversation-name-context-menu-icon-text.cjs`),require(`react`),require(`react/jsx-runtime`);let t=require(`react-dom`);t=e.__toESM(t,1);
@@ -1,4 +1,5 @@
1
1
  import "../../../../utils/utils.js";
2
+ import "../../../shared/buttons/styled-tooltip.js";
2
3
  import "../../../../utils/dropdown-classes.js";
3
4
  import "../../../../icons/u-check-circle.js";
4
5
  import "../../../../icons/u-edit.js";
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../../constants/acp-providers.cjs`),i=require(`../../../hooks/query/use-settings.cjs`),a=require(`../../shared/buttons/styled-tooltip.cjs`),o=require(`../../shared/navigation-link.cjs`),s=require(`../../../icons/skills.cjs`),c=require(`../../../hooks/use-breakpoint.cjs`),l=require(`../sidebar/sidebar-layout.cjs`),u=require(`../settings/backend-synced-settings-badge.cjs`),d=require(`../../../icons/server-process.cjs`),f=require(`../../../stores/sidebar-store.cjs`);let p=require(`react/jsx-runtime`);var m=[{to:`/skills`,label:`Skills`,icon:(0,p.jsx)(s.default,{width:16,height:16,"aria-hidden":`true`}),end:!0},{to:`/mcp`,label:`MCP Servers`,icon:(0,p.jsx)(d.default,{width:16,height:16}),end:!0,disabledByAcp:!0},{to:`/plugins`,label:`Plugins`,icon:(0,p.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,width:16,height:16,"aria-hidden":`true`,children:[(0,p.jsx)(`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`}),(0,p.jsx)(`path`,{d:`m3.3 7 8.7 5 8.7-5`}),(0,p.jsx)(`path`,{d:`M12 22V12`})]}),end:!0,comingSoon:!0}];function h(){let{t:s}=e.useTranslation(`openhands`),{data:d}=i.useSettings(),h=f.useSidebarStore(e=>e.collapsed),g=c.useBreakpoint(1023),_=c.useBreakpoint(767),v=!h&&g&&!_,y=d?.agent_settings?.agent_kind===`acp`,b=typeof d?.agent_settings?.acp_server==`string`?d.agent_settings.acp_server:void 0,x=y?r.ACP_PROVIDERS.find(({key:e})=>e===b)?.display_name??`ACP Agent`:void 0;return v?null:(0,p.jsxs)(`aside`,{"data-testid":`extensions-navbar-desktop`,className:`hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2 md:sticky md:top-8 md:self-start`,children:[(0,p.jsx)(`span`,{className:`px-2 text-sm font-normal text-white`,children:s(t.I18nKey.NAV$CUSTOMIZE)}),(0,p.jsx)(`div`,{className:`flex flex-col gap-0.5 pt-0.5`,children:m.map(e=>{let r=!!(y&&e.disabledByAcp),i=(0,p.jsx)(`span`,{className:`shrink-0 flex items-center justify-center`,children:e.icon}),c=(0,p.jsx)(`span`,{className:`truncate`,children:e.label}),u=e.comingSoon&&(0,p.jsx)(`span`,{className:`ml-auto shrink-0 rounded-full border border-white/20 bg-white/5 px-1.5 py-0.5 text-[10px] font-medium text-[var(--oh-text-dim)]`,children:s(t.I18nKey.NAV$COMING_SOON)});return r?(0,p.jsx)(a.StyledTooltip,{content:s(t.I18nKey.SETTINGS$AGENT_DISABLED_TOOLTIP,{agentName:x}),placement:`right`,children:(0,p.jsxs)(`span`,{"aria-disabled":`true`,"data-testid":`sidebar-extensions-${e.to}`,className:n.cn(l.sidebarNavRowClassName(),`truncate text-[var(--oh-muted)] opacity-50 cursor-not-allowed`),children:[i,c,u]})},e.to):(0,p.jsxs)(o.NavigationLink,{to:e.to,end:e.end,"data-testid":`sidebar-extensions-${e.to}`,className:({isActive:e})=>n.cn(l.sidebarNavRowClassName(),`truncate`,e?l.SIDEBAR_ROW_INTERACTIVE_CLASS.active:l.SIDEBAR_ROW_INTERACTIVE_CLASS.idle),children:[i,c,u]},e.to)})}),(0,p.jsx)(`div`,{className:`px-2 pt-3`,children:(0,p.jsx)(u.BackendSyncedSettingsBadge,{})})]})}exports.ExtensionsNavigation=h;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../../../i18n/declaration.cjs`),n=require(`../../../utils/utils.cjs`),r=require(`../../shared/navigation-link.cjs`),i=require(`../../../icons/skills.cjs`),a=require(`../../../hooks/use-breakpoint.cjs`),o=require(`../sidebar/sidebar-layout.cjs`),s=require(`../settings/backend-synced-settings-badge.cjs`),c=require(`../../../icons/server-process.cjs`),l=require(`../../../stores/sidebar-store.cjs`);let u=require(`react/jsx-runtime`);var d=[{to:`/skills`,label:`Skills`,icon:(0,u.jsx)(i.default,{width:16,height:16,"aria-hidden":`true`}),end:!0},{to:`/mcp`,label:`MCP Servers`,icon:(0,u.jsx)(c.default,{width:16,height:16}),end:!0},{to:`/plugins`,label:`Plugins`,icon:(0,u.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,width:16,height:16,"aria-hidden":`true`,children:[(0,u.jsx)(`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`}),(0,u.jsx)(`path`,{d:`m3.3 7 8.7 5 8.7-5`}),(0,u.jsx)(`path`,{d:`M12 22V12`})]}),end:!0,comingSoon:!0}];function f(){let{t:i}=e.useTranslation(`openhands`),c=l.useSidebarStore(e=>e.collapsed),f=a.useBreakpoint(1023),p=a.useBreakpoint(767);return!c&&f&&!p?null:(0,u.jsxs)(`aside`,{"data-testid":`extensions-navbar-desktop`,className:`hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2 md:sticky md:top-8 md:self-start`,children:[(0,u.jsx)(`span`,{className:`px-2 text-sm font-normal text-white`,children:i(t.I18nKey.NAV$CUSTOMIZE)}),(0,u.jsx)(`div`,{className:`flex flex-col gap-0.5 pt-0.5`,children:d.map(e=>{let a=(0,u.jsx)(`span`,{className:`shrink-0 flex items-center justify-center`,children:e.icon}),s=(0,u.jsx)(`span`,{className:`truncate`,children:e.label}),c=e.comingSoon&&(0,u.jsx)(`span`,{className:`ml-auto shrink-0 rounded-full border border-white/20 bg-white/5 px-1.5 py-0.5 text-[10px] font-medium text-[var(--oh-text-dim)]`,children:i(t.I18nKey.NAV$COMING_SOON)});return(0,u.jsxs)(r.NavigationLink,{to:e.to,end:e.end,"data-testid":`sidebar-extensions-${e.to}`,className:({isActive:e})=>n.cn(o.sidebarNavRowClassName(),`truncate`,e?o.SIDEBAR_ROW_INTERACTIVE_CLASS.active:o.SIDEBAR_ROW_INTERACTIVE_CLASS.idle),children:[a,s,c]},e.to)})}),(0,u.jsx)(`div`,{className:`px-2 pt-3`,children:(0,u.jsx)(s.BackendSyncedSettingsBadge,{})})]})}exports.ExtensionsNavigation=f;
2
2
  //# sourceMappingURL=extensions-navigation.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensions-navigation.cjs","names":[],"sources":["../../../../src/components/features/skills/extensions-navigation.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport { ACP_PROVIDERS } from \"#/constants/acp-providers\";\nimport { cn } from \"#/utils/utils\";\nimport SkillsIcon from \"#/icons/skills.svg?react\";\nimport ServerProcessIcon from \"#/icons/server-process.svg?react\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport {\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useBreakpoint } from \"#/hooks/use-breakpoint\";\n\ninterface ExtensionNavItem {\n to: string;\n label: string;\n icon: React.ReactElement;\n end?: boolean;\n comingSoon?: boolean;\n /**\n * When true, this item greys out (and the /route's ``clientLoader``\n * bounces to ``/settings/agent``) while an ACP agent is active.\n * The ACP sub-agent manages its own MCP servers; the SDK rejects\n * ``mcp_config`` on ``ACPAgent`` init outright, so the OpenHands-\n * side editor would silently no-op against the running subprocess.\n */\n disabledByAcp?: boolean;\n}\n\nexport const EXTENSIONS_NAV_ITEMS: ExtensionNavItem[] = [\n {\n to: \"/skills\",\n label: \"Skills\",\n icon: <SkillsIcon width={16} height={16} aria-hidden=\"true\" />,\n end: true,\n },\n {\n to: \"/mcp\",\n label: \"MCP Servers\",\n icon: <ServerProcessIcon width={16} height={16} />,\n end: true,\n disabledByAcp: true,\n },\n {\n to: \"/plugins\",\n label: \"Plugins\",\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n width={16}\n height={16}\n aria-hidden=\"true\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\" />\n <path d=\"m3.3 7 8.7 5 8.7-5\" />\n <path d=\"M12 22V12\" />\n </svg>\n ),\n end: true,\n comingSoon: true,\n },\n];\n\nexport function ExtensionsNavigation() {\n const { t } = useTranslation(\"openhands\");\n const { data: settings } = useSettings();\n const sidebarCollapsed = useSidebarStore((state) => state.collapsed);\n // At iPad portrait widths (md to <lg) an expanded primary Sidebar (300px)\n // plus this nav (260px) leaves the main content unreadable. Hide ourselves\n // until the user collapses the Sidebar or the viewport reaches `lg`.\n const belowLg = useBreakpoint(1023);\n const belowMd = useBreakpoint(767);\n const hideForExpandedSidebar = !sidebarCollapsed && belowLg && !belowMd;\n const isAcpAgent = settings?.agent_settings?.agent_kind === \"acp\";\n const acpServerKey =\n typeof settings?.agent_settings?.acp_server === \"string\"\n ? settings.agent_settings.acp_server\n : undefined;\n const acpServerName = isAcpAgent\n ? (ACP_PROVIDERS.find(({ key }) => key === acpServerKey)?.display_name ??\n \"ACP Agent\")\n : undefined;\n\n if (hideForExpandedSidebar) return null;\n\n return (\n <aside\n data-testid=\"extensions-navbar-desktop\"\n className=\"hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2 md:sticky md:top-8 md:self-start\"\n >\n <span className=\"px-2 text-sm font-normal text-white\">\n {t(I18nKey.NAV$CUSTOMIZE)}\n </span>\n <div className=\"flex flex-col gap-0.5 pt-0.5\">\n {EXTENSIONS_NAV_ITEMS.map((item) => {\n const disabled = !!(isAcpAgent && item.disabledByAcp);\n const baseRow = (\n <span className=\"shrink-0 flex items-center justify-center\">\n {item.icon}\n </span>\n );\n const label = <span className=\"truncate\">{item.label}</span>;\n const comingSoonBadge = item.comingSoon && (\n <span className=\"ml-auto shrink-0 rounded-full border border-white/20 bg-white/5 px-1.5 py-0.5 text-[10px] font-medium text-[var(--oh-text-dim)]\">\n {t(I18nKey.NAV$COMING_SOON)}\n </span>\n );\n\n if (disabled) {\n // Render a non-clickable surrogate so the URL and a11y tree\n // both communicate \"you can't go here right now,\" then wrap\n // in StyledTooltip for the why. Mirrors the SettingsNavLink\n // disabled rendering — same flag (``disabledByAcp``), same\n // explanatory tooltip (\"Disabled while {agentName} is the\n // active agent\"), same greyed styles.\n return (\n <StyledTooltip\n key={item.to}\n content={t(I18nKey.SETTINGS$AGENT_DISABLED_TOOLTIP, {\n agentName: acpServerName,\n })}\n placement=\"right\"\n >\n <span\n aria-disabled=\"true\"\n data-testid={`sidebar-extensions-${item.to}`}\n className={cn(\n sidebarNavRowClassName(),\n \"truncate text-[var(--oh-muted)] opacity-50 cursor-not-allowed\",\n )}\n >\n {baseRow}\n {label}\n {comingSoonBadge}\n </span>\n </StyledTooltip>\n );\n }\n\n return (\n <NavigationLink\n key={item.to}\n to={item.to}\n end={item.end}\n data-testid={`sidebar-extensions-${item.to}`}\n className={({ isActive }) =>\n cn(\n sidebarNavRowClassName(),\n \"truncate\",\n isActive\n ? SIDEBAR_ROW_INTERACTIVE_CLASS.active\n : SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )\n }\n >\n {baseRow}\n {label}\n {comingSoonBadge}\n </NavigationLink>\n );\n })}\n </div>\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </aside>\n );\n}\n"],"mappings":"2tBAiCA,IAAa,EAA2C,CACtD,CACE,GAAI,UACJ,MAAO,SACP,MAAM,EAAA,EAAA,KAAC,EAAA,QAAD,CAAY,MAAO,GAAI,OAAQ,GAAI,cAAY,OAAS,CAAA,CAC9D,IAAK,GACN,CACD,CACE,GAAI,OACJ,MAAO,cACP,MAAM,EAAA,EAAA,KAAC,EAAA,QAAD,CAAmB,MAAO,GAAI,OAAQ,GAAM,CAAA,CAClD,IAAK,GACL,cAAe,GAChB,CACD,CACE,GAAI,WACJ,MAAO,UACP,MACE,EAAA,EAAA,MAAC,MAAD,CACE,MAAM,6BACN,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,MAAO,GACP,OAAQ,GACR,cAAY,gBAVd,EAYE,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,yHAA2H,CAAA,EACnI,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,qBAAuB,CAAA,EAC/B,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,YAAc,CAAA,CAClB,GAER,IAAK,GACL,WAAY,GACb,CACF,CAED,SAAgB,GAAuB,CACrC,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,KAAM,GAAa,EAAA,aAAa,CAClC,EAAmB,EAAA,gBAAiB,GAAU,EAAM,UAAU,CAI9D,EAAU,EAAA,cAAc,KAAK,CAC7B,EAAU,EAAA,cAAc,IAAI,CAC5B,EAAyB,CAAC,GAAoB,GAAW,CAAC,EAC1D,EAAa,GAAU,gBAAgB,aAAe,MACtD,EACJ,OAAO,GAAU,gBAAgB,YAAe,SAC5C,EAAS,eAAe,WACxB,IAAA,GACA,EAAgB,EACjB,EAAA,cAAc,MAAM,CAAE,SAAU,IAAQ,EAAa,EAAE,cACxD,YACA,IAAA,GAIJ,OAFI,EAA+B,MAGjC,EAAA,EAAA,MAAC,QAAD,CACE,cAAY,4BACZ,UAAU,yGAFZ,EAIE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,+CACb,EAAE,EAAA,QAAQ,cAAc,CACpB,CAAA,EACP,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,wCACZ,EAAqB,IAAK,GAAS,CAClC,IAAM,EAAW,CAAC,EAAE,GAAc,EAAK,eACjC,GACJ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,qDACb,EAAK,KACD,CAAA,CAEH,GAAQ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,oBAAY,EAAK,MAAa,CAAA,CACtD,EAAkB,EAAK,aAC3B,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,2IACb,EAAE,EAAA,QAAQ,gBAAgB,CACtB,CAAA,CAkCT,OA/BI,GAQA,EAAA,EAAA,KAAC,EAAA,cAAD,CAEE,QAAS,EAAE,EAAA,QAAQ,gCAAiC,CAClD,UAAW,EACZ,CAAC,CACF,UAAU,kBAEV,EAAA,EAAA,MAAC,OAAD,CACE,gBAAc,OACd,cAAa,sBAAsB,EAAK,KACxC,UAAW,EAAA,GACT,EAAA,wBAAwB,CACxB,gEACD,UANH,CAQG,EACA,EACA,EACI,GACO,CAlBT,EAAK,GAkBI,EAKlB,EAAA,EAAA,MAAC,EAAA,eAAD,CAEE,GAAI,EAAK,GACT,IAAK,EAAK,IACV,cAAa,sBAAsB,EAAK,KACxC,WAAY,CAAE,cACZ,EAAA,GACE,EAAA,wBAAwB,CACxB,WACA,EACI,EAAA,8BAA8B,OAC9B,EAAA,8BAA8B,KACnC,UAZL,CAeG,EACA,EACA,EACc,EAjBV,EAAK,GAiBK,EAEnB,CACE,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,2BAAD,EAA8B,CAAA,CAC1B,CAAA,CACA"}
1
+ {"version":3,"file":"extensions-navigation.cjs","names":[],"sources":["../../../../src/components/features/skills/extensions-navigation.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { cn } from \"#/utils/utils\";\nimport SkillsIcon from \"#/icons/skills.svg?react\";\nimport ServerProcessIcon from \"#/icons/server-process.svg?react\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport {\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useBreakpoint } from \"#/hooks/use-breakpoint\";\n\ninterface ExtensionNavItem {\n to: string;\n label: string;\n icon: React.ReactElement;\n end?: boolean;\n comingSoon?: boolean;\n}\n\nexport const EXTENSIONS_NAV_ITEMS: ExtensionNavItem[] = [\n {\n to: \"/skills\",\n label: \"Skills\",\n icon: <SkillsIcon width={16} height={16} aria-hidden=\"true\" />,\n end: true,\n },\n {\n to: \"/mcp\",\n label: \"MCP Servers\",\n icon: <ServerProcessIcon width={16} height={16} />,\n end: true,\n },\n {\n to: \"/plugins\",\n label: \"Plugins\",\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n width={16}\n height={16}\n aria-hidden=\"true\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\" />\n <path d=\"m3.3 7 8.7 5 8.7-5\" />\n <path d=\"M12 22V12\" />\n </svg>\n ),\n end: true,\n comingSoon: true,\n },\n];\n\nexport function ExtensionsNavigation() {\n const { t } = useTranslation(\"openhands\");\n const sidebarCollapsed = useSidebarStore((state) => state.collapsed);\n // At iPad portrait widths (md to <lg) an expanded primary Sidebar (300px)\n // plus this nav (260px) leaves the main content unreadable. Hide ourselves\n // until the user collapses the Sidebar or the viewport reaches `lg`.\n const belowLg = useBreakpoint(1023);\n const belowMd = useBreakpoint(767);\n const hideForExpandedSidebar = !sidebarCollapsed && belowLg && !belowMd;\n\n if (hideForExpandedSidebar) return null;\n\n return (\n <aside\n data-testid=\"extensions-navbar-desktop\"\n className=\"hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2 md:sticky md:top-8 md:self-start\"\n >\n <span className=\"px-2 text-sm font-normal text-white\">\n {t(I18nKey.NAV$CUSTOMIZE)}\n </span>\n <div className=\"flex flex-col gap-0.5 pt-0.5\">\n {EXTENSIONS_NAV_ITEMS.map((item) => {\n const baseRow = (\n <span className=\"shrink-0 flex items-center justify-center\">\n {item.icon}\n </span>\n );\n const label = <span className=\"truncate\">{item.label}</span>;\n const comingSoonBadge = item.comingSoon && (\n <span className=\"ml-auto shrink-0 rounded-full border border-white/20 bg-white/5 px-1.5 py-0.5 text-[10px] font-medium text-[var(--oh-text-dim)]\">\n {t(I18nKey.NAV$COMING_SOON)}\n </span>\n );\n\n return (\n <NavigationLink\n key={item.to}\n to={item.to}\n end={item.end}\n data-testid={`sidebar-extensions-${item.to}`}\n className={({ isActive }) =>\n cn(\n sidebarNavRowClassName(),\n \"truncate\",\n isActive\n ? SIDEBAR_ROW_INTERACTIVE_CLASS.active\n : SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )\n }\n >\n {baseRow}\n {label}\n {comingSoonBadge}\n </NavigationLink>\n );\n })}\n </div>\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </aside>\n );\n}\n"],"mappings":"ikBAsBA,IAAa,EAA2C,CACtD,CACE,GAAI,UACJ,MAAO,SACP,MAAM,EAAA,EAAA,KAAC,EAAA,QAAD,CAAY,MAAO,GAAI,OAAQ,GAAI,cAAY,OAAS,CAAA,CAC9D,IAAK,GACN,CACD,CACE,GAAI,OACJ,MAAO,cACP,MAAM,EAAA,EAAA,KAAC,EAAA,QAAD,CAAmB,MAAO,GAAI,OAAQ,GAAM,CAAA,CAClD,IAAK,GACN,CACD,CACE,GAAI,WACJ,MAAO,UACP,MACE,EAAA,EAAA,MAAC,MAAD,CACE,MAAM,6BACN,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,MAAO,GACP,OAAQ,GACR,cAAY,gBAVd,EAYE,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,yHAA2H,CAAA,EACnI,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,qBAAuB,CAAA,EAC/B,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,YAAc,CAAA,CAClB,GAER,IAAK,GACL,WAAY,GACb,CACF,CAED,SAAgB,GAAuB,CACrC,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,EAAmB,EAAA,gBAAiB,GAAU,EAAM,UAAU,CAI9D,EAAU,EAAA,cAAc,KAAK,CAC7B,EAAU,EAAA,cAAc,IAAI,CAKlC,MAJ+B,CAAC,GAAoB,GAAW,CAAC,EAE7B,MAGjC,EAAA,EAAA,MAAC,QAAD,CACE,cAAY,4BACZ,UAAU,yGAFZ,EAIE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,+CACb,EAAE,EAAA,QAAQ,cAAc,CACpB,CAAA,EACP,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,wCACZ,EAAqB,IAAK,GAAS,CAClC,IAAM,GACJ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,qDACb,EAAK,KACD,CAAA,CAEH,GAAQ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,oBAAY,EAAK,MAAa,CAAA,CACtD,EAAkB,EAAK,aAC3B,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,2IACb,EAAE,EAAA,QAAQ,gBAAgB,CACtB,CAAA,CAGT,OACE,EAAA,EAAA,MAAC,EAAA,eAAD,CAEE,GAAI,EAAK,GACT,IAAK,EAAK,IACV,cAAa,sBAAsB,EAAK,KACxC,WAAY,CAAE,cACZ,EAAA,GACE,EAAA,wBAAwB,CACxB,WACA,EACI,EAAA,8BAA8B,OAC9B,EAAA,8BAA8B,KACnC,UAZL,CAeG,EACA,EACA,EACc,EAjBV,EAAK,GAiBK,EAEnB,CACE,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,2BAAD,EAA8B,CAAA,CAC1B,CAAA,CACA"}
@@ -4,14 +4,6 @@ interface ExtensionNavItem {
4
4
  icon: React.ReactElement;
5
5
  end?: boolean;
6
6
  comingSoon?: boolean;
7
- /**
8
- * When true, this item greys out (and the /route's ``clientLoader``
9
- * bounces to ``/settings/agent``) while an ACP agent is active.
10
- * The ACP sub-agent manages its own MCP servers; the SDK rejects
11
- * ``mcp_config`` on ``ACPAgent`` init outright, so the OpenHands-
12
- * side editor would silently no-op against the running subprocess.
13
- */
14
- disabledByAcp?: boolean;
15
7
  }
16
8
  export declare const EXTENSIONS_NAV_ITEMS: ExtensionNavItem[];
17
9
  export declare function ExtensionsNavigation(): import("react/jsx-runtime").JSX.Element | null;
@@ -1,23 +1,20 @@
1
1
  import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
2
  import { I18nKey as t } from "../../../i18n/declaration.js";
3
3
  import { cn as n } from "../../../utils/utils.js";
4
- import { ACP_PROVIDERS as r } from "../../../constants/acp-providers.js";
5
- import { useSettings as i } from "../../../hooks/query/use-settings.js";
6
- import { StyledTooltip as a } from "../../shared/buttons/styled-tooltip.js";
7
- import { NavigationLink as o } from "../../shared/navigation-link.js";
8
- import s from "../../../icons/skills.js";
9
- import { useBreakpoint as c } from "../../../hooks/use-breakpoint.js";
10
- import { SIDEBAR_ROW_INTERACTIVE_CLASS as l, sidebarNavRowClassName as u } from "../sidebar/sidebar-layout.js";
11
- import { BackendSyncedSettingsBadge as d } from "../settings/backend-synced-settings-badge.js";
12
- import f from "../../../icons/server-process.js";
13
- import { useSidebarStore as p } from "../../../stores/sidebar-store.js";
14
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
4
+ import { NavigationLink as r } from "../../shared/navigation-link.js";
5
+ import i from "../../../icons/skills.js";
6
+ import { useBreakpoint as a } from "../../../hooks/use-breakpoint.js";
7
+ import { SIDEBAR_ROW_INTERACTIVE_CLASS as o, sidebarNavRowClassName as s } from "../sidebar/sidebar-layout.js";
8
+ import { BackendSyncedSettingsBadge as c } from "../settings/backend-synced-settings-badge.js";
9
+ import l from "../../../icons/server-process.js";
10
+ import { useSidebarStore as u } from "../../../stores/sidebar-store.js";
11
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
15
12
  //#region src/components/features/skills/extensions-navigation.tsx
16
- var g = [
13
+ var p = [
17
14
  {
18
15
  to: "/skills",
19
16
  label: "Skills",
20
- icon: /* @__PURE__ */ m(s, {
17
+ icon: /* @__PURE__ */ d(i, {
21
18
  width: 16,
22
19
  height: 16,
23
20
  "aria-hidden": "true"
@@ -27,17 +24,16 @@ var g = [
27
24
  {
28
25
  to: "/mcp",
29
26
  label: "MCP Servers",
30
- icon: /* @__PURE__ */ m(f, {
27
+ icon: /* @__PURE__ */ d(l, {
31
28
  width: 16,
32
29
  height: 16
33
30
  }),
34
- end: !0,
35
- disabledByAcp: !0
31
+ end: !0
36
32
  },
37
33
  {
38
34
  to: "/plugins",
39
35
  label: "Plugins",
40
- icon: /* @__PURE__ */ h("svg", {
36
+ icon: /* @__PURE__ */ f("svg", {
41
37
  xmlns: "http://www.w3.org/2000/svg",
42
38
  viewBox: "0 0 24 24",
43
39
  fill: "none",
@@ -49,72 +45,59 @@ var g = [
49
45
  height: 16,
50
46
  "aria-hidden": "true",
51
47
  children: [
52
- /* @__PURE__ */ m("path", { d: "M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z" }),
53
- /* @__PURE__ */ m("path", { d: "m3.3 7 8.7 5 8.7-5" }),
54
- /* @__PURE__ */ m("path", { d: "M12 22V12" })
48
+ /* @__PURE__ */ d("path", { d: "M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z" }),
49
+ /* @__PURE__ */ d("path", { d: "m3.3 7 8.7 5 8.7-5" }),
50
+ /* @__PURE__ */ d("path", { d: "M12 22V12" })
55
51
  ]
56
52
  }),
57
53
  end: !0,
58
54
  comingSoon: !0
59
55
  }
60
56
  ];
61
- function _() {
62
- let { t: s } = e("openhands"), { data: f } = i(), _ = p((e) => e.collapsed), v = c(1023), y = c(767), b = !_ && v && !y, x = f?.agent_settings?.agent_kind === "acp", S = typeof f?.agent_settings?.acp_server == "string" ? f.agent_settings.acp_server : void 0, C = x ? r.find(({ key: e }) => e === S)?.display_name ?? "ACP Agent" : void 0;
63
- return b ? null : /* @__PURE__ */ h("aside", {
57
+ function m() {
58
+ let { t: i } = e("openhands"), l = u((e) => e.collapsed), m = a(1023), h = a(767);
59
+ return !l && m && !h ? null : /* @__PURE__ */ f("aside", {
64
60
  "data-testid": "extensions-navbar-desktop",
65
61
  className: "hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2 md:sticky md:top-8 md:self-start",
66
62
  children: [
67
- /* @__PURE__ */ m("span", {
63
+ /* @__PURE__ */ d("span", {
68
64
  className: "px-2 text-sm font-normal text-white",
69
- children: s(t.NAV$CUSTOMIZE)
65
+ children: i(t.NAV$CUSTOMIZE)
70
66
  }),
71
- /* @__PURE__ */ m("div", {
67
+ /* @__PURE__ */ d("div", {
72
68
  className: "flex flex-col gap-0.5 pt-0.5",
73
- children: g.map((e) => {
74
- let r = !!(x && e.disabledByAcp), i = /* @__PURE__ */ m("span", {
69
+ children: p.map((e) => {
70
+ let a = /* @__PURE__ */ d("span", {
75
71
  className: "shrink-0 flex items-center justify-center",
76
72
  children: e.icon
77
- }), c = /* @__PURE__ */ m("span", {
73
+ }), c = /* @__PURE__ */ d("span", {
78
74
  className: "truncate",
79
75
  children: e.label
80
- }), d = e.comingSoon && /* @__PURE__ */ m("span", {
76
+ }), l = e.comingSoon && /* @__PURE__ */ d("span", {
81
77
  className: "ml-auto shrink-0 rounded-full border border-white/20 bg-white/5 px-1.5 py-0.5 text-[10px] font-medium text-[var(--oh-text-dim)]",
82
- children: s(t.NAV$COMING_SOON)
78
+ children: i(t.NAV$COMING_SOON)
83
79
  });
84
- return r ? /* @__PURE__ */ m(a, {
85
- content: s(t.SETTINGS$AGENT_DISABLED_TOOLTIP, { agentName: C }),
86
- placement: "right",
87
- children: /* @__PURE__ */ h("span", {
88
- "aria-disabled": "true",
89
- "data-testid": `sidebar-extensions-${e.to}`,
90
- className: n(u(), "truncate text-[var(--oh-muted)] opacity-50 cursor-not-allowed"),
91
- children: [
92
- i,
93
- c,
94
- d
95
- ]
96
- })
97
- }, e.to) : /* @__PURE__ */ h(o, {
80
+ return /* @__PURE__ */ f(r, {
98
81
  to: e.to,
99
82
  end: e.end,
100
83
  "data-testid": `sidebar-extensions-${e.to}`,
101
- className: ({ isActive: e }) => n(u(), "truncate", e ? l.active : l.idle),
84
+ className: ({ isActive: e }) => n(s(), "truncate", e ? o.active : o.idle),
102
85
  children: [
103
- i,
86
+ a,
104
87
  c,
105
- d
88
+ l
106
89
  ]
107
90
  }, e.to);
108
91
  })
109
92
  }),
110
- /* @__PURE__ */ m("div", {
93
+ /* @__PURE__ */ d("div", {
111
94
  className: "px-2 pt-3",
112
- children: /* @__PURE__ */ m(d, {})
95
+ children: /* @__PURE__ */ d(c, {})
113
96
  })
114
97
  ]
115
98
  });
116
99
  }
117
100
  //#endregion
118
- export { _ as ExtensionsNavigation };
101
+ export { m as ExtensionsNavigation };
119
102
 
120
103
  //# sourceMappingURL=extensions-navigation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensions-navigation.js","names":[],"sources":["../../../../src/components/features/skills/extensions-navigation.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { StyledTooltip } from \"#/components/shared/buttons/styled-tooltip\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport { ACP_PROVIDERS } from \"#/constants/acp-providers\";\nimport { cn } from \"#/utils/utils\";\nimport SkillsIcon from \"#/icons/skills.svg?react\";\nimport ServerProcessIcon from \"#/icons/server-process.svg?react\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport {\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useBreakpoint } from \"#/hooks/use-breakpoint\";\n\ninterface ExtensionNavItem {\n to: string;\n label: string;\n icon: React.ReactElement;\n end?: boolean;\n comingSoon?: boolean;\n /**\n * When true, this item greys out (and the /route's ``clientLoader``\n * bounces to ``/settings/agent``) while an ACP agent is active.\n * The ACP sub-agent manages its own MCP servers; the SDK rejects\n * ``mcp_config`` on ``ACPAgent`` init outright, so the OpenHands-\n * side editor would silently no-op against the running subprocess.\n */\n disabledByAcp?: boolean;\n}\n\nexport const EXTENSIONS_NAV_ITEMS: ExtensionNavItem[] = [\n {\n to: \"/skills\",\n label: \"Skills\",\n icon: <SkillsIcon width={16} height={16} aria-hidden=\"true\" />,\n end: true,\n },\n {\n to: \"/mcp\",\n label: \"MCP Servers\",\n icon: <ServerProcessIcon width={16} height={16} />,\n end: true,\n disabledByAcp: true,\n },\n {\n to: \"/plugins\",\n label: \"Plugins\",\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n width={16}\n height={16}\n aria-hidden=\"true\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\" />\n <path d=\"m3.3 7 8.7 5 8.7-5\" />\n <path d=\"M12 22V12\" />\n </svg>\n ),\n end: true,\n comingSoon: true,\n },\n];\n\nexport function ExtensionsNavigation() {\n const { t } = useTranslation(\"openhands\");\n const { data: settings } = useSettings();\n const sidebarCollapsed = useSidebarStore((state) => state.collapsed);\n // At iPad portrait widths (md to <lg) an expanded primary Sidebar (300px)\n // plus this nav (260px) leaves the main content unreadable. Hide ourselves\n // until the user collapses the Sidebar or the viewport reaches `lg`.\n const belowLg = useBreakpoint(1023);\n const belowMd = useBreakpoint(767);\n const hideForExpandedSidebar = !sidebarCollapsed && belowLg && !belowMd;\n const isAcpAgent = settings?.agent_settings?.agent_kind === \"acp\";\n const acpServerKey =\n typeof settings?.agent_settings?.acp_server === \"string\"\n ? settings.agent_settings.acp_server\n : undefined;\n const acpServerName = isAcpAgent\n ? (ACP_PROVIDERS.find(({ key }) => key === acpServerKey)?.display_name ??\n \"ACP Agent\")\n : undefined;\n\n if (hideForExpandedSidebar) return null;\n\n return (\n <aside\n data-testid=\"extensions-navbar-desktop\"\n className=\"hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2 md:sticky md:top-8 md:self-start\"\n >\n <span className=\"px-2 text-sm font-normal text-white\">\n {t(I18nKey.NAV$CUSTOMIZE)}\n </span>\n <div className=\"flex flex-col gap-0.5 pt-0.5\">\n {EXTENSIONS_NAV_ITEMS.map((item) => {\n const disabled = !!(isAcpAgent && item.disabledByAcp);\n const baseRow = (\n <span className=\"shrink-0 flex items-center justify-center\">\n {item.icon}\n </span>\n );\n const label = <span className=\"truncate\">{item.label}</span>;\n const comingSoonBadge = item.comingSoon && (\n <span className=\"ml-auto shrink-0 rounded-full border border-white/20 bg-white/5 px-1.5 py-0.5 text-[10px] font-medium text-[var(--oh-text-dim)]\">\n {t(I18nKey.NAV$COMING_SOON)}\n </span>\n );\n\n if (disabled) {\n // Render a non-clickable surrogate so the URL and a11y tree\n // both communicate \"you can't go here right now,\" then wrap\n // in StyledTooltip for the why. Mirrors the SettingsNavLink\n // disabled rendering — same flag (``disabledByAcp``), same\n // explanatory tooltip (\"Disabled while {agentName} is the\n // active agent\"), same greyed styles.\n return (\n <StyledTooltip\n key={item.to}\n content={t(I18nKey.SETTINGS$AGENT_DISABLED_TOOLTIP, {\n agentName: acpServerName,\n })}\n placement=\"right\"\n >\n <span\n aria-disabled=\"true\"\n data-testid={`sidebar-extensions-${item.to}`}\n className={cn(\n sidebarNavRowClassName(),\n \"truncate text-[var(--oh-muted)] opacity-50 cursor-not-allowed\",\n )}\n >\n {baseRow}\n {label}\n {comingSoonBadge}\n </span>\n </StyledTooltip>\n );\n }\n\n return (\n <NavigationLink\n key={item.to}\n to={item.to}\n end={item.end}\n data-testid={`sidebar-extensions-${item.to}`}\n className={({ isActive }) =>\n cn(\n sidebarNavRowClassName(),\n \"truncate\",\n isActive\n ? SIDEBAR_ROW_INTERACTIVE_CLASS.active\n : SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )\n }\n >\n {baseRow}\n {label}\n {comingSoonBadge}\n </NavigationLink>\n );\n })}\n </div>\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </aside>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAiCA,IAAa,IAA2C;CACtD;EACE,IAAI;EACJ,OAAO;EACP,MAAM,kBAAC,GAAD;GAAY,OAAO;GAAI,QAAQ;GAAI,eAAY;GAAS,CAAA;EAC9D,KAAK;EACN;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM,kBAAC,GAAD;GAAmB,OAAO;GAAI,QAAQ;GAAM,CAAA;EAClD,KAAK;EACL,eAAe;EAChB;CACD;EACE,IAAI;EACJ,OAAO;EACP,MACE,kBAAC,OAAD;GACE,OAAM;GACN,SAAQ;GACR,MAAK;GACL,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,OAAO;GACP,QAAQ;GACR,eAAY;aAVd;IAYE,kBAAC,QAAD,EAAM,GAAE,0HAA2H,CAAA;IACnI,kBAAC,QAAD,EAAM,GAAE,sBAAuB,CAAA;IAC/B,kBAAC,QAAD,EAAM,GAAE,aAAc,CAAA;IAClB;;EAER,KAAK;EACL,YAAY;EACb;CACF;AAED,SAAgB,IAAuB;CACrC,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,MAAM,MAAa,GAAa,EAClC,IAAmB,GAAiB,MAAU,EAAM,UAAU,EAI9D,IAAU,EAAc,KAAK,EAC7B,IAAU,EAAc,IAAI,EAC5B,IAAyB,CAAC,KAAoB,KAAW,CAAC,GAC1D,IAAa,GAAU,gBAAgB,eAAe,OACtD,IACJ,OAAO,GAAU,gBAAgB,cAAe,WAC5C,EAAS,eAAe,aACxB,KAAA,GACA,IAAgB,IACjB,EAAc,MAAM,EAAE,aAAU,MAAQ,EAAa,EAAE,gBACxD,cACA,KAAA;AAIJ,QAFI,IAA+B,OAGjC,kBAAC,SAAD;EACE,eAAY;EACZ,WAAU;YAFZ;GAIE,kBAAC,QAAD;IAAM,WAAU;cACb,EAAE,EAAQ,cAAc;IACpB,CAAA;GACP,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAqB,KAAK,MAAS;KAClC,IAAM,IAAW,CAAC,EAAE,KAAc,EAAK,gBACjC,IACJ,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAK;MACD,CAAA,EAEH,IAAQ,kBAAC,QAAD;MAAM,WAAU;gBAAY,EAAK;MAAa,CAAA,EACtD,IAAkB,EAAK,cAC3B,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAE,EAAQ,gBAAgB;MACtB,CAAA;AAkCT,YA/BI,IAQA,kBAAC,GAAD;MAEE,SAAS,EAAE,EAAQ,iCAAiC,EAClD,WAAW,GACZ,CAAC;MACF,WAAU;gBAEV,kBAAC,QAAD;OACE,iBAAc;OACd,eAAa,sBAAsB,EAAK;OACxC,WAAW,EACT,GAAwB,EACxB,gEACD;iBANH;QAQG;QACA;QACA;QACI;;MACO,EAlBT,EAAK,GAkBI,GAKlB,kBAAC,GAAD;MAEE,IAAI,EAAK;MACT,KAAK,EAAK;MACV,eAAa,sBAAsB,EAAK;MACxC,YAAY,EAAE,kBACZ,EACE,GAAwB,EACxB,YACA,IACI,EAA8B,SAC9B,EAA8B,KACnC;gBAZL;OAeG;OACA;OACA;OACc;QAjBV,EAAK,GAiBK;MAEnB;IACE,CAAA;GACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAA8B,CAAA;IAC1B,CAAA;GACA"}
1
+ {"version":3,"file":"extensions-navigation.js","names":[],"sources":["../../../../src/components/features/skills/extensions-navigation.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { cn } from \"#/utils/utils\";\nimport SkillsIcon from \"#/icons/skills.svg?react\";\nimport ServerProcessIcon from \"#/icons/server-process.svg?react\";\nimport { BackendSyncedSettingsBadge } from \"#/components/features/settings/backend-synced-settings-badge\";\nimport {\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useBreakpoint } from \"#/hooks/use-breakpoint\";\n\ninterface ExtensionNavItem {\n to: string;\n label: string;\n icon: React.ReactElement;\n end?: boolean;\n comingSoon?: boolean;\n}\n\nexport const EXTENSIONS_NAV_ITEMS: ExtensionNavItem[] = [\n {\n to: \"/skills\",\n label: \"Skills\",\n icon: <SkillsIcon width={16} height={16} aria-hidden=\"true\" />,\n end: true,\n },\n {\n to: \"/mcp\",\n label: \"MCP Servers\",\n icon: <ServerProcessIcon width={16} height={16} />,\n end: true,\n },\n {\n to: \"/plugins\",\n label: \"Plugins\",\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n width={16}\n height={16}\n aria-hidden=\"true\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\" />\n <path d=\"m3.3 7 8.7 5 8.7-5\" />\n <path d=\"M12 22V12\" />\n </svg>\n ),\n end: true,\n comingSoon: true,\n },\n];\n\nexport function ExtensionsNavigation() {\n const { t } = useTranslation(\"openhands\");\n const sidebarCollapsed = useSidebarStore((state) => state.collapsed);\n // At iPad portrait widths (md to <lg) an expanded primary Sidebar (300px)\n // plus this nav (260px) leaves the main content unreadable. Hide ourselves\n // until the user collapses the Sidebar or the viewport reaches `lg`.\n const belowLg = useBreakpoint(1023);\n const belowMd = useBreakpoint(767);\n const hideForExpandedSidebar = !sidebarCollapsed && belowLg && !belowMd;\n\n if (hideForExpandedSidebar) return null;\n\n return (\n <aside\n data-testid=\"extensions-navbar-desktop\"\n className=\"hidden md:flex md:w-[260px] md:shrink-0 md:flex-col md:gap-2 md:sticky md:top-8 md:self-start\"\n >\n <span className=\"px-2 text-sm font-normal text-white\">\n {t(I18nKey.NAV$CUSTOMIZE)}\n </span>\n <div className=\"flex flex-col gap-0.5 pt-0.5\">\n {EXTENSIONS_NAV_ITEMS.map((item) => {\n const baseRow = (\n <span className=\"shrink-0 flex items-center justify-center\">\n {item.icon}\n </span>\n );\n const label = <span className=\"truncate\">{item.label}</span>;\n const comingSoonBadge = item.comingSoon && (\n <span className=\"ml-auto shrink-0 rounded-full border border-white/20 bg-white/5 px-1.5 py-0.5 text-[10px] font-medium text-[var(--oh-text-dim)]\">\n {t(I18nKey.NAV$COMING_SOON)}\n </span>\n );\n\n return (\n <NavigationLink\n key={item.to}\n to={item.to}\n end={item.end}\n data-testid={`sidebar-extensions-${item.to}`}\n className={({ isActive }) =>\n cn(\n sidebarNavRowClassName(),\n \"truncate\",\n isActive\n ? SIDEBAR_ROW_INTERACTIVE_CLASS.active\n : SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )\n }\n >\n {baseRow}\n {label}\n {comingSoonBadge}\n </NavigationLink>\n );\n })}\n </div>\n <div className=\"px-2 pt-3\">\n <BackendSyncedSettingsBadge />\n </div>\n </aside>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAsBA,IAAa,IAA2C;CACtD;EACE,IAAI;EACJ,OAAO;EACP,MAAM,kBAAC,GAAD;GAAY,OAAO;GAAI,QAAQ;GAAI,eAAY;GAAS,CAAA;EAC9D,KAAK;EACN;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM,kBAAC,GAAD;GAAmB,OAAO;GAAI,QAAQ;GAAM,CAAA;EAClD,KAAK;EACN;CACD;EACE,IAAI;EACJ,OAAO;EACP,MACE,kBAAC,OAAD;GACE,OAAM;GACN,SAAQ;GACR,MAAK;GACL,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,OAAO;GACP,QAAQ;GACR,eAAY;aAVd;IAYE,kBAAC,QAAD,EAAM,GAAE,0HAA2H,CAAA;IACnI,kBAAC,QAAD,EAAM,GAAE,sBAAuB,CAAA;IAC/B,kBAAC,QAAD,EAAM,GAAE,aAAc,CAAA;IAClB;;EAER,KAAK;EACL,YAAY;EACb;CACF;AAED,SAAgB,IAAuB;CACrC,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,IAAmB,GAAiB,MAAU,EAAM,UAAU,EAI9D,IAAU,EAAc,KAAK,EAC7B,IAAU,EAAc,IAAI;AAKlC,QAJ+B,CAAC,KAAoB,KAAW,CAAC,IAE7B,OAGjC,kBAAC,SAAD;EACE,eAAY;EACZ,WAAU;YAFZ;GAIE,kBAAC,QAAD;IAAM,WAAU;cACb,EAAE,EAAQ,cAAc;IACpB,CAAA;GACP,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAqB,KAAK,MAAS;KAClC,IAAM,IACJ,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAK;MACD,CAAA,EAEH,IAAQ,kBAAC,QAAD;MAAM,WAAU;gBAAY,EAAK;MAAa,CAAA,EACtD,IAAkB,EAAK,cAC3B,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAE,EAAQ,gBAAgB;MACtB,CAAA;AAGT,YACE,kBAAC,GAAD;MAEE,IAAI,EAAK;MACT,KAAK,EAAK;MACV,eAAa,sBAAsB,EAAK;MACxC,YAAY,EAAE,kBACZ,EACE,GAAwB,EACxB,YACA,IACI,EAA8B,SAC9B,EAA8B,KACnC;gBAZL;OAeG;OACA;OACA;OACc;QAjBV,EAAK,GAiBK;MAEnB;IACE,CAAA;GACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAA8B,CAAA;IAC1B,CAAA;GACA"}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../i18n/declaration.cjs`),t=require(`../node_modules/@openhands/typescript-client/dist/models/acp.cjs`);require(`../node_modules/@openhands/typescript-client/dist/index.cjs`);var n=new Set([`default`,`default (recommended)`]);function r(e){if(typeof e!=`string`)return null;let t=e.trim();return!t||n.has(t.toLowerCase())||t===`acp-managed`?null:t}function i(e){for(let t of[e.runtimeName,e.runtimeId,e.configured,e.sdkLlm]){let e=r(t);if(e)return e}return e.providerDefault??null}var a={"claude-code":{icon:`claude-code`,description_key:e.I18nKey.ONBOARDING$AGENT_CLAUDE_CODE_DESCRIPTION},codex:{icon:`codex`,description_key:e.I18nKey.ONBOARDING$AGENT_CODEX_DESCRIPTION},"gemini-cli":{icon:`gemini`,description_key:e.I18nKey.ONBOARDING$AGENT_GEMINI_CLI_DESCRIPTION}},o=Object.entries(a).map(([e,n])=>{let r=t.getAcpProvider(e);return{key:e,display_name:r?.display_name??e,default_command:r?[...r.default_command]:[],available_models:r?.available_models?.map(e=>({id:e.id,label:e.label})),default_model:r?.default_model??void 0,description_key:n.description_key,icon:n.icon}});function s(e){if(e)return o.find(t=>t.key===e)}function c(e){let t=s(e);return t?t.display_name:null}function l(e){return s(e)?.icon??`cli-generic`}function u(e,t){return t?s(e)?.available_models?.find(e=>e.id===t)?.label??t:null}exports.ACP_PROVIDERS=o,exports.getAcpProvider=s,exports.getAcpProviderDisplayName=c,exports.labelForAcpModel=u,exports.resolveAcpProviderIcon=l,exports.resolveEffectiveAcpModel=i;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../i18n/declaration.cjs`),t=require(`../node_modules/@openhands/typescript-client/dist/models/acp.cjs`);require(`../node_modules/@openhands/typescript-client/dist/index.cjs`);var n=new Set([`default`,`default (recommended)`]);function r(e){if(typeof e!=`string`)return null;let t=e.trim();return!t||n.has(t.toLowerCase())||t===`acp-managed`?null:t}function i(e){for(let t of[e.runtimeName,e.runtimeId,e.configured,e.sdkLlm]){let e=r(t);if(e)return e}return e.providerDefault??null}var a={"claude-code":{icon:`claude-code`,description_key:e.I18nKey.ONBOARDING$AGENT_CLAUDE_CODE_DESCRIPTION},codex:{icon:`codex`,description_key:e.I18nKey.ONBOARDING$AGENT_CODEX_DESCRIPTION},"gemini-cli":{icon:`gemini`,description_key:e.I18nKey.ONBOARDING$AGENT_GEMINI_CLI_DESCRIPTION}},o=Object.entries(a).map(([e,n])=>{let r=t.getAcpProvider(e);return{key:e,display_name:r?.display_name??e,default_command:r?[...r.default_command]:[],available_models:r?.available_models?.map(e=>({id:e.id,label:e.label})),default_model:r?.default_model??void 0,description_key:n.description_key,icon:n.icon}});function s(e){if(e)return o.find(t=>t.key===e)}function c(e){let t=s(e);return t?t.display_name:null}function l(e){return s(e)?.icon??`cli-generic`}function u(e,t){return t?s(e)?.available_models?.find(e=>e.id===t)?.label??t:null}exports.getAcpProvider=s,exports.getAcpProviderDisplayName=c,exports.labelForAcpModel=u,exports.resolveAcpProviderIcon=l,exports.resolveEffectiveAcpModel=i;
2
2
  //# sourceMappingURL=acp-providers.cjs.map
@@ -61,6 +61,6 @@ function u(e, t) {
61
61
  return t ? s(e)?.available_models?.find((e) => e.id === t)?.label ?? t : null;
62
62
  }
63
63
  //#endregion
64
- export { o as ACP_PROVIDERS, s as getAcpProvider, c as getAcpProviderDisplayName, u as labelForAcpModel, l as resolveAcpProviderIcon, i as resolveEffectiveAcpModel };
64
+ export { s as getAcpProvider, c as getAcpProviderDisplayName, u as labelForAcpModel, l as resolveAcpProviderIcon, i as resolveEffectiveAcpModel };
65
65
 
66
66
  //# sourceMappingURL=acp-providers.js.map
@@ -1,2 +1,2 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),t=require(`../../node_modules/@tanstack/react-query/build/modern/useMutation.cjs`),n=require(`../../api/conversation-service/agent-server-conversation-service.api.cjs`),r=require(`../use-tracking.cjs`);var i=()=>{let i=e.useQueryClient(),{trackConversationCreated:a}=r.useTracking();return t.useMutation({mutationKey:[`create-conversation`],mutationFn:async e=>{let{query:t,conversationInstructions:r,plugins:i,repository:a,workingDir:o,parentConversationId:s,agentType:c}=e,l=await n.default.createConversation(t,r,i,a?{selected_repository:a.name,selected_branch:a.branch??null,git_provider:a.gitProvider}:null,o,s,c);return{conversation_id:l.app_conversation_id?l.app_conversation_id:`task-${l.id}`,session_api_key:null,url:l.agent_server_url,task_id:l.id}},onSuccess:async(e,{repository:t})=>{a({hasRepository:!!t}),i.invalidateQueries({queryKey:[`user`,`conversations`]}),i.invalidateQueries({queryKey:[`start-tasks`]})}})};exports.useCreateConversation=i;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),t=require(`../../node_modules/@tanstack/react-query/build/modern/useMutation.cjs`),n=require(`../../api/conversation-metadata-store.cjs`),r=require(`../../api/conversation-service/agent-server-conversation-service.api.cjs`),i=require(`../use-tracking.cjs`),a=require(`../query/use-llm-profiles.cjs`);var o=()=>{let o=e.useQueryClient(),{trackConversationCreated:s}=i.useTracking(),{data:c}=a.useLlmProfiles();return t.useMutation({mutationKey:[`create-conversation`],mutationFn:async e=>{let{query:t,conversationInstructions:i,plugins:a,repository:o,workingDir:s,parentConversationId:l,agentType:u}=e,d=await r.default.createConversation(t,i,a,o?{selected_repository:o.name,selected_branch:o.branch??null,git_provider:o.gitProvider}:null,s,l,u),f=d.app_conversation_id;if(f&&c?.active_profile){let e=n.getStoredConversationMetadata(f);n.setStoredConversationMetadata(f,{selected_repository:e?.selected_repository??null,selected_branch:e?.selected_branch??null,git_provider:e?.git_provider??null,selected_workspace:e?.selected_workspace??null,active_profile:c.active_profile})}return{conversation_id:d.app_conversation_id?d.app_conversation_id:`task-${d.id}`,session_api_key:null,url:d.agent_server_url,task_id:d.id}},onSuccess:async(e,{repository:t})=>{s({hasRepository:!!t}),o.invalidateQueries({queryKey:[`user`,`conversations`]}),o.invalidateQueries({queryKey:[`start-tasks`]})}})};exports.useCreateConversation=o;
2
2
  //# sourceMappingURL=use-create-conversation.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-create-conversation.cjs","names":[],"sources":["../../../src/hooks/mutation/use-create-conversation.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { PluginSpec } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { SuggestedTask } from \"#/utils/types\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface CreateConversationVariables {\n query?: string;\n repository?: {\n name: string;\n gitProvider: Provider;\n branch?: string;\n };\n suggestedTask?: SuggestedTask;\n conversationInstructions?: string;\n parentConversationId?: string;\n agentType?: \"default\" | \"plan\";\n plugins?: PluginSpec[];\n workingDir?: string;\n}\n\ninterface CreateConversationResponse {\n conversation_id: string;\n session_api_key: string | null;\n url: string | null;\n task_id?: string;\n}\n\nexport const useCreateConversation = () => {\n const queryClient = useQueryClient();\n const { trackConversationCreated } = useTracking();\n\n return useMutation({\n mutationKey: [\"create-conversation\"],\n mutationFn: async (\n variables: CreateConversationVariables,\n ): Promise<CreateConversationResponse> => {\n const {\n query,\n conversationInstructions,\n plugins,\n repository,\n workingDir,\n parentConversationId,\n agentType,\n } = variables;\n\n const conversation =\n await AgentServerConversationService.createConversation(\n query,\n conversationInstructions,\n plugins,\n repository\n ? {\n selected_repository: repository.name,\n selected_branch: repository.branch ?? null,\n git_provider: repository.gitProvider,\n }\n : null,\n workingDir,\n parentConversationId,\n agentType,\n );\n\n // OpenHands cloud pattern: when the start task isn't immediately\n // READY (cloud sandbox is still provisioning),\n // app_conversation_id is null. We return a `task-{id}` URL so the\n // conversation route's useTaskPolling can drive it to READY and\n // then redirect to the real `/conversations/{app_conversation_id}`.\n const conversationId = conversation.app_conversation_id\n ? conversation.app_conversation_id\n : `task-${conversation.id}`;\n\n return {\n conversation_id: conversationId,\n session_api_key: null,\n url: conversation.agent_server_url,\n task_id: conversation.id,\n };\n },\n onSuccess: async (_, { repository }) => {\n trackConversationCreated({\n hasRepository: !!repository,\n });\n\n // Invalidate (rather than remove) so the existing paginated list stays\n // rendered while a background refetch picks up the new conversation.\n // `removeQueries` would wipe the cache and force the panel back to its\n // initial loading state, dropping loaded pages and scroll position.\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversations\"],\n });\n // The cloud path returns a start task (no app_conversation_id\n // yet); the sidebar surfaces those via `useStartTasks` which doesn't\n // poll, so invalidate it explicitly so the in-flight task shows up\n // in the conversation list immediately.\n queryClient.invalidateQueries({\n queryKey: [\"start-tasks\"],\n });\n },\n });\n};\n"],"mappings":"2VA6BA,IAAa,MAA8B,CACzC,IAAM,EAAc,EAAA,gBAAgB,CAC9B,CAAE,4BAA6B,EAAA,aAAa,CAElD,OAAO,EAAA,YAAY,CACjB,YAAa,CAAC,sBAAsB,CACpC,WAAY,KACV,IACwC,CACxC,GAAM,CACJ,QACA,2BACA,UACA,aACA,aACA,uBACA,aACE,EAEE,EACJ,MAAM,EAAA,QAA+B,mBACnC,EACA,EACA,EACA,EACI,CACE,oBAAqB,EAAW,KAChC,gBAAiB,EAAW,QAAU,KACtC,aAAc,EAAW,YAC1B,CACD,KACJ,EACA,EACA,EACD,CAWH,MAAO,CACL,gBALqB,EAAa,oBAChC,EAAa,oBACb,QAAQ,EAAa,KAIvB,gBAAiB,KACjB,IAAK,EAAa,iBAClB,QAAS,EAAa,GACvB,EAEH,UAAW,MAAO,EAAG,CAAE,gBAAiB,CACtC,EAAyB,CACvB,cAAe,CAAC,CAAC,EAClB,CAAC,CAMF,EAAY,kBAAkB,CAC5B,SAAU,CAAC,OAAQ,gBAAgB,CACpC,CAAC,CAKF,EAAY,kBAAkB,CAC5B,SAAU,CAAC,cAAc,CAC1B,CAAC,EAEL,CAAC"}
1
+ {"version":3,"file":"use-create-conversation.cjs","names":[],"sources":["../../../src/hooks/mutation/use-create-conversation.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { PluginSpec } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { SuggestedTask } from \"#/utils/types\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { useLlmProfiles } from \"#/hooks/query/use-llm-profiles\";\nimport {\n getStoredConversationMetadata,\n setStoredConversationMetadata,\n} from \"#/api/conversation-metadata-store\";\n\ninterface CreateConversationVariables {\n query?: string;\n repository?: {\n name: string;\n gitProvider: Provider;\n branch?: string;\n };\n suggestedTask?: SuggestedTask;\n conversationInstructions?: string;\n parentConversationId?: string;\n agentType?: \"default\" | \"plan\";\n plugins?: PluginSpec[];\n workingDir?: string;\n}\n\ninterface CreateConversationResponse {\n conversation_id: string;\n session_api_key: string | null;\n url: string | null;\n task_id?: string;\n}\n\nexport const useCreateConversation = () => {\n const queryClient = useQueryClient();\n const { trackConversationCreated } = useTracking();\n // Cache-warm on the home page (the profile picker reads the same query).\n // Stamped onto the conversation at creation so the switcher can show the\n // exact profile even when several profiles share a model (#1082).\n const { data: llmProfiles } = useLlmProfiles();\n\n return useMutation({\n mutationKey: [\"create-conversation\"],\n mutationFn: async (\n variables: CreateConversationVariables,\n ): Promise<CreateConversationResponse> => {\n const {\n query,\n conversationInstructions,\n plugins,\n repository,\n workingDir,\n parentConversationId,\n agentType,\n } = variables;\n\n const conversation =\n await AgentServerConversationService.createConversation(\n query,\n conversationInstructions,\n plugins,\n repository\n ? {\n selected_repository: repository.name,\n selected_branch: repository.branch ?? null,\n git_provider: repository.gitProvider,\n }\n : null,\n workingDir,\n parentConversationId,\n agentType,\n );\n\n // Stamp the active LLM profile onto the (local) conversation so the\n // chat switcher shows the exact profile even when several profiles\n // share a model (#1082). Cloud conversations don't use local profiles\n // (app_conversation_id stays null until the sandbox is READY). Merge so\n // the repo/workspace metadata the service just persisted is preserved.\n const localConversationId = conversation.app_conversation_id;\n if (localConversationId && llmProfiles?.active_profile) {\n const prev = getStoredConversationMetadata(localConversationId);\n setStoredConversationMetadata(localConversationId, {\n selected_repository: prev?.selected_repository ?? null,\n selected_branch: prev?.selected_branch ?? null,\n git_provider: prev?.git_provider ?? null,\n selected_workspace: prev?.selected_workspace ?? null,\n active_profile: llmProfiles.active_profile,\n });\n }\n\n // OpenHands cloud pattern: when the start task isn't immediately\n // READY (cloud sandbox is still provisioning),\n // app_conversation_id is null. We return a `task-{id}` URL so the\n // conversation route's useTaskPolling can drive it to READY and\n // then redirect to the real `/conversations/{app_conversation_id}`.\n const conversationId = conversation.app_conversation_id\n ? conversation.app_conversation_id\n : `task-${conversation.id}`;\n\n return {\n conversation_id: conversationId,\n session_api_key: null,\n url: conversation.agent_server_url,\n task_id: conversation.id,\n };\n },\n onSuccess: async (_, { repository }) => {\n trackConversationCreated({\n hasRepository: !!repository,\n });\n\n // Invalidate (rather than remove) so the existing paginated list stays\n // rendered while a background refetch picks up the new conversation.\n // `removeQueries` would wipe the cache and force the panel back to its\n // initial loading state, dropping loaded pages and scroll position.\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversations\"],\n });\n // The cloud path returns a start task (no app_conversation_id\n // yet); the sidebar surfaces those via `useStartTasks` which doesn't\n // poll, so invalidate it explicitly so the in-flight task shows up\n // in the conversation list immediately.\n queryClient.invalidateQueries({\n queryKey: [\"start-tasks\"],\n });\n },\n });\n};\n"],"mappings":"6bAkCA,IAAa,MAA8B,CACzC,IAAM,EAAc,EAAA,gBAAgB,CAC9B,CAAE,4BAA6B,EAAA,aAAa,CAI5C,CAAE,KAAM,GAAgB,EAAA,gBAAgB,CAE9C,OAAO,EAAA,YAAY,CACjB,YAAa,CAAC,sBAAsB,CACpC,WAAY,KACV,IACwC,CACxC,GAAM,CACJ,QACA,2BACA,UACA,aACA,aACA,uBACA,aACE,EAEE,EACJ,MAAM,EAAA,QAA+B,mBACnC,EACA,EACA,EACA,EACI,CACE,oBAAqB,EAAW,KAChC,gBAAiB,EAAW,QAAU,KACtC,aAAc,EAAW,YAC1B,CACD,KACJ,EACA,EACA,EACD,CAOG,EAAsB,EAAa,oBACzC,GAAI,GAAuB,GAAa,eAAgB,CACtD,IAAM,EAAO,EAAA,8BAA8B,EAAoB,CAC/D,EAAA,8BAA8B,EAAqB,CACjD,oBAAqB,GAAM,qBAAuB,KAClD,gBAAiB,GAAM,iBAAmB,KAC1C,aAAc,GAAM,cAAgB,KACpC,mBAAoB,GAAM,oBAAsB,KAChD,eAAgB,EAAY,eAC7B,CAAC,CAYJ,MAAO,CACL,gBALqB,EAAa,oBAChC,EAAa,oBACb,QAAQ,EAAa,KAIvB,gBAAiB,KACjB,IAAK,EAAa,iBAClB,QAAS,EAAa,GACvB,EAEH,UAAW,MAAO,EAAG,CAAE,gBAAiB,CACtC,EAAyB,CACvB,cAAe,CAAC,CAAC,EAClB,CAAC,CAMF,EAAY,kBAAkB,CAC5B,SAAU,CAAC,OAAQ,gBAAgB,CACpC,CAAC,CAKF,EAAY,kBAAkB,CAC5B,SAAU,CAAC,cAAc,CAC1B,CAAC,EAEL,CAAC"}
@@ -1,31 +1,43 @@
1
1
  import { useQueryClient as e } from "../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
2
2
  import { useMutation as t } from "../../node_modules/@tanstack/react-query/build/modern/useMutation.js";
3
- import n from "../../api/conversation-service/agent-server-conversation-service.api.js";
4
- import { useTracking as r } from "../use-tracking.js";
3
+ import { getStoredConversationMetadata as n, setStoredConversationMetadata as r } from "../../api/conversation-metadata-store.js";
4
+ import i from "../../api/conversation-service/agent-server-conversation-service.api.js";
5
+ import { useTracking as a } from "../use-tracking.js";
6
+ import { useLlmProfiles as o } from "../query/use-llm-profiles.js";
5
7
  //#region src/hooks/mutation/use-create-conversation.ts
6
- var i = () => {
7
- let i = e(), { trackConversationCreated: a } = r();
8
+ var s = () => {
9
+ let s = e(), { trackConversationCreated: c } = a(), { data: l } = o();
8
10
  return t({
9
11
  mutationKey: ["create-conversation"],
10
12
  mutationFn: async (e) => {
11
- let { query: t, conversationInstructions: r, plugins: i, repository: a, workingDir: o, parentConversationId: s, agentType: c } = e, l = await n.createConversation(t, r, i, a ? {
12
- selected_repository: a.name,
13
- selected_branch: a.branch ?? null,
14
- git_provider: a.gitProvider
15
- } : null, o, s, c);
13
+ let { query: t, conversationInstructions: a, plugins: o, repository: s, workingDir: c, parentConversationId: u, agentType: d } = e, f = await i.createConversation(t, a, o, s ? {
14
+ selected_repository: s.name,
15
+ selected_branch: s.branch ?? null,
16
+ git_provider: s.gitProvider
17
+ } : null, c, u, d), p = f.app_conversation_id;
18
+ if (p && l?.active_profile) {
19
+ let e = n(p);
20
+ r(p, {
21
+ selected_repository: e?.selected_repository ?? null,
22
+ selected_branch: e?.selected_branch ?? null,
23
+ git_provider: e?.git_provider ?? null,
24
+ selected_workspace: e?.selected_workspace ?? null,
25
+ active_profile: l.active_profile
26
+ });
27
+ }
16
28
  return {
17
- conversation_id: l.app_conversation_id ? l.app_conversation_id : `task-${l.id}`,
29
+ conversation_id: f.app_conversation_id ? f.app_conversation_id : `task-${f.id}`,
18
30
  session_api_key: null,
19
- url: l.agent_server_url,
20
- task_id: l.id
31
+ url: f.agent_server_url,
32
+ task_id: f.id
21
33
  };
22
34
  },
23
35
  onSuccess: async (e, { repository: t }) => {
24
- a({ hasRepository: !!t }), i.invalidateQueries({ queryKey: ["user", "conversations"] }), i.invalidateQueries({ queryKey: ["start-tasks"] });
36
+ c({ hasRepository: !!t }), s.invalidateQueries({ queryKey: ["user", "conversations"] }), s.invalidateQueries({ queryKey: ["start-tasks"] });
25
37
  }
26
38
  });
27
39
  };
28
40
  //#endregion
29
- export { i as useCreateConversation };
41
+ export { s as useCreateConversation };
30
42
 
31
43
  //# sourceMappingURL=use-create-conversation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-create-conversation.js","names":[],"sources":["../../../src/hooks/mutation/use-create-conversation.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { PluginSpec } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { SuggestedTask } from \"#/utils/types\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\n\ninterface CreateConversationVariables {\n query?: string;\n repository?: {\n name: string;\n gitProvider: Provider;\n branch?: string;\n };\n suggestedTask?: SuggestedTask;\n conversationInstructions?: string;\n parentConversationId?: string;\n agentType?: \"default\" | \"plan\";\n plugins?: PluginSpec[];\n workingDir?: string;\n}\n\ninterface CreateConversationResponse {\n conversation_id: string;\n session_api_key: string | null;\n url: string | null;\n task_id?: string;\n}\n\nexport const useCreateConversation = () => {\n const queryClient = useQueryClient();\n const { trackConversationCreated } = useTracking();\n\n return useMutation({\n mutationKey: [\"create-conversation\"],\n mutationFn: async (\n variables: CreateConversationVariables,\n ): Promise<CreateConversationResponse> => {\n const {\n query,\n conversationInstructions,\n plugins,\n repository,\n workingDir,\n parentConversationId,\n agentType,\n } = variables;\n\n const conversation =\n await AgentServerConversationService.createConversation(\n query,\n conversationInstructions,\n plugins,\n repository\n ? {\n selected_repository: repository.name,\n selected_branch: repository.branch ?? null,\n git_provider: repository.gitProvider,\n }\n : null,\n workingDir,\n parentConversationId,\n agentType,\n );\n\n // OpenHands cloud pattern: when the start task isn't immediately\n // READY (cloud sandbox is still provisioning),\n // app_conversation_id is null. We return a `task-{id}` URL so the\n // conversation route's useTaskPolling can drive it to READY and\n // then redirect to the real `/conversations/{app_conversation_id}`.\n const conversationId = conversation.app_conversation_id\n ? conversation.app_conversation_id\n : `task-${conversation.id}`;\n\n return {\n conversation_id: conversationId,\n session_api_key: null,\n url: conversation.agent_server_url,\n task_id: conversation.id,\n };\n },\n onSuccess: async (_, { repository }) => {\n trackConversationCreated({\n hasRepository: !!repository,\n });\n\n // Invalidate (rather than remove) so the existing paginated list stays\n // rendered while a background refetch picks up the new conversation.\n // `removeQueries` would wipe the cache and force the panel back to its\n // initial loading state, dropping loaded pages and scroll position.\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversations\"],\n });\n // The cloud path returns a start task (no app_conversation_id\n // yet); the sidebar surfaces those via `useStartTasks` which doesn't\n // poll, so invalidate it explicitly so the in-flight task shows up\n // in the conversation list immediately.\n queryClient.invalidateQueries({\n queryKey: [\"start-tasks\"],\n });\n },\n });\n};\n"],"mappings":";;;;;AA6BA,IAAa,UAA8B;CACzC,IAAM,IAAc,GAAgB,EAC9B,EAAE,gCAA6B,GAAa;AAElD,QAAO,EAAY;EACjB,aAAa,CAAC,sBAAsB;EACpC,YAAY,OACV,MACwC;GACxC,IAAM,EACJ,UACA,6BACA,YACA,eACA,eACA,yBACA,iBACE,GAEE,IACJ,MAAM,EAA+B,mBACnC,GACA,GACA,GACA,IACI;IACE,qBAAqB,EAAW;IAChC,iBAAiB,EAAW,UAAU;IACtC,cAAc,EAAW;IAC1B,GACD,MACJ,GACA,GACA,EACD;AAWH,UAAO;IACL,iBALqB,EAAa,sBAChC,EAAa,sBACb,QAAQ,EAAa;IAIvB,iBAAiB;IACjB,KAAK,EAAa;IAClB,SAAS,EAAa;IACvB;;EAEH,WAAW,OAAO,GAAG,EAAE,oBAAiB;AAgBtC,GAfA,EAAyB,EACvB,eAAe,CAAC,CAAC,GAClB,CAAC,EAMF,EAAY,kBAAkB,EAC5B,UAAU,CAAC,QAAQ,gBAAgB,EACpC,CAAC,EAKF,EAAY,kBAAkB,EAC5B,UAAU,CAAC,cAAc,EAC1B,CAAC;;EAEL,CAAC"}
1
+ {"version":3,"file":"use-create-conversation.js","names":[],"sources":["../../../src/hooks/mutation/use-create-conversation.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { PluginSpec } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport { SuggestedTask } from \"#/utils/types\";\nimport { Provider } from \"#/types/settings\";\nimport { useTracking } from \"#/hooks/use-tracking\";\nimport { useLlmProfiles } from \"#/hooks/query/use-llm-profiles\";\nimport {\n getStoredConversationMetadata,\n setStoredConversationMetadata,\n} from \"#/api/conversation-metadata-store\";\n\ninterface CreateConversationVariables {\n query?: string;\n repository?: {\n name: string;\n gitProvider: Provider;\n branch?: string;\n };\n suggestedTask?: SuggestedTask;\n conversationInstructions?: string;\n parentConversationId?: string;\n agentType?: \"default\" | \"plan\";\n plugins?: PluginSpec[];\n workingDir?: string;\n}\n\ninterface CreateConversationResponse {\n conversation_id: string;\n session_api_key: string | null;\n url: string | null;\n task_id?: string;\n}\n\nexport const useCreateConversation = () => {\n const queryClient = useQueryClient();\n const { trackConversationCreated } = useTracking();\n // Cache-warm on the home page (the profile picker reads the same query).\n // Stamped onto the conversation at creation so the switcher can show the\n // exact profile even when several profiles share a model (#1082).\n const { data: llmProfiles } = useLlmProfiles();\n\n return useMutation({\n mutationKey: [\"create-conversation\"],\n mutationFn: async (\n variables: CreateConversationVariables,\n ): Promise<CreateConversationResponse> => {\n const {\n query,\n conversationInstructions,\n plugins,\n repository,\n workingDir,\n parentConversationId,\n agentType,\n } = variables;\n\n const conversation =\n await AgentServerConversationService.createConversation(\n query,\n conversationInstructions,\n plugins,\n repository\n ? {\n selected_repository: repository.name,\n selected_branch: repository.branch ?? null,\n git_provider: repository.gitProvider,\n }\n : null,\n workingDir,\n parentConversationId,\n agentType,\n );\n\n // Stamp the active LLM profile onto the (local) conversation so the\n // chat switcher shows the exact profile even when several profiles\n // share a model (#1082). Cloud conversations don't use local profiles\n // (app_conversation_id stays null until the sandbox is READY). Merge so\n // the repo/workspace metadata the service just persisted is preserved.\n const localConversationId = conversation.app_conversation_id;\n if (localConversationId && llmProfiles?.active_profile) {\n const prev = getStoredConversationMetadata(localConversationId);\n setStoredConversationMetadata(localConversationId, {\n selected_repository: prev?.selected_repository ?? null,\n selected_branch: prev?.selected_branch ?? null,\n git_provider: prev?.git_provider ?? null,\n selected_workspace: prev?.selected_workspace ?? null,\n active_profile: llmProfiles.active_profile,\n });\n }\n\n // OpenHands cloud pattern: when the start task isn't immediately\n // READY (cloud sandbox is still provisioning),\n // app_conversation_id is null. We return a `task-{id}` URL so the\n // conversation route's useTaskPolling can drive it to READY and\n // then redirect to the real `/conversations/{app_conversation_id}`.\n const conversationId = conversation.app_conversation_id\n ? conversation.app_conversation_id\n : `task-${conversation.id}`;\n\n return {\n conversation_id: conversationId,\n session_api_key: null,\n url: conversation.agent_server_url,\n task_id: conversation.id,\n };\n },\n onSuccess: async (_, { repository }) => {\n trackConversationCreated({\n hasRepository: !!repository,\n });\n\n // Invalidate (rather than remove) so the existing paginated list stays\n // rendered while a background refetch picks up the new conversation.\n // `removeQueries` would wipe the cache and force the panel back to its\n // initial loading state, dropping loaded pages and scroll position.\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversations\"],\n });\n // The cloud path returns a start task (no app_conversation_id\n // yet); the sidebar surfaces those via `useStartTasks` which doesn't\n // poll, so invalidate it explicitly so the in-flight task shows up\n // in the conversation list immediately.\n queryClient.invalidateQueries({\n queryKey: [\"start-tasks\"],\n });\n },\n });\n};\n"],"mappings":";;;;;;;AAkCA,IAAa,UAA8B;CACzC,IAAM,IAAc,GAAgB,EAC9B,EAAE,gCAA6B,GAAa,EAI5C,EAAE,MAAM,MAAgB,GAAgB;AAE9C,QAAO,EAAY;EACjB,aAAa,CAAC,sBAAsB;EACpC,YAAY,OACV,MACwC;GACxC,IAAM,EACJ,UACA,6BACA,YACA,eACA,eACA,yBACA,iBACE,GAEE,IACJ,MAAM,EAA+B,mBACnC,GACA,GACA,GACA,IACI;IACE,qBAAqB,EAAW;IAChC,iBAAiB,EAAW,UAAU;IACtC,cAAc,EAAW;IAC1B,GACD,MACJ,GACA,GACA,EACD,EAOG,IAAsB,EAAa;AACzC,OAAI,KAAuB,GAAa,gBAAgB;IACtD,IAAM,IAAO,EAA8B,EAAoB;AAC/D,MAA8B,GAAqB;KACjD,qBAAqB,GAAM,uBAAuB;KAClD,iBAAiB,GAAM,mBAAmB;KAC1C,cAAc,GAAM,gBAAgB;KACpC,oBAAoB,GAAM,sBAAsB;KAChD,gBAAgB,EAAY;KAC7B,CAAC;;AAYJ,UAAO;IACL,iBALqB,EAAa,sBAChC,EAAa,sBACb,QAAQ,EAAa;IAIvB,iBAAiB;IACjB,KAAK,EAAa;IAClB,SAAS,EAAa;IACvB;;EAEH,WAAW,OAAO,GAAG,EAAE,oBAAiB;AAgBtC,GAfA,EAAyB,EACvB,eAAe,CAAC,CAAC,GAClB,CAAC,EAMF,EAAY,kBAAkB,EAC5B,UAAU,CAAC,QAAQ,gBAAgB,EACpC,CAAC,EAKF,EAAY,kBAAkB,EAC5B,UAAU,CAAC,cAAc,EAC1B,CAAC;;EAEL,CAAC"}
@@ -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/custom-toast-handlers.cjs`),r=require(`../chat/model-command-event-anchor.cjs`),i=require(`../chat/record-model-switch-message.cjs`),a=require(`./use-switch-llm-profile.cjs`);let o=require(`react`);function s(){let{mutate:s,isPending:c}=a.useSwitchLlmProfile(),{t:l}=e.useTranslation();return{switchAndLog:(0,o.useCallback)((e,a)=>{let o=r.getLastRenderableEventId();s({conversationId:e,profileName:a},{onSuccess:()=>{e&&i.recordModelSwitchMessage(e,a,o)},onError:e=>{let r=l(t.I18nKey.MODEL$SWITCH_FAILED,{name:a});n.displayErrorToast(e instanceof Error&&e.message?e.message:r)}})},[s,l]),isPending:c}}exports.useSwitchLlmProfileAndLog=s;
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/custom-toast-handlers.cjs`),r=require(`../../api/conversation-metadata-store.cjs`),i=require(`../chat/model-command-event-anchor.cjs`),a=require(`../chat/record-model-switch-message.cjs`),o=require(`./use-switch-llm-profile.cjs`);let s=require(`react`);function c(){let{mutate:c,isPending:l}=o.useSwitchLlmProfile(),{t:u}=e.useTranslation();return{switchAndLog:(0,s.useCallback)((e,o)=>{let s=i.getLastRenderableEventId();c({conversationId:e,profileName:o},{onSuccess:()=>{if(e){a.recordModelSwitchMessage(e,o,s);let t=r.getStoredConversationMetadata(e);r.setStoredConversationMetadata(e,{selected_repository:t?.selected_repository??null,selected_branch:t?.selected_branch??null,git_provider:t?.git_provider??null,selected_workspace:t?.selected_workspace??null,active_profile:o})}},onError:e=>{let r=u(t.I18nKey.MODEL$SWITCH_FAILED,{name:o});n.displayErrorToast(e instanceof Error&&e.message?e.message:r)}})},[c,u]),isPending:l}}exports.useSwitchLlmProfileAndLog=c;
2
2
  //# sourceMappingURL=use-switch-llm-profile-and-log.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-switch-llm-profile-and-log.cjs","names":[],"sources":["../../../src/hooks/mutation/use-switch-llm-profile-and-log.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { getLastRenderableEventId } from \"#/hooks/chat/model-command-event-anchor\";\nimport { recordModelSwitchMessage } from \"#/hooks/chat/record-model-switch-message\";\nimport { useSwitchLlmProfile } from \"#/hooks/mutation/use-switch-llm-profile\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\n/**\n * Switch the conversation's LLM profile and render the result inline (same\n * UX as `/model <name>`). On success the switch is recorded against the\n * last rendered event so the confirmation lines up with where the user\n * issued the command.\n */\nexport function useSwitchLlmProfileAndLog() {\n const { mutate, isPending } = useSwitchLlmProfile();\n const { t } = useTranslation();\n\n const switchAndLog = useCallback(\n (conversationId: string | null, profileName: string) => {\n const anchorEventId = getLastRenderableEventId();\n\n mutate(\n { conversationId, profileName },\n {\n onSuccess: () => {\n // The inline \"Switched to\" message is scoped to a conversation;\n // skip it when activating from the home page (no convo yet).\n if (conversationId) {\n recordModelSwitchMessage(\n conversationId,\n profileName,\n anchorEventId,\n );\n }\n },\n onError: (err: unknown) => {\n const fallback = t(I18nKey.MODEL$SWITCH_FAILED, {\n name: profileName,\n });\n const message =\n err instanceof Error && err.message ? err.message : fallback;\n displayErrorToast(message);\n },\n },\n );\n },\n [mutate, t],\n );\n\n return { switchAndLog, isPending };\n}\n"],"mappings":"oYAcA,SAAgB,GAA4B,CAC1C,GAAM,CAAE,SAAQ,aAAc,EAAA,qBAAqB,CAC7C,CAAE,KAAM,EAAA,gBAAgB,CAkC9B,MAAO,CAAE,cAAA,EAAA,EAAA,cA/BN,EAA+B,IAAwB,CACtD,IAAM,EAAgB,EAAA,0BAA0B,CAEhD,EACE,CAAE,iBAAgB,cAAa,CAC/B,CACE,cAAiB,CAGX,GACF,EAAA,yBACE,EACA,EACA,EACD,EAGL,QAAU,GAAiB,CACzB,IAAM,EAAW,EAAE,EAAA,QAAQ,oBAAqB,CAC9C,KAAM,EACP,CAAC,CAGF,EAAA,kBADE,aAAe,OAAS,EAAI,QAAU,EAAI,QAAU,EAC5B,EAE7B,CACF,EAEH,CAAC,EAAQ,EAAE,CAGJ,CAAc,YAAW"}
1
+ {"version":3,"file":"use-switch-llm-profile-and-log.cjs","names":[],"sources":["../../../src/hooks/mutation/use-switch-llm-profile-and-log.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { getLastRenderableEventId } from \"#/hooks/chat/model-command-event-anchor\";\nimport { recordModelSwitchMessage } from \"#/hooks/chat/record-model-switch-message\";\nimport { useSwitchLlmProfile } from \"#/hooks/mutation/use-switch-llm-profile\";\nimport {\n getStoredConversationMetadata,\n setStoredConversationMetadata,\n} from \"#/api/conversation-metadata-store\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\n/**\n * Switch the conversation's LLM profile and render the result inline (same\n * UX as `/model <name>`). On success the switch is recorded against the\n * last rendered event so the confirmation lines up with where the user\n * issued the command.\n */\nexport function useSwitchLlmProfileAndLog() {\n const { mutate, isPending } = useSwitchLlmProfile();\n const { t } = useTranslation();\n\n const switchAndLog = useCallback(\n (conversationId: string | null, profileName: string) => {\n const anchorEventId = getLastRenderableEventId();\n\n mutate(\n { conversationId, profileName },\n {\n onSuccess: () => {\n // The inline \"Switched to\" message is scoped to a conversation;\n // skip it when activating from the home page (no convo yet).\n if (conversationId) {\n recordModelSwitchMessage(\n conversationId,\n profileName,\n anchorEventId,\n );\n // Keep the per-conversation profile identity fresh so the\n // chat-header switcher shows the right name after a reload\n // (the agent-server only round-trips the model string). #1082\n const prev = getStoredConversationMetadata(conversationId);\n setStoredConversationMetadata(conversationId, {\n selected_repository: prev?.selected_repository ?? null,\n selected_branch: prev?.selected_branch ?? null,\n git_provider: prev?.git_provider ?? null,\n selected_workspace: prev?.selected_workspace ?? null,\n active_profile: profileName,\n });\n }\n },\n onError: (err: unknown) => {\n const fallback = t(I18nKey.MODEL$SWITCH_FAILED, {\n name: profileName,\n });\n const message =\n err instanceof Error && err.message ? err.message : fallback;\n displayErrorToast(message);\n },\n },\n );\n },\n [mutate, t],\n );\n\n return { switchAndLog, isPending };\n}\n"],"mappings":"2bAkBA,SAAgB,GAA4B,CAC1C,GAAM,CAAE,SAAQ,aAAc,EAAA,qBAAqB,CAC7C,CAAE,KAAM,EAAA,gBAAgB,CA6C9B,MAAO,CAAE,cAAA,EAAA,EAAA,cA1CN,EAA+B,IAAwB,CACtD,IAAM,EAAgB,EAAA,0BAA0B,CAEhD,EACE,CAAE,iBAAgB,cAAa,CAC/B,CACE,cAAiB,CAGf,GAAI,EAAgB,CAClB,EAAA,yBACE,EACA,EACA,EACD,CAID,IAAM,EAAO,EAAA,8BAA8B,EAAe,CAC1D,EAAA,8BAA8B,EAAgB,CAC5C,oBAAqB,GAAM,qBAAuB,KAClD,gBAAiB,GAAM,iBAAmB,KAC1C,aAAc,GAAM,cAAgB,KACpC,mBAAoB,GAAM,oBAAsB,KAChD,eAAgB,EACjB,CAAC,GAGN,QAAU,GAAiB,CACzB,IAAM,EAAW,EAAE,EAAA,QAAQ,oBAAqB,CAC9C,KAAM,EACP,CAAC,CAGF,EAAA,kBADE,aAAe,OAAS,EAAI,QAAU,EAAI,QAAU,EAC5B,EAE7B,CACF,EAEH,CAAC,EAAQ,EAAE,CAGJ,CAAc,YAAW"}