@openhands/agent-canvas 1.4.0 → 1.5.1

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 (710) hide show
  1. package/README.md +11 -12
  2. package/README.windows.md +4 -2
  3. package/build/assets/{Trans-Ch-OVWEA.js → Trans-DqF_OEZB.js} +1 -1
  4. package/build/assets/{acp-providers-Sy2LKyMa.js → acp-providers-DerAmTyY.js} +1 -1
  5. package/build/assets/active-backend-context-B8rMv0X9.js +1 -0
  6. package/build/assets/{add-backend-modal-Bgy8anoR.js → add-backend-modal-CxC7BNEc.js} +1 -1
  7. package/build/assets/{agent-profiles-settings-3mmXljZX.js → agent-profiles-settings-BJb8YXR1.js} +1 -1
  8. package/build/assets/agent-server-compatibility-BWN-EIQn.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-DSPIkMwJ.js +41 -0
  10. package/build/assets/{agent-settings-B-W10B4E.js → agent-settings-CgCnqaAA.js} +2 -2
  11. package/build/assets/agent-settings-DDkSavD7.js +1 -0
  12. package/build/assets/{alert-banner-Bpf2NQJq.js → alert-banner-Dh51WURQ.js} +1 -1
  13. package/build/assets/api-key-entry-screen-iZc7n8AI.js +1 -0
  14. package/build/assets/app-settings-B5zyipxJ.js +1 -0
  15. package/build/assets/automation-detail-CZsu2CoM.js +2 -0
  16. package/build/assets/automation-export-BwRX6H32.js +2 -0
  17. package/build/assets/automations-list-lHAVzMoA.js +1 -0
  18. package/build/assets/{back-nav-button-CUS2mi-U.js → back-nav-button-DVknCcSP.js} +1 -1
  19. package/build/assets/backend-form-modal-RGcu909r.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-D9hZx05w.js → backend-synced-settings-badge-BSfN0AZA.js} +1 -1
  21. package/build/assets/{base-modal-BuF2f0YL.js → base-modal-CIF_785P.js} +1 -1
  22. package/build/assets/{bot-D7eUAuSB.js → bot-C-EA6685.js} +1 -1
  23. package/build/assets/{brand-button-vMVuyDXu.js → brand-button-B1izLAdR.js} +1 -1
  24. package/build/assets/{browser-BifzWIBd.js → browser-DKaeq_sT.js} +3 -3
  25. package/build/assets/{browser-tab-CkkqJnqw.js → browser-tab-qb_ftCxW.js} +1 -1
  26. package/build/assets/canvas-ui-COgjltGz.js +1 -0
  27. package/build/assets/{chat-send-button-B_jc5z5C.js → chat-send-button-BZHG2hAW.js} +1 -1
  28. package/build/assets/check-TbOEtHKj.js +1 -0
  29. package/build/assets/{chevron-down-CI8A6tet.js → chevron-down-D7IvFMBM.js} +1 -1
  30. package/build/assets/{circle-plus-check-toggle-C5YxjxvI.js → circle-plus-check-toggle-DoFIjVE0.js} +1 -1
  31. package/build/assets/client-source-BZK8vRs2.js +1 -0
  32. package/build/assets/cloud-funnel-analytics-Zcv57hfT.js +1 -0
  33. package/build/assets/{color-themes-DPBzNtVg.js → color-themes-CHizm1xF.js} +1 -1
  34. package/build/assets/{combobox-caret-DoObzqf4.js → combobox-caret-CxZpqoSR.js} +1 -1
  35. package/build/assets/{command-menu-D-JV3Wqm.js → command-menu-oTvKDU3Y.js} +1 -1
  36. package/build/assets/condenser-settings-BGlWn93P.js +1 -0
  37. package/build/assets/{confirmation-modal-BGLu6XJN.js → confirmation-modal-DGBWM2Ls.js} +1 -1
  38. package/build/assets/{context-menu-list-item-BD5_EaKN.js → context-menu-list-item-6psNyl7X.js} +1 -1
  39. package/build/assets/conversation-BoCYx8n2.js +89 -0
  40. package/build/assets/conversation-DgHqMjnY.js +1 -0
  41. package/build/assets/conversation-panel-78Rxh_-I.js +1 -0
  42. package/build/assets/conversation-service.api-_f9GlIEi.js +1 -0
  43. package/build/assets/{conversation-tab-empty-state-B2dDYEwf.js → conversation-tab-empty-state-CNUmIms2.js} +1 -1
  44. package/build/assets/{copy-3JCw_XFB.js → copy-D1YGjP-C.js} +1 -1
  45. package/build/assets/{copy-to-clipboard-button-CaR52OnA.js → copy-to-clipboard-button-CFzH_NOX.js} +1 -1
  46. package/build/assets/declaration-BGsHjPEW.js +1 -0
  47. package/build/assets/{device-verify-Dj6I4Iqe.js → device-verify-WBSjJBLH.js} +1 -1
  48. package/build/assets/{dropdown-classes-DJSXeLqc.js → dropdown-classes-D3wMJlXT.js} +1 -1
  49. package/build/assets/{ellipsis-button-C5Z-tPFp.js → ellipsis-button-CbNnHlIq.js} +1 -1
  50. package/build/assets/{entry.client-2_3ePAm0.js → entry.client-DNlPGxsu.js} +2 -2
  51. package/build/assets/{enum-filter-dropdown-DXbVwiNZ.js → enum-filter-dropdown-JLYv1t8L.js} +1 -1
  52. package/build/assets/{environment-switch-overlay-DZQfRGTx.js → environment-switch-overlay-B1PFO8P8.js} +1 -1
  53. package/build/assets/{extensions-hub-CLjmOGqS.js → extensions-hub-CCbLA7IM.js} +1 -1
  54. package/build/assets/{extensions-navigation-B5MeUiMq.js → extensions-navigation-CPNjMNvR.js} +1 -1
  55. package/build/assets/{external-link-D2zJjE9G.js → external-link-lhdITPqq.js} +1 -1
  56. package/build/assets/files-tab-y4K7EXBO.js +1 -0
  57. package/build/assets/{form-control-classes-ChpNBe9n.js → form-control-classes-CbdN5aO3.js} +1 -1
  58. package/build/assets/format-time-delta-DhDbkD7V.js +1 -0
  59. package/build/assets/git-provider-icon-ITvsH4Ko.js +1 -0
  60. package/build/assets/home-BwbeOWwU.js +1 -0
  61. package/build/assets/home-DKPGQ5P3.js +1 -0
  62. package/build/assets/index-home-Bko2Itv5.js +1 -0
  63. package/build/assets/install-server-modal-Qk1gwyI8.js +1 -0
  64. package/build/assets/{launch-V_3Rp7WS.js → launch-CAGavYl-.js} +1 -1
  65. package/build/assets/lesson-plan-DMCPdtrf.js +4 -0
  66. package/build/assets/{list-todo-BfH6yYUK.js → list-todo-CAtvkzcy.js} +1 -1
  67. package/build/assets/llm-not-configured-banner-C1ktyb3C.js +27 -0
  68. package/build/assets/llm-settings-BBsZFi9l.js +1 -0
  69. package/build/assets/llm-settings-DFkJQr_w.js +1 -0
  70. package/build/assets/llm-subscription-service-Casyzgn1.js +1 -0
  71. package/build/assets/loader-circle-CsAsfLIs.js +1 -0
  72. package/build/assets/{loading-spinner-BLdswi6q.js → loading-spinner-BcdnT0mN.js} +1 -1
  73. package/build/assets/manage-backends-modal-CKQ46rvw.js +1 -0
  74. package/build/assets/manifest-03478bbf.js +1 -0
  75. package/build/assets/{map-provider-BM2SJarp.js → map-provider-BbIb12oh.js} +1 -1
  76. package/build/assets/{markdown-renderer-DMT7Zkpd.js → markdown-renderer-B4V2OMFP.js} +1 -1
  77. package/build/assets/{mcp-BQufNPZ6.js → mcp-BapoJsDc.js} +2 -2
  78. package/build/assets/{messages-BnJCqnFf.js → messages-CUBFMY5o.js} +26 -26
  79. package/build/assets/{modal-body-DouOE5KH.js → modal-body-Cc2zp0xb.js} +1 -1
  80. package/build/assets/{modal-classes-Cf-4tbHz.js → modal-classes-3qT9Ap7Q.js} +1 -1
  81. package/build/assets/{modal-close-button-B6CfxxJj.js → modal-close-button-BcIBUdSq.js} +1 -1
  82. package/build/assets/model-selector-DJrMrFAr.js +1 -0
  83. package/build/assets/onboarding-6NMkdNxV.js +1 -0
  84. package/build/assets/onboarding-modal-Q4AnpIdg.js +1 -0
  85. package/build/assets/organization-service.api-vrRNwOma.js +1 -0
  86. package/build/assets/path-utils-PNfCKQDV.js +1 -0
  87. package/build/assets/{pencil-Dj2XjKmI.js → pencil-CWhApFIT.js} +1 -1
  88. package/build/assets/{plan-components-CcCBmCzW.js → plan-components-BdZXPyZU.js} +1 -1
  89. package/build/assets/{planner-tab-Dhyqcqmb.js → planner-tab-ByOw1he8.js} +1 -1
  90. package/build/assets/plugins-management-service-B75jyC56.js +1 -0
  91. package/build/assets/profiles-service.api-BQTklD5D.js +1 -0
  92. package/build/assets/providers-DfTB2gPd.js +1 -0
  93. package/build/assets/proxy-B3tCGf0X.js +1 -0
  94. package/build/assets/{recommended-automations-launcher-CTcGTl4d.js → recommended-automations-launcher-Bj7PuHY1.js} +1 -1
  95. package/build/assets/{refresh-cw-DM82EIyx.js → refresh-cw-B9B7-vsy.js} +1 -1
  96. package/build/assets/root-CDnuTToz.js +2 -0
  97. package/build/assets/root-CYWeTrWE.css +1 -0
  98. package/build/assets/root-layout-DfYVlcRG.js +2 -0
  99. package/build/assets/{runtime-waiting-state-BsXLElvN.js → runtime-waiting-state-CnyVhX4T.js} +1 -1
  100. package/build/assets/schema-field-CUwk4wrQ.js +1 -0
  101. package/build/assets/sdk-section-page-DLLNrYjI.js +1 -0
  102. package/build/assets/{sdk-settings-schema-Cv7M9eSe.js → sdk-settings-schema-CLR01YIK.js} +1 -1
  103. package/build/assets/search-dIQ09UY2.js +1 -0
  104. package/build/assets/secrets-service-CvyPWJhg.js +1 -0
  105. package/build/assets/{secrets-settings-Cx6yJlyb.js → secrets-settings-CHy72A5C.js} +1 -1
  106. package/build/assets/{segmented-toggle-DyQqPhoD.js → segmented-toggle-kzwZkLaj.js} +1 -1
  107. package/build/assets/settings-B9S8UVQr.js +1 -0
  108. package/build/assets/{settings-dropdown-input-BjunGXJb.js → settings-dropdown-input-Dhx9ErGd.js} +1 -1
  109. package/build/assets/{settings-index-D6sxWSRk.js → settings-index-BKDl2CQ-.js} +1 -1
  110. package/build/assets/{settings-input-bD6npsDm.js → settings-input-BsgQWS5R.js} +1 -1
  111. package/build/assets/{settings-list-classes-Dp_OgzN0.js → settings-list-classes-DSJJX99U.js} +1 -1
  112. package/build/assets/settings-modal-DeK11CyT.js +1 -0
  113. package/build/assets/settings-service.api-DXk5TdeJ.js +1 -0
  114. package/build/assets/{settings-switch-5cuxl8Dc.js → settings-switch-Bes8dIlV.js} +1 -1
  115. package/build/assets/{settings-utils-BMdG65By.js → settings-utils-DzCVfiR3.js} +1 -1
  116. package/build/assets/shared-conversation-9atDzTR4.js +1 -0
  117. package/build/assets/{sidebar-layout-DuzJMMw-.js → sidebar-layout-Bm7pa3Vk.js} +1 -1
  118. package/build/assets/{sidebar-mobile-menu-toggle-VvvX32iF.js → sidebar-mobile-menu-toggle-giMMZctn.js} +1 -1
  119. package/build/assets/{sidebar-nav-link-5AlTT5-j.js → sidebar-nav-link-CHqyFXwV.js} +1 -1
  120. package/build/assets/{sidebar-store-CZuE8AH5.js → sidebar-store-uiUXBU1N.js} +1 -1
  121. package/build/assets/{skill-card-pill-row-eTIkE4nz.js → skill-card-pill-row-BPYKQ3IN.js} +1 -1
  122. package/build/assets/skills-plugins-Tropusio.js +1 -0
  123. package/build/assets/{skills-settings-BUv04tSc.js → skills-settings-BvzBBCWk.js} +2 -2
  124. package/build/assets/{square-chevron-right-Czw3FFWc.js → square-chevron-right-DE-JN-2Z.js} +1 -1
  125. package/build/assets/{styled-tooltip-CgX2oRaK.js → styled-tooltip-B14i_Uac.js} +1 -1
  126. package/build/assets/{suspense-BO1Tl_Vf.js → suspense-DmZ3MSSh.js} +1 -1
  127. package/build/assets/{task-list-tab-0k9PhuqO.js → task-list-tab-DyfgG4MC.js} +1 -1
  128. package/build/assets/telemetry-C5JMEfqB.js +2 -0
  129. package/build/assets/{terminal-B61WrJdS.js → terminal-DRXt2Lr4.js} +1 -1
  130. package/build/assets/{toggle-switch-2j5wwR85.js → toggle-switch-DX_k418f.js} +1 -1
  131. package/build/assets/{trash-2-Be_7y3Mn.js → trash-2-BU6BlW4i.js} +1 -1
  132. package/build/assets/{typography-D8mHDeNG.js → typography-CzfoD9DY.js} +1 -1
  133. package/build/assets/use-acp-credential-form-Bm8qXdlc.js +1 -0
  134. package/build/assets/{use-activate-agent-profile-20v1xU0H.js → use-activate-agent-profile-DlykqEfN.js} +1 -1
  135. package/build/assets/{use-active-agent-profile-BkJN7Xsy.js → use-active-agent-profile-hI-x-UBa.js} +1 -1
  136. package/build/assets/{use-active-conversation-DOZVSVtU.js → use-active-conversation-2qeez40F.js} +1 -1
  137. package/build/assets/use-agent-profiles-0pr5bLS7.js +1 -0
  138. package/build/assets/{use-agent-state-DHZO1obC.js → use-agent-state-C6peDXUm.js} +1 -1
  139. package/build/assets/use-backends-health-CLHPitJM.js +1 -0
  140. package/build/assets/{use-can-manage-org-profiles-C-OhWVBS.js → use-can-manage-org-profiles-Ck_bsNbH.js} +1 -1
  141. package/build/assets/use-cloud-current-user-id-DUCSxNjY.js +1 -0
  142. package/build/assets/use-config-B5r8erYt.js +1 -0
  143. package/build/assets/use-create-conversation-r1JHfKO5.js +1 -0
  144. package/build/assets/{use-create-secret-D0HCOZFu.js → use-create-secret-Cf2N11d2.js} +1 -1
  145. package/build/assets/{use-event-store-DjgU4wfO.js → use-event-store-Bbaz51GR.js} +1 -1
  146. package/build/assets/{use-handle-plan-click-DyRASKMC.js → use-handle-plan-click-CsAW3FlH.js} +1 -1
  147. package/build/assets/use-is-authed-BezEyfeh.js +1 -0
  148. package/build/assets/use-llm-profiles-Dr5__SlZ.js +1 -0
  149. package/build/assets/use-plugins-marketplace-BplU65ae.js +1 -0
  150. package/build/assets/use-runtime-is-ready-vCFOcLFa.js +1 -0
  151. package/build/assets/use-save-agent-profile-RqUGqTv6.js +1 -0
  152. package/build/assets/use-save-settings-Chvzeu2s.js +1 -0
  153. package/build/assets/use-settings-CyxSlyTQ.js +1 -0
  154. package/build/assets/use-settings-nav-items-zEkSO_Bf.js +16 -0
  155. package/build/assets/use-skills-xrVoKYrF.js +1 -0
  156. package/build/assets/{use-task-list-AVBLbbcR.js → use-task-list-CfisapBW.js} +1 -1
  157. package/build/assets/use-tracking-D2Qg5Lpd.js +1 -0
  158. package/build/assets/{use-user-conversation-zpx7I18x.js → use-user-conversation-CnE4zhOA.js} +1 -1
  159. package/build/assets/{useMutation-DrCAVg5w.js → useMutation-u8UgRgDK.js} +1 -1
  160. package/build/assets/{useMutationState-D8QN0ZCy.js → useMutationState-OnAsCLA_.js} +1 -1
  161. package/build/assets/{useQueries-DClgUTc7.js → useQueries-BpIlT8Mt.js} +1 -1
  162. package/build/assets/{useQuery-CRBP8vIS.js → useQuery-D5pEZbY0.js} +1 -1
  163. package/build/assets/{useTranslation-CDRCKC9-.js → useTranslation-Cbf5AGg_.js} +1 -1
  164. package/build/assets/{utils-D3U3rlqr.js → utils-DB9LsAzA.js} +1 -1
  165. package/build/assets/{vendor~browser-tab-Di0kh5Zw.js → vendor~browser-tab-CsMb-pta.js} +1 -1
  166. package/build/assets/{vendor~browser-Cvg7jXCP.js → vendor~browser-wXQ-WZEC.js} +1 -1
  167. package/build/assets/{vendor~entry.client-9tWQ_Ugw.js → vendor~entry.client-DDuH4--y.js} +1 -1
  168. package/build/assets/{vendor~entry.client-D6BtSOtn.js → vendor~entry.client-DQGrNspu.js} +1 -1
  169. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-eGLBu60s.js +2 -0
  170. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~iztiaf2o-rqo6vRFz.js +185 -0
  171. package/build/assets/{vendor~files-tab-B02k3xvx.js → vendor~files-tab-B-5fBohe.js} +1 -1
  172. package/build/assets/{vendor~home~conversation-panel~conversation-CYMF9JYB.js → vendor~index-home~home~conversation-panel~conversation-ChmYLVgz.js} +1 -1
  173. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD7v71DM.js +2 -0
  174. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BT05Osu4.js} +1 -1
  175. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DgzWSMRc.js} +1 -1
  176. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DqZatR3B.js} +1 -1
  177. package/build/assets/{vendor~launch-CHXA9cJu.js → vendor~launch-_Km3J77E.js} +1 -1
  178. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~ivvrgjsa-BlIZPCXX.js → vendor~module-D5a_AClf.js} +1 -1
  179. package/build/assets/{vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js → vendor~root-layout~conversation-panel~conversation-8tIsyrPj.js} +1 -1
  180. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-BrguKXCn.js} +1 -1
  181. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BTvhGHHG.js} +1 -1
  182. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation~aler~gfu7qdtz-BOKQkbc6.js} +1 -1
  183. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-B0EIDu4M.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~ftka0fnu-cFNmfAE6.js} +2 -2
  184. package/build/assets/{verification-settings-D576N2xa.js → verification-settings-CfkrXoSa.js} +1 -1
  185. package/build/assets/x-ZE4iplpF.js +1 -0
  186. package/build/index.html +4 -4
  187. package/build/locales/ar/openhands.json +9 -0
  188. package/build/locales/ca/openhands.json +9 -0
  189. package/build/locales/de/openhands.json +9 -0
  190. package/build/locales/en/openhands.json +9 -0
  191. package/build/locales/es/openhands.json +9 -0
  192. package/build/locales/fr/openhands.json +9 -0
  193. package/build/locales/it/openhands.json +9 -0
  194. package/build/locales/ja/openhands.json +9 -0
  195. package/build/locales/ko-KR/openhands.json +9 -0
  196. package/build/locales/no/openhands.json +9 -0
  197. package/build/locales/pt/openhands.json +9 -0
  198. package/build/locales/tr/openhands.json +9 -0
  199. package/build/locales/uk/openhands.json +9 -0
  200. package/build/locales/zh-CN/openhands.json +9 -0
  201. package/build/locales/zh-TW/openhands.json +9 -0
  202. package/config/defaults.json +5 -4
  203. package/dist/api/agent-server-adapter.cjs +3 -3
  204. package/dist/api/agent-server-adapter.cjs.map +1 -1
  205. package/dist/api/agent-server-adapter.d.ts +9 -1
  206. package/dist/api/agent-server-adapter.js +105 -102
  207. package/dist/api/agent-server-adapter.js.map +1 -1
  208. package/dist/api/agent-server-config.cjs +1 -1
  209. package/dist/api/agent-server-config.cjs.map +1 -1
  210. package/dist/api/agent-server-config.d.ts +3 -0
  211. package/dist/api/agent-server-config.js +45 -23
  212. package/dist/api/agent-server-config.js.map +1 -1
  213. package/dist/api/backend-registry/auth.cjs +1 -1
  214. package/dist/api/backend-registry/auth.cjs.map +1 -1
  215. package/dist/api/backend-registry/auth.js +1 -1
  216. package/dist/api/backend-registry/auth.js.map +1 -1
  217. package/dist/api/backend-registry/default-backend.cjs +1 -1
  218. package/dist/api/backend-registry/default-backend.cjs.map +1 -1
  219. package/dist/api/backend-registry/default-backend.d.ts +3 -0
  220. package/dist/api/backend-registry/default-backend.js +22 -10
  221. package/dist/api/backend-registry/default-backend.js.map +1 -1
  222. package/dist/api/backend-registry/storage.cjs +1 -1
  223. package/dist/api/backend-registry/storage.cjs.map +1 -1
  224. package/dist/api/backend-registry/storage.js +38 -33
  225. package/dist/api/backend-registry/storage.js.map +1 -1
  226. package/dist/api/backend-registry/types.d.ts +2 -0
  227. package/dist/api/canvas-ui-client-tool.cjs +38 -0
  228. package/dist/api/canvas-ui-client-tool.cjs.map +1 -0
  229. package/dist/api/canvas-ui-client-tool.d.ts +14 -0
  230. package/dist/api/canvas-ui-client-tool.js +47 -0
  231. package/dist/api/canvas-ui-client-tool.js.map +1 -0
  232. package/dist/api/client-source.cjs +2 -0
  233. package/dist/api/client-source.cjs.map +1 -0
  234. package/dist/api/client-source.d.ts +9 -0
  235. package/dist/api/client-source.js +10 -0
  236. package/dist/api/client-source.js.map +1 -0
  237. package/dist/api/cloud/client.cjs +2 -0
  238. package/dist/api/cloud/client.cjs.map +1 -0
  239. package/dist/api/cloud/client.d.ts +4 -0
  240. package/dist/api/cloud/client.js +38 -0
  241. package/dist/api/cloud/client.js.map +1 -0
  242. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  243. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  244. package/dist/api/cloud/conversation-service.api.js +35 -33
  245. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  246. package/dist/api/cloud/organization-service.api.cjs +1 -1
  247. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  248. package/dist/api/cloud/organization-service.api.js +11 -10
  249. package/dist/api/cloud/organization-service.api.js.map +1 -1
  250. package/dist/api/cloud/proxy.cjs +1 -1
  251. package/dist/api/cloud/proxy.cjs.map +1 -1
  252. package/dist/api/cloud/proxy.d.ts +2 -40
  253. package/dist/api/cloud/proxy.js +14 -39
  254. package/dist/api/cloud/proxy.js.map +1 -1
  255. package/dist/api/conversation-metadata-store.cjs +1 -1
  256. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  257. package/dist/api/conversation-metadata-store.d.ts +2 -9
  258. package/dist/api/conversation-metadata-store.js +13 -9
  259. package/dist/api/conversation-metadata-store.js.map +1 -1
  260. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  261. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  262. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +2 -1
  263. package/dist/api/conversation-service/agent-server-conversation-service.api.js +98 -88
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  265. package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +5 -0
  266. package/dist/api/device-flow-client.cjs +1 -1
  267. package/dist/api/device-flow-client.cjs.map +1 -1
  268. package/dist/api/device-flow-client.d.ts +4 -58
  269. package/dist/api/device-flow-client.js +8 -98
  270. package/dist/api/device-flow-client.js.map +1 -1
  271. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  272. package/dist/api/git-service/agent-server-git-service.api.cjs.map +1 -1
  273. package/dist/api/git-service/agent-server-git-service.api.d.ts +10 -2
  274. package/dist/api/git-service/agent-server-git-service.api.js +107 -40
  275. package/dist/api/git-service/agent-server-git-service.api.js.map +1 -1
  276. package/dist/api/open-hands.types.d.ts +11 -0
  277. package/dist/api/option-service/option-service.api.cjs +1 -1
  278. package/dist/api/option-service/option-service.api.cjs.map +1 -1
  279. package/dist/api/option-service/option-service.api.js +0 -1
  280. package/dist/api/option-service/option-service.api.js.map +1 -1
  281. package/dist/api/option-service/option.types.d.ts +0 -1
  282. package/dist/api/secrets-service.cjs +1 -1
  283. package/dist/api/secrets-service.cjs.map +1 -1
  284. package/dist/api/secrets-service.js +15 -14
  285. package/dist/api/secrets-service.js.map +1 -1
  286. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  287. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  288. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +73 -64
  289. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  290. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs +2 -2
  291. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs.map +1 -1
  292. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js +2 -0
  293. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js.map +1 -1
  294. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  295. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  296. package/dist/components/features/backends/backend-form-modal.d.ts +4 -2
  297. package/dist/components/features/backends/backend-form-modal.js +108 -101
  298. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  299. package/dist/components/features/backends/backend-row.cjs +1 -1
  300. package/dist/components/features/backends/backend-row.cjs.map +1 -1
  301. package/dist/components/features/backends/backend-row.js +2 -1
  302. package/dist/components/features/backends/backend-row.js.map +1 -1
  303. package/dist/components/features/backends/backend-selector.cjs +1 -1
  304. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  305. package/dist/components/features/backends/backend-selector.js +51 -51
  306. package/dist/components/features/backends/backend-selector.js.map +1 -1
  307. package/dist/components/features/backends/device-flow-auth.cjs +1 -1
  308. package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
  309. package/dist/components/features/backends/device-flow-auth.d.ts +4 -1
  310. package/dist/components/features/backends/device-flow-auth.js +38 -38
  311. package/dist/components/features/backends/device-flow-auth.js.map +1 -1
  312. package/dist/components/features/chat/chat-interface.cjs +2 -2
  313. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  314. package/dist/components/features/chat/chat-interface.js +173 -165
  315. package/dist/components/features/chat/chat-interface.js.map +1 -1
  316. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  317. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  318. package/dist/components/features/chat/components/chat-input-actions.d.ts +2 -1
  319. package/dist/components/features/chat/components/chat-input-actions.js +44 -43
  320. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  321. package/dist/components/features/chat/components/chat-input-container.cjs +1 -1
  322. package/dist/components/features/chat/components/chat-input-container.cjs.map +1 -1
  323. package/dist/components/features/chat/components/chat-input-container.d.ts +2 -1
  324. package/dist/components/features/chat/components/chat-input-container.js +20 -19
  325. package/dist/components/features/chat/components/chat-input-container.js.map +1 -1
  326. package/dist/components/features/chat/components/chat-input-profile-picker.cjs +1 -1
  327. package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -1
  328. package/dist/components/features/chat/components/chat-input-profile-picker.js +44 -32
  329. package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -1
  330. package/dist/components/features/chat/components/resolve-picker-kind.cjs +1 -1
  331. package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -1
  332. package/dist/components/features/chat/components/resolve-picker-kind.d.ts +10 -22
  333. package/dist/components/features/chat/components/resolve-picker-kind.js +6 -3
  334. package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -1
  335. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  336. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  337. package/dist/components/features/chat/custom-chat-input.d.ts +2 -1
  338. package/dist/components/features/chat/custom-chat-input.js +52 -51
  339. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  340. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  341. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  342. package/dist/components/features/chat/interactive-chat-box.d.ts +2 -1
  343. package/dist/components/features/chat/interactive-chat-box.js +9 -8
  344. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  345. package/dist/components/features/diff-viewer/commit-list.cjs +2 -0
  346. package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -0
  347. package/dist/components/features/diff-viewer/commit-list.d.ts +13 -0
  348. package/dist/components/features/diff-viewer/commit-list.js +27 -0
  349. package/dist/components/features/diff-viewer/commit-list.js.map +1 -0
  350. package/dist/components/features/diff-viewer/commit-row.cjs +2 -0
  351. package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -0
  352. package/dist/components/features/diff-viewer/commit-row.d.ts +14 -0
  353. package/dist/components/features/diff-viewer/commit-row.js +59 -0
  354. package/dist/components/features/diff-viewer/commit-row.js.map +1 -0
  355. package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
  356. package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
  357. package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +7 -1
  358. package/dist/components/features/diff-viewer/file-diff-viewer.js +40 -39
  359. package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
  360. package/dist/components/features/plugins/plugin-detail-modal.d.ts +2 -1
  361. package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
  362. package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
  363. package/dist/components/providers/agent-server-ui-providers.d.ts +4 -2
  364. package/dist/components/providers/agent-server-ui-providers.js +9 -2
  365. package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
  366. package/dist/components/providers/index.cjs +1 -1
  367. package/dist/components/providers/index.d.ts +1 -2
  368. package/dist/components/providers/index.js +0 -1
  369. package/dist/components/providers/telemetry-provider.cjs +2 -0
  370. package/dist/components/providers/telemetry-provider.cjs.map +1 -0
  371. package/dist/components/providers/telemetry-provider.d.ts +6 -0
  372. package/dist/components/providers/telemetry-provider.js +64 -0
  373. package/dist/components/providers/telemetry-provider.js.map +1 -0
  374. package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
  375. package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
  376. package/dist/components/shared/modals/settings/settings-modal.js +23 -22
  377. package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
  378. package/dist/config/defaults.cjs +1 -1
  379. package/dist/config/defaults.cjs.map +1 -1
  380. package/dist/config/defaults.js +5 -4
  381. package/dist/config/defaults.js.map +1 -1
  382. package/dist/constants/acp-providers.cjs.map +1 -1
  383. package/dist/constants/acp-providers.d.ts +1 -1
  384. package/dist/constants/acp-providers.js.map +1 -1
  385. package/dist/constants/canvas-ui.cjs +2 -0
  386. package/dist/constants/canvas-ui.cjs.map +1 -0
  387. package/dist/constants/canvas-ui.d.ts +8 -0
  388. package/dist/constants/canvas-ui.js +6 -0
  389. package/dist/constants/canvas-ui.js.map +1 -0
  390. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  391. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  392. package/dist/contexts/conversation-websocket-context.js +197 -204
  393. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  394. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  395. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  396. package/dist/hooks/mutation/use-create-conversation.d.ts +2 -1
  397. package/dist/hooks/mutation/use-create-conversation.js +52 -52
  398. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  399. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  400. package/dist/hooks/mutation/use-save-settings.cjs.map +1 -1
  401. package/dist/hooks/mutation/use-save-settings.d.ts +3 -1
  402. package/dist/hooks/mutation/use-save-settings.js +6 -5
  403. package/dist/hooks/mutation/use-save-settings.js.map +1 -1
  404. package/dist/hooks/query/query-keys.cjs +1 -1
  405. package/dist/hooks/query/query-keys.cjs.map +1 -1
  406. package/dist/hooks/query/query-keys.d.ts +2 -0
  407. package/dist/hooks/query/query-keys.js +4 -1
  408. package/dist/hooks/query/query-keys.js.map +1 -1
  409. package/dist/hooks/query/use-backends-health.cjs +1 -1
  410. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  411. package/dist/hooks/query/use-backends-health.js +50 -48
  412. package/dist/hooks/query/use-backends-health.js.map +1 -1
  413. package/dist/hooks/query/use-cloud-organizations.cjs +1 -1
  414. package/dist/hooks/query/use-cloud-organizations.cjs.map +1 -1
  415. package/dist/hooks/query/use-cloud-organizations.d.ts +1 -0
  416. package/dist/hooks/query/use-cloud-organizations.js +5 -2
  417. package/dist/hooks/query/use-cloud-organizations.js.map +1 -1
  418. package/dist/hooks/query/use-commit-changes.cjs +2 -0
  419. package/dist/hooks/query/use-commit-changes.cjs.map +1 -0
  420. package/dist/hooks/query/use-commit-changes.d.ts +5 -0
  421. package/dist/hooks/query/use-commit-changes.js +34 -0
  422. package/dist/hooks/query/use-commit-changes.js.map +1 -0
  423. package/dist/hooks/query/use-task-polling.cjs +1 -1
  424. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  425. package/dist/hooks/query/use-task-polling.d.ts +3 -2
  426. package/dist/hooks/query/use-task-polling.js +53 -40
  427. package/dist/hooks/query/use-task-polling.js.map +1 -1
  428. package/dist/hooks/query/use-unified-git-commits.cjs +2 -0
  429. package/dist/hooks/query/use-unified-git-commits.cjs.map +1 -0
  430. package/dist/hooks/query/use-unified-git-commits.d.ts +10 -0
  431. package/dist/hooks/query/use-unified-git-commits.js +41 -0
  432. package/dist/hooks/query/use-unified-git-commits.js.map +1 -0
  433. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  434. package/dist/hooks/query/use-unified-git-diff.cjs.map +1 -1
  435. package/dist/hooks/query/use-unified-git-diff.d.ts +5 -0
  436. package/dist/hooks/query/use-unified-git-diff.js +11 -4
  437. package/dist/hooks/query/use-unified-git-diff.js.map +1 -1
  438. package/dist/hooks/use-acp-model-context.cjs +1 -1
  439. package/dist/hooks/use-acp-model-context.cjs.map +1 -1
  440. package/dist/hooks/use-acp-model-context.d.ts +4 -1
  441. package/dist/hooks/use-acp-model-context.js +9 -8
  442. package/dist/hooks/use-acp-model-context.js.map +1 -1
  443. package/dist/hooks/use-auto-refresh-files-on-edit.cjs +1 -1
  444. package/dist/hooks/use-auto-refresh-files-on-edit.cjs.map +1 -1
  445. package/dist/hooks/use-auto-refresh-files-on-edit.js +1 -1
  446. package/dist/hooks/use-auto-refresh-files-on-edit.js.map +1 -1
  447. package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
  448. package/dist/hooks/use-chat-input-model-state.d.ts +2 -1
  449. package/dist/hooks/use-chat-input-model-state.js.map +1 -1
  450. package/dist/hooks/use-chat-input-profile-state.cjs +1 -1
  451. package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -1
  452. package/dist/hooks/use-chat-input-profile-state.d.ts +1 -10
  453. package/dist/hooks/use-chat-input-profile-state.js +42 -15
  454. package/dist/hooks/use-chat-input-profile-state.js.map +1 -1
  455. package/dist/hooks/use-device-flow.cjs +1 -1
  456. package/dist/hooks/use-device-flow.cjs.map +1 -1
  457. package/dist/hooks/use-device-flow.d.ts +4 -1
  458. package/dist/hooks/use-device-flow.js +42 -40
  459. package/dist/hooks/use-device-flow.js.map +1 -1
  460. package/dist/hooks/use-telemetry.cjs +1 -1
  461. package/dist/hooks/use-telemetry.cjs.map +1 -1
  462. package/dist/hooks/use-telemetry.d.ts +3 -3
  463. package/dist/hooks/use-telemetry.js +16 -22
  464. package/dist/hooks/use-telemetry.js.map +1 -1
  465. package/dist/hooks/use-tracking.cjs +1 -1
  466. package/dist/hooks/use-tracking.cjs.map +1 -1
  467. package/dist/hooks/use-tracking.d.ts +5 -5
  468. package/dist/hooks/use-tracking.js +37 -37
  469. package/dist/hooks/use-tracking.js.map +1 -1
  470. package/dist/i18n/declaration.cjs +1 -1
  471. package/dist/i18n/declaration.cjs.map +1 -1
  472. package/dist/i18n/declaration.d.ts +9 -0
  473. package/dist/i18n/declaration.js +1 -1
  474. package/dist/i18n/declaration.js.map +1 -1
  475. package/dist/i18n/index.cjs +1 -1
  476. package/dist/i18n/index.cjs.map +1 -1
  477. package/dist/i18n/index.js +19 -18
  478. package/dist/i18n/index.js.map +1 -1
  479. package/dist/i18n/translation.cjs +2 -2
  480. package/dist/i18n/translation.cjs.map +1 -1
  481. package/dist/i18n/translation.js +153 -0
  482. package/dist/i18n/translation.js.map +1 -1
  483. package/dist/index.cjs +1 -1
  484. package/dist/index.js +32 -32
  485. package/dist/lib/index.cjs +1 -1
  486. package/dist/lib/index.d.ts +2 -2
  487. package/dist/lib/index.js +1 -1
  488. package/dist/locales/ar/openhands.json +9 -0
  489. package/dist/locales/ca/openhands.json +9 -0
  490. package/dist/locales/de/openhands.json +9 -0
  491. package/dist/locales/en/openhands.json +9 -0
  492. package/dist/locales/es/openhands.json +9 -0
  493. package/dist/locales/fr/openhands.json +9 -0
  494. package/dist/locales/it/openhands.json +9 -0
  495. package/dist/locales/ja/openhands.json +9 -0
  496. package/dist/locales/ko-KR/openhands.json +9 -0
  497. package/dist/locales/no/openhands.json +9 -0
  498. package/dist/locales/pt/openhands.json +9 -0
  499. package/dist/locales/tr/openhands.json +9 -0
  500. package/dist/locales/uk/openhands.json +9 -0
  501. package/dist/locales/zh-CN/openhands.json +9 -0
  502. package/dist/locales/zh-TW/openhands.json +9 -0
  503. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs +2 -0
  504. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs.map +1 -0
  505. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js +351 -0
  506. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js.map +1 -0
  507. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs +2 -0
  508. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs.map +1 -0
  509. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js +106 -0
  510. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js.map +1 -0
  511. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +2 -0
  512. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -0
  513. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +69 -0
  514. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -0
  515. package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
  516. package/dist/node_modules/@openhands/typescript-client/dist/clients.js +3 -0
  517. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  518. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  519. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +18 -2
  520. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  521. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.cjs.map +1 -1
  522. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.js.map +1 -1
  523. package/dist/node_modules/axios/index.cjs +1 -1
  524. package/dist/node_modules/axios/index.js +1 -1
  525. package/dist/package.cjs +1 -1
  526. package/dist/package.cjs.map +1 -1
  527. package/dist/package.js +3 -3
  528. package/dist/package.js.map +1 -1
  529. package/dist/routes/app-settings.cjs +1 -1
  530. package/dist/routes/app-settings.cjs.map +1 -1
  531. package/dist/routes/app-settings.js +59 -60
  532. package/dist/routes/app-settings.js.map +1 -1
  533. package/dist/routes/commits-tab.cjs +2 -0
  534. package/dist/routes/commits-tab.cjs.map +1 -0
  535. package/dist/routes/commits-tab.d.ts +8 -0
  536. package/dist/routes/commits-tab.js +45 -0
  537. package/dist/routes/commits-tab.js.map +1 -0
  538. package/dist/routes/files-tab.cjs +1 -1
  539. package/dist/routes/files-tab.cjs.map +1 -1
  540. package/dist/routes/files-tab.js +148 -127
  541. package/dist/routes/files-tab.js.map +1 -1
  542. package/dist/routes/llm-settings.cjs +1 -1
  543. package/dist/routes/llm-settings.cjs.map +1 -1
  544. package/dist/routes/llm-settings.js +4 -1
  545. package/dist/routes/llm-settings.js.map +1 -1
  546. package/dist/services/cloud-funnel-analytics.cjs +2 -0
  547. package/dist/services/cloud-funnel-analytics.cjs.map +1 -0
  548. package/dist/services/cloud-funnel-analytics.d.ts +4 -0
  549. package/dist/services/cloud-funnel-analytics.js +39 -0
  550. package/dist/services/cloud-funnel-analytics.js.map +1 -0
  551. package/dist/services/telemetry.cjs +1 -1
  552. package/dist/services/telemetry.cjs.map +1 -1
  553. package/dist/services/telemetry.d.ts +46 -9
  554. package/dist/services/telemetry.js +182 -71
  555. package/dist/services/telemetry.js.map +1 -1
  556. package/dist/themes/color-themes.cjs.map +1 -1
  557. package/dist/themes/color-themes.d.ts +3 -6
  558. package/dist/themes/color-themes.js.map +1 -1
  559. package/dist/types/agent-server/core/base/action.d.ts +5 -4
  560. package/dist/types/agent-server/core/base/base.d.ts +3 -2
  561. package/dist/types/agent-server/core/base/observation.d.ts +1 -1
  562. package/dist/types/agent-server/type-guards.cjs +1 -1
  563. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  564. package/dist/types/agent-server/type-guards.d.ts +3 -5
  565. package/dist/types/agent-server/type-guards.js +2 -1
  566. package/dist/types/agent-server/type-guards.js.map +1 -1
  567. package/dist/types/automation.d.ts +5 -0
  568. package/dist/utils/api-error-message.d.ts +11 -0
  569. package/dist/utils/automation-timeout.d.ts +19 -0
  570. package/dist/utils/base-path.cjs +2 -0
  571. package/dist/utils/base-path.cjs.map +1 -0
  572. package/dist/utils/base-path.d.ts +2 -0
  573. package/dist/utils/base-path.js +23 -0
  574. package/dist/utils/base-path.js.map +1 -0
  575. package/dist/utils/error-handler.cjs +1 -1
  576. package/dist/utils/error-handler.cjs.map +1 -1
  577. package/dist/utils/error-handler.d.ts +1 -4
  578. package/dist/utils/error-handler.js +6 -7
  579. package/dist/utils/error-handler.js.map +1 -1
  580. package/dist/utils/map-provider.cjs +1 -1
  581. package/dist/utils/map-provider.cjs.map +1 -1
  582. package/dist/utils/map-provider.d.ts +1 -0
  583. package/dist/utils/map-provider.js +2 -1
  584. package/dist/utils/map-provider.js.map +1 -1
  585. package/package.json +3 -3
  586. package/scripts/check-sdk-version-sync.mjs +6 -6
  587. package/scripts/dev-safe.mjs +7 -8
  588. package/scripts/dev-static.mjs +3 -0
  589. package/scripts/dev-with-automation.mjs +3 -0
  590. package/scripts/docker-build.mjs +4 -0
  591. package/scripts/static-server.mjs +93 -7
  592. package/tools/canvas_ui_tool.py +14 -8
  593. package/build/assets/active-backend-context-hxq31W25.js +0 -1
  594. package/build/assets/agent-server-client-options-DVLRd9sw.js +0 -1
  595. package/build/assets/agent-server-conversation-service.api-CuSdr4Qb.js +0 -5
  596. package/build/assets/agent-settings-D_yOy8XB.js +0 -1
  597. package/build/assets/api-key-entry-screen-Dl0qVYi4.js +0 -1
  598. package/build/assets/app-settings-yVizGXox.js +0 -1
  599. package/build/assets/automation-detail-dvJfLs5u.js +0 -2
  600. package/build/assets/automation-export-BPcgLqPD.js +0 -2
  601. package/build/assets/automations-list-CUXogTe0.js +0 -1
  602. package/build/assets/backend-form-modal-CQJGmItq.js +0 -1
  603. package/build/assets/check-Bvi71siz.js +0 -1
  604. package/build/assets/condenser-settings-Ca8fYZ_Z.js +0 -1
  605. package/build/assets/conversation-9NBSRoR9.js +0 -1
  606. package/build/assets/conversation-BXg6Oti2.js +0 -89
  607. package/build/assets/conversation-panel-CZri9Rup.js +0 -1
  608. package/build/assets/conversation-service.api-DPBQvTKD.js +0 -1
  609. package/build/assets/declaration-gq8V5eTU.js +0 -1
  610. package/build/assets/files-tab-UVoray88.js +0 -1
  611. package/build/assets/git-provider-icon-o6hdnJUB.js +0 -1
  612. package/build/assets/handle-capture-consent-CPMXU29K.js +0 -1
  613. package/build/assets/home-D1IHvGTN.js +0 -1
  614. package/build/assets/index-redirect-CUUJiNki.js +0 -1
  615. package/build/assets/install-server-modal-BbuQaA2w.js +0 -1
  616. package/build/assets/lesson-plan-jC0HBoe6.js +0 -4
  617. package/build/assets/llm-not-configured-banner-DoARbcdL.js +0 -27
  618. package/build/assets/llm-settings-4JMLV8mq.js +0 -1
  619. package/build/assets/llm-settings-D91gMw3U.js +0 -1
  620. package/build/assets/llm-subscription-service-CKyaV24y.js +0 -1
  621. package/build/assets/loader-circle-BEykUKYG.js +0 -1
  622. package/build/assets/manage-backends-modal-DkWAMSle.js +0 -1
  623. package/build/assets/manifest-aa5c29f6.js +0 -1
  624. package/build/assets/model-selector-BfqpMkSJ.js +0 -1
  625. package/build/assets/mouse-pointer-click-PdEQPL6v.js +0 -1
  626. package/build/assets/onboarding-Bu-HN1ze.js +0 -1
  627. package/build/assets/onboarding-modal-CZgjs5Bx.js +0 -1
  628. package/build/assets/option-service.api-BrZ5q87N.js +0 -1
  629. package/build/assets/organization-service.api-Bk4pCGU1.js +0 -1
  630. package/build/assets/path-utils-CSmuZoix.js +0 -1
  631. package/build/assets/plugins-management-service-BRBLxvUl.js +0 -1
  632. package/build/assets/profiles-service.api-BMXQ9pZC.js +0 -1
  633. package/build/assets/providers-BpO967xS.js +0 -1
  634. package/build/assets/proxy-BgJLtxu7.js +0 -1
  635. package/build/assets/root-BM5WgQ4_.js +0 -2
  636. package/build/assets/root-V8fkplMy.css +0 -1
  637. package/build/assets/root-layout-BdoyoobY.js +0 -2
  638. package/build/assets/schema-field-BSHrUMme.js +0 -1
  639. package/build/assets/sdk-section-page-t82gsOqa.js +0 -1
  640. package/build/assets/search-4DHskuhE.js +0 -1
  641. package/build/assets/secrets-service-B2GqPV0N.js +0 -1
  642. package/build/assets/settings-DmPLkgq0.js +0 -1
  643. package/build/assets/settings-modal-CwrZKrTq.js +0 -1
  644. package/build/assets/settings-service.api-Ce-ub11I.js +0 -1
  645. package/build/assets/shared-conversation-BDREQPnE.js +0 -1
  646. package/build/assets/skills-plugins-2Y44YHbO.js +0 -1
  647. package/build/assets/use-acp-credential-form-MzZM6D7D.js +0 -1
  648. package/build/assets/use-agent-profiles-DwZxnwO5.js +0 -1
  649. package/build/assets/use-backends-health-CRHzuvxO.js +0 -1
  650. package/build/assets/use-cloud-current-user-id-utFreJ0i.js +0 -1
  651. package/build/assets/use-config-mJrtZHP1.js +0 -1
  652. package/build/assets/use-create-conversation-DdqsP78F.js +0 -1
  653. package/build/assets/use-is-authed-B6M0mcGL.js +0 -1
  654. package/build/assets/use-llm-profiles-RC-PkpBl.js +0 -1
  655. package/build/assets/use-plugins-marketplace-FHlbeQ4c.js +0 -1
  656. package/build/assets/use-runtime-is-ready-RKj2WmEh.js +0 -1
  657. package/build/assets/use-save-agent-profile-tvDP15mh.js +0 -1
  658. package/build/assets/use-save-settings-BGlSfuYn.js +0 -1
  659. package/build/assets/use-settings-CH5LzXD8.js +0 -1
  660. package/build/assets/use-settings-nav-items-Dwktv8wo.js +0 -16
  661. package/build/assets/use-skills-CSzSL6HG.js +0 -1
  662. package/build/assets/use-tracking-BIXzagSI.js +0 -1
  663. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~lf310vj7-CSVPGId3.js +0 -10
  664. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nfpll1wp-BCpa95De.js +0 -177
  665. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jewnulst-C57fm7C-.js +0 -1
  666. package/build/assets/vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js +0 -2
  667. package/build/assets/x-Cb0WAtak.js +0 -1
  668. package/dist/components/providers/posthog-wrapper.cjs +0 -2
  669. package/dist/components/providers/posthog-wrapper.cjs.map +0 -1
  670. package/dist/components/providers/posthog-wrapper.d.ts +0 -4
  671. package/dist/components/providers/posthog-wrapper.js +0 -49
  672. package/dist/components/providers/posthog-wrapper.js.map +0 -1
  673. package/dist/node_modules/posthog-js/react/dist/esm/index.cjs +0 -2
  674. package/dist/node_modules/posthog-js/react/dist/esm/index.cjs.map +0 -1
  675. package/dist/node_modules/posthog-js/react/dist/esm/index.js +0 -113
  676. package/dist/node_modules/posthog-js/react/dist/esm/index.js.map +0 -1
  677. package/dist/utils/handle-capture-consent.cjs +0 -2
  678. package/dist/utils/handle-capture-consent.cjs.map +0 -1
  679. package/dist/utils/handle-capture-consent.d.ts +0 -7
  680. package/dist/utils/handle-capture-consent.js +0 -8
  681. package/dist/utils/handle-capture-consent.js.map +0 -1
  682. /package/build/assets/{__vite-browser-external-4xJsU2-u.js → __vite-browser-external-BQUj0sYu.js} +0 -0
  683. /package/build/assets/{agent-server-ui-style-scope-COnDHTm5.js → agent-server-ui-style-scope-qhnhZHBV.js} +0 -0
  684. /package/build/assets/{automation-BU8zu-FP.js → automation-LZB0MjdV.js} +0 -0
  685. /package/build/assets/{close-p3Op5lxI.js → close-DLFb5kfv.js} +0 -0
  686. /package/build/assets/{common-Dh7OqABE.js → common-CxbUL3nR.js} +0 -0
  687. /package/build/assets/{createLucideIcon-CVAsW2Yo.js → createLucideIcon-D4Tak8A1.js} +0 -0
  688. /package/build/assets/{folder-mMWFvaw0.js → folder-Bk311brm.js} +0 -0
  689. /package/build/assets/{get-language-from-path-CPNnuVhI.js → get-language-from-path-DBqBsCWH.js} +0 -0
  690. /package/build/assets/{git-status-mapper-BI8FyUVp.js → git-status-mapper-DnL9OC8_.js} +0 -0
  691. /package/build/assets/{iconBase-DaTRRUjy.js → iconBase-Dz51Zn5x.js} +0 -0
  692. /package/build/assets/{link-external-DfKQroKX.js → link-external-CaBmUEs_.js} +0 -0
  693. /package/build/assets/{search-BsjCEFNf.js → search-BgOCR7_c.js} +0 -0
  694. /package/build/assets/{settings-like-page-layout-classes-DENKlZpD.js → settings-like-page-layout-classes-Cdl6jOe5.js} +0 -0
  695. /package/build/assets/{skills-9cDZONKh.js → skills-EqzxYBvT.js} +0 -0
  696. /package/build/assets/{terminal-BuLtIrb9.js → terminal-Cgf___rK.js} +0 -0
  697. /package/build/assets/{u-check-circle-half-LiwZkuFe.js → u-check-circle-half-MsShT8Ec.js} +0 -0
  698. /package/build/assets/{u-edit-DJ90xc8Z.js → u-edit-DL5LgKon.js} +0 -0
  699. /package/build/assets/{use-breakpoint-B-O0lQ84.js → use-breakpoint-BP3lqLMx.js} +0 -0
  700. /package/build/assets/{use-click-outside-element-Bf4Omzot.js → use-click-outside-element-D9BYdANT.js} +0 -0
  701. /package/build/assets/{use-launch-skill-in-chat-BnoDgvAy.js → use-launch-skill-in-chat-DJWEfVc5.js} +0 -0
  702. /package/build/assets/{vendor~browser-Dqd33JyP.js → vendor~browser-By2MVv_N.js} +0 -0
  703. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js → vendor~conversation-panel~conversation~alert-banner-CxfzCmkN.js} +0 -0
  704. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~epa72zsm-B4rXs7Zd.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~e0djk9ee-Cw6LUe8p.js} +0 -0
  705. /package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~jkpzbynd-CkpBIhVe.js} +0 -0
  706. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-COhHANvV.js} +0 -0
  707. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-FghQ3Z1a.js} +0 -0
  708. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-rV6d1Iv_.js → vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~j2jlu22h-mC0v44WR.js} +0 -0
  709. /package/build/assets/{vendor~root-layout~home~mcp~automations-list~onboarding-modal-CXyYYvYh.js → vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-C4-GDgiF.js} +0 -0
  710. /package/build/assets/{vendor~terminal-aeP3PnKf.js → vendor~terminal-CnKZILnC.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.4.0\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.9.0\",\n \"@openhands/typescript-client\": \"1.32.1\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"httpxy\": \"0.5.3\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"1.8.4\",\n \"sirv\": \"3.0.2\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"3.19.0\",\n \"winston-daily-rotate-file\": \"5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\",\n \"example:acp-docker:env\": \"node scripts/gen-acp-docker-env.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"node scripts/run-staged-typecheck.mjs\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.5.1\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.9.0\",\n \"@openhands/typescript-client\": \"1.34.0\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"httpxy\": \"0.5.3\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"1.8.4\",\n \"sirv\": \"3.0.2\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"3.19.0\",\n \"winston-daily-rotate-file\": \"5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\",\n \"example:acp-docker:env\": \"node scripts/gen-acp-docker-env.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"node scripts/run-staged-typecheck.mjs\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../i18n/declaration.cjs`),r=require(`../i18n/index.cjs`),i=require(`../utils/retrieve-axios-error-message.cjs`),a=require(`../utils/custom-toast-handlers.cjs`),o=require(`../node_modules/posthog-js/react/dist/esm/index.cjs`),s=require(`../services/settings.cjs`),c=require(`../hooks/query/use-settings.cjs`),l=require(`../components/features/settings/brand-button.cjs`),u=require(`../hooks/mutation/use-save-settings.cjs`),d=require(`../components/features/settings/settings-switch.cjs`),f=require(`../components/features/settings/settings-input.cjs`),p=require(`../components/features/settings/app-settings/language-input.cjs`),m=require(`../components/features/settings/app-settings/theme-input.cjs`),h=require(`../utils/handle-capture-consent.cjs`),g=require(`../components/features/settings/app-settings/app-settings-inputs-skeleton.cjs`);let _=require(`react`);_=e.__toESM(_,1);let v=require(`react/jsx-runtime`);function y(){let e=o.usePostHog(),{t:y}=t.useTranslation(`openhands`),{mutate:b,isPending:x}=u.useSaveSettings(),{data:S,isLoading:C}=c.useSettings(),[w,T]=_.default.useState(!1),[E,D]=_.default.useState(!1),[O,k]=_.default.useState(!1),[A,j]=_.default.useState(!1),[M,N]=_.default.useState(!1),P=t=>{let o=t.get(`language-input`)?.toString(),c=r.AvailableLanguages.find(({label:e})=>e===o)?.value||s.DEFAULT_SETTINGS.language,l=t.get(`enable-analytics-switch`)?.toString()===`on`;b({language:c,user_consents_to_analytics:l,enable_sound_notifications:t.get(`enable-sound-notifications-switch`)?.toString()===`on`,git_user_name:t.get(`git-user-name-input`)?.toString()||s.DEFAULT_SETTINGS.git_user_name,git_user_email:t.get(`git-user-email-input`)?.toString()||s.DEFAULT_SETTINGS.git_user_email},{onSuccess:()=>{h.handleCaptureConsent(e,l),a.displaySuccessToast(y(n.I18nKey.SETTINGS$SAVED))},onError:e=>{a.displayErrorToast(i.retrieveAxiosErrorMessage(e)||y(n.I18nKey.ERROR$GENERIC))},onSettled:()=>{T(!1),D(!1),k(!1),j(!1),N(!1)}})},F=e=>{let t=r.AvailableLanguages.find(({label:t})=>t===e)?.label,n=r.AvailableLanguages.find(({value:e})=>e===S?.language)?.label;T(t!==n)},I=e=>{D(e!==(S?.user_consents_to_analytics??!0))},L=e=>{k(e!==!!S?.enable_sound_notifications)},R=e=>{let t=S?.git_user_name;j(e!==t)},z=e=>{let t=S?.git_user_email;N(e!==t)},B=!w&&!E&&!O&&!A&&!M,V=!S||C||x;return(0,v.jsxs)(`form`,{"data-testid":`app-settings-screen`,action:P,className:`flex flex-col gap-6`,children:[V&&(0,v.jsx)(g.AppSettingsInputsSkeleton,{}),!V&&(0,v.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,v.jsx)(p.LanguageInput,{name:`language-input`,defaultKey:S.language,onChange:F}),(0,v.jsx)(m.ThemeInput,{}),(0,v.jsx)(d.SettingsSwitch,{testId:`enable-analytics-switch`,name:`enable-analytics-switch`,defaultIsToggled:S.user_consents_to_analytics??!0,onToggle:I,children:y(n.I18nKey.ANALYTICS$SEND_ANONYMOUS_DATA)}),(0,v.jsx)(d.SettingsSwitch,{testId:`enable-sound-notifications-switch`,name:`enable-sound-notifications-switch`,defaultIsToggled:!!S.enable_sound_notifications,onToggle:L,children:y(n.I18nKey.SETTINGS$SOUND_NOTIFICATIONS)}),(0,v.jsxs)(`div`,{className:`border-t border-[var(--oh-border)] pt-6 mt-2`,children:[(0,v.jsx)(`h3`,{className:`text-lg font-medium mb-2`,children:y(n.I18nKey.SETTINGS$GIT_SETTINGS)}),(0,v.jsx)(`p`,{className:`mb-4 text-sm leading-5 text-tertiary-light`,children:y(n.I18nKey.SETTINGS$GIT_SETTINGS_DESCRIPTION)}),(0,v.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,v.jsx)(f.SettingsInput,{testId:`git-user-name-input`,name:`git-user-name-input`,type:`text`,label:y(n.I18nKey.SETTINGS$GIT_USERNAME),defaultValue:S.git_user_name||``,onChange:R,placeholder:y(n.I18nKey.SETTINGS$GIT_USERNAME_PLACEHOLDER),className:`w-full min-w-0`}),(0,v.jsx)(f.SettingsInput,{testId:`git-user-email-input`,name:`git-user-email-input`,type:`email`,label:y(n.I18nKey.SETTINGS$GIT_EMAIL),defaultValue:S.git_user_email||``,onChange:z,placeholder:y(n.I18nKey.SETTINGS$GIT_EMAIL_PLACEHOLDER),className:`w-full min-w-0`})]}),(0,v.jsx)(`div`,{className:`flex justify-start pt-4`,children:(0,v.jsxs)(l.BrandButton,{testId:`submit-button`,variant:`primary`,type:`submit`,isDisabled:x||B,children:[!x&&y(n.I18nKey.SETTINGS$SAVE_CHANGES),x&&y(n.I18nKey.SETTINGS$SAVING)]})})]})]})]})}exports.default=y;
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../i18n/declaration.cjs`),r=require(`../i18n/index.cjs`),i=require(`../utils/retrieve-axios-error-message.cjs`),a=require(`../utils/custom-toast-handlers.cjs`),o=require(`../services/telemetry.cjs`),s=require(`../services/settings.cjs`),c=require(`../hooks/query/use-settings.cjs`),l=require(`../components/features/settings/brand-button.cjs`),u=require(`../hooks/mutation/use-save-settings.cjs`),d=require(`../components/features/settings/settings-switch.cjs`),f=require(`../components/features/settings/settings-input.cjs`),p=require(`../components/features/settings/app-settings/language-input.cjs`),m=require(`../components/features/settings/app-settings/theme-input.cjs`),h=require(`../components/features/settings/app-settings/app-settings-inputs-skeleton.cjs`);let g=require(`react`);g=e.__toESM(g,1);let _=require(`react/jsx-runtime`);function v(){let{t:e}=t.useTranslation(`openhands`),{mutate:v,isPending:y}=u.useSaveSettings(),{data:b,isLoading:x}=c.useSettings(),[S,C]=g.default.useState(!1),[w,T]=g.default.useState(!1),[E,D]=g.default.useState(!1),[O,k]=g.default.useState(!1),[A,j]=g.default.useState(!1),M=t=>{let c=t.get(`language-input`)?.toString(),l=r.AvailableLanguages.find(({label:e})=>e===c)?.value||s.DEFAULT_SETTINGS.language,u=t.get(`enable-analytics-switch`)?.toString()===`on`;v({language:l,user_consents_to_analytics:u,enable_sound_notifications:t.get(`enable-sound-notifications-switch`)?.toString()===`on`,git_user_name:t.get(`git-user-name-input`)?.toString()||s.DEFAULT_SETTINGS.git_user_name,git_user_email:t.get(`git-user-email-input`)?.toString()||s.DEFAULT_SETTINGS.git_user_email},{onSuccess:()=>{o.setTelemetryConsent(u?`granted`:`denied`),a.displaySuccessToast(e(n.I18nKey.SETTINGS$SAVED))},onError:t=>{a.displayErrorToast(i.retrieveAxiosErrorMessage(t)||e(n.I18nKey.ERROR$GENERIC))},onSettled:()=>{C(!1),T(!1),D(!1),k(!1),j(!1)}})},N=e=>{let t=r.AvailableLanguages.find(({label:t})=>t===e)?.label,n=r.AvailableLanguages.find(({value:e})=>e===b?.language)?.label;C(t!==n)},P=e=>{T(e!==(b?.user_consents_to_analytics??!0))},F=e=>{D(e!==!!b?.enable_sound_notifications)},I=e=>{let t=b?.git_user_name;k(e!==t)},L=e=>{let t=b?.git_user_email;j(e!==t)},R=!S&&!w&&!E&&!O&&!A,z=!b||x||y;return(0,_.jsxs)(`form`,{"data-testid":`app-settings-screen`,action:M,className:`flex flex-col gap-6`,children:[z&&(0,_.jsx)(h.AppSettingsInputsSkeleton,{}),!z&&(0,_.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,_.jsx)(p.LanguageInput,{name:`language-input`,defaultKey:b.language,onChange:N}),(0,_.jsx)(m.ThemeInput,{}),(0,_.jsx)(d.SettingsSwitch,{testId:`enable-analytics-switch`,name:`enable-analytics-switch`,defaultIsToggled:b.user_consents_to_analytics??!0,onToggle:P,children:e(n.I18nKey.ANALYTICS$SEND_ANONYMOUS_DATA)}),(0,_.jsx)(d.SettingsSwitch,{testId:`enable-sound-notifications-switch`,name:`enable-sound-notifications-switch`,defaultIsToggled:!!b.enable_sound_notifications,onToggle:F,children:e(n.I18nKey.SETTINGS$SOUND_NOTIFICATIONS)}),(0,_.jsxs)(`div`,{className:`border-t border-[var(--oh-border)] pt-6 mt-2`,children:[(0,_.jsx)(`h3`,{className:`text-lg font-medium mb-2`,children:e(n.I18nKey.SETTINGS$GIT_SETTINGS)}),(0,_.jsx)(`p`,{className:`mb-4 text-sm leading-5 text-tertiary-light`,children:e(n.I18nKey.SETTINGS$GIT_SETTINGS_DESCRIPTION)}),(0,_.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,_.jsx)(f.SettingsInput,{testId:`git-user-name-input`,name:`git-user-name-input`,type:`text`,label:e(n.I18nKey.SETTINGS$GIT_USERNAME),defaultValue:b.git_user_name||``,onChange:I,placeholder:e(n.I18nKey.SETTINGS$GIT_USERNAME_PLACEHOLDER),className:`w-full min-w-0`}),(0,_.jsx)(f.SettingsInput,{testId:`git-user-email-input`,name:`git-user-email-input`,type:`email`,label:e(n.I18nKey.SETTINGS$GIT_EMAIL),defaultValue:b.git_user_email||``,onChange:L,placeholder:e(n.I18nKey.SETTINGS$GIT_EMAIL_PLACEHOLDER),className:`w-full min-w-0`})]}),(0,_.jsx)(`div`,{className:`flex justify-start pt-4`,children:(0,_.jsxs)(l.BrandButton,{testId:`submit-button`,variant:`primary`,type:`submit`,isDisabled:y||R,children:[!y&&e(n.I18nKey.SETTINGS$SAVE_CHANGES),y&&e(n.I18nKey.SETTINGS$SAVING)]})})]})]})]})}exports.default=v;
2
2
  //# sourceMappingURL=app-settings.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-settings.cjs","names":[],"sources":["../../src/routes/app-settings.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { usePostHog } from \"posthog-js/react\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport { AvailableLanguages } from \"#/i18n\";\nimport { DEFAULT_SETTINGS } from \"#/services/settings\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { SettingsSwitch } from \"#/components/features/settings/settings-switch\";\nimport { SettingsInput } from \"#/components/features/settings/settings-input\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { LanguageInput } from \"#/components/features/settings/app-settings/language-input\";\nimport { ThemeInput } from \"#/components/features/settings/app-settings/theme-input\";\nimport { handleCaptureConsent } from \"#/utils/handle-capture-consent\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\nimport { AppSettingsInputsSkeleton } from \"#/components/features/settings/app-settings/app-settings-inputs-skeleton\";\n\nexport function AppSettingsScreen() {\n const posthog = usePostHog();\n const { t } = useTranslation(\"openhands\");\n\n const { mutate: saveSettings, isPending } = useSaveSettings();\n const { data: settings, isLoading } = useSettings();\n\n const [languageInputHasChanged, setLanguageInputHasChanged] =\n React.useState(false);\n const [analyticsSwitchHasChanged, setAnalyticsSwitchHasChanged] =\n React.useState(false);\n const [\n soundNotificationsSwitchHasChanged,\n setSoundNotificationsSwitchHasChanged,\n ] = React.useState(false);\n const [gitUserNameHasChanged, setGitUserNameHasChanged] =\n React.useState(false);\n const [gitUserEmailHasChanged, setGitUserEmailHasChanged] =\n React.useState(false);\n\n const formAction = (formData: FormData) => {\n const languageLabel = formData.get(\"language-input\")?.toString();\n const languageValue = AvailableLanguages.find(\n ({ label }) => label === languageLabel,\n )?.value;\n const language = languageValue || DEFAULT_SETTINGS.language;\n\n const enableAnalytics =\n formData.get(\"enable-analytics-switch\")?.toString() === \"on\";\n const enableSoundNotifications =\n formData.get(\"enable-sound-notifications-switch\")?.toString() === \"on\";\n\n const gitUserName =\n formData.get(\"git-user-name-input\")?.toString() ||\n DEFAULT_SETTINGS.git_user_name;\n const gitUserEmail =\n formData.get(\"git-user-email-input\")?.toString() ||\n DEFAULT_SETTINGS.git_user_email;\n\n saveSettings(\n {\n language,\n user_consents_to_analytics: enableAnalytics,\n enable_sound_notifications: enableSoundNotifications,\n git_user_name: gitUserName,\n git_user_email: gitUserEmail,\n },\n {\n onSuccess: () => {\n handleCaptureConsent(posthog, enableAnalytics);\n displaySuccessToast(t(I18nKey.SETTINGS$SAVED));\n },\n onError: (error) => {\n const errorMessage = retrieveAxiosErrorMessage(error);\n displayErrorToast(errorMessage || t(I18nKey.ERROR$GENERIC));\n },\n onSettled: () => {\n setLanguageInputHasChanged(false);\n setAnalyticsSwitchHasChanged(false);\n setSoundNotificationsSwitchHasChanged(false);\n setGitUserNameHasChanged(false);\n setGitUserEmailHasChanged(false);\n },\n },\n );\n };\n\n const checkIfLanguageInputHasChanged = (value: string) => {\n const selectedLanguage = AvailableLanguages.find(\n ({ label: langValue }) => langValue === value,\n )?.label;\n const currentLanguage = AvailableLanguages.find(\n ({ value: langValue }) => langValue === settings?.language,\n )?.label;\n\n setLanguageInputHasChanged(selectedLanguage !== currentLanguage);\n };\n\n const checkIfAnalyticsSwitchHasChanged = (checked: boolean) => {\n // Treat null as true since analytics is opt-in by default\n const currentAnalytics = settings?.user_consents_to_analytics ?? true;\n setAnalyticsSwitchHasChanged(checked !== currentAnalytics);\n };\n\n const checkIfSoundNotificationsSwitchHasChanged = (checked: boolean) => {\n const currentSoundNotifications = !!settings?.enable_sound_notifications;\n setSoundNotificationsSwitchHasChanged(\n checked !== currentSoundNotifications,\n );\n };\n\n const checkIfGitUserNameHasChanged = (value: string) => {\n const currentValue = settings?.git_user_name;\n setGitUserNameHasChanged(value !== currentValue);\n };\n\n const checkIfGitUserEmailHasChanged = (value: string) => {\n const currentValue = settings?.git_user_email;\n setGitUserEmailHasChanged(value !== currentValue);\n };\n\n const formIsClean =\n !languageInputHasChanged &&\n !analyticsSwitchHasChanged &&\n !soundNotificationsSwitchHasChanged &&\n !gitUserNameHasChanged &&\n !gitUserEmailHasChanged;\n\n const shouldBeLoading = !settings || isLoading || isPending;\n\n return (\n <form\n data-testid=\"app-settings-screen\"\n action={formAction}\n className=\"flex flex-col gap-6\"\n >\n {shouldBeLoading && <AppSettingsInputsSkeleton />}\n {!shouldBeLoading && (\n <div className=\"flex flex-col gap-6\">\n <LanguageInput\n name=\"language-input\"\n defaultKey={settings.language}\n onChange={checkIfLanguageInputHasChanged}\n />\n\n <ThemeInput />\n\n <SettingsSwitch\n testId=\"enable-analytics-switch\"\n name=\"enable-analytics-switch\"\n defaultIsToggled={settings.user_consents_to_analytics ?? true}\n onToggle={checkIfAnalyticsSwitchHasChanged}\n >\n {t(I18nKey.ANALYTICS$SEND_ANONYMOUS_DATA)}\n </SettingsSwitch>\n\n <SettingsSwitch\n testId=\"enable-sound-notifications-switch\"\n name=\"enable-sound-notifications-switch\"\n defaultIsToggled={!!settings.enable_sound_notifications}\n onToggle={checkIfSoundNotificationsSwitchHasChanged}\n >\n {t(I18nKey.SETTINGS$SOUND_NOTIFICATIONS)}\n </SettingsSwitch>\n\n <div className=\"border-t border-[var(--oh-border)] pt-6 mt-2\">\n <h3 className=\"text-lg font-medium mb-2\">\n {t(I18nKey.SETTINGS$GIT_SETTINGS)}\n </h3>\n <p className=\"mb-4 text-sm leading-5 text-tertiary-light\">\n {t(I18nKey.SETTINGS$GIT_SETTINGS_DESCRIPTION)}\n </p>\n <div className=\"flex flex-col gap-6\">\n <SettingsInput\n testId=\"git-user-name-input\"\n name=\"git-user-name-input\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$GIT_USERNAME)}\n defaultValue={settings.git_user_name || \"\"}\n onChange={checkIfGitUserNameHasChanged}\n placeholder={t(I18nKey.SETTINGS$GIT_USERNAME_PLACEHOLDER)}\n className=\"w-full min-w-0\"\n />\n <SettingsInput\n testId=\"git-user-email-input\"\n name=\"git-user-email-input\"\n type=\"email\"\n label={t(I18nKey.SETTINGS$GIT_EMAIL)}\n defaultValue={settings.git_user_email || \"\"}\n onChange={checkIfGitUserEmailHasChanged}\n placeholder={t(I18nKey.SETTINGS$GIT_EMAIL_PLACEHOLDER)}\n className=\"w-full min-w-0\"\n />\n </div>\n <div className=\"flex justify-start pt-4\">\n <BrandButton\n testId=\"submit-button\"\n variant=\"primary\"\n type=\"submit\"\n isDisabled={isPending || formIsClean}\n >\n {!isPending && t(I18nKey.SETTINGS$SAVE_CHANGES)}\n {isPending && t(I18nKey.SETTINGS$SAVING)}\n </BrandButton>\n </div>\n </div>\n </div>\n )}\n </form>\n );\n}\n\nexport default AppSettingsScreen;\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-settings.cjs","names":[],"sources":["../../src/routes/app-settings.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport { AvailableLanguages } from \"#/i18n\";\nimport { DEFAULT_SETTINGS } from \"#/services/settings\";\nimport { setTelemetryConsent } from \"#/services/telemetry\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { SettingsSwitch } from \"#/components/features/settings/settings-switch\";\nimport { SettingsInput } from \"#/components/features/settings/settings-input\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { LanguageInput } from \"#/components/features/settings/app-settings/language-input\";\nimport { ThemeInput } from \"#/components/features/settings/app-settings/theme-input\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\nimport { AppSettingsInputsSkeleton } from \"#/components/features/settings/app-settings/app-settings-inputs-skeleton\";\n\nexport function AppSettingsScreen() {\n const { t } = useTranslation(\"openhands\");\n\n const { mutate: saveSettings, isPending } = useSaveSettings();\n const { data: settings, isLoading } = useSettings();\n\n const [languageInputHasChanged, setLanguageInputHasChanged] =\n React.useState(false);\n const [analyticsSwitchHasChanged, setAnalyticsSwitchHasChanged] =\n React.useState(false);\n const [\n soundNotificationsSwitchHasChanged,\n setSoundNotificationsSwitchHasChanged,\n ] = React.useState(false);\n const [gitUserNameHasChanged, setGitUserNameHasChanged] =\n React.useState(false);\n const [gitUserEmailHasChanged, setGitUserEmailHasChanged] =\n React.useState(false);\n\n const formAction = (formData: FormData) => {\n const languageLabel = formData.get(\"language-input\")?.toString();\n const languageValue = AvailableLanguages.find(\n ({ label }) => label === languageLabel,\n )?.value;\n const language = languageValue || DEFAULT_SETTINGS.language;\n\n const enableAnalytics =\n formData.get(\"enable-analytics-switch\")?.toString() === \"on\";\n const enableSoundNotifications =\n formData.get(\"enable-sound-notifications-switch\")?.toString() === \"on\";\n\n const gitUserName =\n formData.get(\"git-user-name-input\")?.toString() ||\n DEFAULT_SETTINGS.git_user_name;\n const gitUserEmail =\n formData.get(\"git-user-email-input\")?.toString() ||\n DEFAULT_SETTINGS.git_user_email;\n\n saveSettings(\n {\n language,\n user_consents_to_analytics: enableAnalytics,\n enable_sound_notifications: enableSoundNotifications,\n git_user_name: gitUserName,\n git_user_email: gitUserEmail,\n },\n {\n onSuccess: () => {\n void setTelemetryConsent(enableAnalytics ? \"granted\" : \"denied\");\n displaySuccessToast(t(I18nKey.SETTINGS$SAVED));\n },\n onError: (error) => {\n const errorMessage = retrieveAxiosErrorMessage(error);\n displayErrorToast(errorMessage || t(I18nKey.ERROR$GENERIC));\n },\n onSettled: () => {\n setLanguageInputHasChanged(false);\n setAnalyticsSwitchHasChanged(false);\n setSoundNotificationsSwitchHasChanged(false);\n setGitUserNameHasChanged(false);\n setGitUserEmailHasChanged(false);\n },\n },\n );\n };\n\n const checkIfLanguageInputHasChanged = (value: string) => {\n const selectedLanguage = AvailableLanguages.find(\n ({ label: langValue }) => langValue === value,\n )?.label;\n const currentLanguage = AvailableLanguages.find(\n ({ value: langValue }) => langValue === settings?.language,\n )?.label;\n\n setLanguageInputHasChanged(selectedLanguage !== currentLanguage);\n };\n\n const checkIfAnalyticsSwitchHasChanged = (checked: boolean) => {\n // Treat null as true since analytics is opt-in by default\n const currentAnalytics = settings?.user_consents_to_analytics ?? true;\n setAnalyticsSwitchHasChanged(checked !== currentAnalytics);\n };\n\n const checkIfSoundNotificationsSwitchHasChanged = (checked: boolean) => {\n const currentSoundNotifications = !!settings?.enable_sound_notifications;\n setSoundNotificationsSwitchHasChanged(\n checked !== currentSoundNotifications,\n );\n };\n\n const checkIfGitUserNameHasChanged = (value: string) => {\n const currentValue = settings?.git_user_name;\n setGitUserNameHasChanged(value !== currentValue);\n };\n\n const checkIfGitUserEmailHasChanged = (value: string) => {\n const currentValue = settings?.git_user_email;\n setGitUserEmailHasChanged(value !== currentValue);\n };\n\n const formIsClean =\n !languageInputHasChanged &&\n !analyticsSwitchHasChanged &&\n !soundNotificationsSwitchHasChanged &&\n !gitUserNameHasChanged &&\n !gitUserEmailHasChanged;\n\n const shouldBeLoading = !settings || isLoading || isPending;\n\n return (\n <form\n data-testid=\"app-settings-screen\"\n action={formAction}\n className=\"flex flex-col gap-6\"\n >\n {shouldBeLoading && <AppSettingsInputsSkeleton />}\n {!shouldBeLoading && (\n <div className=\"flex flex-col gap-6\">\n <LanguageInput\n name=\"language-input\"\n defaultKey={settings.language}\n onChange={checkIfLanguageInputHasChanged}\n />\n\n <ThemeInput />\n\n <SettingsSwitch\n testId=\"enable-analytics-switch\"\n name=\"enable-analytics-switch\"\n defaultIsToggled={settings.user_consents_to_analytics ?? true}\n onToggle={checkIfAnalyticsSwitchHasChanged}\n >\n {t(I18nKey.ANALYTICS$SEND_ANONYMOUS_DATA)}\n </SettingsSwitch>\n\n <SettingsSwitch\n testId=\"enable-sound-notifications-switch\"\n name=\"enable-sound-notifications-switch\"\n defaultIsToggled={!!settings.enable_sound_notifications}\n onToggle={checkIfSoundNotificationsSwitchHasChanged}\n >\n {t(I18nKey.SETTINGS$SOUND_NOTIFICATIONS)}\n </SettingsSwitch>\n\n <div className=\"border-t border-[var(--oh-border)] pt-6 mt-2\">\n <h3 className=\"text-lg font-medium mb-2\">\n {t(I18nKey.SETTINGS$GIT_SETTINGS)}\n </h3>\n <p className=\"mb-4 text-sm leading-5 text-tertiary-light\">\n {t(I18nKey.SETTINGS$GIT_SETTINGS_DESCRIPTION)}\n </p>\n <div className=\"flex flex-col gap-6\">\n <SettingsInput\n testId=\"git-user-name-input\"\n name=\"git-user-name-input\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$GIT_USERNAME)}\n defaultValue={settings.git_user_name || \"\"}\n onChange={checkIfGitUserNameHasChanged}\n placeholder={t(I18nKey.SETTINGS$GIT_USERNAME_PLACEHOLDER)}\n className=\"w-full min-w-0\"\n />\n <SettingsInput\n testId=\"git-user-email-input\"\n name=\"git-user-email-input\"\n type=\"email\"\n label={t(I18nKey.SETTINGS$GIT_EMAIL)}\n defaultValue={settings.git_user_email || \"\"}\n onChange={checkIfGitUserEmailHasChanged}\n placeholder={t(I18nKey.SETTINGS$GIT_EMAIL_PLACEHOLDER)}\n className=\"w-full min-w-0\"\n />\n </div>\n <div className=\"flex justify-start pt-4\">\n <BrandButton\n testId=\"submit-button\"\n variant=\"primary\"\n type=\"submit\"\n isDisabled={isPending || formIsClean}\n >\n {!isPending && t(I18nKey.SETTINGS$SAVE_CHANGES)}\n {isPending && t(I18nKey.SETTINGS$SAVING)}\n </BrandButton>\n </div>\n </div>\n </div>\n )}\n </form>\n );\n}\n\nexport default AppSettingsScreen;\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { I18nKey as t } from "../i18n/declaration.js";
