@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
@@ -12,78 +12,79 @@ import { HiddenFileInput as u } from "./components/hidden-file-input.js";
12
12
  import d, { useEffect as f, useRef as p } from "react";
13
13
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
14
14
  //#region src/components/features/chat/custom-chat-input.tsx
15
- function g({ disabled: g = !1, isNewConversationPending: _ = !1, showButton: v = !0, onSubmit: y, onFocus: b, onBlur: ee, onFilesPaste: te, className: x = "", buttonClassName: S = "" }) {
16
- let [C, w] = d.useState(!1), { submittedMessage: T, clearAllFiles: E, setShouldHideSuggestions: D, setSubmittedMessage: O, images: k, files: A } = t(), j = g, M = p(y);
15
+ function g({ disabled: g = !1, isNewConversationPending: _ = !1, hasStartedConversation: v, showButton: y = !0, onSubmit: b, onFocus: ee, onBlur: te, onFilesPaste: x, className: S = "", buttonClassName: C = "" }) {
16
+ let [w, T] = d.useState(!1), { submittedMessage: E, clearAllFiles: D, setShouldHideSuggestions: O, setSubmittedMessage: k, images: A, files: j } = t(), M = g, N = p(b);
17
17
  f(() => {
18
- M.current = y;
19
- }, [y]), f(() => {
20
- !T || g || (M.current(T), O(null));
18
+ N.current = b;
19
+ }, [b]), f(() => {
20
+ !E || g || (N.current(E), k(null));
21
21
  }, [
22
- T,
22
+ E,
23
23
  g,
24
- O
24
+ k
25
25
  ]);
26
- let { chatInputRef: N, messageToSend: P, checkIsContentEmpty: F, clearEmptyContentHandler: I, saveDraft: L } = n(), R = d.useCallback(() => {
27
- let e = N.current?.innerText ?? "", t = k.length > 0 || A.length > 0;
28
- w(e.trim().length > 0 || t);
26
+ let { chatInputRef: P, messageToSend: F, checkIsContentEmpty: I, clearEmptyContentHandler: L, saveDraft: R } = n(), z = d.useCallback(() => {
27
+ let e = P.current?.innerText ?? "", t = A.length > 0 || j.length > 0;
28
+ T(e.trim().length > 0 || t);
29
29
  }, [
30
- N,
31
- k,
32
- A
33
- ]), { fileInputRef: z, chatContainerRef: B, isDragOver: V, handleFileIconClick: H, handleFileInputChange: U, handleDragOver: W, handleDragLeave: ne, handleDrop: G } = r(te), { gripRef: K, isGripVisible: q, isGripDragging: J, handleTopEdgeClick: Y, smartResize: X, handleGripMouseDown: Z, handleGripTouchStart: re, increaseHeightForEmptyContent: ie, resetManualResize: ae } = i(N, P), { handleSubmit: Q } = o(N, z, X, y, ae), $ = d.useCallback(() => {
34
- Q(), R();
35
- }, [Q, R]), { handleInput: oe, handlePaste: se, handleKeyDown: ce, handleBlur: le, handleFocus: ue } = a(N, X, ie, F, I, b, ee), { isMenuOpen: de, filteredItems: fe, selectedIndex: pe, updateSlashMenu: me, selectItem: he, handleSlashKeyDown: ge, closeMenu: _e } = s(N);
30
+ P,
31
+ A,
32
+ j
33
+ ]), { fileInputRef: B, chatContainerRef: V, isDragOver: H, handleFileIconClick: U, handleFileInputChange: W, handleDragOver: ne, handleDragLeave: G, handleDrop: K } = r(x), { gripRef: q, isGripVisible: J, isGripDragging: Y, handleTopEdgeClick: X, smartResize: Z, handleGripMouseDown: re, handleGripTouchStart: ie, increaseHeightForEmptyContent: ae, resetManualResize: oe } = i(P, F), { handleSubmit: Q } = o(P, B, Z, b, oe), $ = d.useCallback(() => {
34
+ Q(), z();
35
+ }, [Q, z]), { handleInput: se, handlePaste: ce, handleKeyDown: le, handleBlur: ue, handleFocus: de } = a(P, Z, ae, I, L, ee, te), { isMenuOpen: fe, filteredItems: pe, selectedIndex: me, updateSlashMenu: he, selectItem: ge, handleSlashKeyDown: _e, closeMenu: ve } = s(P);
36
36
  return f(() => () => {
37
- D(!1), E();
38
- }, [D, E]), f(() => {
39
- R();
37
+ O(!1), D();
38
+ }, [O, D]), f(() => {
39
+ z();
40
40
  }, [
41
- R,
42
- k.length,
43
- A.length
41
+ z,
42
+ A.length,
43
+ j.length
44
44
  ]), /* @__PURE__ */ h("div", {
45
- className: e("w-full", x),
45
+ className: e("w-full", S),
46
46
  children: [/* @__PURE__ */ m(u, {
47
- fileInputRef: z,
48
- onChange: U
47
+ fileInputRef: B,
48
+ onChange: W
49
49
  }), /* @__PURE__ */ h("div", {
50
50
  className: "relative w-full",
51
51
  children: [/* @__PURE__ */ m(c, {
52
- gripRef: K,
53
- isGripVisible: q,
54
- isGripDragging: J,
55
- handleTopEdgeClick: Y,
56
- handleGripMouseDown: Z,
57
- handleGripTouchStart: re
52
+ gripRef: q,
53
+ isGripVisible: J,
54
+ isGripDragging: Y,
55
+ handleTopEdgeClick: X,
56
+ handleGripMouseDown: re,
57
+ handleGripTouchStart: ie
58
58
  }), /* @__PURE__ */ m(l, {
59
- chatContainerRef: B,
60
- isDragOver: V,
61
- disabled: j,
62
- canSubmit: C,
59
+ chatContainerRef: V,
60
+ isDragOver: H,
61
+ disabled: M,
62
+ canSubmit: w,
63
+ hasStartedConversation: v,
63
64
  isNewConversationPending: _,
64
- showButton: v,
65
- buttonClassName: S,
66
- chatInputRef: N,
67
- handleFileIconClick: H,
65
+ showButton: y,
66
+ buttonClassName: C,
67
+ chatInputRef: P,
68
+ handleFileIconClick: U,
68
69
  handleSubmit: $,
69
- onDragOver: W,
70
- onDragLeave: ne,
71
- onDrop: G,
70
+ onDragOver: ne,
71
+ onDragLeave: G,
72
+ onDrop: K,
72
73
  onInput: () => {
73
- oe(), me(), L(), R();
74
+ se(), he(), R(), z();
74
75
  },
75
- onPaste: se,
76
+ onPaste: ce,
76
77
  onKeyDown: (e) => {
77
- ge(e) || ce(e, j, $);
78
+ _e(e) || le(e, M, $);
78
79
  },
79
- onFocus: ue,
80
+ onFocus: de,
80
81
  onBlur: () => {
81
- le(), _e(), R();
82
+ ue(), ve(), z();
82
83
  },
83
- isSlashMenuOpen: de,
84
- slashItems: fe,
85
- slashSelectedIndex: pe,
86
- onSlashSelect: he
84
+ isSlashMenuOpen: fe,
85
+ slashItems: pe,
86
+ slashSelectedIndex: me,
87
+ onSlashSelect: ge
87
88
  })]
88
89
  })]
89
90
  });
@@ -1 +1 @@
1
- {"version":3,"file":"custom-chat-input.js","names":[],"sources":["../../../../src/components/features/chat/custom-chat-input.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { useChatInputLogic } from \"#/hooks/chat/use-chat-input-logic\";\nimport { useFileHandling } from \"#/hooks/chat/use-file-handling\";\nimport { useGripResize } from \"#/hooks/chat/use-grip-resize\";\nimport { useChatInputEvents } from \"#/hooks/chat/use-chat-input-events\";\nimport { useChatSubmission } from \"#/hooks/chat/use-chat-submission\";\nimport { useSlashCommand } from \"#/hooks/chat/use-slash-command\";\nimport { ChatInputGrip } from \"./components/chat-input-grip\";\nimport { ChatInputContainer } from \"./components/chat-input-container\";\nimport { HiddenFileInput } from \"./components/hidden-file-input\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { cn } from \"#/utils/utils\";\n\nexport interface CustomChatInputProps {\n disabled?: boolean;\n isNewConversationPending?: boolean;\n showButton?: boolean;\n onSubmit: (message: string) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onFilesPaste?: (\n files: File[],\n options?: import(\"#/hooks/chat/use-chat-attachment-upload\").ChatAttachmentUploadOptions,\n ) => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n buttonClassName?: React.HTMLAttributes<HTMLButtonElement>[\"className\"];\n}\n\nexport function CustomChatInput({\n disabled = false,\n isNewConversationPending = false,\n showButton = true,\n onSubmit,\n onFocus,\n onBlur,\n onFilesPaste,\n className = \"\",\n buttonClassName = \"\",\n}: CustomChatInputProps) {\n const [canSubmit, setCanSubmit] = React.useState(false);\n const {\n submittedMessage,\n clearAllFiles,\n setShouldHideSuggestions,\n setSubmittedMessage,\n images,\n files,\n } = useConversationStore();\n\n // Note: we intentionally do NOT disable the input when the conversation is\n // in an ERROR/STUCK execution state. Users should be able to send a follow-up\n // message to recover the conversation; the message will be delivered\n // immediately via the WebSocket if connected, or queued via REST otherwise.\n const isDisabled = disabled;\n\n // Always call the latest `onSubmit` without making the effect re-run when\n // its identity changes. `onSubmit` (typically `handleSendMessage`) is a\n // fresh function on every parent render, and the parent re-renders\n // whenever the pending-message queue updates synchronously inside\n // `onSubmit` itself. Listing it in the dep array caused the effect to\n // fire twice — once for the original submit and again from the\n // mid-submit re-render, before `setSubmittedMessage(null)` was applied —\n // producing a duplicate \"Sending…\" bubble.\n const onSubmitRef = useRef(onSubmit);\n useEffect(() => {\n onSubmitRef.current = onSubmit;\n }, [onSubmit]);\n\n // Listen to submittedMessage state changes\n useEffect(() => {\n if (!submittedMessage || disabled) {\n return;\n }\n onSubmitRef.current(submittedMessage);\n setSubmittedMessage(null);\n }, [submittedMessage, disabled, setSubmittedMessage]);\n\n // Custom hooks\n const {\n chatInputRef,\n messageToSend,\n checkIsContentEmpty,\n clearEmptyContentHandler,\n saveDraft,\n } = useChatInputLogic();\n\n const syncCanSubmit = React.useCallback(() => {\n const text = chatInputRef.current?.innerText ?? \"\";\n const hasAttachments = images.length > 0 || files.length > 0;\n setCanSubmit(text.trim().length > 0 || hasAttachments);\n }, [chatInputRef, images, files]);\n\n const {\n fileInputRef,\n chatContainerRef,\n isDragOver,\n handleFileIconClick,\n handleFileInputChange,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n } = useFileHandling(onFilesPaste);\n\n const {\n gripRef,\n isGripVisible,\n isGripDragging,\n handleTopEdgeClick,\n smartResize,\n handleGripMouseDown,\n handleGripTouchStart,\n increaseHeightForEmptyContent,\n resetManualResize,\n } = useGripResize(\n chatInputRef as React.RefObject<HTMLDivElement | null>,\n messageToSend,\n );\n\n const { handleSubmit } = useChatSubmission(\n chatInputRef as React.RefObject<HTMLDivElement | null>,\n fileInputRef as React.RefObject<HTMLInputElement | null>,\n smartResize,\n onSubmit,\n resetManualResize,\n );\n const handleSubmitAndSync = React.useCallback(() => {\n handleSubmit();\n syncCanSubmit();\n }, [handleSubmit, syncCanSubmit]);\n\n const { handleInput, handlePaste, handleKeyDown, handleBlur, handleFocus } =\n useChatInputEvents(\n chatInputRef as React.RefObject<HTMLDivElement | null>,\n smartResize,\n increaseHeightForEmptyContent,\n checkIsContentEmpty,\n clearEmptyContentHandler,\n onFocus,\n onBlur,\n );\n\n const {\n isMenuOpen: isSlashMenuOpen,\n filteredItems: slashItems,\n selectedIndex: slashSelectedIndex,\n updateSlashMenu,\n selectItem: selectSlashItem,\n handleSlashKeyDown,\n closeMenu: closeSlashMenu,\n } = useSlashCommand(chatInputRef as React.RefObject<HTMLDivElement | null>);\n\n // Cleanup: reset suggestions visibility when component unmounts\n useEffect(\n () => () => {\n setShouldHideSuggestions(false);\n clearAllFiles();\n },\n [setShouldHideSuggestions, clearAllFiles],\n );\n useEffect(() => {\n syncCanSubmit();\n }, [syncCanSubmit, images.length, files.length]);\n return (\n <div className={cn(\"w-full\", className)}>\n {/* Hidden file input */}\n <HiddenFileInput\n fileInputRef={fileInputRef}\n onChange={handleFileInputChange}\n />\n\n {/* Container with grip */}\n <div className=\"relative w-full\">\n <ChatInputGrip\n gripRef={gripRef}\n isGripVisible={isGripVisible}\n isGripDragging={isGripDragging}\n handleTopEdgeClick={handleTopEdgeClick}\n handleGripMouseDown={handleGripMouseDown}\n handleGripTouchStart={handleGripTouchStart}\n />\n\n <ChatInputContainer\n chatContainerRef={chatContainerRef}\n isDragOver={isDragOver}\n disabled={isDisabled}\n canSubmit={canSubmit}\n isNewConversationPending={isNewConversationPending}\n showButton={showButton}\n buttonClassName={buttonClassName}\n chatInputRef={chatInputRef}\n handleFileIconClick={handleFileIconClick}\n handleSubmit={handleSubmitAndSync}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onInput={() => {\n handleInput();\n updateSlashMenu();\n saveDraft();\n syncCanSubmit();\n }}\n onPaste={handlePaste}\n onKeyDown={(e) => {\n if (handleSlashKeyDown(e)) return;\n handleKeyDown(e, isDisabled, handleSubmitAndSync);\n }}\n onFocus={handleFocus}\n onBlur={() => {\n handleBlur();\n closeSlashMenu();\n syncCanSubmit();\n }}\n isSlashMenuOpen={isSlashMenuOpen}\n slashItems={slashItems}\n slashSelectedIndex={slashSelectedIndex}\n onSlashSelect={selectSlashItem}\n />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AA4BA,SAAgB,EAAgB,EAC9B,cAAW,IACX,8BAA2B,IAC3B,gBAAa,IACb,aACA,YACA,YACA,kBACA,eAAY,IACZ,qBAAkB,MACK;CACvB,IAAM,CAAC,GAAW,KAAgB,EAAM,SAAS,GAAM,EACjD,EACJ,qBACA,kBACA,6BACA,wBACA,WACA,aACE,GAAsB,EAMpB,IAAa,GAUb,IAAc,EAAO,EAAS;AAMpC,CALA,QAAgB;AACd,IAAY,UAAU;IACrB,CAAC,EAAS,CAAC,EAGd,QAAgB;AACV,GAAC,KAAoB,MAGzB,EAAY,QAAQ,EAAiB,EACrC,EAAoB,KAAK;IACxB;EAAC;EAAkB;EAAU;EAAoB,CAAC;CAGrD,IAAM,EACJ,iBACA,kBACA,wBACA,6BACA,iBACE,GAAmB,EAEjB,IAAgB,EAAM,kBAAkB;EAC5C,IAAM,IAAO,EAAa,SAAS,aAAa,IAC1C,IAAiB,EAAO,SAAS,KAAK,EAAM,SAAS;AAC3D,IAAa,EAAK,MAAM,CAAC,SAAS,KAAK,EAAe;IACrD;EAAC;EAAc;EAAQ;EAAM,CAAC,EAE3B,EACJ,iBACA,qBACA,eACA,wBACA,0BACA,mBACA,qBACA,kBACE,EAAgB,GAAa,EAE3B,EACJ,YACA,kBACA,mBACA,uBACA,gBACA,wBACA,0BACA,mCACA,0BACE,EACF,GACA,EACD,EAEK,EAAE,oBAAiB,EACvB,GACA,GACA,GACA,GACA,GACD,EACK,IAAsB,EAAM,kBAAkB;AAElD,EADA,GAAc,EACd,GAAe;IACd,CAAC,GAAc,EAAc,CAAC,EAE3B,EAAE,iBAAa,iBAAa,mBAAe,gBAAY,oBAC3D,EACE,GACA,GACA,IACA,GACA,GACA,GACA,GACD,EAEG,EACJ,YAAY,IACZ,eAAe,IACf,eAAe,IACf,qBACA,YAAY,IACZ,wBACA,WAAW,OACT,EAAgB,EAAuD;AAa3E,QAVA,cACc;AAEV,EADA,EAAyB,GAAM,EAC/B,GAAe;IAEjB,CAAC,GAA0B,EAAc,CAC1C,EACD,QAAgB;AACd,KAAe;IACd;EAAC;EAAe,EAAO;EAAQ,EAAM;EAAO,CAAC,EAE9C,kBAAC,OAAD;EAAK,WAAW,EAAG,UAAU,EAAU;YAAvC,CAEE,kBAAC,GAAD;GACgB;GACd,UAAU;GACV,CAAA,EAGF,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IACW;IACM;IACC;IACI;IACC;IACC;IACtB,CAAA,EAEF,kBAAC,GAAD;IACoB;IACN;IACZ,UAAU;IACC;IACe;IACd;IACK;IACH;IACO;IACrB,cAAc;IACd,YAAY;IACZ,aAAa;IACb,QAAQ;IACR,eAAe;AAIb,KAHA,IAAa,EACb,IAAiB,EACjB,GAAW,EACX,GAAe;;IAEjB,SAAS;IACT,YAAY,MAAM;AACZ,QAAmB,EAAE,IACzB,GAAc,GAAG,GAAY,EAAoB;;IAEnD,SAAS;IACT,cAAc;AAGZ,KAFA,IAAY,EACZ,IAAgB,EAChB,GAAe;;IAEA;IACL;IACQ;IACpB,eAAe;IACf,CAAA,CACE;KACF"}
1
+ {"version":3,"file":"custom-chat-input.js","names":[],"sources":["../../../../src/components/features/chat/custom-chat-input.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { useChatInputLogic } from \"#/hooks/chat/use-chat-input-logic\";\nimport { useFileHandling } from \"#/hooks/chat/use-file-handling\";\nimport { useGripResize } from \"#/hooks/chat/use-grip-resize\";\nimport { useChatInputEvents } from \"#/hooks/chat/use-chat-input-events\";\nimport { useChatSubmission } from \"#/hooks/chat/use-chat-submission\";\nimport { useSlashCommand } from \"#/hooks/chat/use-slash-command\";\nimport { ChatInputGrip } from \"./components/chat-input-grip\";\nimport { ChatInputContainer } from \"./components/chat-input-container\";\nimport { HiddenFileInput } from \"./components/hidden-file-input\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { cn } from \"#/utils/utils\";\n\nexport interface CustomChatInputProps {\n disabled?: boolean;\n isNewConversationPending?: boolean;\n hasStartedConversation?: boolean;\n showButton?: boolean;\n onSubmit: (message: string) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onFilesPaste?: (\n files: File[],\n options?: import(\"#/hooks/chat/use-chat-attachment-upload\").ChatAttachmentUploadOptions,\n ) => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n buttonClassName?: React.HTMLAttributes<HTMLButtonElement>[\"className\"];\n}\n\nexport function CustomChatInput({\n disabled = false,\n isNewConversationPending = false,\n hasStartedConversation,\n showButton = true,\n onSubmit,\n onFocus,\n onBlur,\n onFilesPaste,\n className = \"\",\n buttonClassName = \"\",\n}: CustomChatInputProps) {\n const [canSubmit, setCanSubmit] = React.useState(false);\n const {\n submittedMessage,\n clearAllFiles,\n setShouldHideSuggestions,\n setSubmittedMessage,\n images,\n files,\n } = useConversationStore();\n\n // Note: we intentionally do NOT disable the input when the conversation is\n // in an ERROR/STUCK execution state. Users should be able to send a follow-up\n // message to recover the conversation; the message will be delivered\n // immediately via the WebSocket if connected, or queued via REST otherwise.\n const isDisabled = disabled;\n\n // Always call the latest `onSubmit` without making the effect re-run when\n // its identity changes. `onSubmit` (typically `handleSendMessage`) is a\n // fresh function on every parent render, and the parent re-renders\n // whenever the pending-message queue updates synchronously inside\n // `onSubmit` itself. Listing it in the dep array caused the effect to\n // fire twice — once for the original submit and again from the\n // mid-submit re-render, before `setSubmittedMessage(null)` was applied —\n // producing a duplicate \"Sending…\" bubble.\n const onSubmitRef = useRef(onSubmit);\n useEffect(() => {\n onSubmitRef.current = onSubmit;\n }, [onSubmit]);\n\n // Listen to submittedMessage state changes\n useEffect(() => {\n if (!submittedMessage || disabled) {\n return;\n }\n onSubmitRef.current(submittedMessage);\n setSubmittedMessage(null);\n }, [submittedMessage, disabled, setSubmittedMessage]);\n\n // Custom hooks\n const {\n chatInputRef,\n messageToSend,\n checkIsContentEmpty,\n clearEmptyContentHandler,\n saveDraft,\n } = useChatInputLogic();\n\n const syncCanSubmit = React.useCallback(() => {\n const text = chatInputRef.current?.innerText ?? \"\";\n const hasAttachments = images.length > 0 || files.length > 0;\n setCanSubmit(text.trim().length > 0 || hasAttachments);\n }, [chatInputRef, images, files]);\n\n const {\n fileInputRef,\n chatContainerRef,\n isDragOver,\n handleFileIconClick,\n handleFileInputChange,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n } = useFileHandling(onFilesPaste);\n\n const {\n gripRef,\n isGripVisible,\n isGripDragging,\n handleTopEdgeClick,\n smartResize,\n handleGripMouseDown,\n handleGripTouchStart,\n increaseHeightForEmptyContent,\n resetManualResize,\n } = useGripResize(\n chatInputRef as React.RefObject<HTMLDivElement | null>,\n messageToSend,\n );\n\n const { handleSubmit } = useChatSubmission(\n chatInputRef as React.RefObject<HTMLDivElement | null>,\n fileInputRef as React.RefObject<HTMLInputElement | null>,\n smartResize,\n onSubmit,\n resetManualResize,\n );\n const handleSubmitAndSync = React.useCallback(() => {\n handleSubmit();\n syncCanSubmit();\n }, [handleSubmit, syncCanSubmit]);\n\n const { handleInput, handlePaste, handleKeyDown, handleBlur, handleFocus } =\n useChatInputEvents(\n chatInputRef as React.RefObject<HTMLDivElement | null>,\n smartResize,\n increaseHeightForEmptyContent,\n checkIsContentEmpty,\n clearEmptyContentHandler,\n onFocus,\n onBlur,\n );\n\n const {\n isMenuOpen: isSlashMenuOpen,\n filteredItems: slashItems,\n selectedIndex: slashSelectedIndex,\n updateSlashMenu,\n selectItem: selectSlashItem,\n handleSlashKeyDown,\n closeMenu: closeSlashMenu,\n } = useSlashCommand(chatInputRef as React.RefObject<HTMLDivElement | null>);\n\n // Cleanup: reset suggestions visibility when component unmounts\n useEffect(\n () => () => {\n setShouldHideSuggestions(false);\n clearAllFiles();\n },\n [setShouldHideSuggestions, clearAllFiles],\n );\n useEffect(() => {\n syncCanSubmit();\n }, [syncCanSubmit, images.length, files.length]);\n return (\n <div className={cn(\"w-full\", className)}>\n {/* Hidden file input */}\n <HiddenFileInput\n fileInputRef={fileInputRef}\n onChange={handleFileInputChange}\n />\n\n {/* Container with grip */}\n <div className=\"relative w-full\">\n <ChatInputGrip\n gripRef={gripRef}\n isGripVisible={isGripVisible}\n isGripDragging={isGripDragging}\n handleTopEdgeClick={handleTopEdgeClick}\n handleGripMouseDown={handleGripMouseDown}\n handleGripTouchStart={handleGripTouchStart}\n />\n\n <ChatInputContainer\n chatContainerRef={chatContainerRef}\n isDragOver={isDragOver}\n disabled={isDisabled}\n canSubmit={canSubmit}\n hasStartedConversation={hasStartedConversation}\n isNewConversationPending={isNewConversationPending}\n showButton={showButton}\n buttonClassName={buttonClassName}\n chatInputRef={chatInputRef}\n handleFileIconClick={handleFileIconClick}\n handleSubmit={handleSubmitAndSync}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onInput={() => {\n handleInput();\n updateSlashMenu();\n saveDraft();\n syncCanSubmit();\n }}\n onPaste={handlePaste}\n onKeyDown={(e) => {\n if (handleSlashKeyDown(e)) return;\n handleKeyDown(e, isDisabled, handleSubmitAndSync);\n }}\n onFocus={handleFocus}\n onBlur={() => {\n handleBlur();\n closeSlashMenu();\n syncCanSubmit();\n }}\n isSlashMenuOpen={isSlashMenuOpen}\n slashItems={slashItems}\n slashSelectedIndex={slashSelectedIndex}\n onSlashSelect={selectSlashItem}\n />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AA6BA,SAAgB,EAAgB,EAC9B,cAAW,IACX,8BAA2B,IAC3B,2BACA,gBAAa,IACb,aACA,aACA,YACA,iBACA,eAAY,IACZ,qBAAkB,MACK;CACvB,IAAM,CAAC,GAAW,KAAgB,EAAM,SAAS,GAAM,EACjD,EACJ,qBACA,kBACA,6BACA,wBACA,WACA,aACE,GAAsB,EAMpB,IAAa,GAUb,IAAc,EAAO,EAAS;AAMpC,CALA,QAAgB;AACd,IAAY,UAAU;IACrB,CAAC,EAAS,CAAC,EAGd,QAAgB;AACV,GAAC,KAAoB,MAGzB,EAAY,QAAQ,EAAiB,EACrC,EAAoB,KAAK;IACxB;EAAC;EAAkB;EAAU;EAAoB,CAAC;CAGrD,IAAM,EACJ,iBACA,kBACA,wBACA,6BACA,iBACE,GAAmB,EAEjB,IAAgB,EAAM,kBAAkB;EAC5C,IAAM,IAAO,EAAa,SAAS,aAAa,IAC1C,IAAiB,EAAO,SAAS,KAAK,EAAM,SAAS;AAC3D,IAAa,EAAK,MAAM,CAAC,SAAS,KAAK,EAAe;IACrD;EAAC;EAAc;EAAQ;EAAM,CAAC,EAE3B,EACJ,iBACA,qBACA,eACA,wBACA,0BACA,oBACA,oBACA,kBACE,EAAgB,EAAa,EAE3B,EACJ,YACA,kBACA,mBACA,uBACA,gBACA,yBACA,0BACA,mCACA,0BACE,EACF,GACA,EACD,EAEK,EAAE,oBAAiB,EACvB,GACA,GACA,GACA,GACA,GACD,EACK,IAAsB,EAAM,kBAAkB;AAElD,EADA,GAAc,EACd,GAAe;IACd,CAAC,GAAc,EAAc,CAAC,EAE3B,EAAE,iBAAa,iBAAa,mBAAe,gBAAY,oBAC3D,EACE,GACA,GACA,IACA,GACA,GACA,IACA,GACD,EAEG,EACJ,YAAY,IACZ,eAAe,IACf,eAAe,IACf,qBACA,YAAY,IACZ,wBACA,WAAW,OACT,EAAgB,EAAuD;AAa3E,QAVA,cACc;AAEV,EADA,EAAyB,GAAM,EAC/B,GAAe;IAEjB,CAAC,GAA0B,EAAc,CAC1C,EACD,QAAgB;AACd,KAAe;IACd;EAAC;EAAe,EAAO;EAAQ,EAAM;EAAO,CAAC,EAE9C,kBAAC,OAAD;EAAK,WAAW,EAAG,UAAU,EAAU;YAAvC,CAEE,kBAAC,GAAD;GACgB;GACd,UAAU;GACV,CAAA,EAGF,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IACW;IACM;IACC;IACI;IACC;IACC;IACtB,CAAA,EAEF,kBAAC,GAAD;IACoB;IACN;IACZ,UAAU;IACC;IACa;IACE;IACd;IACK;IACH;IACO;IACrB,cAAc;IACd,YAAY;IACZ,aAAa;IACb,QAAQ;IACR,eAAe;AAIb,KAHA,IAAa,EACb,IAAiB,EACjB,GAAW,EACX,GAAe;;IAEjB,SAAS;IACT,YAAY,MAAM;AACZ,QAAmB,EAAE,IACzB,GAAc,GAAG,GAAY,EAAoB;;IAEnD,SAAS;IACT,cAAc;AAGZ,KAFA,IAAY,EACZ,IAAgB,EAChB,GAAe;;IAEA;IACL;IACQ;IACpB,eAAe;IACf,CAAA,CACE;KACF"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../types/agent-state.cjs`),t=require(`../../../utils/utils.cjs`),n=require(`../../../hooks/use-conversation-id.cjs`),r=require(`../../../stores/conversation-store.cjs`),i=require(`../../../hooks/query/use-active-conversation.cjs`),a=require(`../../../hooks/use-agent-state.cjs`),o=require(`./utils/chat-input.utils.cjs`),s=require(`../../../hooks/query/use-sub-conversation-task-polling.cjs`),c=require(`./custom-chat-input.cjs`),l=require(`../../../hooks/chat/use-btw-interceptor.cjs`),u=require(`../../../hooks/chat/use-goal-interceptor.cjs`),d=require(`../../../hooks/chat/use-model-interceptor.cjs`),f=require(`../../../hooks/chat/use-chat-attachment-upload.cjs`),p=require(`./git-control-bar.cjs`);let m=require(`react/jsx-runtime`);function h({onSubmit:h,disabled:g=!1}){let{images:_,files:v,imagesMarkedUploadAsFile:y,clearAllFiles:b,subConversationTaskId:x}=r.useConversationStore(),{curAgentState:S}=a.useAgentState(),{data:C}=i.useActiveConversation(),{conversationId:w}=n.useOptionalConversationId(),T=w??C?.id??null,{taskStatus:E}=s.useSubConversationTaskPolling(x,C?.id||null),{handleUpload:D}=f.useChatAttachmentUpload(),O=d.useModelInterceptor(T,u.useGoalInterceptor(T,l.useBtwInterceptor(T,e=>{let{imagesToEmbed:t,imagesAsFiles:n}=o.partitionImagesForUpload(_,y);h(e,t,[...v,...n]),b()})));return(0,m.jsxs)(`div`,{"data-testid":`interactive-chat-box`,children:[(0,m.jsx)(c.CustomChatInput,{disabled:g||S===e.AgentState.AWAITING_USER_CONFIRMATION||t.isTaskPolling(E),isNewConversationPending:g,onSubmit:O,onFilesPaste:D}),(0,m.jsx)(`div`,{className:`mt-3 pb-3`,children:(0,m.jsx)(p.GitControlBar,{onSuggestionsClick:e=>{O(e)}})})]})}exports.InteractiveChatBox=h;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../types/agent-state.cjs`),t=require(`../../../utils/utils.cjs`),n=require(`../../../hooks/use-conversation-id.cjs`),r=require(`../../../stores/conversation-store.cjs`),i=require(`../../../hooks/query/use-active-conversation.cjs`),a=require(`../../../hooks/use-agent-state.cjs`),o=require(`./utils/chat-input.utils.cjs`),s=require(`../../../hooks/query/use-sub-conversation-task-polling.cjs`),c=require(`./custom-chat-input.cjs`),l=require(`../../../hooks/chat/use-btw-interceptor.cjs`),u=require(`../../../hooks/chat/use-goal-interceptor.cjs`),d=require(`../../../hooks/chat/use-model-interceptor.cjs`),f=require(`../../../hooks/chat/use-chat-attachment-upload.cjs`),p=require(`./git-control-bar.cjs`);let m=require(`react/jsx-runtime`);function h({onSubmit:h,disabled:g=!1,hasStartedConversation:_}){let{images:v,files:y,imagesMarkedUploadAsFile:b,clearAllFiles:x,subConversationTaskId:S}=r.useConversationStore(),{curAgentState:C}=a.useAgentState(),{data:w}=i.useActiveConversation(),{conversationId:T}=n.useOptionalConversationId(),E=T??w?.id??null,{taskStatus:D}=s.useSubConversationTaskPolling(S,w?.id||null),{handleUpload:O}=f.useChatAttachmentUpload(),k=d.useModelInterceptor(E,u.useGoalInterceptor(E,l.useBtwInterceptor(E,e=>{let{imagesToEmbed:t,imagesAsFiles:n}=o.partitionImagesForUpload(v,b);h(e,t,[...y,...n]),x()})));return(0,m.jsxs)(`div`,{"data-testid":`interactive-chat-box`,children:[(0,m.jsx)(c.CustomChatInput,{disabled:g||C===e.AgentState.AWAITING_USER_CONFIRMATION||t.isTaskPolling(D),isNewConversationPending:g,hasStartedConversation:_,onSubmit:k,onFilesPaste:O}),(0,m.jsx)(`div`,{className:`mt-3 pb-3`,children:(0,m.jsx)(p.GitControlBar,{onSuggestionsClick:e=>{k(e)}})})]})}exports.InteractiveChatBox=h;
2
2
  //# sourceMappingURL=interactive-chat-box.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-chat-box.cjs","names":[],"sources":["../../../../src/components/features/chat/interactive-chat-box.tsx"],"sourcesContent":["import { CustomChatInput } from \"./custom-chat-input\";\nimport { useBtwInterceptor } from \"#/hooks/chat/use-btw-interceptor\";\nimport { useGoalInterceptor } from \"#/hooks/chat/use-goal-interceptor\";\nimport { useModelInterceptor } from \"#/hooks/chat/use-model-interceptor\";\nimport { useChatAttachmentUpload } from \"#/hooks/chat/use-chat-attachment-upload\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { GitControlBar } from \"./git-control-bar\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useSubConversationTaskPolling } from \"#/hooks/query/use-sub-conversation-task-polling\";\nimport { partitionImagesForUpload } from \"#/components/features/chat/utils/chat-input.utils\";\nimport { isTaskPolling } from \"#/utils/utils\";\n\ninterface InteractiveChatBoxProps {\n onSubmit: (message: string, images: File[], files: File[]) => void;\n disabled?: boolean;\n}\n\nexport function InteractiveChatBox({\n onSubmit,\n disabled = false,\n}: InteractiveChatBoxProps) {\n const {\n images,\n files,\n imagesMarkedUploadAsFile,\n clearAllFiles,\n subConversationTaskId,\n } = useConversationStore();\n const { curAgentState } = useAgentState();\n const { data: conversation } = useActiveConversation();\n const { conversationId: routeConversationId } = useOptionalConversationId();\n const conversationId = routeConversationId ?? conversation?.id ?? null;\n\n const { taskStatus: subConversationTaskStatus } =\n useSubConversationTaskPolling(\n subConversationTaskId,\n conversation?.id || null,\n );\n\n const { handleUpload } = useChatAttachmentUpload();\n\n const handleAfterGoal = useBtwInterceptor(conversationId, (message) => {\n const { imagesToEmbed, imagesAsFiles } = partitionImagesForUpload(\n images,\n imagesMarkedUploadAsFile,\n );\n onSubmit(message, imagesToEmbed, [...files, ...imagesAsFiles]);\n clearAllFiles();\n });\n const handleAfterModel = useGoalInterceptor(conversationId, handleAfterGoal);\n const handleSubmit = useModelInterceptor(conversationId, handleAfterModel);\n\n const handleSuggestionsClick = (suggestion: string) => {\n handleSubmit(suggestion);\n };\n\n const isDisabled =\n disabled ||\n curAgentState === AgentState.AWAITING_USER_CONFIRMATION ||\n isTaskPolling(subConversationTaskStatus);\n\n return (\n <div data-testid=\"interactive-chat-box\">\n <CustomChatInput\n disabled={isDisabled}\n isNewConversationPending={disabled}\n onSubmit={handleSubmit}\n onFilesPaste={handleUpload}\n />\n <div className=\"mt-3 pb-3\">\n <GitControlBar onSuggestionsClick={handleSuggestionsClick} />\n </div>\n </div>\n );\n}\n"],"mappings":"4yBAoBA,SAAgB,EAAmB,CACjC,WACA,WAAW,IACe,CAC1B,GAAM,CACJ,SACA,QACA,2BACA,gBACA,yBACE,EAAA,sBAAsB,CACpB,CAAE,iBAAkB,EAAA,eAAe,CACnC,CAAE,KAAM,GAAiB,EAAA,uBAAuB,CAChD,CAAE,eAAgB,GAAwB,EAAA,2BAA2B,CACrE,EAAiB,GAAuB,GAAc,IAAM,KAE5D,CAAE,WAAY,GAClB,EAAA,8BACE,EACA,GAAc,IAAM,KACrB,CAEG,CAAE,gBAAiB,EAAA,yBAAyB,CAW5C,EAAe,EAAA,oBAAoB,EADhB,EAAA,mBAAmB,EARpB,EAAA,kBAAkB,EAAiB,GAAY,CACrE,GAAM,CAAE,gBAAe,iBAAkB,EAAA,yBACvC,EACA,EACD,CACD,EAAS,EAAS,EAAe,CAAC,GAAG,EAAO,GAAG,EAAc,CAAC,CAC9D,GAAe,EAE2C,CACH,CAAiB,CAW1E,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,cAAY,gCAAjB,EACE,EAAA,EAAA,KAAC,EAAA,gBAAD,CACE,SAPJ,GACA,IAAkB,EAAA,WAAW,4BAC7B,EAAA,cAAc,EAA0B,CAMpC,yBAA0B,EAC1B,SAAU,EACV,aAAc,EACd,CAAA,EACF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,cAAD,CAAe,mBAlBW,GAAuB,CACrD,EAAa,EAAW,EAiByC,CAAA,CACzD,CAAA,CACF"}
1
+ {"version":3,"file":"interactive-chat-box.cjs","names":[],"sources":["../../../../src/components/features/chat/interactive-chat-box.tsx"],"sourcesContent":["import { CustomChatInput } from \"./custom-chat-input\";\nimport { useBtwInterceptor } from \"#/hooks/chat/use-btw-interceptor\";\nimport { useGoalInterceptor } from \"#/hooks/chat/use-goal-interceptor\";\nimport { useModelInterceptor } from \"#/hooks/chat/use-model-interceptor\";\nimport { useChatAttachmentUpload } from \"#/hooks/chat/use-chat-attachment-upload\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { GitControlBar } from \"./git-control-bar\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useSubConversationTaskPolling } from \"#/hooks/query/use-sub-conversation-task-polling\";\nimport { partitionImagesForUpload } from \"#/components/features/chat/utils/chat-input.utils\";\nimport { isTaskPolling } from \"#/utils/utils\";\n\ninterface InteractiveChatBoxProps {\n onSubmit: (message: string, images: File[], files: File[]) => void;\n disabled?: boolean;\n hasStartedConversation?: boolean;\n}\n\nexport function InteractiveChatBox({\n onSubmit,\n disabled = false,\n hasStartedConversation,\n}: InteractiveChatBoxProps) {\n const {\n images,\n files,\n imagesMarkedUploadAsFile,\n clearAllFiles,\n subConversationTaskId,\n } = useConversationStore();\n const { curAgentState } = useAgentState();\n const { data: conversation } = useActiveConversation();\n const { conversationId: routeConversationId } = useOptionalConversationId();\n const conversationId = routeConversationId ?? conversation?.id ?? null;\n\n const { taskStatus: subConversationTaskStatus } =\n useSubConversationTaskPolling(\n subConversationTaskId,\n conversation?.id || null,\n );\n\n const { handleUpload } = useChatAttachmentUpload();\n\n const handleAfterGoal = useBtwInterceptor(conversationId, (message) => {\n const { imagesToEmbed, imagesAsFiles } = partitionImagesForUpload(\n images,\n imagesMarkedUploadAsFile,\n );\n onSubmit(message, imagesToEmbed, [...files, ...imagesAsFiles]);\n clearAllFiles();\n });\n const handleAfterModel = useGoalInterceptor(conversationId, handleAfterGoal);\n const handleSubmit = useModelInterceptor(conversationId, handleAfterModel);\n\n const handleSuggestionsClick = (suggestion: string) => {\n handleSubmit(suggestion);\n };\n\n const isDisabled =\n disabled ||\n curAgentState === AgentState.AWAITING_USER_CONFIRMATION ||\n isTaskPolling(subConversationTaskStatus);\n\n return (\n <div data-testid=\"interactive-chat-box\">\n <CustomChatInput\n disabled={isDisabled}\n isNewConversationPending={disabled}\n hasStartedConversation={hasStartedConversation}\n onSubmit={handleSubmit}\n onFilesPaste={handleUpload}\n />\n <div className=\"mt-3 pb-3\">\n <GitControlBar onSuggestionsClick={handleSuggestionsClick} />\n </div>\n </div>\n );\n}\n"],"mappings":"4yBAqBA,SAAgB,EAAmB,CACjC,WACA,WAAW,GACX,0BAC0B,CAC1B,GAAM,CACJ,SACA,QACA,2BACA,gBACA,yBACE,EAAA,sBAAsB,CACpB,CAAE,iBAAkB,EAAA,eAAe,CACnC,CAAE,KAAM,GAAiB,EAAA,uBAAuB,CAChD,CAAE,eAAgB,GAAwB,EAAA,2BAA2B,CACrE,EAAiB,GAAuB,GAAc,IAAM,KAE5D,CAAE,WAAY,GAClB,EAAA,8BACE,EACA,GAAc,IAAM,KACrB,CAEG,CAAE,gBAAiB,EAAA,yBAAyB,CAW5C,EAAe,EAAA,oBAAoB,EADhB,EAAA,mBAAmB,EARpB,EAAA,kBAAkB,EAAiB,GAAY,CACrE,GAAM,CAAE,gBAAe,iBAAkB,EAAA,yBACvC,EACA,EACD,CACD,EAAS,EAAS,EAAe,CAAC,GAAG,EAAO,GAAG,EAAc,CAAC,CAC9D,GAAe,EAE2C,CACH,CAAiB,CAW1E,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,cAAY,gCAAjB,EACE,EAAA,EAAA,KAAC,EAAA,gBAAD,CACE,SAPJ,GACA,IAAkB,EAAA,WAAW,4BAC7B,EAAA,cAAc,EAA0B,CAMpC,yBAA0B,EACF,yBACxB,SAAU,EACV,aAAc,EACd,CAAA,EACF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,KAAC,EAAA,cAAD,CAAe,mBAnBW,GAAuB,CACrD,EAAa,EAAW,EAkByC,CAAA,CACzD,CAAA,CACF"}
@@ -1,6 +1,7 @@
1
1
  interface InteractiveChatBoxProps {
2
2
  onSubmit: (message: string, images: File[], files: File[]) => void;
3
3
  disabled?: boolean;
4
+ hasStartedConversation?: boolean;
4
5
  }
5
- export declare function InteractiveChatBox({ onSubmit, disabled, }: InteractiveChatBoxProps): import("react/jsx-runtime").JSX.Element;
6
+ export declare function InteractiveChatBox({ onSubmit, disabled, hasStartedConversation, }: InteractiveChatBoxProps): import("react/jsx-runtime").JSX.Element;
6
7
  export {};
@@ -14,22 +14,23 @@ import { useChatAttachmentUpload as f } from "../../../hooks/chat/use-chat-attac
14
14
  import { GitControlBar as p } from "./git-control-bar.js";
15
15
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
16
16
  //#region src/components/features/chat/interactive-chat-box.tsx
17
- function g({ onSubmit: g, disabled: _ = !1 }) {
18
- let { images: v, files: y, imagesMarkedUploadAsFile: b, clearAllFiles: x, subConversationTaskId: S } = r(), { curAgentState: C } = a(), { data: w } = i(), { conversationId: T } = n(), E = T ?? w?.id ?? null, { taskStatus: D } = s(S, w?.id || null), { handleUpload: O } = f(), k = d(E, u(E, l(E, (e) => {
19
- let { imagesToEmbed: t, imagesAsFiles: n } = o(v, b);
20
- g(e, t, [...y, ...n]), x();
17
+ function g({ onSubmit: g, disabled: _ = !1, hasStartedConversation: v }) {
18
+ let { images: y, files: b, imagesMarkedUploadAsFile: x, clearAllFiles: S, subConversationTaskId: C } = r(), { curAgentState: w } = a(), { data: T } = i(), { conversationId: E } = n(), D = E ?? T?.id ?? null, { taskStatus: O } = s(C, T?.id || null), { handleUpload: k } = f(), A = d(D, u(D, l(D, (e) => {
19
+ let { imagesToEmbed: t, imagesAsFiles: n } = o(y, x);
20
+ g(e, t, [...b, ...n]), S();
21
21
  })));
22
22
  return /* @__PURE__ */ h("div", {
23
23
  "data-testid": "interactive-chat-box",
24
24
  children: [/* @__PURE__ */ m(c, {
25
- disabled: _ || C === e.AWAITING_USER_CONFIRMATION || t(D),
25
+ disabled: _ || w === e.AWAITING_USER_CONFIRMATION || t(O),
26
26
  isNewConversationPending: _,
27
- onSubmit: k,
28
- onFilesPaste: O
27
+ hasStartedConversation: v,
28
+ onSubmit: A,
29
+ onFilesPaste: k
29
30
  }), /* @__PURE__ */ m("div", {
30
31
  className: "mt-3 pb-3",
31
32
  children: /* @__PURE__ */ m(p, { onSuggestionsClick: (e) => {
32
- k(e);
33
+ A(e);
33
34
  } })
34
35
  })]
35
36
  });
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-chat-box.js","names":[],"sources":["../../../../src/components/features/chat/interactive-chat-box.tsx"],"sourcesContent":["import { CustomChatInput } from \"./custom-chat-input\";\nimport { useBtwInterceptor } from \"#/hooks/chat/use-btw-interceptor\";\nimport { useGoalInterceptor } from \"#/hooks/chat/use-goal-interceptor\";\nimport { useModelInterceptor } from \"#/hooks/chat/use-model-interceptor\";\nimport { useChatAttachmentUpload } from \"#/hooks/chat/use-chat-attachment-upload\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { GitControlBar } from \"./git-control-bar\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useSubConversationTaskPolling } from \"#/hooks/query/use-sub-conversation-task-polling\";\nimport { partitionImagesForUpload } from \"#/components/features/chat/utils/chat-input.utils\";\nimport { isTaskPolling } from \"#/utils/utils\";\n\ninterface InteractiveChatBoxProps {\n onSubmit: (message: string, images: File[], files: File[]) => void;\n disabled?: boolean;\n}\n\nexport function InteractiveChatBox({\n onSubmit,\n disabled = false,\n}: InteractiveChatBoxProps) {\n const {\n images,\n files,\n imagesMarkedUploadAsFile,\n clearAllFiles,\n subConversationTaskId,\n } = useConversationStore();\n const { curAgentState } = useAgentState();\n const { data: conversation } = useActiveConversation();\n const { conversationId: routeConversationId } = useOptionalConversationId();\n const conversationId = routeConversationId ?? conversation?.id ?? null;\n\n const { taskStatus: subConversationTaskStatus } =\n useSubConversationTaskPolling(\n subConversationTaskId,\n conversation?.id || null,\n );\n\n const { handleUpload } = useChatAttachmentUpload();\n\n const handleAfterGoal = useBtwInterceptor(conversationId, (message) => {\n const { imagesToEmbed, imagesAsFiles } = partitionImagesForUpload(\n images,\n imagesMarkedUploadAsFile,\n );\n onSubmit(message, imagesToEmbed, [...files, ...imagesAsFiles]);\n clearAllFiles();\n });\n const handleAfterModel = useGoalInterceptor(conversationId, handleAfterGoal);\n const handleSubmit = useModelInterceptor(conversationId, handleAfterModel);\n\n const handleSuggestionsClick = (suggestion: string) => {\n handleSubmit(suggestion);\n };\n\n const isDisabled =\n disabled ||\n curAgentState === AgentState.AWAITING_USER_CONFIRMATION ||\n isTaskPolling(subConversationTaskStatus);\n\n return (\n <div data-testid=\"interactive-chat-box\">\n <CustomChatInput\n disabled={isDisabled}\n isNewConversationPending={disabled}\n onSubmit={handleSubmit}\n onFilesPaste={handleUpload}\n />\n <div className=\"mt-3 pb-3\">\n <GitControlBar onSuggestionsClick={handleSuggestionsClick} />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAoBA,SAAgB,EAAmB,EACjC,aACA,cAAW,MACe;CAC1B,IAAM,EACJ,WACA,UACA,6BACA,kBACA,6BACE,GAAsB,EACpB,EAAE,qBAAkB,GAAe,EACnC,EAAE,MAAM,MAAiB,GAAuB,EAChD,EAAE,gBAAgB,MAAwB,GAA2B,EACrE,IAAiB,KAAuB,GAAc,MAAM,MAE5D,EAAE,YAAY,MAClB,EACE,GACA,GAAc,MAAM,KACrB,EAEG,EAAE,oBAAiB,GAAyB,EAW5C,IAAe,EAAoB,GADhB,EAAmB,GARpB,EAAkB,IAAiB,MAAY;EACrE,IAAM,EAAE,kBAAe,qBAAkB,EACvC,GACA,EACD;AAED,EADA,EAAS,GAAS,GAAe,CAAC,GAAG,GAAO,GAAG,EAAc,CAAC,EAC9D,GAAe;GAE2C,CACH,CAAiB;AAW1E,QACE,kBAAC,OAAD;EAAK,eAAY;YAAjB,CACE,kBAAC,GAAD;GACE,UAPJ,KACA,MAAkB,EAAW,8BAC7B,EAAc,EAA0B;GAMpC,0BAA0B;GAC1B,UAAU;GACV,cAAc;GACd,CAAA,EACF,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD,EAAe,qBAlBW,MAAuB;AACrD,MAAa,EAAW;MAiByC,CAAA;GACzD,CAAA,CACF"}
1
+ {"version":3,"file":"interactive-chat-box.js","names":[],"sources":["../../../../src/components/features/chat/interactive-chat-box.tsx"],"sourcesContent":["import { CustomChatInput } from \"./custom-chat-input\";\nimport { useBtwInterceptor } from \"#/hooks/chat/use-btw-interceptor\";\nimport { useGoalInterceptor } from \"#/hooks/chat/use-goal-interceptor\";\nimport { useModelInterceptor } from \"#/hooks/chat/use-model-interceptor\";\nimport { useChatAttachmentUpload } from \"#/hooks/chat/use-chat-attachment-upload\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { GitControlBar } from \"./git-control-bar\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useAgentState } from \"#/hooks/use-agent-state\";\nimport { useSubConversationTaskPolling } from \"#/hooks/query/use-sub-conversation-task-polling\";\nimport { partitionImagesForUpload } from \"#/components/features/chat/utils/chat-input.utils\";\nimport { isTaskPolling } from \"#/utils/utils\";\n\ninterface InteractiveChatBoxProps {\n onSubmit: (message: string, images: File[], files: File[]) => void;\n disabled?: boolean;\n hasStartedConversation?: boolean;\n}\n\nexport function InteractiveChatBox({\n onSubmit,\n disabled = false,\n hasStartedConversation,\n}: InteractiveChatBoxProps) {\n const {\n images,\n files,\n imagesMarkedUploadAsFile,\n clearAllFiles,\n subConversationTaskId,\n } = useConversationStore();\n const { curAgentState } = useAgentState();\n const { data: conversation } = useActiveConversation();\n const { conversationId: routeConversationId } = useOptionalConversationId();\n const conversationId = routeConversationId ?? conversation?.id ?? null;\n\n const { taskStatus: subConversationTaskStatus } =\n useSubConversationTaskPolling(\n subConversationTaskId,\n conversation?.id || null,\n );\n\n const { handleUpload } = useChatAttachmentUpload();\n\n const handleAfterGoal = useBtwInterceptor(conversationId, (message) => {\n const { imagesToEmbed, imagesAsFiles } = partitionImagesForUpload(\n images,\n imagesMarkedUploadAsFile,\n );\n onSubmit(message, imagesToEmbed, [...files, ...imagesAsFiles]);\n clearAllFiles();\n });\n const handleAfterModel = useGoalInterceptor(conversationId, handleAfterGoal);\n const handleSubmit = useModelInterceptor(conversationId, handleAfterModel);\n\n const handleSuggestionsClick = (suggestion: string) => {\n handleSubmit(suggestion);\n };\n\n const isDisabled =\n disabled ||\n curAgentState === AgentState.AWAITING_USER_CONFIRMATION ||\n isTaskPolling(subConversationTaskStatus);\n\n return (\n <div data-testid=\"interactive-chat-box\">\n <CustomChatInput\n disabled={isDisabled}\n isNewConversationPending={disabled}\n hasStartedConversation={hasStartedConversation}\n onSubmit={handleSubmit}\n onFilesPaste={handleUpload}\n />\n <div className=\"mt-3 pb-3\">\n <GitControlBar onSuggestionsClick={handleSuggestionsClick} />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAqBA,SAAgB,EAAmB,EACjC,aACA,cAAW,IACX,6BAC0B;CAC1B,IAAM,EACJ,WACA,UACA,6BACA,kBACA,6BACE,GAAsB,EACpB,EAAE,qBAAkB,GAAe,EACnC,EAAE,MAAM,MAAiB,GAAuB,EAChD,EAAE,gBAAgB,MAAwB,GAA2B,EACrE,IAAiB,KAAuB,GAAc,MAAM,MAE5D,EAAE,YAAY,MAClB,EACE,GACA,GAAc,MAAM,KACrB,EAEG,EAAE,oBAAiB,GAAyB,EAW5C,IAAe,EAAoB,GADhB,EAAmB,GARpB,EAAkB,IAAiB,MAAY;EACrE,IAAM,EAAE,kBAAe,qBAAkB,EACvC,GACA,EACD;AAED,EADA,EAAS,GAAS,GAAe,CAAC,GAAG,GAAO,GAAG,EAAc,CAAC,EAC9D,GAAe;GAE2C,CACH,CAAiB;AAW1E,QACE,kBAAC,OAAD;EAAK,eAAY;YAAjB,CACE,kBAAC,GAAD;GACE,UAPJ,KACA,MAAkB,EAAW,8BAC7B,EAAc,EAA0B;GAMpC,0BAA0B;GACF;GACxB,UAAU;GACV,cAAc;GACd,CAAA,EACF,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD,EAAe,qBAnBW,MAAuB;AACrD,MAAa,EAAW;MAkByC,CAAA;GACzD,CAAA,CACF"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`./commit-row.cjs`);let i=require(`react`);i=e.__toESM(i,1);let a=require(`react/jsx-runtime`);function o({commits:e,hasMore:o}){let{t:s}=t.useTranslation(`openhands`),[c,l]=i.default.useState(null),u=new Set(e.map(e=>e.author)).size>1;return(0,a.jsxs)(`section`,{"data-testid":`commit-list`,className:`w-full flex flex-col`,children:[e.map(e=>(0,a.jsx)(r.CommitRow,{commit:e,showAuthor:u,isExpanded:c===e.sha,onToggle:()=>l(t=>t===e.sha?null:e.sha)},e.sha)),o&&(0,a.jsx)(`div`,{"data-testid":`commit-list-cap-notice`,className:`px-3 py-2.5 text-xs text-[var(--oh-muted)]`,children:s(n.I18nKey.DIFF_VIEWER$COMMITS_CAP,{count:e.length})})]})}exports.CommitList=o;
2
+ //# sourceMappingURL=commit-list.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-list.cjs","names":[],"sources":["../../../../src/components/features/diff-viewer/commit-list.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitCommit } from \"#/api/open-hands.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { CommitRow } from \"./commit-row\";\n\nexport interface CommitListProps {\n commits: GitCommit[];\n /** True when the server capped the page — surfaces the cap notice. */\n hasMore: boolean;\n}\n\n/**\n * The workspace's recent commit history (newest first). Single-open\n * accordion: expanding a commit collapses the previously expanded one.\n * Empty/loading/waiting states are the host view's job\n * (see routes/commits-tab.tsx).\n */\nexport function CommitList({ commits, hasMore }: CommitListProps) {\n const { t } = useTranslation(\"openhands\");\n const [expandedSha, setExpandedSha] = React.useState<string | null>(null);\n\n // Author is noise when every commit has the same one (the usual\n // single-agent conversation); show it only when authors differ.\n const showAuthor = new Set(commits.map((commit) => commit.author)).size > 1;\n\n return (\n <section data-testid=\"commit-list\" className=\"w-full flex flex-col\">\n {commits.map((commit) => (\n <CommitRow\n key={commit.sha}\n commit={commit}\n showAuthor={showAuthor}\n isExpanded={expandedSha === commit.sha}\n onToggle={() =>\n setExpandedSha((prev) => (prev === commit.sha ? null : commit.sha))\n }\n />\n ))}\n\n {hasMore && (\n <div\n data-testid=\"commit-list-cap-notice\"\n className=\"px-3 py-2.5 text-xs text-[var(--oh-muted)]\"\n >\n {t(I18nKey.DIFF_VIEWER$COMMITS_CAP, { count: commits.length })}\n </div>\n )}\n </section>\n );\n}\n"],"mappings":"2RAkBA,SAAgB,EAAW,CAAE,UAAS,WAA4B,CAChE,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CACnC,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAwB,KAAK,CAInE,EAAa,IAAI,IAAI,EAAQ,IAAK,GAAW,EAAO,OAAO,CAAC,CAAC,KAAO,EAE1E,OACE,EAAA,EAAA,MAAC,UAAD,CAAS,cAAY,cAAc,UAAU,gCAA7C,CACG,EAAQ,IAAK,IACZ,EAAA,EAAA,KAAC,EAAA,UAAD,CAEU,SACI,aACZ,WAAY,IAAgB,EAAO,IACnC,aACE,EAAgB,GAAU,IAAS,EAAO,IAAM,KAAO,EAAO,IAAK,CAErE,CAPK,EAAO,IAOZ,CACF,CAED,IACC,EAAA,EAAA,KAAC,MAAD,CACE,cAAY,yBACZ,UAAU,sDAET,EAAE,EAAA,QAAQ,wBAAyB,CAAE,MAAO,EAAQ,OAAQ,CAAC,CAC1D,CAAA,CAEA"}
@@ -0,0 +1,13 @@
1
+ import { GitCommit } from "#/api/open-hands.types";
2
+ export interface CommitListProps {
3
+ commits: GitCommit[];
4
+ /** True when the server capped the page — surfaces the cap notice. */
5
+ hasMore: boolean;
6
+ }
7
+ /**
8
+ * The workspace's recent commit history (newest first). Single-open
9
+ * accordion: expanding a commit collapses the previously expanded one.
10
+ * Empty/loading/waiting states are the host view's job
11
+ * (see routes/commits-tab.tsx).
12
+ */
13
+ export declare function CommitList({ commits, hasMore }: CommitListProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,27 @@
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 { CommitRow as n } from "./commit-row.js";
4
+ import r from "react";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ //#region src/components/features/diff-viewer/commit-list.tsx
7
+ function o({ commits: o, hasMore: s }) {
8
+ let { t: c } = e("openhands"), [l, u] = r.useState(null), d = new Set(o.map((e) => e.author)).size > 1;
9
+ return /* @__PURE__ */ a("section", {
10
+ "data-testid": "commit-list",
11
+ className: "w-full flex flex-col",
12
+ children: [o.map((e) => /* @__PURE__ */ i(n, {
13
+ commit: e,
14
+ showAuthor: d,
15
+ isExpanded: l === e.sha,
16
+ onToggle: () => u((t) => t === e.sha ? null : e.sha)
17
+ }, e.sha)), s && /* @__PURE__ */ i("div", {
18
+ "data-testid": "commit-list-cap-notice",
19
+ className: "px-3 py-2.5 text-xs text-[var(--oh-muted)]",
20
+ children: c(t.DIFF_VIEWER$COMMITS_CAP, { count: o.length })
21
+ })]
22
+ });
23
+ }
24
+ //#endregion
25
+ export { o as CommitList };
26
+
27
+ //# sourceMappingURL=commit-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-list.js","names":[],"sources":["../../../../src/components/features/diff-viewer/commit-list.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitCommit } from \"#/api/open-hands.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { CommitRow } from \"./commit-row\";\n\nexport interface CommitListProps {\n commits: GitCommit[];\n /** True when the server capped the page — surfaces the cap notice. */\n hasMore: boolean;\n}\n\n/**\n * The workspace's recent commit history (newest first). Single-open\n * accordion: expanding a commit collapses the previously expanded one.\n * Empty/loading/waiting states are the host view's job\n * (see routes/commits-tab.tsx).\n */\nexport function CommitList({ commits, hasMore }: CommitListProps) {\n const { t } = useTranslation(\"openhands\");\n const [expandedSha, setExpandedSha] = React.useState<string | null>(null);\n\n // Author is noise when every commit has the same one (the usual\n // single-agent conversation); show it only when authors differ.\n const showAuthor = new Set(commits.map((commit) => commit.author)).size > 1;\n\n return (\n <section data-testid=\"commit-list\" className=\"w-full flex flex-col\">\n {commits.map((commit) => (\n <CommitRow\n key={commit.sha}\n commit={commit}\n showAuthor={showAuthor}\n isExpanded={expandedSha === commit.sha}\n onToggle={() =>\n setExpandedSha((prev) => (prev === commit.sha ? null : commit.sha))\n }\n />\n ))}\n\n {hasMore && (\n <div\n data-testid=\"commit-list-cap-notice\"\n className=\"px-3 py-2.5 text-xs text-[var(--oh-muted)]\"\n >\n {t(I18nKey.DIFF_VIEWER$COMMITS_CAP, { count: commits.length })}\n </div>\n )}\n </section>\n );\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,EAAW,EAAE,YAAS,cAA4B;CAChE,IAAM,EAAE,SAAM,EAAe,YAAY,EACnC,CAAC,GAAa,KAAkB,EAAM,SAAwB,KAAK,EAInE,IAAa,IAAI,IAAI,EAAQ,KAAK,MAAW,EAAO,OAAO,CAAC,CAAC,OAAO;AAE1E,QACE,kBAAC,WAAD;EAAS,eAAY;EAAc,WAAU;YAA7C,CACG,EAAQ,KAAK,MACZ,kBAAC,GAAD;GAEU;GACI;GACZ,YAAY,MAAgB,EAAO;GACnC,gBACE,GAAgB,MAAU,MAAS,EAAO,MAAM,OAAO,EAAO,IAAK;GAErE,EAPK,EAAO,IAOZ,CACF,EAED,KACC,kBAAC,OAAD;GACE,eAAY;GACZ,WAAU;aAET,EAAE,EAAQ,yBAAyB,EAAE,OAAO,EAAQ,QAAQ,CAAC;GAC1D,CAAA,CAEA"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../node_modules/react-i18next/dist/es/useTranslation.cjs`),n=require(`../../../i18n/declaration.cjs`),r=require(`../../../utils/utils.cjs`),i=require(`../../../utils/format-time-delta.cjs`),a=require(`../../../icons/chveron-up.cjs`),o=require(`./loading-spinner.cjs`),s=require(`./file-diff-viewer.cjs`),c=require(`../../../hooks/query/use-commit-changes.cjs`);let l=require(`react`);l=e.__toESM(l,1);let u=require(`react/jsx-runtime`);function d({commit:e,showAuthor:l,isExpanded:d,onToggle:f}){let{t:p}=t.useTranslation(`openhands`),{data:m,isLoading:h,isSuccess:g}=c.useCommitChanges(e.sha,{enabled:d});return(0,u.jsxs)(`div`,{"data-testid":`commit-row`,className:`w-full flex flex-col`,children:[(0,u.jsxs)(`button`,{type:`button`,onClick:f,"aria-expanded":d,"data-testid":`commit-row-toggle`,className:`w-full flex items-center gap-2 px-3 py-2.5 border-b border-[var(--oh-border)] text-sm text-content text-left hover:cursor-pointer`,children:[(0,u.jsx)(`code`,{className:`font-mono text-xs text-[var(--oh-muted)] flex-shrink-0`,children:e.shortSha}),(0,u.jsx)(`strong`,{className:`flex-1 truncate font-medium`,children:e.subject}),l&&(0,u.jsx)(`span`,{className:`text-xs text-[var(--oh-muted)] truncate max-w-32 flex-shrink-0`,children:e.author}),(0,u.jsx)(`span`,{className:`text-xs text-[var(--oh-muted)] flex-shrink-0`,children:`${i.formatTimeDelta(e.timestamp)} ${p(n.I18nKey.CONVERSATION$AGO)}`}),(0,u.jsx)(a.default,{className:r.cn(`w-4 h-4 transition-transform flex-shrink-0`,!d&&`transform rotate-180`)})]}),d&&(0,u.jsxs)(`div`,{"data-testid":`commit-row-content`,className:`w-full flex flex-col pl-6`,children:[h&&(0,u.jsx)(`div`,{className:`p-3`,children:(0,u.jsx)(o.LoadingSpinner,{className:`w-4 h-4`})}),g&&m?.map(t=>(0,u.jsx)(s.FileDiffViewer,{path:t.path,type:t.status,commit:e.sha},t.path))]})]})}exports.CommitRow=d;
2
+ //# sourceMappingURL=commit-row.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-row.cjs","names":[],"sources":["../../../../src/components/features/diff-viewer/commit-row.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitCommit } from \"#/api/open-hands.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport ChevronUp from \"#/icons/chveron-up.svg?react\";\nimport { useCommitChanges } from \"#/hooks/query/use-commit-changes\";\nimport { FileDiffViewer } from \"./file-diff-viewer\";\nimport { LoadingSpinner } from \"./loading-spinner\";\n\nexport interface CommitRowProps {\n commit: GitCommit;\n /** Only shown when the listed commits have more than one author. */\n showAuthor: boolean;\n isExpanded: boolean;\n onToggle: () => void;\n}\n\n/**\n * One collapsible commit: header row (short SHA, subject, relative time),\n * expanding into the files that commit changed, each rendered with the\n * regular FileDiffViewer in per-commit mode.\n */\nexport function CommitRow({\n commit,\n showAuthor,\n isExpanded,\n onToggle,\n}: CommitRowProps) {\n const { t } = useTranslation(\"openhands\");\n\n // Only fetch a commit's file list once the row is expanded.\n const {\n data: changes,\n isLoading,\n isSuccess,\n } = useCommitChanges(commit.sha, { enabled: isExpanded });\n\n return (\n <div data-testid=\"commit-row\" className=\"w-full flex flex-col\">\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={isExpanded}\n data-testid=\"commit-row-toggle\"\n className=\"w-full flex items-center gap-2 px-3 py-2.5 border-b border-[var(--oh-border)] text-sm text-content text-left hover:cursor-pointer\"\n >\n <code className=\"font-mono text-xs text-[var(--oh-muted)] flex-shrink-0\">\n {commit.shortSha}\n </code>\n <strong className=\"flex-1 truncate font-medium\">\n {commit.subject}\n </strong>\n {showAuthor && (\n <span className=\"text-xs text-[var(--oh-muted)] truncate max-w-32 flex-shrink-0\">\n {commit.author}\n </span>\n )}\n <span className=\"text-xs text-[var(--oh-muted)] flex-shrink-0\">\n {`${formatTimeDelta(commit.timestamp)} ${t(I18nKey.CONVERSATION$AGO)}`}\n </span>\n <ChevronUp\n className={cn(\n \"w-4 h-4 transition-transform flex-shrink-0\",\n !isExpanded && \"transform rotate-180\",\n )}\n />\n </button>\n\n {isExpanded && (\n <div\n data-testid=\"commit-row-content\"\n className=\"w-full flex flex-col pl-6\"\n >\n {isLoading && (\n <div className=\"p-3\">\n <LoadingSpinner className=\"w-4 h-4\" />\n </div>\n )}\n {isSuccess &&\n changes?.map((change) => (\n <FileDiffViewer\n key={change.path}\n path={change.path}\n type={change.status}\n commit={commit.sha}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"ggBAwBA,SAAgB,EAAU,CACxB,SACA,aACA,aACA,YACiB,CACjB,GAAM,CAAE,KAAM,EAAA,eAAe,YAAY,CAGnC,CACJ,KAAM,EACN,YACA,aACE,EAAA,iBAAiB,EAAO,IAAK,CAAE,QAAS,EAAY,CAAC,CAEzD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,cAAY,aAAa,UAAU,gCAAxC,EACE,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,QAAS,EACT,gBAAe,EACf,cAAY,oBACZ,UAAU,6IALZ,EAOE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,kEACb,EAAO,SACH,CAAA,EACP,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,uCACf,EAAO,QACD,CAAA,CACR,IACC,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,0EACb,EAAO,OACH,CAAA,EAET,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,wDACb,GAAG,EAAA,gBAAgB,EAAO,UAAU,CAAC,GAAG,EAAE,EAAA,QAAQ,iBAAiB,GAC/D,CAAA,EACP,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,UAAW,EAAA,GACT,6CACA,CAAC,GAAc,uBAChB,CACD,CAAA,CACK,GAER,IACC,EAAA,EAAA,MAAC,MAAD,CACE,cAAY,qBACZ,UAAU,qCAFZ,CAIG,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gBACb,EAAA,EAAA,KAAC,EAAA,eAAD,CAAgB,UAAU,UAAY,CAAA,CAClC,CAAA,CAEP,GACC,GAAS,IAAK,IACZ,EAAA,EAAA,KAAC,EAAA,eAAD,CAEE,KAAM,EAAO,KACb,KAAM,EAAO,OACb,OAAQ,EAAO,IACf,CAJK,EAAO,KAIZ,CACF,CACA,GAEJ"}
@@ -0,0 +1,14 @@
1
+ import { GitCommit } from "#/api/open-hands.types";
2
+ export interface CommitRowProps {
3
+ commit: GitCommit;
4
+ /** Only shown when the listed commits have more than one author. */
5
+ showAuthor: boolean;
6
+ isExpanded: boolean;
7
+ onToggle: () => void;
8
+ }
9
+ /**
10
+ * One collapsible commit: header row (short SHA, subject, relative time),
11
+ * expanding into the files that commit changed, each rendered with the
12
+ * regular FileDiffViewer in per-commit mode.
13
+ */
14
+ export declare function CommitRow({ commit, showAuthor, isExpanded, onToggle, }: CommitRowProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,59 @@
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 { cn as n } from "../../../utils/utils.js";
4
+ import { formatTimeDelta as r } from "../../../utils/format-time-delta.js";
5
+ import i from "../../../icons/chveron-up.js";
6
+ import { LoadingSpinner as a } from "./loading-spinner.js";
7
+ import { FileDiffViewer as o } from "./file-diff-viewer.js";
8
+ import { useCommitChanges as s } from "../../../hooks/query/use-commit-changes.js";
9
+ import "react";
10
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
11
+ //#region src/components/features/diff-viewer/commit-row.tsx
12
+ function u({ commit: u, showAuthor: d, isExpanded: f, onToggle: p }) {
13
+ let { t: m } = e("openhands"), { data: h, isLoading: g, isSuccess: _ } = s(u.sha, { enabled: f });
14
+ return /* @__PURE__ */ l("div", {
15
+ "data-testid": "commit-row",
16
+ className: "w-full flex flex-col",
17
+ children: [/* @__PURE__ */ l("button", {
18
+ type: "button",
19
+ onClick: p,
20
+ "aria-expanded": f,
21
+ "data-testid": "commit-row-toggle",
22
+ className: "w-full flex items-center gap-2 px-3 py-2.5 border-b border-[var(--oh-border)] text-sm text-content text-left hover:cursor-pointer",
23
+ children: [
24
+ /* @__PURE__ */ c("code", {
25
+ className: "font-mono text-xs text-[var(--oh-muted)] flex-shrink-0",
26
+ children: u.shortSha
27
+ }),
28
+ /* @__PURE__ */ c("strong", {
29
+ className: "flex-1 truncate font-medium",
30
+ children: u.subject
31
+ }),
32
+ d && /* @__PURE__ */ c("span", {
33
+ className: "text-xs text-[var(--oh-muted)] truncate max-w-32 flex-shrink-0",
34
+ children: u.author
35
+ }),
36
+ /* @__PURE__ */ c("span", {
37
+ className: "text-xs text-[var(--oh-muted)] flex-shrink-0",
38
+ children: `${r(u.timestamp)} ${m(t.CONVERSATION$AGO)}`
39
+ }),
40
+ /* @__PURE__ */ c(i, { className: n("w-4 h-4 transition-transform flex-shrink-0", !f && "transform rotate-180") })
41
+ ]
42
+ }), f && /* @__PURE__ */ l("div", {
43
+ "data-testid": "commit-row-content",
44
+ className: "w-full flex flex-col pl-6",
45
+ children: [g && /* @__PURE__ */ c("div", {
46
+ className: "p-3",
47
+ children: /* @__PURE__ */ c(a, { className: "w-4 h-4" })
48
+ }), _ && h?.map((e) => /* @__PURE__ */ c(o, {
49
+ path: e.path,
50
+ type: e.status,
51
+ commit: u.sha
52
+ }, e.path))]
53
+ })]
54
+ });
55
+ }
56
+ //#endregion
57
+ export { u as CommitRow };
58
+
59
+ //# sourceMappingURL=commit-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-row.js","names":[],"sources":["../../../../src/components/features/diff-viewer/commit-row.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { GitCommit } from \"#/api/open-hands.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport { formatTimeDelta } from \"#/utils/format-time-delta\";\nimport ChevronUp from \"#/icons/chveron-up.svg?react\";\nimport { useCommitChanges } from \"#/hooks/query/use-commit-changes\";\nimport { FileDiffViewer } from \"./file-diff-viewer\";\nimport { LoadingSpinner } from \"./loading-spinner\";\n\nexport interface CommitRowProps {\n commit: GitCommit;\n /** Only shown when the listed commits have more than one author. */\n showAuthor: boolean;\n isExpanded: boolean;\n onToggle: () => void;\n}\n\n/**\n * One collapsible commit: header row (short SHA, subject, relative time),\n * expanding into the files that commit changed, each rendered with the\n * regular FileDiffViewer in per-commit mode.\n */\nexport function CommitRow({\n commit,\n showAuthor,\n isExpanded,\n onToggle,\n}: CommitRowProps) {\n const { t } = useTranslation(\"openhands\");\n\n // Only fetch a commit's file list once the row is expanded.\n const {\n data: changes,\n isLoading,\n isSuccess,\n } = useCommitChanges(commit.sha, { enabled: isExpanded });\n\n return (\n <div data-testid=\"commit-row\" className=\"w-full flex flex-col\">\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={isExpanded}\n data-testid=\"commit-row-toggle\"\n className=\"w-full flex items-center gap-2 px-3 py-2.5 border-b border-[var(--oh-border)] text-sm text-content text-left hover:cursor-pointer\"\n >\n <code className=\"font-mono text-xs text-[var(--oh-muted)] flex-shrink-0\">\n {commit.shortSha}\n </code>\n <strong className=\"flex-1 truncate font-medium\">\n {commit.subject}\n </strong>\n {showAuthor && (\n <span className=\"text-xs text-[var(--oh-muted)] truncate max-w-32 flex-shrink-0\">\n {commit.author}\n </span>\n )}\n <span className=\"text-xs text-[var(--oh-muted)] flex-shrink-0\">\n {`${formatTimeDelta(commit.timestamp)} ${t(I18nKey.CONVERSATION$AGO)}`}\n </span>\n <ChevronUp\n className={cn(\n \"w-4 h-4 transition-transform flex-shrink-0\",\n !isExpanded && \"transform rotate-180\",\n )}\n />\n </button>\n\n {isExpanded && (\n <div\n data-testid=\"commit-row-content\"\n className=\"w-full flex flex-col pl-6\"\n >\n {isLoading && (\n <div className=\"p-3\">\n <LoadingSpinner className=\"w-4 h-4\" />\n </div>\n )}\n {isSuccess &&\n changes?.map((change) => (\n <FileDiffViewer\n key={change.path}\n path={change.path}\n type={change.status}\n commit={commit.sha}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAwBA,SAAgB,EAAU,EACxB,WACA,eACA,eACA,eACiB;CACjB,IAAM,EAAE,SAAM,EAAe,YAAY,EAGnC,EACJ,MAAM,GACN,cACA,iBACE,EAAiB,EAAO,KAAK,EAAE,SAAS,GAAY,CAAC;AAEzD,QACE,kBAAC,OAAD;EAAK,eAAY;EAAa,WAAU;YAAxC,CACE,kBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,iBAAe;GACf,eAAY;GACZ,WAAU;aALZ;IAOE,kBAAC,QAAD;KAAM,WAAU;eACb,EAAO;KACH,CAAA;IACP,kBAAC,UAAD;KAAQ,WAAU;eACf,EAAO;KACD,CAAA;IACR,KACC,kBAAC,QAAD;KAAM,WAAU;eACb,EAAO;KACH,CAAA;IAET,kBAAC,QAAD;KAAM,WAAU;eACb,GAAG,EAAgB,EAAO,UAAU,CAAC,GAAG,EAAE,EAAQ,iBAAiB;KAC/D,CAAA;IACP,kBAAC,GAAD,EACE,WAAW,EACT,8CACA,CAAC,KAAc,uBAChB,EACD,CAAA;IACK;MAER,KACC,kBAAC,OAAD;GACE,eAAY;GACZ,WAAU;aAFZ,CAIG,KACC,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAAgB,WAAU,WAAY,CAAA;IAClC,CAAA,EAEP,KACC,GAAS,KAAK,MACZ,kBAAC,GAAD;IAEE,MAAM,EAAO;IACb,MAAM,EAAO;IACb,QAAQ,EAAO;IACf,EAJK,EAAO,KAIZ,CACF,CACA;KAEJ"}
@@ -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(`../../../utils/utils.cjs`),i=require(`../markdown/markdown-renderer.cjs`),a=require(`../../../ui/typography.cjs`),o=require(`../../../utils/get-language-from-path.cjs`),s=require(`../../../node_modules/@monaco-editor/react/dist/index.cjs`),c=require(`../../../node_modules/react-icons/lu/index.cjs`),l=require(`../../../icons/chveron-up.cjs`),u=require(`../../../hooks/query/use-unified-git-diff.cjs`),d=require(`./loading-spinner.cjs`),f=require(`./editor-container.cjs`);let p=require(`react`);p=e.__toESM(p,1);let m=require(`react/jsx-runtime`);var h=[{mode:`old`,icon:c.LuHistory},{mode:`diff`,icon:c.LuGitCompareArrows},{mode:`new`,icon:c.LuFileCheck}],g={renderValidationDecorations:`off`,readOnly:!0,scrollBeyondLastLine:!1,minimap:{enabled:!1},automaticLayout:!0,scrollbar:{alwaysConsumeMouseWheel:!1}},_={A:c.LuFilePlus,D:c.LuFileMinus,M:c.LuFileDiff,R:`Renamed`,U:`Untracked`},v=e=>{e.editor.defineTheme(`custom-diff-theme`,{base:`vs-dark`,inherit:!0,rules:[{token:`comment`,foreground:`6a9955`},{token:`keyword`,foreground:`569cd6`},{token:`string`,foreground:`ce9178`},{token:`number`,foreground:`b5cea8`}],colors:{"diffEditor.insertedTextBackground":`#014b01AA`,"diffEditor.removedTextBackground":`#750000AA`,"diffEditor.insertedLineBackground":`#003f00AA`,"diffEditor.removedLineBackground":`#5a0000AA`,"diffEditor.border":`var(--oh-border-subtle)`,"editorUnnecessaryCode.border":`#00000000`,"editorUnnecessaryCode.opacity":`rgba(0, 0, 0, 0.467)`}})};function y({path:e,type:c}){let{t:y}=t.useTranslation(`openhands`),[b,x]=p.default.useState(!0),[S,C]=p.default.useState(400),[w,T]=p.default.useState(`diff`),E=p.default.useRef(null),D=p.default.useRef(null),O=c===`A`||c===`U`,k=c===`D`,A=p.default.useMemo(()=>{if(c===`R`){let t=e.split(/\s+/).slice(1);return t[t.length-1]}return e},[e,c]),{data:j,isLoading:M,isSuccess:N,isRefetching:P}=u.useUnifiedGitDiff({filePath:A,type:c,enabled:!b}),F=p.default.useCallback(()=>{if(!E.current)return;let e=E.current.getOriginalEditor(),t=E.current.getModifiedEditor();e&&t&&C(Math.max(e.getContentHeight(),t.getContentHeight())+20)},[]),I=p.default.useCallback(()=>{D.current&&C(D.current.getContentHeight()+20)},[]),L=e=>{E.current=e,F(),e.getOriginalEditor().onDidContentSizeChange(F),e.getModifiedEditor().onDidContentSizeChange(F)},R=e=>{D.current=e,I(),e.onDidContentSizeChange(I)},z=(c===`U`?_.A:_[c])||`?`,B=typeof z==`string`?(0,m.jsx)(a.Typography.Text,{children:z}):p.default.createElement(z,{className:`w-5 h-5`}),V=M||P,H=o.getLanguageFromPath(A),U=H===`markdown`,W=w===`old`?j?.original??``:j?.modified??``;return(0,m.jsxs)(`div`,{"data-testid":`file-diff-viewer-outer`,className:`w-full flex flex-col`,children:[(0,m.jsx)(`div`,{className:`flex justify-between items-center px-3 py-2.5 border-b border-[var(--oh-border)] hover:cursor-pointer`,onClick:()=>x(e=>!e),children:(0,m.jsxs)(`span`,{className:`text-sm w-full text-content flex items-center gap-2`,children:[V?(0,m.jsx)(d.LoadingSpinner,{className:`w-4 h-4`}):B,(0,m.jsx)(`strong`,{className:`w-full truncate font-medium`,children:A}),!b&&!k&&(0,m.jsx)(`span`,{className:`flex items-center gap-0.5 shrink-0`,onClick:e=>e.stopPropagation(),children:h.map(({mode:e,icon:t})=>(0,m.jsx)(`button`,{"data-testid":`view-mode-${e}`,type:`button`,"aria-pressed":w===e,onClick:()=>T(e),className:r.cn(`p-1 rounded transition-colors cursor-pointer`,w===e?`bg-[var(--oh-interactive-hover)] text-white`:`text-[var(--oh-muted)] hover:bg-[var(--oh-interactive-hover)] hover:text-white`),children:(0,m.jsx)(t,{className:`w-4 h-4`})},e))}),(0,m.jsx)(`button`,{"data-testid":`collapse`,type:`button`,children:(0,m.jsx)(l.default,{className:r.cn(`w-4 h-4 transition-transform`,b&&`transform rotate-180`)})})]})}),!b&&k&&(0,m.jsx)(`div`,{"data-testid":`file-deleted-message`,className:`w-full border-b border-[var(--oh-border)] p-4 bg-base text-[var(--oh-text-dim)] text-sm`,children:y(n.I18nKey.DIFF_VIEWER$FILE_DELETED)}),!b&&!k&&N&&(w===`diff`?(0,m.jsx)(f.EditorContainer,{height:S,children:(0,m.jsx)(s.we,{"data-testid":`file-diff-viewer`,className:`w-full h-full`,language:H,original:O?``:j?.original??``,modified:k?``:j?.modified??``,theme:`custom-diff-theme`,onMount:L,beforeMount:v,options:{...g,renderSideBySide:!O&&!k,hideUnchangedRegions:{enabled:!0}}})}):U?(0,m.jsx)(`div`,{className:`w-full border-b border-[var(--oh-border)] overflow-auto p-4 bg-base prose prose-invert max-w-none`,"data-testid":`markdown-preview`,children:(0,m.jsx)(i.MarkdownRenderer,{content:W,includeStandard:!0,includeHeadings:!0})}):(0,m.jsx)(f.EditorContainer,{height:S,children:(0,m.jsx)(s.de,{"data-testid":`file-single-viewer`,className:`w-full h-full`,language:H,value:W,theme:`custom-diff-theme`,beforeMount:v,onMount:R,options:g})}))]})}exports.FileDiffViewer=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(`../../../utils/utils.cjs`),i=require(`../markdown/markdown-renderer.cjs`),a=require(`../../../ui/typography.cjs`),o=require(`../../../utils/get-language-from-path.cjs`),s=require(`../../../node_modules/@monaco-editor/react/dist/index.cjs`),c=require(`../../../node_modules/react-icons/lu/index.cjs`),l=require(`../../../icons/chveron-up.cjs`),u=require(`../../../hooks/query/use-unified-git-diff.cjs`),d=require(`./loading-spinner.cjs`),f=require(`./editor-container.cjs`);let p=require(`react`);p=e.__toESM(p,1);let m=require(`react/jsx-runtime`);var h=[{mode:`old`,icon:c.LuHistory},{mode:`diff`,icon:c.LuGitCompareArrows},{mode:`new`,icon:c.LuFileCheck}],g={renderValidationDecorations:`off`,readOnly:!0,scrollBeyondLastLine:!1,minimap:{enabled:!1},automaticLayout:!0,scrollbar:{alwaysConsumeMouseWheel:!1}},_={A:c.LuFilePlus,D:c.LuFileMinus,M:c.LuFileDiff,R:`Renamed`,U:`Untracked`},v=e=>{e.editor.defineTheme(`custom-diff-theme`,{base:`vs-dark`,inherit:!0,rules:[{token:`comment`,foreground:`6a9955`},{token:`keyword`,foreground:`569cd6`},{token:`string`,foreground:`ce9178`},{token:`number`,foreground:`b5cea8`}],colors:{"diffEditor.insertedTextBackground":`#014b01AA`,"diffEditor.removedTextBackground":`#750000AA`,"diffEditor.insertedLineBackground":`#003f00AA`,"diffEditor.removedLineBackground":`#5a0000AA`,"diffEditor.border":`var(--oh-border-subtle)`,"editorUnnecessaryCode.border":`#00000000`,"editorUnnecessaryCode.opacity":`rgba(0, 0, 0, 0.467)`}})};function y({path:e,type:c,commit:y}){let{t:b}=t.useTranslation(`openhands`),[x,S]=p.default.useState(!0),[C,w]=p.default.useState(400),[T,E]=p.default.useState(`diff`),D=p.default.useRef(null),O=p.default.useRef(null),k=c===`A`||c===`U`,A=c===`D`,j=p.default.useMemo(()=>{if(c===`R`){let t=e.split(/\s+/).slice(1);return t[t.length-1]}return e},[e,c]),{data:M,isLoading:N,isSuccess:P,isRefetching:F}=u.useUnifiedGitDiff({filePath:j,type:c,enabled:!x,commit:y}),I=p.default.useCallback(()=>{if(!D.current)return;let e=D.current.getOriginalEditor(),t=D.current.getModifiedEditor();e&&t&&w(Math.max(e.getContentHeight(),t.getContentHeight())+20)},[]),L=p.default.useCallback(()=>{O.current&&w(O.current.getContentHeight()+20)},[]),R=e=>{D.current=e,I(),e.getOriginalEditor().onDidContentSizeChange(I),e.getModifiedEditor().onDidContentSizeChange(I)},z=e=>{O.current=e,L(),e.onDidContentSizeChange(L)},B=(c===`U`?_.A:_[c])||`?`,V=typeof B==`string`?(0,m.jsx)(a.Typography.Text,{children:B}):p.default.createElement(B,{className:`w-5 h-5`}),H=N||F,U=o.getLanguageFromPath(j),W=U===`markdown`,G=T===`old`?M?.original??``:M?.modified??``;return(0,m.jsxs)(`div`,{"data-testid":`file-diff-viewer-outer`,className:`w-full flex flex-col`,children:[(0,m.jsx)(`div`,{className:`flex justify-between items-center px-3 py-2.5 border-b border-[var(--oh-border)] hover:cursor-pointer`,onClick:()=>S(e=>!e),children:(0,m.jsxs)(`span`,{className:`text-sm w-full text-content flex items-center gap-2`,children:[H?(0,m.jsx)(d.LoadingSpinner,{className:`w-4 h-4`}):V,(0,m.jsx)(`strong`,{className:`w-full truncate font-medium`,children:j}),!x&&!A&&(0,m.jsx)(`span`,{className:`flex items-center gap-0.5 shrink-0`,onClick:e=>e.stopPropagation(),children:h.map(({mode:e,icon:t})=>(0,m.jsx)(`button`,{"data-testid":`view-mode-${e}`,type:`button`,"aria-pressed":T===e,onClick:()=>E(e),className:r.cn(`p-1 rounded transition-colors cursor-pointer`,T===e?`bg-[var(--oh-interactive-hover)] text-white`:`text-[var(--oh-muted)] hover:bg-[var(--oh-interactive-hover)] hover:text-white`),children:(0,m.jsx)(t,{className:`w-4 h-4`})},e))}),(0,m.jsx)(`button`,{"data-testid":`collapse`,type:`button`,children:(0,m.jsx)(l.default,{className:r.cn(`w-4 h-4 transition-transform`,x&&`transform rotate-180`)})})]})}),!x&&A&&!y&&(0,m.jsx)(`div`,{"data-testid":`file-deleted-message`,className:`w-full border-b border-[var(--oh-border)] p-4 bg-base text-[var(--oh-text-dim)] text-sm`,children:b(n.I18nKey.DIFF_VIEWER$FILE_DELETED)}),!x&&(!A||!!y)&&P&&(T===`diff`?(0,m.jsx)(f.EditorContainer,{height:C,children:(0,m.jsx)(s.we,{"data-testid":`file-diff-viewer`,className:`w-full h-full`,language:U,original:k?``:M?.original??``,modified:A?``:M?.modified??``,theme:`custom-diff-theme`,onMount:R,beforeMount:v,options:{...g,renderSideBySide:!k&&!A,hideUnchangedRegions:{enabled:!0}}})}):W?(0,m.jsx)(`div`,{className:`w-full border-b border-[var(--oh-border)] overflow-auto p-4 bg-base prose prose-invert max-w-none`,"data-testid":`markdown-preview`,children:(0,m.jsx)(i.MarkdownRenderer,{content:G,includeStandard:!0,includeHeadings:!0})}):(0,m.jsx)(f.EditorContainer,{height:C,children:(0,m.jsx)(s.de,{"data-testid":`file-single-viewer`,className:`w-full h-full`,language:U,value:G,theme:`custom-diff-theme`,beforeMount:v,onMount:z,options:g})}))]})}exports.FileDiffViewer=y;
2
2
  //# sourceMappingURL=file-diff-viewer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-diff-viewer.cjs","names":[],"sources":["../../../../src/components/features/diff-viewer/file-diff-viewer.tsx"],"sourcesContent":["import { DiffEditor, Editor, Monaco } from \"@monaco-editor/react\";\nimport React from \"react\";\nimport { editor as editor_t } from \"monaco-editor\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n LuFileDiff,\n LuFileMinus,\n LuFilePlus,\n LuHistory,\n LuGitCompareArrows,\n LuFileCheck,\n} from \"react-icons/lu\";\nimport { IconType } from \"react-icons/lib\";\nimport { GitChangeStatus } from \"#/api/open-hands.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { getLanguageFromPath } from \"#/utils/get-language-from-path\";\nimport { cn } from \"#/utils/utils\";\nimport ChevronUp from \"#/icons/chveron-up.svg?react\";\nimport { useUnifiedGitDiff } from \"#/hooks/query/use-unified-git-diff\";\nimport { MarkdownRenderer } from \"#/components/features/markdown/markdown-renderer\";\nimport { Typography } from \"#/ui/typography\";\nimport { LoadingSpinner } from \"./loading-spinner\";\nimport { EditorContainer } from \"./editor-container\";\n\ntype ViewMode = \"diff\" | \"old\" | \"new\";\n\nconst VIEW_MODES: { mode: ViewMode; icon: IconType }[] = [\n { mode: \"old\", icon: LuHistory },\n { mode: \"diff\", icon: LuGitCompareArrows },\n { mode: \"new\", icon: LuFileCheck },\n];\n\nconst SHARED_EDITOR_OPTIONS: editor_t.IEditorOptions = {\n renderValidationDecorations: \"off\",\n readOnly: true,\n scrollBeyondLastLine: false,\n minimap: { enabled: false },\n automaticLayout: true,\n scrollbar: { alwaysConsumeMouseWheel: false },\n};\n\nconst STATUS_MAP: Record<GitChangeStatus, string | IconType> = {\n A: LuFilePlus,\n D: LuFileMinus,\n M: LuFileDiff,\n R: \"Renamed\",\n U: \"Untracked\",\n};\n\nconst beforeMount = (monaco: Monaco) => {\n monaco.editor.defineTheme(\"custom-diff-theme\", {\n base: \"vs-dark\",\n inherit: true,\n rules: [\n { token: \"comment\", foreground: \"6a9955\" },\n { token: \"keyword\", foreground: \"569cd6\" },\n { token: \"string\", foreground: \"ce9178\" },\n { token: \"number\", foreground: \"b5cea8\" },\n ],\n colors: {\n \"diffEditor.insertedTextBackground\": \"#014b01AA\",\n \"diffEditor.removedTextBackground\": \"#750000AA\",\n \"diffEditor.insertedLineBackground\": \"#003f00AA\",\n \"diffEditor.removedLineBackground\": \"#5a0000AA\",\n \"diffEditor.border\": \"var(--oh-border-subtle)\",\n \"editorUnnecessaryCode.border\": \"#00000000\",\n \"editorUnnecessaryCode.opacity\": \"rgba(0, 0, 0, 0.467)\",\n },\n });\n};\n\nexport interface FileDiffViewerProps {\n path: string;\n type: GitChangeStatus;\n}\n\nexport function FileDiffViewer({ path, type }: FileDiffViewerProps) {\n const { t } = useTranslation(\"openhands\");\n const [isCollapsed, setIsCollapsed] = React.useState(true);\n const [editorHeight, setEditorHeight] = React.useState(400);\n const [viewMode, setViewMode] = React.useState<ViewMode>(\"diff\");\n const diffEditorRef = React.useRef<editor_t.IStandaloneDiffEditor>(null);\n const singleEditorRef = React.useRef<editor_t.IStandaloneCodeEditor>(null);\n\n const isAdded = type === \"A\" || type === \"U\";\n const isDeleted = type === \"D\";\n\n const filePath = React.useMemo(() => {\n if (type === \"R\") {\n const parts = path.split(/\\s+/).slice(1);\n return parts[parts.length - 1];\n }\n return path;\n }, [path, type]);\n\n const {\n data: diff,\n isLoading,\n isSuccess,\n isRefetching,\n } = useUnifiedGitDiff({\n filePath,\n type,\n enabled: !isCollapsed,\n });\n\n const updateEditorHeight = React.useCallback(() => {\n if (!diffEditorRef.current) return;\n const originalEditor = diffEditorRef.current.getOriginalEditor();\n const modifiedEditor = diffEditorRef.current.getModifiedEditor();\n if (originalEditor && modifiedEditor) {\n setEditorHeight(\n Math.max(\n originalEditor.getContentHeight(),\n modifiedEditor.getContentHeight(),\n ) + 20,\n );\n }\n }, []);\n\n const updateSingleEditorHeight = React.useCallback(() => {\n if (singleEditorRef.current) {\n setEditorHeight(singleEditorRef.current.getContentHeight() + 20);\n }\n }, []);\n\n const handleDiffEditorMount = (editor: editor_t.IStandaloneDiffEditor) => {\n diffEditorRef.current = editor;\n updateEditorHeight();\n editor.getOriginalEditor().onDidContentSizeChange(updateEditorHeight);\n editor.getModifiedEditor().onDidContentSizeChange(updateEditorHeight);\n };\n\n const handleSingleEditorMount = (editor: editor_t.IStandaloneCodeEditor) => {\n singleEditorRef.current = editor;\n updateSingleEditorHeight();\n editor.onDidContentSizeChange(updateSingleEditorHeight);\n };\n\n const status = (type === \"U\" ? STATUS_MAP.A : STATUS_MAP[type]) || \"?\";\n const statusIcon =\n typeof status === \"string\" ? (\n <Typography.Text>{status}</Typography.Text>\n ) : (\n React.createElement(status, { className: \"w-5 h-5\" })\n );\n\n const isFetchingData = isLoading || isRefetching;\n const language = getLanguageFromPath(filePath);\n const isMarkdownFile = language === \"markdown\";\n const singleViewContent =\n viewMode === \"old\" ? (diff?.original ?? \"\") : (diff?.modified ?? \"\");\n\n const renderContent = () => {\n if (viewMode === \"diff\") {\n return (\n <EditorContainer height={editorHeight}>\n <DiffEditor\n data-testid=\"file-diff-viewer\"\n className=\"w-full h-full\"\n language={language}\n original={isAdded ? \"\" : (diff?.original ?? \"\")}\n modified={isDeleted ? \"\" : (diff?.modified ?? \"\")}\n theme=\"custom-diff-theme\"\n onMount={handleDiffEditorMount}\n beforeMount={beforeMount}\n options={{\n ...SHARED_EDITOR_OPTIONS,\n renderSideBySide: !isAdded && !isDeleted,\n hideUnchangedRegions: { enabled: true },\n }}\n />\n </EditorContainer>\n );\n }\n\n if (isMarkdownFile) {\n return (\n <div\n className=\"w-full border-b border-[var(--oh-border)] overflow-auto p-4 bg-base prose prose-invert max-w-none\"\n data-testid=\"markdown-preview\"\n >\n <MarkdownRenderer\n content={singleViewContent}\n includeStandard\n includeHeadings\n />\n </div>\n );\n }\n\n return (\n <EditorContainer height={editorHeight}>\n <Editor\n data-testid=\"file-single-viewer\"\n className=\"w-full h-full\"\n language={language}\n value={singleViewContent}\n theme=\"custom-diff-theme\"\n beforeMount={beforeMount}\n onMount={handleSingleEditorMount}\n options={SHARED_EDITOR_OPTIONS}\n />\n </EditorContainer>\n );\n };\n\n return (\n <div data-testid=\"file-diff-viewer-outer\" className=\"w-full flex flex-col\">\n <div\n className=\"flex justify-between items-center px-3 py-2.5 border-b border-[var(--oh-border)] hover:cursor-pointer\"\n onClick={() => setIsCollapsed((prev) => !prev)}\n >\n <span className=\"text-sm w-full text-content flex items-center gap-2\">\n {isFetchingData ? <LoadingSpinner className=\"w-4 h-4\" /> : statusIcon}\n <strong className=\"w-full truncate font-medium\">{filePath}</strong>\n {!isCollapsed && !isDeleted && (\n <span\n className=\"flex items-center gap-0.5 shrink-0\"\n onClick={(e) => e.stopPropagation()}\n >\n {VIEW_MODES.map(({ mode, icon: Icon }) => (\n <button\n key={mode}\n data-testid={`view-mode-${mode}`}\n type=\"button\"\n aria-pressed={viewMode === mode}\n onClick={() => setViewMode(mode)}\n className={cn(\n \"p-1 rounded transition-colors cursor-pointer\",\n viewMode === mode\n ? \"bg-[var(--oh-interactive-hover)] text-white\"\n : \"text-[var(--oh-muted)] hover:bg-[var(--oh-interactive-hover)] hover:text-white\",\n )}\n >\n <Icon className=\"w-4 h-4\" />\n </button>\n ))}\n </span>\n )}\n <button data-testid=\"collapse\" type=\"button\">\n <ChevronUp\n className={cn(\n \"w-4 h-4 transition-transform\",\n isCollapsed && \"transform rotate-180\",\n )}\n />\n </button>\n </span>\n </div>\n\n {!isCollapsed && isDeleted && (\n <div\n data-testid=\"file-deleted-message\"\n className=\"w-full border-b border-[var(--oh-border)] p-4 bg-base text-[var(--oh-text-dim)] text-sm\"\n >\n {t(I18nKey.DIFF_VIEWER$FILE_DELETED)}\n </div>\n )}\n\n {!isCollapsed && !isDeleted && isSuccess && renderContent()}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"file-diff-viewer.cjs","names":[],"sources":["../../../../src/components/features/diff-viewer/file-diff-viewer.tsx"],"sourcesContent":["import { DiffEditor, Editor, Monaco } from \"@monaco-editor/react\";\nimport React from \"react\";\nimport { editor as editor_t } from \"monaco-editor\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n LuFileDiff,\n LuFileMinus,\n LuFilePlus,\n LuHistory,\n LuGitCompareArrows,\n LuFileCheck,\n} from \"react-icons/lu\";\nimport { IconType } from \"react-icons/lib\";\nimport { GitChangeStatus } from \"#/api/open-hands.types\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { getLanguageFromPath } from \"#/utils/get-language-from-path\";\nimport { cn } from \"#/utils/utils\";\nimport ChevronUp from \"#/icons/chveron-up.svg?react\";\nimport { useUnifiedGitDiff } from \"#/hooks/query/use-unified-git-diff\";\nimport { MarkdownRenderer } from \"#/components/features/markdown/markdown-renderer\";\nimport { Typography } from \"#/ui/typography\";\nimport { LoadingSpinner } from \"./loading-spinner\";\nimport { EditorContainer } from \"./editor-container\";\n\ntype ViewMode = \"diff\" | \"old\" | \"new\";\n\nconst VIEW_MODES: { mode: ViewMode; icon: IconType }[] = [\n { mode: \"old\", icon: LuHistory },\n { mode: \"diff\", icon: LuGitCompareArrows },\n { mode: \"new\", icon: LuFileCheck },\n];\n\nconst SHARED_EDITOR_OPTIONS: editor_t.IEditorOptions = {\n renderValidationDecorations: \"off\",\n readOnly: true,\n scrollBeyondLastLine: false,\n minimap: { enabled: false },\n automaticLayout: true,\n scrollbar: { alwaysConsumeMouseWheel: false },\n};\n\nconst STATUS_MAP: Record<GitChangeStatus, string | IconType> = {\n A: LuFilePlus,\n D: LuFileMinus,\n M: LuFileDiff,\n R: \"Renamed\",\n U: \"Untracked\",\n};\n\nconst beforeMount = (monaco: Monaco) => {\n monaco.editor.defineTheme(\"custom-diff-theme\", {\n base: \"vs-dark\",\n inherit: true,\n rules: [\n { token: \"comment\", foreground: \"6a9955\" },\n { token: \"keyword\", foreground: \"569cd6\" },\n { token: \"string\", foreground: \"ce9178\" },\n { token: \"number\", foreground: \"b5cea8\" },\n ],\n colors: {\n \"diffEditor.insertedTextBackground\": \"#014b01AA\",\n \"diffEditor.removedTextBackground\": \"#750000AA\",\n \"diffEditor.insertedLineBackground\": \"#003f00AA\",\n \"diffEditor.removedLineBackground\": \"#5a0000AA\",\n \"diffEditor.border\": \"var(--oh-border-subtle)\",\n \"editorUnnecessaryCode.border\": \"#00000000\",\n \"editorUnnecessaryCode.opacity\": \"rgba(0, 0, 0, 0.467)\",\n },\n });\n};\n\nexport interface FileDiffViewerProps {\n path: string;\n type: GitChangeStatus;\n /**\n * When set, show the file's diff as changed by this commit instead of\n * the working-tree-vs-base diff. Deleted files render their content in\n * commit mode (both sides come from git objects).\n */\n commit?: string;\n}\n\nexport function FileDiffViewer({ path, type, commit }: FileDiffViewerProps) {\n const { t } = useTranslation(\"openhands\");\n const [isCollapsed, setIsCollapsed] = React.useState(true);\n const [editorHeight, setEditorHeight] = React.useState(400);\n const [viewMode, setViewMode] = React.useState<ViewMode>(\"diff\");\n const diffEditorRef = React.useRef<editor_t.IStandaloneDiffEditor>(null);\n const singleEditorRef = React.useRef<editor_t.IStandaloneCodeEditor>(null);\n\n const isAdded = type === \"A\" || type === \"U\";\n const isDeleted = type === \"D\";\n\n const filePath = React.useMemo(() => {\n if (type === \"R\") {\n const parts = path.split(/\\s+/).slice(1);\n return parts[parts.length - 1];\n }\n return path;\n }, [path, type]);\n\n const {\n data: diff,\n isLoading,\n isSuccess,\n isRefetching,\n } = useUnifiedGitDiff({\n filePath,\n type,\n enabled: !isCollapsed,\n commit,\n });\n\n const updateEditorHeight = React.useCallback(() => {\n if (!diffEditorRef.current) return;\n const originalEditor = diffEditorRef.current.getOriginalEditor();\n const modifiedEditor = diffEditorRef.current.getModifiedEditor();\n if (originalEditor && modifiedEditor) {\n setEditorHeight(\n Math.max(\n originalEditor.getContentHeight(),\n modifiedEditor.getContentHeight(),\n ) + 20,\n );\n }\n }, []);\n\n const updateSingleEditorHeight = React.useCallback(() => {\n if (singleEditorRef.current) {\n setEditorHeight(singleEditorRef.current.getContentHeight() + 20);\n }\n }, []);\n\n const handleDiffEditorMount = (editor: editor_t.IStandaloneDiffEditor) => {\n diffEditorRef.current = editor;\n updateEditorHeight();\n editor.getOriginalEditor().onDidContentSizeChange(updateEditorHeight);\n editor.getModifiedEditor().onDidContentSizeChange(updateEditorHeight);\n };\n\n const handleSingleEditorMount = (editor: editor_t.IStandaloneCodeEditor) => {\n singleEditorRef.current = editor;\n updateSingleEditorHeight();\n editor.onDidContentSizeChange(updateSingleEditorHeight);\n };\n\n const status = (type === \"U\" ? STATUS_MAP.A : STATUS_MAP[type]) || \"?\";\n const statusIcon =\n typeof status === \"string\" ? (\n <Typography.Text>{status}</Typography.Text>\n ) : (\n React.createElement(status, { className: \"w-5 h-5\" })\n );\n\n const isFetchingData = isLoading || isRefetching;\n const language = getLanguageFromPath(filePath);\n const isMarkdownFile = language === \"markdown\";\n const singleViewContent =\n viewMode === \"old\" ? (diff?.original ?? \"\") : (diff?.modified ?? \"\");\n\n const renderContent = () => {\n if (viewMode === \"diff\") {\n return (\n <EditorContainer height={editorHeight}>\n <DiffEditor\n data-testid=\"file-diff-viewer\"\n className=\"w-full h-full\"\n language={language}\n original={isAdded ? \"\" : (diff?.original ?? \"\")}\n modified={isDeleted ? \"\" : (diff?.modified ?? \"\")}\n theme=\"custom-diff-theme\"\n onMount={handleDiffEditorMount}\n beforeMount={beforeMount}\n options={{\n ...SHARED_EDITOR_OPTIONS,\n renderSideBySide: !isAdded && !isDeleted,\n hideUnchangedRegions: { enabled: true },\n }}\n />\n </EditorContainer>\n );\n }\n\n if (isMarkdownFile) {\n return (\n <div\n className=\"w-full border-b border-[var(--oh-border)] overflow-auto p-4 bg-base prose prose-invert max-w-none\"\n data-testid=\"markdown-preview\"\n >\n <MarkdownRenderer\n content={singleViewContent}\n includeStandard\n includeHeadings\n />\n </div>\n );\n }\n\n return (\n <EditorContainer height={editorHeight}>\n <Editor\n data-testid=\"file-single-viewer\"\n className=\"w-full h-full\"\n language={language}\n value={singleViewContent}\n theme=\"custom-diff-theme\"\n beforeMount={beforeMount}\n onMount={handleSingleEditorMount}\n options={SHARED_EDITOR_OPTIONS}\n />\n </EditorContainer>\n );\n };\n\n return (\n <div data-testid=\"file-diff-viewer-outer\" className=\"w-full flex flex-col\">\n <div\n className=\"flex justify-between items-center px-3 py-2.5 border-b border-[var(--oh-border)] hover:cursor-pointer\"\n onClick={() => setIsCollapsed((prev) => !prev)}\n >\n <span className=\"text-sm w-full text-content flex items-center gap-2\">\n {isFetchingData ? <LoadingSpinner className=\"w-4 h-4\" /> : statusIcon}\n <strong className=\"w-full truncate font-medium\">{filePath}</strong>\n {!isCollapsed && !isDeleted && (\n <span\n className=\"flex items-center gap-0.5 shrink-0\"\n onClick={(e) => e.stopPropagation()}\n >\n {VIEW_MODES.map(({ mode, icon: Icon }) => (\n <button\n key={mode}\n data-testid={`view-mode-${mode}`}\n type=\"button\"\n aria-pressed={viewMode === mode}\n onClick={() => setViewMode(mode)}\n className={cn(\n \"p-1 rounded transition-colors cursor-pointer\",\n viewMode === mode\n ? \"bg-[var(--oh-interactive-hover)] text-white\"\n : \"text-[var(--oh-muted)] hover:bg-[var(--oh-interactive-hover)] hover:text-white\",\n )}\n >\n <Icon className=\"w-4 h-4\" />\n </button>\n ))}\n </span>\n )}\n <button data-testid=\"collapse\" type=\"button\">\n <ChevronUp\n className={cn(\n \"w-4 h-4 transition-transform\",\n isCollapsed && \"transform rotate-180\",\n )}\n />\n </button>\n </span>\n </div>\n\n {!isCollapsed && isDeleted && !commit && (\n <div\n data-testid=\"file-deleted-message\"\n className=\"w-full border-b border-[var(--oh-border)] p-4 bg-base text-[var(--oh-text-dim)] text-sm\"\n >\n {t(I18nKey.DIFF_VIEWER$FILE_DELETED)}\n </div>\n )}\n\n {!isCollapsed && (!isDeleted || !!commit) && isSuccess && renderContent()}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -2,5 +2,11 @@ import { GitChangeStatus } from "#/api/open-hands.types";
2
2
  export interface FileDiffViewerProps {
3
3
  path: string;
4
4
  type: GitChangeStatus;
5
+ /**
6
+ * When set, show the file's diff as changed by this commit instead of
7
+ * the working-tree-vs-base diff. Deleted files render their content in
8
+ * commit mode (both sides come from git objects).
9
+ */
10
+ commit?: string;
5
11
  }
6
- export declare function FileDiffViewer({ path, type }: FileDiffViewerProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function FileDiffViewer({ path, type, commit }: FileDiffViewerProps): import("react/jsx-runtime").JSX.Element;