3
3
  import { AvailableLanguages as n } from "../i18n/index.js";
4
4
  import { retrieveAxiosErrorMessage as r } from "../utils/retrieve-axios-error-message.js";
5
5
  import { displayErrorToast as i, displaySuccessToast as a } from "../utils/custom-toast-handlers.js";
6
- import { usePostHog as o } from "../node_modules/posthog-js/react/dist/esm/index.js";
6
+ import { setTelemetryConsent as o } from "../services/telemetry.js";
7
7
  import { DEFAULT_SETTINGS as s } from "../services/settings.js";
8
8
  import { useSettings as c } from "../hooks/query/use-settings.js";
9
9
  import { BrandButton as l } from "../components/features/settings/brand-button.js";
@@ -12,113 +12,112 @@ import { SettingsSwitch as d } from "../components/features/settings/settings-sw
12
12
  import { SettingsInput as f } from "../components/features/settings/settings-input.js";
13
13
  import { LanguageInput as p } from "../components/features/settings/app-settings/language-input.js";
14
14
  import { ThemeInput as m } from "../components/features/settings/app-settings/theme-input.js";
15
- import { handleCaptureConsent as h } from "../utils/handle-capture-consent.js";
16
- import { AppSettingsInputsSkeleton as g } from "../components/features/settings/app-settings/app-settings-inputs-skeleton.js";
17
- import _ from "react";
18
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
15
+ import { AppSettingsInputsSkeleton as h } from "../components/features/settings/app-settings/app-settings-inputs-skeleton.js";
16
+ import g from "react";
17
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
19
18
  //#region src/routes/app-settings.tsx
20
- function b() {
21
- let b = o(), { t: x } = e("openhands"), { mutate: S, isPending: C } = u(), { data: w, isLoading: T } = c(), [E, D] = _.useState(!1), [O, k] = _.useState(!1), [A, j] = _.useState(!1), [M, N] = _.useState(!1), [P, F] = _.useState(!1), I = (e) => {
22
- let o = e.get("language-input")?.toString(), c = n.find(({ label: e }) => e === o)?.value || s.language, l = e.get("enable-analytics-switch")?.toString() === "on";
23
- S({
24
- language: c,
25
- user_consents_to_analytics: l,
19
+ function y() {
20
+ let { t: y } = e("openhands"), { mutate: b, isPending: x } = u(), { data: S, isLoading: C } = c(), [w, T] = g.useState(!1), [E, D] = g.useState(!1), [O, k] = g.useState(!1), [A, j] = g.useState(!1), [M, N] = g.useState(!1), P = (e) => {
21
+ let c = e.get("language-input")?.toString(), l = n.find(({ label: e }) => e === c)?.value || s.language, u = e.get("enable-analytics-switch")?.toString() === "on";
22
+ b({
23
+ language: l,
24
+ user_consents_to_analytics: u,
26
25
  enable_sound_notifications: e.get("enable-sound-notifications-switch")?.toString() === "on",
27
26
  git_user_name: e.get("git-user-name-input")?.toString() || s.git_user_name,
28
27
  git_user_email: e.get("git-user-email-input")?.toString() || s.git_user_email
29
28
  }, {
30
29
  onSuccess: () => {
31
- h(b, l), a(x(t.SETTINGS$SAVED));
30
+ o(u ? "granted" : "denied"), a(y(t.SETTINGS$SAVED));
32
31
  },
33
32
  onError: (e) => {
34
- i(r(e) || x(t.ERROR$GENERIC));
33
+ i(r(e) || y(t.ERROR$GENERIC));
35
34
  },
36
35
  onSettled: () => {
37
- D(!1), k(!1), j(!1), N(!1), F(!1);
36
+ T(!1), D(!1), k(!1), j(!1), N(!1);
38
37
  }
39
38
  });
39
+ }, F = (e) => {
40
+ let t = n.find(({ label: t }) => t === e)?.label, r = n.find(({ value: e }) => e === S?.language)?.label;
41
+ T(t !== r);
42
+ }, I = (e) => {
43
+ D(e !== (S?.user_consents_to_analytics ?? !0));
40
44
  }, L = (e) => {
41
- let t = n.find(({ label: t }) => t === e)?.label, r = n.find(({ value: e }) => e === w?.language)?.label;
42
- D(t !== r);
45
+ k(e !== !!S?.enable_sound_notifications);
43
46
  }, R = (e) => {
44
- k(e !== (w?.user_consents_to_analytics ?? !0));
47
+ let t = S?.git_user_name;
48
+ j(e !== t);
45
49
  }, z = (e) => {
46
- j(e !== !!w?.enable_sound_notifications);
47
- }, B = (e) => {
48
- let t = w?.git_user_name;
50
+ let t = S?.git_user_email;
49
51
  N(e !== t);
50
- }, V = (e) => {
51
- let t = w?.git_user_email;
52
- F(e !== t);
53
- }, H = !E && !O && !A && !M && !P, U = !w || T || C;
54
- return /* @__PURE__ */ y("form", {
52
+ }, B = !w && !E && !O && !A && !M, V = !S || C || x;
53
+ return /* @__PURE__ */ v("form", {
55
54
  "data-testid": "app-settings-screen",
56
- action: I,
55
+ action: P,
57
56
  className: "flex flex-col gap-6",
58
- children: [U && /* @__PURE__ */ v(g, {}), !U && /* @__PURE__ */ y("div", {
57
+ children: [V && /* @__PURE__ */ _(h, {}), !V && /* @__PURE__ */ v("div", {
59
58
  className: "flex flex-col gap-6",
60
59
  children: [
61
- /* @__PURE__ */ v(p, {
60
+ /* @__PURE__ */ _(p, {
62
61
  name: "language-input",
63
- defaultKey: w.language,
64
- onChange: L
62
+ defaultKey: S.language,
63
+ onChange: F
65
64
  }),
66
- /* @__PURE__ */ v(m, {}),
67
- /* @__PURE__ */ v(d, {
65
+ /* @__PURE__ */ _(m, {}),
66
+ /* @__PURE__ */ _(d, {
68
67
  testId: "enable-analytics-switch",
69
68
  name: "enable-analytics-switch",
70
- defaultIsToggled: w.user_consents_to_analytics ?? !0,
71
- onToggle: R,
72
- children: x(t.ANALYTICS$SEND_ANONYMOUS_DATA)
69
+ defaultIsToggled: S.user_consents_to_analytics ?? !0,
70
+ onToggle: I,
71
+ children: y(t.ANALYTICS$SEND_ANONYMOUS_DATA)
73
72
  }),
74
- /* @__PURE__ */ v(d, {
73
+ /* @__PURE__ */ _(d, {
75
74
  testId: "enable-sound-notifications-switch",
76
75
  name: "enable-sound-notifications-switch",
77
- defaultIsToggled: !!w.enable_sound_notifications,
78
- onToggle: z,
79
- children: x(t.SETTINGS$SOUND_NOTIFICATIONS)
76
+ defaultIsToggled: !!S.enable_sound_notifications,
77
+ onToggle: L,
78
+ children: y(t.SETTINGS$SOUND_NOTIFICATIONS)
80
79
  }),
81
- /* @__PURE__ */ y("div", {
80
+ /* @__PURE__ */ v("div", {
82
81
  className: "border-t border-[var(--oh-border)] pt-6 mt-2",
83
82
  children: [
84
- /* @__PURE__ */ v("h3", {
83
+ /* @__PURE__ */ _("h3", {
85
84
  className: "text-lg font-medium mb-2",
86
- children: x(t.SETTINGS$GIT_SETTINGS)
85
+ children: y(t.SETTINGS$GIT_SETTINGS)
87
86
  }),
88
- /* @__PURE__ */ v("p", {
87
+ /* @__PURE__ */ _("p", {
89
88
  className: "mb-4 text-sm leading-5 text-tertiary-light",
90
- children: x(t.SETTINGS$GIT_SETTINGS_DESCRIPTION)
89
+ children: y(t.SETTINGS$GIT_SETTINGS_DESCRIPTION)
91
90
  }),
92
- /* @__PURE__ */ y("div", {
91
+ /* @__PURE__ */ v("div", {
93
92
  className: "flex flex-col gap-6",
94
- children: [/* @__PURE__ */ v(f, {
93
+ children: [/* @__PURE__ */ _(f, {
95
94
  testId: "git-user-name-input",
96
95
  name: "git-user-name-input",
97
96
  type: "text",
98
- label: x(t.SETTINGS$GIT_USERNAME),
99
- defaultValue: w.git_user_name || "",
100
- onChange: B,
101
- placeholder: x(t.SETTINGS$GIT_USERNAME_PLACEHOLDER),
97
+ label: y(t.SETTINGS$GIT_USERNAME),
98
+ defaultValue: S.git_user_name || "",
99
+ onChange: R,
100
+ placeholder: y(t.SETTINGS$GIT_USERNAME_PLACEHOLDER),
102
101
  className: "w-full min-w-0"
103
- }), /* @__PURE__ */ v(f, {
102
+ }), /* @__PURE__ */ _(f, {
104
103
  testId: "git-user-email-input",
105
104
  name: "git-user-email-input",
106
105
  type: "email",
107
- label: x(t.SETTINGS$GIT_EMAIL),
108
- defaultValue: w.git_user_email || "",
109
- onChange: V,
110
- placeholder: x(t.SETTINGS$GIT_EMAIL_PLACEHOLDER),
106
+ label: y(t.SETTINGS$GIT_EMAIL),
107
+ defaultValue: S.git_user_email || "",
108
+ onChange: z,
109
+ placeholder: y(t.SETTINGS$GIT_EMAIL_PLACEHOLDER),
111
110
  className: "w-full min-w-0"
112
111
  })]
113
112
  }),
114
- /* @__PURE__ */ v("div", {
113
+ /* @__PURE__ */ _("div", {
115
114
  className: "flex justify-start pt-4",
116
- children: /* @__PURE__ */ y(l, {
115
+ children: /* @__PURE__ */ v(l, {
117
116
  testId: "submit-button",
118
117
  variant: "primary",
119
118
  type: "submit",
120
- isDisabled: C || H,
121
- children: [!C && x(t.SETTINGS$SAVE_CHANGES), C && x(t.SETTINGS$SAVING)]
119
+ isDisabled: x || B,
120
+ children: [!x && y(t.SETTINGS$SAVE_CHANGES), x && y(t.SETTINGS$SAVING)]
122
121
  })
123
122
  })
124
123
  ]
@@ -128,6 +127,6 @@ function b() {
128
127
  });
129
128
  }
130
129
  //#endregion
131
- export { b as default };
130
+ export { y as default };
132
131
 
133
132
  //# sourceMappingURL=app-settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-settings.js","names":[],"sources":["../../src/routes/app-settings.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { usePostHog } from \"posthog-js/react\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport { AvailableLanguages } from \"#/i18n\";\nimport { DEFAULT_SETTINGS } from \"#/services/settings\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { SettingsSwitch } from \"#/components/features/settings/settings-switch\";\nimport { SettingsInput } from \"#/components/features/settings/settings-input\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { LanguageInput } from \"#/components/features/settings/app-settings/language-input\";\nimport { ThemeInput } from \"#/components/features/settings/app-settings/theme-input\";\nimport { handleCaptureConsent } from \"#/utils/handle-capture-consent\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\nimport { AppSettingsInputsSkeleton } from \"#/components/features/settings/app-settings/app-settings-inputs-skeleton\";\n\nexport function AppSettingsScreen() {\n const posthog = usePostHog();\n const { t } = useTranslation(\"openhands\");\n\n const { mutate: saveSettings, isPending } = useSaveSettings();\n const { data: settings, isLoading } = useSettings();\n\n const [languageInputHasChanged, setLanguageInputHasChanged] =\n React.useState(false);\n const [analyticsSwitchHasChanged, setAnalyticsSwitchHasChanged] =\n React.useState(false);\n const [\n soundNotificationsSwitchHasChanged,\n setSoundNotificationsSwitchHasChanged,\n ] = React.useState(false);\n const [gitUserNameHasChanged, setGitUserNameHasChanged] =\n React.useState(false);\n const [gitUserEmailHasChanged, setGitUserEmailHasChanged] =\n React.useState(false);\n\n const formAction = (formData: FormData) => {\n const languageLabel = formData.get(\"language-input\")?.toString();\n const languageValue = AvailableLanguages.find(\n ({ label }) => label === languageLabel,\n )?.value;\n const language = languageValue || DEFAULT_SETTINGS.language;\n\n const enableAnalytics =\n formData.get(\"enable-analytics-switch\")?.toString() === \"on\";\n const enableSoundNotifications =\n formData.get(\"enable-sound-notifications-switch\")?.toString() === \"on\";\n\n const gitUserName =\n formData.get(\"git-user-name-input\")?.toString() ||\n DEFAULT_SETTINGS.git_user_name;\n const gitUserEmail =\n formData.get(\"git-user-email-input\")?.toString() ||\n DEFAULT_SETTINGS.git_user_email;\n\n saveSettings(\n {\n language,\n user_consents_to_analytics: enableAnalytics,\n enable_sound_notifications: enableSoundNotifications,\n git_user_name: gitUserName,\n git_user_email: gitUserEmail,\n },\n {\n onSuccess: () => {\n handleCaptureConsent(posthog, enableAnalytics);\n displaySuccessToast(t(I18nKey.SETTINGS$SAVED));\n },\n onError: (error) => {\n const errorMessage = retrieveAxiosErrorMessage(error);\n displayErrorToast(errorMessage || t(I18nKey.ERROR$GENERIC));\n },\n onSettled: () => {\n setLanguageInputHasChanged(false);\n setAnalyticsSwitchHasChanged(false);\n setSoundNotificationsSwitchHasChanged(false);\n setGitUserNameHasChanged(false);\n setGitUserEmailHasChanged(false);\n },\n },\n );\n };\n\n const checkIfLanguageInputHasChanged = (value: string) => {\n const selectedLanguage = AvailableLanguages.find(\n ({ label: langValue }) => langValue === value,\n )?.label;\n const currentLanguage = AvailableLanguages.find(\n ({ value: langValue }) => langValue === settings?.language,\n )?.label;\n\n setLanguageInputHasChanged(selectedLanguage !== currentLanguage);\n };\n\n const checkIfAnalyticsSwitchHasChanged = (checked: boolean) => {\n // Treat null as true since analytics is opt-in by default\n const currentAnalytics = settings?.user_consents_to_analytics ?? true;\n setAnalyticsSwitchHasChanged(checked !== currentAnalytics);\n };\n\n const checkIfSoundNotificationsSwitchHasChanged = (checked: boolean) => {\n const currentSoundNotifications = !!settings?.enable_sound_notifications;\n setSoundNotificationsSwitchHasChanged(\n checked !== currentSoundNotifications,\n );\n };\n\n const checkIfGitUserNameHasChanged = (value: string) => {\n const currentValue = settings?.git_user_name;\n setGitUserNameHasChanged(value !== currentValue);\n };\n\n const checkIfGitUserEmailHasChanged = (value: string) => {\n const currentValue = settings?.git_user_email;\n setGitUserEmailHasChanged(value !== currentValue);\n };\n\n const formIsClean =\n !languageInputHasChanged &&\n !analyticsSwitchHasChanged &&\n !soundNotificationsSwitchHasChanged &&\n !gitUserNameHasChanged &&\n !gitUserEmailHasChanged;\n\n const shouldBeLoading = !settings || isLoading || isPending;\n\n return (\n <form\n data-testid=\"app-settings-screen\"\n action={formAction}\n className=\"flex flex-col gap-6\"\n >\n {shouldBeLoading && <AppSettingsInputsSkeleton />}\n {!shouldBeLoading && (\n <div className=\"flex flex-col gap-6\">\n <LanguageInput\n name=\"language-input\"\n defaultKey={settings.language}\n onChange={checkIfLanguageInputHasChanged}\n />\n\n <ThemeInput />\n\n <SettingsSwitch\n testId=\"enable-analytics-switch\"\n name=\"enable-analytics-switch\"\n defaultIsToggled={settings.user_consents_to_analytics ?? true}\n onToggle={checkIfAnalyticsSwitchHasChanged}\n >\n {t(I18nKey.ANALYTICS$SEND_ANONYMOUS_DATA)}\n </SettingsSwitch>\n\n <SettingsSwitch\n testId=\"enable-sound-notifications-switch\"\n name=\"enable-sound-notifications-switch\"\n defaultIsToggled={!!settings.enable_sound_notifications}\n onToggle={checkIfSoundNotificationsSwitchHasChanged}\n >\n {t(I18nKey.SETTINGS$SOUND_NOTIFICATIONS)}\n </SettingsSwitch>\n\n <div className=\"border-t border-[var(--oh-border)] pt-6 mt-2\">\n <h3 className=\"text-lg font-medium mb-2\">\n {t(I18nKey.SETTINGS$GIT_SETTINGS)}\n </h3>\n <p className=\"mb-4 text-sm leading-5 text-tertiary-light\">\n {t(I18nKey.SETTINGS$GIT_SETTINGS_DESCRIPTION)}\n </p>\n <div className=\"flex flex-col gap-6\">\n <SettingsInput\n testId=\"git-user-name-input\"\n name=\"git-user-name-input\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$GIT_USERNAME)}\n defaultValue={settings.git_user_name || \"\"}\n onChange={checkIfGitUserNameHasChanged}\n placeholder={t(I18nKey.SETTINGS$GIT_USERNAME_PLACEHOLDER)}\n className=\"w-full min-w-0\"\n />\n <SettingsInput\n testId=\"git-user-email-input\"\n name=\"git-user-email-input\"\n type=\"email\"\n label={t(I18nKey.SETTINGS$GIT_EMAIL)}\n defaultValue={settings.git_user_email || \"\"}\n onChange={checkIfGitUserEmailHasChanged}\n placeholder={t(I18nKey.SETTINGS$GIT_EMAIL_PLACEHOLDER)}\n className=\"w-full min-w-0\"\n />\n </div>\n <div className=\"flex justify-start pt-4\">\n <BrandButton\n testId=\"submit-button\"\n variant=\"primary\"\n type=\"submit\"\n isDisabled={isPending || formIsClean}\n >\n {!isPending && t(I18nKey.SETTINGS$SAVE_CHANGES)}\n {isPending && t(I18nKey.SETTINGS$SAVING)}\n </BrandButton>\n </div>\n </div>\n </div>\n )}\n </form>\n );\n}\n\nexport default AppSettingsScreen;\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-settings.js","names":[],"sources":["../../src/routes/app-settings.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport { AvailableLanguages } from \"#/i18n\";\nimport { DEFAULT_SETTINGS } from \"#/services/settings\";\nimport { setTelemetryConsent } from \"#/services/telemetry\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { SettingsSwitch } from \"#/components/features/settings/settings-switch\";\nimport { SettingsInput } from \"#/components/features/settings/settings-input\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { LanguageInput } from \"#/components/features/settings/app-settings/language-input\";\nimport { ThemeInput } from \"#/components/features/settings/app-settings/theme-input\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\nimport { AppSettingsInputsSkeleton } from \"#/components/features/settings/app-settings/app-settings-inputs-skeleton\";\n\nexport function AppSettingsScreen() {\n const { t } = useTranslation(\"openhands\");\n\n const { mutate: saveSettings, isPending } = useSaveSettings();\n const { data: settings, isLoading } = useSettings();\n\n const [languageInputHasChanged, setLanguageInputHasChanged] =\n React.useState(false);\n const [analyticsSwitchHasChanged, setAnalyticsSwitchHasChanged] =\n React.useState(false);\n const [\n soundNotificationsSwitchHasChanged,\n setSoundNotificationsSwitchHasChanged,\n ] = React.useState(false);\n const [gitUserNameHasChanged, setGitUserNameHasChanged] =\n React.useState(false);\n const [gitUserEmailHasChanged, setGitUserEmailHasChanged] =\n React.useState(false);\n\n const formAction = (formData: FormData) => {\n const languageLabel = formData.get(\"language-input\")?.toString();\n const languageValue = AvailableLanguages.find(\n ({ label }) => label === languageLabel,\n )?.value;\n const language = languageValue || DEFAULT_SETTINGS.language;\n\n const enableAnalytics =\n formData.get(\"enable-analytics-switch\")?.toString() === \"on\";\n const enableSoundNotifications =\n formData.get(\"enable-sound-notifications-switch\")?.toString() === \"on\";\n\n const gitUserName =\n formData.get(\"git-user-name-input\")?.toString() ||\n DEFAULT_SETTINGS.git_user_name;\n const gitUserEmail =\n formData.get(\"git-user-email-input\")?.toString() ||\n DEFAULT_SETTINGS.git_user_email;\n\n saveSettings(\n {\n language,\n user_consents_to_analytics: enableAnalytics,\n enable_sound_notifications: enableSoundNotifications,\n git_user_name: gitUserName,\n git_user_email: gitUserEmail,\n },\n {\n onSuccess: () => {\n void setTelemetryConsent(enableAnalytics ? \"granted\" : \"denied\");\n displaySuccessToast(t(I18nKey.SETTINGS$SAVED));\n },\n onError: (error) => {\n const errorMessage = retrieveAxiosErrorMessage(error);\n displayErrorToast(errorMessage || t(I18nKey.ERROR$GENERIC));\n },\n onSettled: () => {\n setLanguageInputHasChanged(false);\n setAnalyticsSwitchHasChanged(false);\n setSoundNotificationsSwitchHasChanged(false);\n setGitUserNameHasChanged(false);\n setGitUserEmailHasChanged(false);\n },\n },\n );\n };\n\n const checkIfLanguageInputHasChanged = (value: string) => {\n const selectedLanguage = AvailableLanguages.find(\n ({ label: langValue }) => langValue === value,\n )?.label;\n const currentLanguage = AvailableLanguages.find(\n ({ value: langValue }) => langValue === settings?.language,\n )?.label;\n\n setLanguageInputHasChanged(selectedLanguage !== currentLanguage);\n };\n\n const checkIfAnalyticsSwitchHasChanged = (checked: boolean) => {\n // Treat null as true since analytics is opt-in by default\n const currentAnalytics = settings?.user_consents_to_analytics ?? true;\n setAnalyticsSwitchHasChanged(checked !== currentAnalytics);\n };\n\n const checkIfSoundNotificationsSwitchHasChanged = (checked: boolean) => {\n const currentSoundNotifications = !!settings?.enable_sound_notifications;\n setSoundNotificationsSwitchHasChanged(\n checked !== currentSoundNotifications,\n );\n };\n\n const checkIfGitUserNameHasChanged = (value: string) => {\n const currentValue = settings?.git_user_name;\n setGitUserNameHasChanged(value !== currentValue);\n };\n\n const checkIfGitUserEmailHasChanged = (value: string) => {\n const currentValue = settings?.git_user_email;\n setGitUserEmailHasChanged(value !== currentValue);\n };\n\n const formIsClean =\n !languageInputHasChanged &&\n !analyticsSwitchHasChanged &&\n !soundNotificationsSwitchHasChanged &&\n !gitUserNameHasChanged &&\n !gitUserEmailHasChanged;\n\n const shouldBeLoading = !settings || isLoading || isPending;\n\n return (\n <form\n data-testid=\"app-settings-screen\"\n action={formAction}\n className=\"flex flex-col gap-6\"\n >\n {shouldBeLoading && <AppSettingsInputsSkeleton />}\n {!shouldBeLoading && (\n <div className=\"flex flex-col gap-6\">\n <LanguageInput\n name=\"language-input\"\n defaultKey={settings.language}\n onChange={checkIfLanguageInputHasChanged}\n />\n\n <ThemeInput />\n\n <SettingsSwitch\n testId=\"enable-analytics-switch\"\n name=\"enable-analytics-switch\"\n defaultIsToggled={settings.user_consents_to_analytics ?? true}\n onToggle={checkIfAnalyticsSwitchHasChanged}\n >\n {t(I18nKey.ANALYTICS$SEND_ANONYMOUS_DATA)}\n </SettingsSwitch>\n\n <SettingsSwitch\n testId=\"enable-sound-notifications-switch\"\n name=\"enable-sound-notifications-switch\"\n defaultIsToggled={!!settings.enable_sound_notifications}\n onToggle={checkIfSoundNotificationsSwitchHasChanged}\n >\n {t(I18nKey.SETTINGS$SOUND_NOTIFICATIONS)}\n </SettingsSwitch>\n\n <div className=\"border-t border-[var(--oh-border)] pt-6 mt-2\">\n <h3 className=\"text-lg font-medium mb-2\">\n {t(I18nKey.SETTINGS$GIT_SETTINGS)}\n </h3>\n <p className=\"mb-4 text-sm leading-5 text-tertiary-light\">\n {t(I18nKey.SETTINGS$GIT_SETTINGS_DESCRIPTION)}\n </p>\n <div className=\"flex flex-col gap-6\">\n <SettingsInput\n testId=\"git-user-name-input\"\n name=\"git-user-name-input\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$GIT_USERNAME)}\n defaultValue={settings.git_user_name || \"\"}\n onChange={checkIfGitUserNameHasChanged}\n placeholder={t(I18nKey.SETTINGS$GIT_USERNAME_PLACEHOLDER)}\n className=\"w-full min-w-0\"\n />\n <SettingsInput\n testId=\"git-user-email-input\"\n name=\"git-user-email-input\"\n type=\"email\"\n label={t(I18nKey.SETTINGS$GIT_EMAIL)}\n defaultValue={settings.git_user_email || \"\"}\n onChange={checkIfGitUserEmailHasChanged}\n placeholder={t(I18nKey.SETTINGS$GIT_EMAIL_PLACEHOLDER)}\n className=\"w-full min-w-0\"\n />\n </div>\n <div className=\"flex justify-start pt-4\">\n <BrandButton\n testId=\"submit-button\"\n variant=\"primary\"\n type=\"submit\"\n isDisabled={isPending || formIsClean}\n >\n {!isPending && t(I18nKey.SETTINGS$SAVE_CHANGES)}\n {isPending && t(I18nKey.SETTINGS$SAVING)}\n </BrandButton>\n </div>\n </div>\n </div>\n )}\n </form>\n );\n}\n\nexport default AppSettingsScreen;\n"],"mappings":"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"}
@@ -0,0 +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(`../types/agent-state.cjs`),r=require(`../components/features/conversation/conversation-tab-empty-state.cjs`),i=require(`../hooks/use-conversation-id.cjs`),a=require(`../hooks/use-agent-state.cjs`),o=require(`../components/features/conversation-panel/runtime-waiting-state.cjs`),s=require(`../hooks/query/use-unified-git-commits.cjs`),c=require(`../components/features/diff-viewer/diff-drawer-icon.cjs`),l=require(`../components/features/diff-viewer/commit-list.cjs`);let u=require(`react/jsx-runtime`);function d(){let{t:d}=e.useTranslation(`openhands`),{conversationId:f}=i.useConversationId(),{commits:p,hasMore:m,isUnsupported:h,isLoading:g,isSuccess:_}=s.useUnifiedGitCommits(),{curAgentState:v}=a.useAgentState(),y=!n.RUNTIME_INACTIVE_STATES.includes(v);return(0,u.jsx)(`main`,{className:`h-full w-full flex flex-col items-stretch`,children:_&&!h&&p.length>0?(0,u.jsx)(`div`,{className:`h-full overflow-y-auto flex flex-col items-stretch custom-scrollbar-always`,children:(0,u.jsx)(l.CommitList,{commits:p,hasMore:m},f)}):(0,u.jsxs)(`div`,{className:`flex-1 flex items-center justify-center`,children:[!y&&(0,u.jsx)(o.RuntimeWaitingState,{testId:`commits-tab-status`,messageKey:t.I18nKey.DIFF_VIEWER$WAITING_FOR_RUNTIME}),y&&g&&(0,u.jsx)(o.RuntimeWaitingState,{testId:`commits-tab-status`,messageKey:t.I18nKey.DIFF_VIEWER$LOADING}),y&&!g&&(0,u.jsx)(r.ConversationTabEmptyState,{icon:(0,u.jsx)(c.DiffDrawerIcon,{}),children:d(t.I18nKey.DIFF_VIEWER$NO_COMMITS)})]})})}exports.default=d;
2
+ //# sourceMappingURL=commits-tab.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commits-tab.cjs","names":[],"sources":["../../src/routes/commits-tab.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { CommitList } from \"#/components/features/diff-viewer/commit-list\";\nimport { DiffDrawerIcon } from \"#/components/features/diff-viewer/diff-drawer-icon\";\nimport { useUnifiedGitCommits } from \"#/hooks/query/use-unified-git-commits\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { RUNTIME_INACTIVE_STATES } from \"#/types/agent-state\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { RuntimeWaitingState } from \"#/components/features/conversation-panel/runtime-waiting-state\";\nimport { ConversationTabEmptyState } from \"#/components/features/conversation/conversation-tab-empty-state\";\n\n/**\n * The Files tab's \"Commits\" view: the workspace's recent commit history\n * (newest first), each commit expandable into its per-file diffs. Sits\n * behind the third segment of the Diff/Files toggle, which is only\n * offered when the agent server supports the commits API.\n */\nfunction GitCommits() {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const { commits, hasMore, isUnsupported, isLoading, isSuccess } =\n useUnifiedGitCommits();\n\n const { curAgentState } = useAgentState();\n const runtimeIsActive = !RUNTIME_INACTIVE_STATES.includes(curAgentState);\n\n const showList = isSuccess && !isUnsupported && commits.length > 0;\n\n return (\n <main className=\"h-full w-full flex flex-col items-stretch\">\n {showList ? (\n <div className=\"h-full overflow-y-auto flex flex-col items-stretch custom-scrollbar-always\">\n {/* Keyed by conversation so switching conversations collapses any\n expanded commit. */}\n <CommitList\n key={conversationId}\n commits={commits}\n hasMore={hasMore}\n />\n </div>\n ) : (\n <div className=\"flex-1 flex items-center justify-center\">\n {!runtimeIsActive && (\n <RuntimeWaitingState\n testId=\"commits-tab-status\"\n messageKey={I18nKey.DIFF_VIEWER$WAITING_FOR_RUNTIME}\n />\n )}\n {runtimeIsActive && isLoading && (\n <RuntimeWaitingState\n testId=\"commits-tab-status\"\n messageKey={I18nKey.DIFF_VIEWER$LOADING}\n />\n )}\n {runtimeIsActive && !isLoading && (\n <ConversationTabEmptyState icon={<DiffDrawerIcon />}>\n {t(I18nKey.DIFF_VIEWER$NO_COMMITS)}\n </ConversationTabEmptyState>\n )}\n </div>\n )}\n </main>\n );\n}\n\nexport default GitCommits;\n"],"mappings":"+pBAiBA,SAAS,GAAa,CACpB,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAE,kBAAmB,EAAA,mBAAmB,CACxC,CAAE,UAAS,UAAS,gBAAe,YAAW,aAClD,EAAA,sBAAsB,CAElB,CAAE,iBAAkB,EAAA,eAAe,CACnC,EAAkB,CAAC,EAAA,wBAAwB,SAAS,EAAc,CAIxE,OACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,qDAHD,GAAa,CAAC,GAAiB,EAAQ,OAAS,GAK3D,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,uFAGb,EAAA,EAAA,KAAC,EAAA,WAAD,CAEW,UACA,UACT,CAHK,EAGL,CACE,CAAA,EAEN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mDAAf,CACG,CAAC,IACA,EAAA,EAAA,KAAC,EAAA,oBAAD,CACE,OAAO,qBACP,WAAY,EAAA,QAAQ,gCACpB,CAAA,CAEH,GAAmB,IAClB,EAAA,EAAA,KAAC,EAAA,oBAAD,CACE,OAAO,qBACP,WAAY,EAAA,QAAQ,oBACpB,CAAA,CAEH,GAAmB,CAAC,IACnB,EAAA,EAAA,KAAC,EAAA,0BAAD,CAA2B,MAAM,EAAA,EAAA,KAAC,EAAA,eAAD,EAAkB,CAAA,UAChD,EAAE,EAAA,QAAQ,uBAAuB,CACR,CAAA,CAE1B,GAEH,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The Files tab's "Commits" view: the workspace's recent commit history
3
+ * (newest first), each commit expandable into its per-file diffs. Sits
4
+ * behind the third segment of the Diff/Files toggle, which is only
5
+ * offered when the agent server supports the commits API.
6
+ */
7
+ declare function GitCommits(): import("react/jsx-runtime").JSX.Element;
8
+ export default GitCommits;
@@ -0,0 +1,45 @@
1
+ import { useTranslation as e } from "../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../i18n/declaration.js";
3
+ import { RUNTIME_INACTIVE_STATES as n } from "../types/agent-state.js";
4
+ import { ConversationTabEmptyState as r } from "../components/features/conversation/conversation-tab-empty-state.js";
5
+ import { useConversationId as i } from "../hooks/use-conversation-id.js";
6
+ import { useAgentState as a } from "../hooks/use-agent-state.js";
7
+ import { RuntimeWaitingState as o } from "../components/features/conversation-panel/runtime-waiting-state.js";
8
+ import { useUnifiedGitCommits as s } from "../hooks/query/use-unified-git-commits.js";
9
+ import { DiffDrawerIcon as c } from "../components/features/diff-viewer/diff-drawer-icon.js";
10
+ import { CommitList as l } from "../components/features/diff-viewer/commit-list.js";
11
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
12
+ //#region src/routes/commits-tab.tsx
13
+ function f() {
14
+ let { t: f } = e("openhands"), { conversationId: p } = i(), { commits: m, hasMore: h, isUnsupported: g, isLoading: _, isSuccess: v } = s(), { curAgentState: y } = a(), b = !n.includes(y);
15
+ return /* @__PURE__ */ u("main", {
16
+ className: "h-full w-full flex flex-col items-stretch",
17
+ children: v && !g && m.length > 0 ? /* @__PURE__ */ u("div", {
18
+ className: "h-full overflow-y-auto flex flex-col items-stretch custom-scrollbar-always",
19
+ children: /* @__PURE__ */ u(l, {
20
+ commits: m,
21
+ hasMore: h
22
+ }, p)
23
+ }) : /* @__PURE__ */ d("div", {
24
+ className: "flex-1 flex items-center justify-center",
25
+ children: [
26
+ !b && /* @__PURE__ */ u(o, {
27
+ testId: "commits-tab-status",
28
+ messageKey: t.DIFF_VIEWER$WAITING_FOR_RUNTIME
29
+ }),
30
+ b && _ && /* @__PURE__ */ u(o, {
31
+ testId: "commits-tab-status",
32
+ messageKey: t.DIFF_VIEWER$LOADING
33
+ }),
34
+ b && !_ && /* @__PURE__ */ u(r, {
35
+ icon: /* @__PURE__ */ u(c, {}),
36
+ children: f(t.DIFF_VIEWER$NO_COMMITS)
37
+ })
38
+ ]
39
+ })
40
+ });
41
+ }
42
+ //#endregion
43
+ export { f as default };
44
+
45
+ //# sourceMappingURL=commits-tab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commits-tab.js","names":[],"sources":["../../src/routes/commits-tab.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { CommitList } from \"#/components/features/diff-viewer/commit-list\";\nimport { DiffDrawerIcon } from \"#/components/features/diff-viewer/diff-drawer-icon\";\nimport { useUnifiedGitCommits } from \"#/hooks/query/use-unified-git-commits\";\nimport { useConversationId } from \"#/hooks/use-conversation-id\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { RUNTIME_INACTIVE_STATES } from \"#/types/agent-state\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { RuntimeWaitingState } from \"#/components/features/conversation-panel/runtime-waiting-state\";\nimport { ConversationTabEmptyState } from \"#/components/features/conversation/conversation-tab-empty-state\";\n\n/**\n * The Files tab's \"Commits\" view: the workspace's recent commit history\n * (newest first), each commit expandable into its per-file diffs. Sits\n * behind the third segment of the Diff/Files toggle, which is only\n * offered when the agent server supports the commits API.\n */\nfunction GitCommits() {\n const { t } = useTranslation(\"openhands\");\n const { conversationId } = useConversationId();\n const { commits, hasMore, isUnsupported, isLoading, isSuccess } =\n useUnifiedGitCommits();\n\n const { curAgentState } = useAgentState();\n const runtimeIsActive = !RUNTIME_INACTIVE_STATES.includes(curAgentState);\n\n const showList = isSuccess && !isUnsupported && commits.length > 0;\n\n return (\n <main className=\"h-full w-full flex flex-col items-stretch\">\n {showList ? (\n <div className=\"h-full overflow-y-auto flex flex-col items-stretch custom-scrollbar-always\">\n {/* Keyed by conversation so switching conversations collapses any\n expanded commit. */}\n <CommitList\n key={conversationId}\n commits={commits}\n hasMore={hasMore}\n />\n </div>\n ) : (\n <div className=\"flex-1 flex items-center justify-center\">\n {!runtimeIsActive && (\n <RuntimeWaitingState\n testId=\"commits-tab-status\"\n messageKey={I18nKey.DIFF_VIEWER$WAITING_FOR_RUNTIME}\n />\n )}\n {runtimeIsActive && isLoading && (\n <RuntimeWaitingState\n testId=\"commits-tab-status\"\n messageKey={I18nKey.DIFF_VIEWER$LOADING}\n />\n )}\n {runtimeIsActive && !isLoading && (\n <ConversationTabEmptyState icon={<DiffDrawerIcon />}>\n {t(I18nKey.DIFF_VIEWER$NO_COMMITS)}\n </ConversationTabEmptyState>\n )}\n </div>\n )}\n </main>\n );\n}\n\nexport default GitCommits;\n"],"mappings":";;;;;;;;;;;;AAiBA,SAAS,IAAa;CACpB,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,EAAE,sBAAmB,GAAmB,EACxC,EAAE,YAAS,YAAS,kBAAe,cAAW,iBAClD,GAAsB,EAElB,EAAE,qBAAkB,GAAe,EACnC,IAAkB,CAAC,EAAwB,SAAS,EAAc;AAIxE,QACE,kBAAC,QAAD;EAAM,WAAU;YAHD,KAAa,CAAC,KAAiB,EAAQ,SAAS,IAK3D,kBAAC,OAAD;GAAK,WAAU;aAGb,kBAAC,GAAD;IAEW;IACA;IACT,EAHK,EAGL;GACE,CAAA,GAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACG,CAAC,KACA,kBAAC,GAAD;KACE,QAAO;KACP,YAAY,EAAQ;KACpB,CAAA;IAEH,KAAmB,KAClB,kBAAC,GAAD;KACE,QAAO;KACP,YAAY,EAAQ;KACpB,CAAA;IAEH,KAAmB,CAAC,KACnB,kBAAC,GAAD;KAA2B,MAAM,kBAAC,GAAD,EAAkB,CAAA;eAChD,EAAE,EAAQ,uBAAuB;KACR,CAAA;IAE1B;;EAEH,CAAA"}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../i18n/declaration.cjs`),n=require(`../hooks/use-conversation-id.cjs`),r=require(`../utils/conversation-local-storage.cjs`),i=require(`../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),a=require(`../stores/files-tab-store.cjs`),o=require(`../icons/link-external.cjs`),s=require(`../components/features/files-tab/segmented-toggle.cjs`),c=require(`../components/features/files-tab/no-file-selected-message.cjs`),l=require(`../hooks/query/use-unified-get-git-changes.cjs`),u=require(`../hooks/query/use-workspace-files.cjs`),d=require(`../stores/use-workspace-mutation-counter.cjs`),f=require(`../hooks/query/use-workspace-file-content.cjs`),p=require(`../hooks/use-has-attached-source.cjs`),m=require(`../hooks/query/use-has-git-commits.cjs`),h=require(`../hooks/use-auto-refresh-files-on-edit.cjs`),g=require(`../utils/file-priority.cjs`),_=require(`../components/features/files-tab/file-quick-row.cjs`),v=require(`../components/features/files-tab/file-tree-view.cjs`),y=require(`../components/features/files-tab/file-content-viewer.cjs`),b=require(`../icons/u-refresh.cjs`),x=require(`./changes-tab.cjs`);let S=require(`react`),C=require(`react/jsx-runtime`);function w(){let{t:w}=e.useTranslation(`openhands`);h.useAutoRefreshFilesOnEdit();let{hasAttachedSource:T,isLoading:E}=p.useHasAttachedSource(),{hasCommits:D}=m.useHasGitCommits({enabled:T}),{conversationId:O}=n.useOptionalConversationId(),{state:k,setFilesTabDiffView:A,setFilesTabContentViewMode:j}=r.useConversationLocalStorageState(O??``),M=(T||E)&&D!==!1,N=k.filesTabDiffView??M,P=k.filesTabContentViewMode,[F,I]=(0,S.useState)(!1),L=u.useWorkspaceFiles(),R=(0,S.useMemo)(()=>L.data??[],[L.data]),z=a.useFilesTabStore(e=>e.selectedPath),B=a.useFilesTabStore(e=>e.selectedConversationId),V=a.useFilesTabStore(e=>e.setSelectedPath),H=B===O?z:null,U=(0,S.useCallback)(e=>V(e,O),[O,V]),W=f.useWorkspaceFileContent(H),G=d.useWorkspaceMutationCounter(e=>e.count),K=d.withWorkspaceCacheBuster(W.data?.staticUrl??null,G);(0,S.useEffect)(()=>{B!==O&&V(null,O)},[B,O,V]),(0,S.useEffect)(()=>{if(H||R.length===0)return;let[e]=g.sortFilesByPriority(R);e&&V(e,O)},[R,H,O,V]);let q=i.useQueryClient(),{refetch:J,isFetching:Y}=l.useUnifiedGetGitChanges();return(0,C.jsxs)(`main`,{className:`h-full w-full flex flex-col items-stretch`,"data-testid":`files-tab`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-1.5 border-b border-[var(--oh-border)]`,children:[(0,C.jsx)(s.SegmentedToggle,{ariaLabel:w(t.I18nKey.FILES$DIFF_VIEW),testId:`files-tab-diff-toggle`,value:N?`on`:`off`,options:[{value:`on`,label:w(t.I18nKey.FILES$DIFF_VIEW)},{value:`off`,label:w(t.I18nKey.COMMON$FILES)}],onChange:e=>A(e===`on`)}),!N&&(0,C.jsx)(s.SegmentedToggle,{ariaLabel:w(t.I18nKey.FILES$RICH),testId:`files-tab-content-mode-toggle`,value:P,options:[{value:`rich`,label:w(t.I18nKey.FILES$RICH)},{value:`plain`,label:w(t.I18nKey.FILES$PLAIN)}],onChange:j}),(0,C.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[!N&&K&&(0,C.jsx)(`a`,{href:K,target:`_blank`,rel:`noopener noreferrer`,"aria-label":w(t.I18nKey.FILES$OPEN_IN_NEW_WINDOW),title:w(t.I18nKey.FILES$OPEN_IN_NEW_WINDOW),"data-testid":`files-tab-open-in-new-window`,className:`flex items-center justify-center w-[26px] py-1 rounded-[7px] hover:bg-[var(--oh-interactive-hover)] cursor-pointer text-white`,children:(0,C.jsx)(o.default,{width:14,height:14})}),(0,C.jsx)(`button`,{type:`button`,onClick:()=>{J(),q.invalidateQueries({queryKey:[`workspace-files`]}),q.invalidateQueries({queryKey:[`workspace-file-content`]})},disabled:Y,"aria-label":w(t.I18nKey.FILES$REFRESH),title:w(t.I18nKey.FILES$REFRESH),"data-testid":`files-tab-refresh`,className:`flex items-center justify-center w-[26px] py-1 rounded-[7px] hover:enabled:bg-[var(--oh-interactive-hover)] cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed`,children:(0,C.jsx)(b.default,{width:12.75,height:15,color:`#ffffff`,className:Y?`animate-spin`:``})})]})]}),N?(0,C.jsx)(`div`,{className:`flex-1 min-h-0`,children:(0,C.jsx)(x.default,{})}):(0,C.jsx)(`div`,{className:`flex flex-1 flex-col min-h-0`,children:L.isLoading?(0,C.jsx)(`div`,{className:`flex flex-1 items-center justify-center text-sm text-[var(--oh-muted)]`,children:w(t.I18nKey.FILES$LOADING_FILES)}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(_.FileQuickRow,{paths:R,selectedPath:H,onSelectFile:U,isTreeVisible:F,onToggleTree:()=>I(e=>!e)}),(0,C.jsxs)(`div`,{className:`flex h-full min-h-0 flex-1`,children:[F&&(0,C.jsx)(`aside`,{className:`w-56 shrink-0 border-r border-[var(--oh-border)] overflow-y-auto custom-scrollbar-always`,"data-testid":`files-tab-tree`,children:(0,C.jsx)(v.FileTreeView,{paths:R,selectedPath:H,onSelectFile:U})}),(0,C.jsx)(`section`,{className:`flex h-full min-h-0 min-w-0 flex-1 flex-col`,"data-testid":`files-tab-content`,children:H?(0,C.jsx)(y.FileContentViewer,{path:H,viewMode:P}):(0,C.jsx)(c.NoFileSelectedMessage,{})})]})]})})]})}exports.default=w;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../i18n/declaration.cjs`),ee=require(`../hooks/use-conversation-id.cjs`),te=require(`../utils/conversation-local-storage.cjs`),n=require(`../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),r=require(`../stores/files-tab-store.cjs`),i=require(`../icons/link-external.cjs`),a=require(`../components/features/files-tab/segmented-toggle.cjs`),o=require(`../components/features/files-tab/no-file-selected-message.cjs`),s=require(`../hooks/query/use-unified-get-git-changes.cjs`),c=require(`../hooks/query/use-workspace-files.cjs`),l=require(`../stores/use-workspace-mutation-counter.cjs`),u=require(`../hooks/query/use-workspace-file-content.cjs`),d=require(`../hooks/use-has-attached-source.cjs`),f=require(`../hooks/query/use-has-git-commits.cjs`),p=require(`../hooks/use-auto-refresh-files-on-edit.cjs`),m=require(`../utils/file-priority.cjs`),ne=require(`../components/features/files-tab/file-quick-row.cjs`),h=require(`../components/features/files-tab/file-tree-view.cjs`),g=require(`../components/features/files-tab/file-content-viewer.cjs`),_=require(`../icons/u-refresh.cjs`),v=require(`../hooks/query/use-unified-git-commits.cjs`),y=require(`./changes-tab.cjs`),b=require(`./commits-tab.cjs`);let x=require(`react`),S=require(`react/jsx-runtime`);function C(){let{t:C}=e.useTranslation(`openhands`);p.useAutoRefreshFilesOnEdit();let{hasAttachedSource:w,isLoading:T}=d.useHasAttachedSource(),{hasCommits:E}=f.useHasGitCommits({enabled:w}),{conversationId:D}=ee.useOptionalConversationId(),{state:O,setFilesTabDiffView:k,setFilesTabContentViewMode:A}=te.useConversationLocalStorageState(D??``),j=(w||T)&&E!==!1,M=O.filesTabDiffView??j,N=O.filesTabContentViewMode,{isSuccess:P,isUnsupported:F}=v.useUnifiedGitCommits(),I=P&&!F,[L,R]=(0,x.useState)(!1),z=M?`on`:`off`;L&&I&&(z=`commits`);let[B,V]=(0,x.useState)(!1),H=c.useWorkspaceFiles(),U=(0,x.useMemo)(()=>H.data??[],[H.data]),W=r.useFilesTabStore(e=>e.selectedPath),G=r.useFilesTabStore(e=>e.selectedConversationId),K=r.useFilesTabStore(e=>e.setSelectedPath),q=G===D?W:null,J=(0,x.useCallback)(e=>K(e,D),[D,K]),Y=u.useWorkspaceFileContent(q),X=l.useWorkspaceMutationCounter(e=>e.count),Z=l.withWorkspaceCacheBuster(Y.data?.staticUrl??null,X);(0,x.useEffect)(()=>{G!==D&&K(null,D)},[G,D,K]),(0,x.useEffect)(()=>{if(q||U.length===0)return;let[e]=m.sortFilesByPriority(U);e&&K(e,D)},[U,q,D,K]);let Q=n.useQueryClient(),{refetch:re,isFetching:$}=s.useUnifiedGetGitChanges(),ie=()=>{re(),Q.invalidateQueries({queryKey:[`workspace-files`]}),Q.invalidateQueries({queryKey:[`workspace-file-content`]}),Q.invalidateQueries({queryKey:[`git_commits`]})};return(0,S.jsxs)(`main`,{className:`h-full w-full flex flex-col items-stretch`,"data-testid":`files-tab`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-1.5 border-b border-[var(--oh-border)]`,children:[(0,S.jsx)(a.SegmentedToggle,{ariaLabel:C(t.I18nKey.FILES$DIFF_VIEW),testId:`files-tab-diff-toggle`,value:z,options:[{value:`on`,label:C(t.I18nKey.FILES$DIFF_VIEW)},...I?[{value:`commits`,label:C(t.I18nKey.DIFF_VIEWER$COMMITS)}]:[],{value:`off`,label:C(t.I18nKey.COMMON$FILES)}],onChange:e=>{e===`commits`?R(!0):(R(!1),k(e===`on`))}}),z===`off`&&(0,S.jsx)(a.SegmentedToggle,{ariaLabel:C(t.I18nKey.FILES$RICH),testId:`files-tab-content-mode-toggle`,value:N,options:[{value:`rich`,label:C(t.I18nKey.FILES$RICH)},{value:`plain`,label:C(t.I18nKey.FILES$PLAIN)}],onChange:A}),(0,S.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[z===`off`&&Z&&(0,S.jsx)(`a`,{href:Z,target:`_blank`,rel:`noopener noreferrer`,"aria-label":C(t.I18nKey.FILES$OPEN_IN_NEW_WINDOW),title:C(t.I18nKey.FILES$OPEN_IN_NEW_WINDOW),"data-testid":`files-tab-open-in-new-window`,className:`flex items-center justify-center w-[26px] py-1 rounded-[7px] hover:bg-[var(--oh-interactive-hover)] cursor-pointer text-white`,children:(0,S.jsx)(i.default,{width:14,height:14})}),(0,S.jsx)(`button`,{type:`button`,onClick:ie,disabled:$,"aria-label":C(t.I18nKey.FILES$REFRESH),title:C(t.I18nKey.FILES$REFRESH),"data-testid":`files-tab-refresh`,className:`flex items-center justify-center w-[26px] py-1 rounded-[7px] hover:enabled:bg-[var(--oh-interactive-hover)] cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed`,children:(0,S.jsx)(_.default,{width:12.75,height:15,color:`#ffffff`,className:$?`animate-spin`:``})})]})]}),z===`on`&&(0,S.jsx)(`div`,{className:`flex-1 min-h-0`,children:(0,S.jsx)(y.default,{})}),z===`commits`&&(0,S.jsx)(`div`,{className:`flex-1 min-h-0`,children:(0,S.jsx)(b.default,{})}),z===`off`&&(0,S.jsx)(`div`,{className:`flex flex-1 flex-col min-h-0`,children:H.isLoading?(0,S.jsx)(`div`,{className:`flex flex-1 items-center justify-center text-sm text-[var(--oh-muted)]`,children:C(t.I18nKey.FILES$LOADING_FILES)}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(ne.FileQuickRow,{paths:U,selectedPath:q,onSelectFile:J,isTreeVisible:B,onToggleTree:()=>V(e=>!e)}),(0,S.jsxs)(`div`,{className:`flex h-full min-h-0 flex-1`,children:[B&&(0,S.jsx)(`aside`,{className:`w-56 shrink-0 border-r border-[var(--oh-border)] overflow-y-auto custom-scrollbar-always`,"data-testid":`files-tab-tree`,children:(0,S.jsx)(h.FileTreeView,{paths:U,selectedPath:q,onSelectFile:J})}),(0,S.jsx)(`section`,{className:`flex h-full min-h-0 min-w-0 flex-1 flex-col`,"data-testid":`files-tab-content`,children:q?(0,S.jsx)(g.FileContentViewer,{path:q,viewMode:N}):(0,S.jsx)(o.NoFileSelectedMessage,{})})]})]})})]})}exports.default=C;
2
2
  //# sourceMappingURL=files-tab.cjs.map