@openhands/agent-canvas 1.0.0-rc.7 → 1.0.0-rc.9

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 (269) hide show
  1. package/README.md +1 -3
  2. package/README.windows.md +2 -2
  3. package/build/assets/{QueryClientProvider-2bFjjuvv.js → QueryClientProvider-XcSjsfpb.js} +1 -1
  4. package/build/assets/{Trans-D1xHkKyr.js → Trans-sy4l4TyQ.js} +1 -1
  5. package/build/assets/{acp-providers-Djbp2WMV.js → acp-providers-Dzb4nxxB.js} +1 -1
  6. package/build/assets/{active-backend-context-BiVlte2V.js → active-backend-context-B2OSC-qe.js} +1 -1
  7. package/build/assets/add-backend-modal-lG8XDYjr.js +1 -0
  8. package/build/assets/{agent-server-adapter-BD6kvwWb.js → agent-server-adapter-BPpZcLOE.js} +3 -3
  9. package/build/assets/agent-server-client-options-wXLeJYeM.js +1 -0
  10. package/build/assets/{agent-server-conversation-service.api-8AC86rC5.js → agent-server-conversation-service.api-C4Fc9Jnp.js} +1 -1
  11. package/build/assets/{agent-settings-DycVwGfd.js → agent-settings-Blipgztd.js} +1 -1
  12. package/build/assets/{alert-banner-BUqPui_3.js → alert-banner-Bsvys-hT.js} +1 -1
  13. package/build/assets/{analytics-consent-form-modal-D0KeG5vZ.js → analytics-consent-form-modal-Cujm1lCj.js} +1 -1
  14. package/build/assets/{api-key-entry-screen-BnvQM0v5.js → api-key-entry-screen-BarZU9nr.js} +1 -1
  15. package/build/assets/{app-settings-FRYUtG-Z.js → app-settings-CofRfixq.js} +1 -1
  16. package/build/assets/{automation-detail-DiIq3Vsh.js → automation-detail-BV4Cn0O8.js} +1 -1
  17. package/build/assets/{automations-list-DQn7k1Ix.js → automations-list-BaJ61q7P.js} +1 -1
  18. package/build/assets/{back-nav-button-B8eULM4t.js → back-nav-button-D20Avel_.js} +1 -1
  19. package/build/assets/{backend-form-modal-DY3My0us.js → backend-form-modal-B3BCZDPq.js} +1 -1
  20. package/build/assets/{backend-synced-settings-badge-BW2WPX-c.js → backend-synced-settings-badge-Da0G6Lwv.js} +1 -1
  21. package/build/assets/{base-modal-B_MCb3rx.js → base-modal-DvuGYyu1.js} +1 -1
  22. package/build/assets/{brand-button-B6g_UvEG.js → brand-button-9SOzmqPP.js} +1 -1
  23. package/build/assets/{browser-tab-DVHx54yn.js → browser-tab-bveyJhG9.js} +1 -1
  24. package/build/assets/{chat-send-button-Ce9rK8Vd.js → chat-send-button-DzRpAQr4.js} +1 -1
  25. package/build/assets/{checkmark-BQIxLn5W.js → checkmark--JWAesua.js} +1 -1
  26. package/build/assets/{circle-plus-check-toggle-DRwQ4Z7K.js → circle-plus-check-toggle-AO9DWyDX.js} +1 -1
  27. package/build/assets/{close-HybccyBS.js → close--W-tHn1h.js} +1 -1
  28. package/build/assets/{code-tag-DZCEX2zo.js → code-tag-chmctf4w.js} +1 -1
  29. package/build/assets/{combobox-caret-kEa3kTvf.js → combobox-caret-C9BNHfSu.js} +1 -1
  30. package/build/assets/{condenser-settings-BlbT8YRd.js → condenser-settings-Bo07FAEi.js} +1 -1
  31. package/build/assets/{confirmation-modal-CG_Fgrny.js → confirmation-modal-Cq3eqvqH.js} +1 -1
  32. package/build/assets/{context-menu-list-item-CvJv3-kq.js → context-menu-list-item-BQU0jZPq.js} +1 -1
  33. package/build/assets/conversation-DDdRyW4z.js +19 -0
  34. package/build/assets/conversation-panel-Dww2uJOd.js +1 -0
  35. package/build/assets/conversation-rGQV1Eym.js +1 -0
  36. package/build/assets/{conversation-service.api-CngSQhPh.js → conversation-service.api-ByRiRU1e.js} +1 -1
  37. package/build/assets/{conversation-tab-empty-state-B5eOSEGv.js → conversation-tab-empty-state-C8tztloo.js} +1 -1
  38. package/build/assets/{copy-D6CyDz2n.js → copy-CdKN5rtJ.js} +1 -1
  39. package/build/assets/{declaration-BDfM67Kl.js → declaration-D9ucT0fq.js} +1 -1
  40. package/build/assets/{device-verify-CAevP6_3.js → device-verify-YuGXnpRk.js} +1 -1
  41. package/build/assets/{dropdown-classes-CL8egwz_.js → dropdown-classes-CVp0kVdt.js} +1 -1
  42. package/build/assets/{edit-automation-modal-CwLfhSMN.js → edit-automation-modal-CpA_JKLY.js} +1 -1
  43. package/build/assets/{ellipsis-button-Db-AwbLv.js → ellipsis-button-k7HLwYth.js} +1 -1
  44. package/build/assets/{entry.client-BKDpKmdB.js → entry.client-DUpefbBp.js} +2 -2
  45. package/build/assets/{enum-filter-dropdown-DnYXhc1E.js → enum-filter-dropdown-COqUq3mB.js} +1 -1
  46. package/build/assets/{environment-switch-overlay-BgYKFdf6.js → environment-switch-overlay-wB5LxfYZ.js} +1 -1
  47. package/build/assets/{extensions-hub-CgisT2wb.js → extensions-hub-BYCLWP3d.js} +1 -1
  48. package/build/assets/{extensions-navigation-nurGkQe5.js → extensions-navigation-3FLKfb6g.js} +1 -1
  49. package/build/assets/{files-tab-DIyAYvp0.js → files-tab-CBUPwSV1.js} +1 -1
  50. package/build/assets/{files-tab-store-RScGdwu8.js → files-tab-store-DSKUhziI.js} +1 -1
  51. package/build/assets/{folder-IChmji2Y.js → folder-DPTBlxWb.js} +1 -1
  52. package/build/assets/home-BDCL0Psk.js +1 -0
  53. package/build/assets/{install-server-modal-C8fylTet.js → install-server-modal-CWZhBKwH.js} +1 -1
  54. package/build/assets/{launch-BNiqgTvz.js → launch-CMZknx1e.js} +1 -1
  55. package/build/assets/{lesson-plan-BdmMvboE.js → lesson-plan-y520IDs6.js} +1 -1
  56. package/build/assets/{lightbulb-DzViGAuw.js → lightbulb-S616sGEL.js} +1 -1
  57. package/build/assets/{link-external-Dwv3oQAx.js → link-external-ooNztGLp.js} +1 -1
  58. package/build/assets/{llm-client-P9f2gKeW.js → llm-client-D6EtdLBs.js} +1 -1
  59. package/build/assets/llm-not-configured-banner-CJyURBCm.js +27 -0
  60. package/build/assets/llm-settings-BW6yW2Go.js +1 -0
  61. package/build/assets/{llm-settings-B92l1Z2N.js → llm-settings-CiY22Wzi.js} +1 -1
  62. package/build/assets/{loading-spinner-Dtm7y-w5.js → loading-spinner-D7bOU6I7.js} +1 -1
  63. package/build/assets/{manage-backends-modal-qpq2M_oN.js → manage-backends-modal-v5POMal5.js} +1 -1
  64. package/build/assets/manifest-eccb7f46.js +1 -0
  65. package/build/assets/{markdown-renderer-Dt0RXhUJ.js → markdown-renderer-z446oW0Z.js} +1 -1
  66. package/build/assets/{mcp-BKdD21xY.js → mcp-DgPFZ_Dv.js} +1 -1
  67. package/build/assets/{messages-Ch8Rd1cx.js → messages-Dq6AQ8mp.js} +1 -1
  68. package/build/assets/{modal-backdrop-DmDLoot0.js → modal-backdrop-_VbcKk5K.js} +1 -1
  69. package/build/assets/{modal-body-BWjhfiSa.js → modal-body-Cd-PtMHr.js} +1 -1
  70. package/build/assets/{modal-classes-DbJbhQCW.js → modal-classes-CNm4ovfm.js} +1 -1
  71. package/build/assets/{modal-close-button-DXN6uYvt.js → modal-close-button-Dbo0NAMt.js} +1 -1
  72. package/build/assets/{model-selector-BMn4D5v6.js → model-selector-CdZs21EZ.js} +1 -1
  73. package/build/assets/{navigation-context-BrRCrWhm.js → navigation-context-BpAOh_t5.js} +1 -1
  74. package/build/assets/{navigation-link-qUrH_I5_.js → navigation-link-Dci7Nuyf.js} +1 -1
  75. package/build/assets/{onboarding-B50IeNyy.js → onboarding-Cdwu8QIy.js} +1 -1
  76. package/build/assets/{openhands-logo-DnfHAq7Y.js → openhands-logo-Dzm-d_V_.js} +1 -1
  77. package/build/assets/{option-service.api-lzN_3s9w.js → option-service.api-CdYnKVsu.js} +1 -1
  78. package/build/assets/{organization-service.api-CNmSPGj4.js → organization-service.api-CzMvXIQT.js} +1 -1
  79. package/build/assets/{path-utils-CKgIQZAY.js → path-utils-DKu3CNkH.js} +1 -1
  80. package/build/assets/{plan-components-D9fU4FFh.js → plan-components-CutRBi0G.js} +1 -1
  81. package/build/assets/{planner-tab-B7kpsTT8.js → planner-tab-YkOp7QXt.js} +1 -1
  82. package/build/assets/{profiles-client-BNvHck-I.js → profiles-client-BjUo3q05.js} +1 -1
  83. package/build/assets/{providers-189W9TJO.js → providers-CbpQft-X.js} +1 -1
  84. package/build/assets/{proxy--Uy1iGsW.js → proxy-Bx3NeKeo.js} +1 -1
  85. package/build/assets/{query-client-config-B9ZI-1_w.js → query-client-config-Ca3tW1AH.js} +1 -1
  86. package/build/assets/{recommended-automations-launcher-C_RcP2yb.js → recommended-automations-launcher-WxaZcjRD.js} +1 -1
  87. package/build/assets/{root-Bz22PITD.js → root-CiNoOVrb.js} +2 -2
  88. package/build/assets/{root-layout-B8swq9fS.js → root-layout-DUw-s9LS.js} +2 -2
  89. package/build/assets/{runtime-waiting-state-DPjfE32a.js → runtime-waiting-state-8i0Z3A_i.js} +1 -1
  90. package/build/assets/{sdk-section-page-ozvrzW4r.js → sdk-section-page-DPBwwLle.js} +1 -1
  91. package/build/assets/{sdk-settings-schema-Ck6f2ON9.js → sdk-settings-schema-Big50zDH.js} +1 -1
  92. package/build/assets/{search-aDWSdSb7.js → search-C_l_XW4e.js} +1 -1
  93. package/build/assets/{secrets-service-D6Gcymcs.js → secrets-service-Skzza9sx.js} +1 -1
  94. package/build/assets/{secrets-settings-Bga0bwB1.js → secrets-settings-DmpsTC9V.js} +1 -1
  95. package/build/assets/{settings-DHAhcPm2.js → settings-ChsRtIJQ.js} +1 -1
  96. package/build/assets/{settings-dropdown-input-N0FtDFkk.js → settings-dropdown-input-BP-arqjU.js} +1 -1
  97. package/build/assets/{settings-gear-D8ao16bi.js → settings-gear-f-zWpxfI.js} +1 -1
  98. package/build/assets/{settings-index-CJvQH5ls.js → settings-index-BLfmrKRl.js} +1 -1
  99. package/build/assets/{settings-input-CyWJBrqC.js → settings-input-BM8ANxDb.js} +1 -1
  100. package/build/assets/{settings-list-classes-CYRnRf8r.js → settings-list-classes-B9uo5WES.js} +1 -1
  101. package/build/assets/{settings-modal-BeAlR7Be.js → settings-modal-Cth7Zb-I.js} +1 -1
  102. package/build/assets/{settings-section-header-context-1fN7Xkb3.js → settings-section-header-context-Cid25HM2.js} +1 -1
  103. package/build/assets/{settings-service.api-CFt5HmXD.js → settings-service.api-CcpckquT.js} +1 -1
  104. package/build/assets/{settings-switch-D3aEIphL.js → settings-switch-xa6q4M6j.js} +1 -1
  105. package/build/assets/{shared-conversation-CtRf6CQN.js → shared-conversation-Y0C8zqdr.js} +1 -1
  106. package/build/assets/{sidebar-mobile-menu-toggle-DkYaKR6Q.js → sidebar-mobile-menu-toggle-BvcBXvLY.js} +1 -1
  107. package/build/assets/{sidebar-nav-link-CzeuB4So.js → sidebar-nav-link-BekRAssb.js} +1 -1
  108. package/build/assets/{skill-card-pill-row-CvLCLqqD.js → skill-card-pill-row-DeodrwPG.js} +1 -1
  109. package/build/assets/{skills-jKeJCunm.js → skills-BE5HJuGM.js} +1 -1
  110. package/build/assets/{skills-client-Ui_9FvXp.js → skills-client-CgraS-wA.js} +1 -1
  111. package/build/assets/{skills-plugins-juwPhlEE.js → skills-plugins-rIza_fUf.js} +1 -1
  112. package/build/assets/{skills-settings-BW09n_Px.js → skills-settings-Dvl7gpEx.js} +1 -1
  113. package/build/assets/{styled-tooltip-B3wz8m5E.js → styled-tooltip-X61SEwqk.js} +1 -1
  114. package/build/assets/{suspense-BpkWt-39.js → suspense-Bqb0V0q1.js} +1 -1
  115. package/build/assets/{switch-skeleton-Cl_Nh2kt.js → switch-skeleton-BbIWemkK.js} +1 -1
  116. package/build/assets/{task-list-tab-DKnHShLG.js → task-list-tab-BFnyHGsn.js} +1 -1
  117. package/build/assets/{telemetry-DR_3fMN0.js → telemetry-CAWBJ_rB.js} +1 -1
  118. package/build/assets/{terminal-BFi5FOMc.js → terminal-B92mACR5.js} +1 -1
  119. package/build/assets/{terminal-CZH2h1J3.js → terminal-BFypysgZ.js} +1 -1
  120. package/build/assets/{toggle-switch-BzaEofjj.js → toggle-switch-CL_wRiGs.js} +1 -1
  121. package/build/assets/{typography-BFj4IzMj.js → typography-BLSEGjph.js} +1 -1
  122. package/build/assets/{u-check-circle-Cs2GOrZ7.js → u-check-circle-dG_VJqx5.js} +1 -1
  123. package/build/assets/{u-check-circle-half-DGgLKVV1.js → u-check-circle-half-D-5ZPRnd.js} +1 -1
  124. package/build/assets/{u-circuit-DniZPNAV.js → u-circuit-BXoisXOA.js} +1 -1
  125. package/build/assets/{u-edit-BvTiDr33.js → u-edit-DIgADxLH.js} +1 -1
  126. package/build/assets/{use-acp-credential-form-8yHKY_py.js → use-acp-credential-form-Dj7Jkhgp.js} +1 -1
  127. package/build/assets/{use-active-conversation-CLzls6XV.js → use-active-conversation-BkohEtaN.js} +1 -1
  128. package/build/assets/{use-agent-settings-schema-BCXxH2N-.js → use-agent-settings-schema-Lf_lBAky.js} +1 -1
  129. package/build/assets/{use-agent-state-BocVPR5S.js → use-agent-state-DITv5qV7.js} +1 -1
  130. package/build/assets/{use-cloud-current-user-id-BjDwnldw.js → use-cloud-current-user-id-CSm3kgqy.js} +1 -1
  131. package/build/assets/use-config-DVU9HaPf.js +1 -0
  132. package/build/assets/{use-create-conversation-CIkPp9u9.js → use-create-conversation-CJUAOf1q.js} +1 -1
  133. package/build/assets/{use-create-secret-Bwy6457V.js → use-create-secret-LObNBU3M.js} +1 -1
  134. package/build/assets/{use-handle-plan-click-CjNwpDeO.js → use-handle-plan-click-BdcdMWbv.js} +1 -1
  135. package/build/assets/use-is-authed-B8eLO-Xq.js +1 -0
  136. package/build/assets/{use-launch-skill-in-chat-QmcJQxUY.js → use-launch-skill-in-chat-BTgXIu3N.js} +1 -1
  137. package/build/assets/{use-llm-profiles-CZD1ALup.js → use-llm-profiles-BBTR-OsK.js} +1 -1
  138. package/build/assets/use-runtime-is-ready-BOQpqCvp.js +1 -0
  139. package/build/assets/{use-save-settings-BjYPOrtF.js → use-save-settings-7_MLft-Y.js} +1 -1
  140. package/build/assets/{use-settings-YTDcMvj1.js → use-settings-CNsxccvQ.js} +1 -1
  141. package/build/assets/{use-settings-nav-items-DMit9adK.js → use-settings-nav-items-ykMjd_NG.js} +1 -1
  142. package/build/assets/{use-skills-fh_U4ZGe.js → use-skills-_unimM2d.js} +1 -1
  143. package/build/assets/{use-tracking-DJ3Z7ha1.js → use-tracking-C9P88zSo.js} +1 -1
  144. package/build/assets/{use-user-conversation-Ct93yaXj.js → use-user-conversation-2jZZ-MLA.js} +1 -1
  145. package/build/assets/{useMutation-B1gQr_yr.js → useMutation-Dm84WAKR.js} +1 -1
  146. package/build/assets/{useQuery-CbqdITLM.js → useQuery-DGRSm7IT.js} +1 -1
  147. package/build/assets/{useTranslation-C-T8J2U-.js → useTranslation-CL6FTf1b.js} +1 -1
  148. package/build/assets/{utils-CXRkUr73.js → utils-eXk6yerZ.js} +1 -1
  149. package/build/assets/{vendor~conversation-panel~conversation-CkFCLbQW.js → vendor~conversation-panel~conversation-D98u43rl.js} +1 -1
  150. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-C1BmvJX4.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Dqpi2xyZ.js} +1 -1
  151. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-RuHTcYaf.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-7eqKdLSQ.js} +1 -1
  152. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-B04AZhMW.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~bok0tgtf-BP3MGAAY.js} +1 -1
  153. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ceijy54y-D7ZsdcLa.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ceijy54y-Dkd2wxJA.js} +1 -1
  154. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~mcp~settings~settings-index~~m3acswdn-CGm-Jxp5.js → vendor~root-layout~home~conversation-panel~conversation~launch~mcp~settings~settings-index~~m3acswdn-DQE89epK.js} +1 -1
  155. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~mcp~automati~dou5smdo-DH07jaIY.js → vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~mcp~automati~dou5smdo-DavKsAvB.js} +186 -40
  156. package/build/assets/{vendor~root-layout~home~mcp~automations-list-COlx7Is6.js → vendor~root-layout~home~mcp~automations-list-D40jgugf.js} +1 -1
  157. package/build/assets/{vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-DuiHR4ce.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BIm99UaF.js} +1 -1
  158. package/build/assets/{vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-4yr76Evz.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-xCM3k6Rd.js} +1 -1
  159. package/build/assets/{verification-settings-CeIuPtF2.js → verification-settings-EUkt_CkZ.js} +1 -1
  160. package/build/assets/{x-mark-BMhi11Sg.js → x-mark-C42svtnu.js} +1 -1
  161. package/build/index.html +4 -4
  162. package/build/locales/ar/openhands.json +45 -40
  163. package/build/locales/ca/openhands.json +41 -36
  164. package/build/locales/de/openhands.json +42 -37
  165. package/build/locales/en/openhands.json +6 -1
  166. package/build/locales/es/openhands.json +44 -39
  167. package/build/locales/fr/openhands.json +44 -39
  168. package/build/locales/it/openhands.json +44 -39
  169. package/build/locales/ja/openhands.json +44 -39
  170. package/build/locales/ko-KR/openhands.json +44 -39
  171. package/build/locales/no/openhands.json +44 -39
  172. package/build/locales/pt/openhands.json +44 -39
  173. package/build/locales/tr/openhands.json +43 -38
  174. package/build/locales/uk/openhands.json +44 -39
  175. package/build/locales/zh-CN/openhands.json +44 -39
  176. package/build/locales/zh-TW/openhands.json +44 -39
  177. package/config/defaults.json +4 -4
  178. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  179. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  180. package/dist/components/features/backends/backend-form-modal.js +1 -1
  181. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  182. package/dist/components/features/chat/chat-interface.cjs +1 -1
  183. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  184. package/dist/components/features/chat/chat-interface.js +1 -1
  185. package/dist/components/features/chat/chat-interface.js.map +1 -1
  186. package/dist/components/features/chat/git-control-bar.cjs +1 -1
  187. package/dist/components/features/chat/git-control-bar.cjs.map +1 -1
  188. package/dist/components/features/chat/git-control-bar.js +1 -1
  189. package/dist/components/features/chat/git-control-bar.js.map +1 -1
  190. package/dist/components/features/chat/open-repository-modal.cjs +1 -1
  191. package/dist/components/features/chat/open-repository-modal.cjs.map +1 -1
  192. package/dist/components/features/chat/open-repository-modal.js +0 -3
  193. package/dist/components/features/chat/open-repository-modal.js.map +1 -1
  194. package/dist/components/features/chat/pending-user-messages.cjs +1 -1
  195. package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
  196. package/dist/components/features/chat/pending-user-messages.js +31 -28
  197. package/dist/components/features/chat/pending-user-messages.js.map +1 -1
  198. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.cjs +1 -1
  199. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.cjs.map +1 -1
  200. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.js +79 -77
  201. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.js.map +1 -1
  202. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.cjs +1 -1
  203. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.cjs.map +1 -1
  204. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.js +67 -65
  205. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.js.map +1 -1
  206. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs +1 -1
  207. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs.map +1 -1
  208. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js +2 -2
  209. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js.map +1 -1
  210. package/dist/components/features/settings/settings-navigation.cjs +1 -1
  211. package/dist/components/features/settings/settings-navigation.cjs.map +1 -1
  212. package/dist/components/features/settings/settings-navigation.js +1 -1
  213. package/dist/components/features/settings/settings-navigation.js.map +1 -1
  214. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  215. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  216. package/dist/components/features/sidebar/sidebar.js +3 -2
  217. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  218. package/dist/i18n/declaration.cjs +1 -1
  219. package/dist/i18n/declaration.cjs.map +1 -1
  220. package/dist/i18n/declaration.d.ts +6 -1
  221. package/dist/i18n/declaration.js +1 -1
  222. package/dist/i18n/declaration.js.map +1 -1
  223. package/dist/i18n/translation.cjs +3 -3
  224. package/dist/i18n/translation.cjs.map +1 -1
  225. package/dist/i18n/translation.js +612 -527
  226. package/dist/i18n/translation.js.map +1 -1
  227. package/dist/locales/ar/openhands.json +45 -40
  228. package/dist/locales/ca/openhands.json +41 -36
  229. package/dist/locales/de/openhands.json +42 -37
  230. package/dist/locales/en/openhands.json +6 -1
  231. package/dist/locales/es/openhands.json +44 -39
  232. package/dist/locales/fr/openhands.json +44 -39
  233. package/dist/locales/it/openhands.json +44 -39
  234. package/dist/locales/ja/openhands.json +44 -39
  235. package/dist/locales/ko-KR/openhands.json +44 -39
  236. package/dist/locales/no/openhands.json +44 -39
  237. package/dist/locales/pt/openhands.json +44 -39
  238. package/dist/locales/tr/openhands.json +43 -38
  239. package/dist/locales/uk/openhands.json +44 -39
  240. package/dist/locales/zh-CN/openhands.json +44 -39
  241. package/dist/locales/zh-TW/openhands.json +44 -39
  242. package/dist/node_modules/@openhands/extensions/skills/index.cjs +186 -40
  243. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  244. package/dist/node_modules/@openhands/extensions/skills/index.js +2 -2
  245. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  246. package/dist/package.cjs +1 -1
  247. package/dist/package.cjs.map +1 -1
  248. package/dist/package.js +2 -2
  249. package/dist/package.js.map +1 -1
  250. package/dist/utils/websocket-url.cjs +1 -1
  251. package/dist/utils/websocket-url.cjs.map +1 -1
  252. package/dist/utils/websocket-url.js +2 -2
  253. package/dist/utils/websocket-url.js.map +1 -1
  254. package/package.json +2 -2
  255. package/scripts/check-sdk-version-sync.mjs +6 -6
  256. package/scripts/check-translation-completeness.cjs +149 -59
  257. package/scripts/dev-safe.mjs +1 -1
  258. package/build/assets/add-backend-modal-CSfOPrnr.js +0 -1
  259. package/build/assets/agent-server-client-options-B-C8JaTb.js +0 -1
  260. package/build/assets/conversation-B7ztPdyS.js +0 -1
  261. package/build/assets/conversation-DZYd8QiZ.js +0 -19
  262. package/build/assets/conversation-panel-CklMXcs6.js +0 -1
  263. package/build/assets/home-iVOrSOWL.js +0 -1
  264. package/build/assets/llm-not-configured-banner-BQgVTo0O.js +0 -27
  265. package/build/assets/llm-settings-ICWFhhjM.js +0 -1
  266. package/build/assets/manifest-d230d4a5.js +0 -1
  267. package/build/assets/use-config-C4DX1-nF.js +0 -1
  268. package/build/assets/use-is-authed-7P3xSsit.js +0 -1
  269. package/build/assets/use-runtime-is-ready-B7sbw-q5.js +0 -1
package/dist/package.cjs CHANGED
@@ -1,2 +1,2 @@
1
- require(`./_virtual/_rolldown/runtime.cjs`);var e={name:`@openhands/agent-canvas`,version:`1.0.0-rc.7`,description:`Agent Canvas UI for OpenHands - run AI coding agents with a visual interface`,license:`MIT`,private:!1,type:`module`,repository:{type:`git`,url:`https://github.com/OpenHands/agent-canvas`},homepage:`https://github.com/OpenHands/agent-canvas#readme`,bugs:{url:`https://github.com/OpenHands/agent-canvas/issues`},bin:{"agent-canvas":`bin/agent-canvas.mjs`},engines:{node:`>=22.12.0`},dependencies:{"@heroui/react":`2.8.10`,"@microlink/react-json-view":`1.31.20`,"@monaco-editor/react":`4.7.0`,"@openhands/extensions":`0.4.0`,"@openhands/typescript-client":`1.24.3`,"@react-router/node":`7.17.0`,"@react-router/serve":`7.17.0`,"@tailwindcss/vite":`4.2.4`,"@tanstack/react-query":`5.100.9`,"@types/shell-quote":`^1.7.5`,"@uidotdev/usehooks":`2.4.1`,"@xterm/addon-fit":`0.11.0`,"@xterm/xterm":`6.0.0`,axios:`1.16.0`,"class-variance-authority":`0.7.1`,clsx:`2.1.1`,downshift:`9.3.2`,"framer-motion":`12.38.0`,i18next:`26.0.8`,"i18next-browser-languagedetector":`8.2.1`,"i18next-http-backend":`4.0.0`,isbot:`5.1.39`,"lucide-react":`1.14.0`,"monaco-editor":`0.55.1`,"posthog-js":`1.372.6`,react:`19.2.5`,"react-dom":`19.2.5`,"react-hot-toast":`2.6.0`,"react-i18next":`17.0.6`,"react-icons":`5.6.0`,"react-markdown":`10.1.0`,"react-router":`7.17.0`,"react-syntax-highlighter":`16.1.1`,"rehype-raw":`7.0.0`,"rehype-sanitize":`6.0.0`,"remark-breaks":`4.0.0`,"remark-gfm":`4.0.1`,"shell-quote":`^1.8.3`,"sirv-cli":`3.0.1`,"socket.io-client":`4.8.3`,"tailwind-merge":`3.5.0`,"tailwind-scrollbar":`4.0.2`,"unist-util-visit":`5.1.0`,uuid:`14.0.0`,vite:`8.0.10`,winston:`^3.19.0`,"winston-daily-rotate-file":`^5.0.0`,zustand:`5.0.12`},scripts:{dev:`node --env-file-if-exists=.env scripts/dev-with-automation.mjs`,"dev:static":`node --env-file-if-exists=.env scripts/dev-static.mjs`,"dev:extra-backend":`node --env-file-if-exists=.env scripts/dev-extra-backend.mjs`,"dev:minimal":`node --env-file-if-exists=.env scripts/dev-safe.mjs`,"dev:frontend":`npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev`,"dev:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev`,build:`npm run build:app`,"build:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router build`,start:`npx sirv-cli build/ --single`,test:`npm run make-i18n && vitest run`,"test:e2e":`playwright test --pass-with-no-tests`,"test:e2e:live":`node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs`,"test:e2e:mock-llm":`playwright test --config=playwright.mock-llm.config.ts`,"test:e2e:mock-llm:docker":`playwright test --config=playwright.mock-llm-docker.config.ts`,"test:e2e:snapshots":`playwright test tests/e2e/snapshots --project=chromium --retries=0`,"test:e2e:snapshots:update":`playwright test tests/e2e/snapshots --project=chromium --update-snapshots`,"test:coverage":`npm run make-i18n && vitest run --coverage`,dev_wsl:`VITE_WATCH_USE_POLLING=true vite`,preview:`vite preview`,"make-i18n":`node scripts/make-i18n-translations.cjs`,prelint:`npm run make-i18n`,lint:`npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}`,"lint:fix":`eslint src --fix && prettier --write src/**/*.{ts,tsx}`,prepare:`husky`,typecheck:`react-router typegen && tsc`,"typecheck:staged":`react-router typegen && npx tsc --noEmit --skipLibCheck`,"check-translation-completeness":`node scripts/check-translation-completeness.cjs`,"build:app":`npm run make-i18n && react-router build`,"build:lib":`npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json`,"build:docker":`node scripts/docker-build.mjs`},"lint-staged":{"src/**/*.{ts,tsx,js}":[`eslint --fix`,`prettier --write`],"src/**/*.{ts,tsx}":[`bash -c 'npm run typecheck:staged'`],"src/**/*":[`npm run check-translation-completeness`]},devDependencies:{"@eslint/eslintrc":`3.3.1`,"@eslint/js":`9.39.4`,"@mswjs/socket.io-binding":`0.2.0`,"@playwright/test":`1.59.1`,"@react-router/dev":`7.17.0`,"@tailwindcss/typography":`0.5.19`,"@tanstack/eslint-plugin-query":`5.100.9`,"@testing-library/dom":`10.4.1`,"@testing-library/jest-dom":`6.9.1`,"@testing-library/react":`16.3.2`,"@testing-library/user-event":`14.6.1`,"@types/mdast":`4.0.4`,"@types/node":`25.6.0`,"@types/react":`19.2.14`,"@types/react-dom":`19.2.3`,"@types/react-syntax-highlighter":`15.5.13`,"@typescript-eslint/eslint-plugin":`8.59.2`,"@typescript-eslint/parser":`8.59.2`,"@vercel/react-router":`1.3.0`,"@vitest/coverage-v8":`4.1.5`,"cross-env":`10.1.0`,eslint:`9.39.4`,"eslint-config-prettier":`10.1.8`,"eslint-import-resolver-typescript":`4.4.4`,"eslint-plugin-i18next":`6.1.4`,"eslint-plugin-import-x":`4.16.2`,"eslint-plugin-jsx-a11y":`6.10.2`,"eslint-plugin-prettier":`5.5.5`,"eslint-plugin-react":`7.37.5`,"eslint-plugin-react-hooks":`7.1.1`,"eslint-plugin-unused-imports":`4.4.1`,globals:`16.5.0`,husky:`9.1.7`,jsdom:`29.1.1`,"lint-staged":`16.4.0`,msw:`2.14.2`,"postcss-prefix-selector":`2.1.1`,prettier:`3.8.3`,tailwindcss:`4.2.4`,typescript:`6.0.3`,"vite-plugin-svgr":`5.2.0`,vitest:`4.1.5`},packageManager:`npm@10.5.0`,volta:{node:`22.12.0`},msw:{workerDirectory:[`public`]},overrides:{"@vercel/static-config":{ajv:`8.20.0`},dompurify:`3.4.7`},main:`./dist/index.cjs`,module:`./dist/index.js`,types:`./dist/index.d.ts`,files:[`dist`,`bin`,`build`,`config`,`scripts`,`tools`],exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.js`,require:`./dist/index.cjs`},"./browser":{types:`./dist/components/browser/index.d.ts`,import:`./dist/components/browser/index.js`,require:`./dist/components/browser/index.cjs`},"./conversation":{types:`./dist/components/conversation/index.d.ts`,import:`./dist/components/conversation/index.js`,require:`./dist/components/conversation/index.cjs`},"./files":{types:`./dist/components/files/index.d.ts`,import:`./dist/components/files/index.js`,require:`./dist/components/files/index.cjs`},"./settings":{types:`./dist/components/settings/index.d.ts`,import:`./dist/components/settings/index.js`,require:`./dist/components/settings/index.cjs`},"./sidebar":{types:`./dist/components/sidebar/index.d.ts`,import:`./dist/components/sidebar/index.js`,require:`./dist/components/sidebar/index.cjs`},"./terminal":{types:`./dist/components/terminal/index.d.ts`,import:`./dist/components/terminal/index.js`,require:`./dist/components/terminal/index.cjs`},"./i18n":{types:`./dist/i18n/index.d.ts`,import:`./dist/i18n/index.js`,require:`./dist/i18n/index.cjs`},"./package.json":`./package.json`},peerDependencies:{react:`19.2.5`,"react-dom":`19.2.5`,"react-router":`7.17.0`}};exports.default=e;
1
+ require(`./_virtual/_rolldown/runtime.cjs`);var e={name:`@openhands/agent-canvas`,version:`1.0.0-rc.9`,description:`Agent Canvas UI for OpenHands - run AI coding agents with a visual interface`,license:`MIT`,private:!1,type:`module`,repository:{type:`git`,url:`https://github.com/OpenHands/agent-canvas`},homepage:`https://github.com/OpenHands/agent-canvas#readme`,bugs:{url:`https://github.com/OpenHands/agent-canvas/issues`},bin:{"agent-canvas":`bin/agent-canvas.mjs`},engines:{node:`>=22.12.0`},dependencies:{"@heroui/react":`2.8.10`,"@microlink/react-json-view":`1.31.20`,"@monaco-editor/react":`4.7.0`,"@openhands/extensions":`0.4.1`,"@openhands/typescript-client":`1.24.3`,"@react-router/node":`7.17.0`,"@react-router/serve":`7.17.0`,"@tailwindcss/vite":`4.2.4`,"@tanstack/react-query":`5.100.9`,"@types/shell-quote":`^1.7.5`,"@uidotdev/usehooks":`2.4.1`,"@xterm/addon-fit":`0.11.0`,"@xterm/xterm":`6.0.0`,axios:`1.16.0`,"class-variance-authority":`0.7.1`,clsx:`2.1.1`,downshift:`9.3.2`,"framer-motion":`12.38.0`,i18next:`26.0.8`,"i18next-browser-languagedetector":`8.2.1`,"i18next-http-backend":`4.0.0`,isbot:`5.1.39`,"lucide-react":`1.14.0`,"monaco-editor":`0.55.1`,"posthog-js":`1.372.6`,react:`19.2.5`,"react-dom":`19.2.5`,"react-hot-toast":`2.6.0`,"react-i18next":`17.0.6`,"react-icons":`5.6.0`,"react-markdown":`10.1.0`,"react-router":`7.17.0`,"react-syntax-highlighter":`16.1.1`,"rehype-raw":`7.0.0`,"rehype-sanitize":`6.0.0`,"remark-breaks":`4.0.0`,"remark-gfm":`4.0.1`,"shell-quote":`^1.8.3`,"sirv-cli":`3.0.1`,"socket.io-client":`4.8.3`,"tailwind-merge":`3.5.0`,"tailwind-scrollbar":`4.0.2`,"unist-util-visit":`5.1.0`,uuid:`14.0.0`,vite:`8.0.10`,winston:`^3.19.0`,"winston-daily-rotate-file":`^5.0.0`,zustand:`5.0.12`},scripts:{dev:`node --env-file-if-exists=.env scripts/dev-with-automation.mjs`,"dev:static":`node --env-file-if-exists=.env scripts/dev-static.mjs`,"dev:extra-backend":`node --env-file-if-exists=.env scripts/dev-extra-backend.mjs`,"dev:minimal":`node --env-file-if-exists=.env scripts/dev-safe.mjs`,"dev:frontend":`npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev`,"dev:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev`,build:`npm run build:app`,"build:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router build`,start:`npx sirv-cli build/ --single`,test:`npm run make-i18n && vitest run`,"test:e2e":`playwright test --pass-with-no-tests`,"test:e2e:live":`node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs`,"test:e2e:mock-llm":`playwright test --config=playwright.mock-llm.config.ts`,"test:e2e:mock-llm:docker":`playwright test --config=playwright.mock-llm-docker.config.ts`,"test:e2e:snapshots":`playwright test tests/e2e/snapshots --project=chromium --retries=0`,"test:e2e:snapshots:update":`playwright test tests/e2e/snapshots --project=chromium --update-snapshots`,"test:coverage":`npm run make-i18n && vitest run --coverage`,dev_wsl:`VITE_WATCH_USE_POLLING=true vite`,preview:`vite preview`,"make-i18n":`node scripts/make-i18n-translations.cjs`,prelint:`npm run make-i18n`,lint:`npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}`,"lint:fix":`eslint src --fix && prettier --write src/**/*.{ts,tsx}`,prepare:`husky`,typecheck:`react-router typegen && tsc`,"typecheck:staged":`react-router typegen && npx tsc --noEmit --skipLibCheck`,"check-translation-completeness":`node scripts/check-translation-completeness.cjs`,"build:app":`npm run make-i18n && react-router build`,"build:lib":`npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json`,"build:docker":`node scripts/docker-build.mjs`},"lint-staged":{"src/**/*.{ts,tsx,js}":[`eslint --fix`,`prettier --write`],"src/**/*.{ts,tsx}":[`bash -c 'npm run typecheck:staged'`],"src/**/*":[`npm run check-translation-completeness`]},devDependencies:{"@eslint/eslintrc":`3.3.1`,"@eslint/js":`9.39.4`,"@mswjs/socket.io-binding":`0.2.0`,"@playwright/test":`1.59.1`,"@react-router/dev":`7.17.0`,"@tailwindcss/typography":`0.5.19`,"@tanstack/eslint-plugin-query":`5.100.9`,"@testing-library/dom":`10.4.1`,"@testing-library/jest-dom":`6.9.1`,"@testing-library/react":`16.3.2`,"@testing-library/user-event":`14.6.1`,"@types/mdast":`4.0.4`,"@types/node":`25.6.0`,"@types/react":`19.2.14`,"@types/react-dom":`19.2.3`,"@types/react-syntax-highlighter":`15.5.13`,"@typescript-eslint/eslint-plugin":`8.59.2`,"@typescript-eslint/parser":`8.59.2`,"@vercel/react-router":`1.3.0`,"@vitest/coverage-v8":`4.1.5`,"cross-env":`10.1.0`,eslint:`9.39.4`,"eslint-config-prettier":`10.1.8`,"eslint-import-resolver-typescript":`4.4.4`,"eslint-plugin-i18next":`6.1.4`,"eslint-plugin-import-x":`4.16.2`,"eslint-plugin-jsx-a11y":`6.10.2`,"eslint-plugin-prettier":`5.5.5`,"eslint-plugin-react":`7.37.5`,"eslint-plugin-react-hooks":`7.1.1`,"eslint-plugin-unused-imports":`4.4.1`,globals:`16.5.0`,husky:`9.1.7`,jsdom:`29.1.1`,"lint-staged":`16.4.0`,msw:`2.14.2`,"postcss-prefix-selector":`2.1.1`,prettier:`3.8.3`,tailwindcss:`4.2.4`,typescript:`6.0.3`,"vite-plugin-svgr":`5.2.0`,vitest:`4.1.5`},packageManager:`npm@10.5.0`,volta:{node:`22.12.0`},msw:{workerDirectory:[`public`]},overrides:{"@vercel/static-config":{ajv:`8.20.0`},dompurify:`3.4.7`},main:`./dist/index.cjs`,module:`./dist/index.js`,types:`./dist/index.d.ts`,files:[`dist`,`bin`,`build`,`config`,`scripts`,`tools`],exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.js`,require:`./dist/index.cjs`},"./browser":{types:`./dist/components/browser/index.d.ts`,import:`./dist/components/browser/index.js`,require:`./dist/components/browser/index.cjs`},"./conversation":{types:`./dist/components/conversation/index.d.ts`,import:`./dist/components/conversation/index.js`,require:`./dist/components/conversation/index.cjs`},"./files":{types:`./dist/components/files/index.d.ts`,import:`./dist/components/files/index.js`,require:`./dist/components/files/index.cjs`},"./settings":{types:`./dist/components/settings/index.d.ts`,import:`./dist/components/settings/index.js`,require:`./dist/components/settings/index.cjs`},"./sidebar":{types:`./dist/components/sidebar/index.d.ts`,import:`./dist/components/sidebar/index.js`,require:`./dist/components/sidebar/index.cjs`},"./terminal":{types:`./dist/components/terminal/index.d.ts`,import:`./dist/components/terminal/index.js`,require:`./dist/components/terminal/index.cjs`},"./i18n":{types:`./dist/i18n/index.d.ts`,import:`./dist/i18n/index.js`,require:`./dist/i18n/index.cjs`},"./package.json":`./package.json`},peerDependencies:{react:`19.2.5`,"react-dom":`19.2.5`,"react-router":`7.17.0`}};exports.default=e;
2
2
  //# sourceMappingURL=package.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.0.0-rc.7\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.4.0\",\n \"@openhands/typescript-client\": \"1.24.3\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"^1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"^3.19.0\",\n \"winston-daily-rotate-file\": \"^5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:e2e:snapshots\": \"playwright test tests/e2e/snapshots --project=chromium --retries=0\",\n \"test:e2e:snapshots:update\": \"playwright test tests/e2e/snapshots --project=chromium --update-snapshots\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"bash -c 'npm run typecheck:staged'\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.0.0-rc.9\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.4.1\",\n \"@openhands/typescript-client\": \"1.24.3\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"^1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"^3.19.0\",\n \"winston-daily-rotate-file\": \"^5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:e2e:snapshots\": \"playwright test tests/e2e/snapshots --project=chromium --retries=0\",\n \"test:e2e:snapshots:update\": \"playwright test tests/e2e/snapshots --project=chromium --update-snapshots\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"bash -c 'npm run typecheck:staged'\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
package/dist/package.js CHANGED
@@ -1,6 +1,6 @@
1
1
  var e = {
2
2
  name: "@openhands/agent-canvas",
3
- version: "1.0.0-rc.7",
3
+ version: "1.0.0-rc.9",
4
4
  description: "Agent Canvas UI for OpenHands - run AI coding agents with a visual interface",
5
5
  license: "MIT",
6
6
  private: !1,
@@ -17,7 +17,7 @@ var e = {
17
17
  "@heroui/react": "2.8.10",
18
18
  "@microlink/react-json-view": "1.31.20",
19
19
  "@monaco-editor/react": "4.7.0",
20
- "@openhands/extensions": "0.4.0",
20
+ "@openhands/extensions": "0.4.1",
21
21
  "@openhands/typescript-client": "1.24.3",
22
22
  "@react-router/node": "7.17.0",
23
23
  "@react-router/serve": "7.17.0",
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.0.0-rc.7\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.4.0\",\n \"@openhands/typescript-client\": \"1.24.3\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"^1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"^3.19.0\",\n \"winston-daily-rotate-file\": \"^5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:e2e:snapshots\": \"playwright test tests/e2e/snapshots --project=chromium --retries=0\",\n \"test:e2e:snapshots:update\": \"playwright test tests/e2e/snapshots --project=chromium --update-snapshots\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"bash -c 'npm run typecheck:staged'\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.0.0-rc.9\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.4.1\",\n \"@openhands/typescript-client\": \"1.24.3\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"^1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"^3.19.0\",\n \"winston-daily-rotate-file\": \"^5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:e2e:snapshots\": \"playwright test tests/e2e/snapshots --project=chromium --retries=0\",\n \"test:e2e:snapshots:update\": \"playwright test tests/e2e/snapshots --project=chromium --update-snapshots\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"bash -c 'npm run typecheck:staged'\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);function e(e){if(e&&!e.startsWith(`/`))try{let t=new URL(e),n=t.hostname,r=window.location.hostname??window.location.host?.split(`:`)[0];return r&&(n===`localhost`||n===`127.0.0.1`)&&r!==`localhost`&&r!==`127.0.0.1`?`${r}:${t.port}`:t.host}catch{return window.location.host}return window.location.host}function t(e){if(e&&!e.startsWith(`/`))try{return(new URL(e).pathname.split(`/api/conversations`)[0]||``).replace(/\/$/,``)}catch{return``}return``}function n(n){let r=e(n),i=t(n);return`${window.location.protocol===`https:`?`https:`:`http:`}//${r}${i}`}function r(e){if(!e||e.startsWith(`/`))return null;try{return new URL(e).protocol}catch{return null}}function i(n,i){let a=e(n),o=t(n),s=window.location.protocol===`https:`,c=r(n)===`https:`,l=`${s||c?`wss:`:`ws:`}//${a}${o}/sockets/bash-events`;return i?`${l}?session_api_key=${encodeURIComponent(i)}`:l}function a(n,i){if(!n)return null;let a=e(i),o=t(i),s=window.location.protocol===`https:`,c=r(i)===`https:`;return`${s||c?`wss:`:`ws:`}//${a}${o}/sockets/events/${n}`}exports.buildBashWebSocketUrl=i,exports.buildHttpBaseUrl=n,exports.buildWebSocketUrl=a;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);function e(e){if(e&&!e.startsWith(`/`))try{let t=new URL(e),n=t.hostname,r=window.location.hostname??window.location.host?.split(`:`)[0];return r&&(n===`localhost`||n===`127.0.0.1`)&&r!==`localhost`&&r!==`127.0.0.1`?`${r}:${t.port}`:t.host}catch{return window.location.host}return window.location.host}function t(e){if(e&&!e.startsWith(`/`))try{return(new URL(e).pathname.split(`/api/conversations`)[0]||``).replace(/\/$/,``)}catch{return``}return``}function n(n){let i=e(n),a=t(n),o=window.location.protocol===`https:`,s=r(n)===`https:`;return`${o||s?`https:`:`http:`}//${i}${a}`}function r(e){if(!e||e.startsWith(`/`))return null;try{return new URL(e).protocol}catch{return null}}function i(n,i){let a=e(n),o=t(n),s=window.location.protocol===`https:`,c=r(n)===`https:`,l=`${s||c?`wss:`:`ws:`}//${a}${o}/sockets/bash-events`;return i?`${l}?session_api_key=${encodeURIComponent(i)}`:l}function a(n,i){if(!n)return null;let a=e(i),o=t(i),s=window.location.protocol===`https:`,c=r(i)===`https:`;return`${s||c?`wss:`:`ws:`}//${a}${o}/sockets/events/${n}`}exports.buildBashWebSocketUrl=i,exports.buildHttpBaseUrl=n,exports.buildWebSocketUrl=a;
2
2
  //# sourceMappingURL=websocket-url.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-url.cjs","names":[],"sources":["../../src/utils/websocket-url.ts"],"sourcesContent":["/**\n * Extracts the base host from conversation URL\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns Base host (e.g., \"localhost:3000\") or window.location.host as fallback\n */\nfunction extractBaseHost(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n // If the conversation URL points to localhost but we're accessing from external,\n // use the browser's hostname with the conversation URL's port\n const urlHostname = url.hostname;\n const browserHostname =\n window.location.hostname ?? window.location.host?.split(\":\")[0];\n if (\n browserHostname &&\n (urlHostname === \"localhost\" || urlHostname === \"127.0.0.1\") &&\n browserHostname !== \"localhost\" &&\n browserHostname !== \"127.0.0.1\"\n ) {\n return `${browserHostname}:${url.port}`;\n }\n return url.host; // e.g., \"localhost:3000\"\n } catch {\n return window.location.host;\n }\n }\n return window.location.host;\n}\n\n/**\n * Extracts the path prefix from conversation URL (everything before /api/conversations)\n * This is needed for proxy deployments where agent-servers are accessed via paths like /runtime/{port}/\n * @param conversationUrl The conversation URL (e.g., \"http://localhost:3000/runtime/55313/api/conversations/123\")\n * @returns Path prefix without trailing slash (e.g., \"/runtime/55313\") or empty string\n */\nfunction extractPathPrefix(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n const pathBeforeApi = url.pathname.split(\"/api/conversations\")[0] || \"\";\n return pathBeforeApi.replace(/\\/$/, \"\"); // Remove trailing slash\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\n\n/**\n * Builds the HTTP base URL for V1 API calls\n * @param conversationUrl The conversation URL containing host/port\n * @returns HTTP base URL (e.g., \"http://localhost:3000\" or \"http://localhost:3000/runtime/55313\")\n */\nexport function buildHttpBaseUrl(\n conversationUrl: string | null | undefined,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n const protocol = window.location.protocol === \"https:\" ? \"https:\" : \"http:\";\n return `${protocol}//${baseHost}${pathPrefix}`;\n}\n\nfunction getConversationUrlProtocol(\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationUrl || conversationUrl.startsWith(\"/\")) {\n return null;\n }\n\n try {\n return new URL(conversationUrl).protocol;\n } catch {\n return null;\n }\n}\n\n/**\n * Builds the WebSocket URL for the agent-server's bash-events endpoint.\n * The URL is derived from the same host and path prefix as the conversation\n * events socket so it works in both direct-connect and reverse-proxy deployments.\n *\n * @param conversationUrl The conversation URL containing host/port\n * @param sessionApiKey Optional session API key (appended as query param)\n * @returns WebSocket URL for the bash-events endpoint\n */\nexport function buildBashWebSocketUrl(\n conversationUrl: string | null | undefined,\n sessionApiKey?: string | null,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n const base = `${protocol}//${baseHost}${pathPrefix}/sockets/bash-events`;\n if (sessionApiKey) {\n return `${base}?session_api_key=${encodeURIComponent(sessionApiKey)}`;\n }\n return base;\n}\n\n/**\n * Builds the WebSocket URL for V1 conversations (without query params)\n * @param conversationId The conversation ID\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns WebSocket URL or null if inputs are invalid\n */\nexport function buildWebSocketUrl(\n conversationId: string | undefined,\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationId) {\n return null;\n }\n\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n // Build WebSocket URL: ws://host:port[/path-prefix]/sockets/events/{conversationId}\n // The path prefix (e.g., /runtime/55313) is needed for proxy deployments\n // Note: Query params should be passed via the useWebSocket hook options\n //\n // Protocol selection follows the actual HTTP access path. A page served\n // over HTTPS must use WSS, but an HTTP page that reaches a remote dev ingress\n // over plain HTTP (for example a Tailscale hostname) must use WS; forcing WSS\n // sends a TLS handshake to the HTTP-only ingress and Node reports it as a\n // malformed HTTP method.\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n return `${protocol}//${baseHost}${pathPrefix}/sockets/events/${conversationId}`;\n}\n"],"mappings":"6CAKA,SAAS,EAAgB,EAAoD,CAC3E,GAAI,GAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,GAAI,CACF,IAAM,EAAM,IAAI,IAAI,EAAgB,CAG9B,EAAc,EAAI,SAClB,EACJ,OAAO,SAAS,UAAY,OAAO,SAAS,MAAM,MAAM,IAAI,CAAC,GAS/D,OAPE,IACC,IAAgB,aAAe,IAAgB,cAChD,IAAoB,aACpB,IAAoB,YAEb,GAAG,EAAgB,GAAG,EAAI,OAE5B,EAAI,UACL,CACN,OAAO,OAAO,SAAS,KAG3B,OAAO,OAAO,SAAS,KASzB,SAAS,EAAkB,EAAoD,CAC7E,GAAI,GAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,GAAI,CAGF,OADsB,IADN,IAAI,EACE,CAAI,SAAS,MAAM,qBAAqB,CAAC,IAAM,IAChD,QAAQ,MAAO,GAAG,MACjC,CACN,MAAO,GAGX,MAAO,GAQT,SAAgB,EACd,EACQ,CACR,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAErD,MAAO,GADU,OAAO,SAAS,WAAa,SAAW,SAAW,QACjD,IAAI,IAAW,IAGpC,SAAS,EACP,EACe,CACf,GAAI,CAAC,GAAmB,EAAgB,WAAW,IAAI,CACrD,OAAO,KAGT,GAAI,CACF,OAAO,IAAI,IAAI,EAAgB,CAAC,cAC1B,CACN,OAAO,MAaX,SAAgB,EACd,EACA,EACQ,CACR,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAE/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAG5C,EAAO,GAFI,GAAgB,EAAiB,OAAS,MAElC,IAAI,IAAW,EAAW,sBAInD,OAHI,EACK,GAAG,EAAK,mBAAmB,mBAAmB,EAAc,GAE9D,EAST,SAAgB,EACd,EACA,EACe,CACf,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAW/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAGlD,MAAO,GAFU,GAAgB,EAAiB,OAAS,MAExC,IAAI,IAAW,EAAW,kBAAkB"}
1
+ {"version":3,"file":"websocket-url.cjs","names":[],"sources":["../../src/utils/websocket-url.ts"],"sourcesContent":["/**\n * Extracts the base host from conversation URL\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns Base host (e.g., \"localhost:3000\") or window.location.host as fallback\n */\nfunction extractBaseHost(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n // If the conversation URL points to localhost but we're accessing from external,\n // use the browser's hostname with the conversation URL's port\n const urlHostname = url.hostname;\n const browserHostname =\n window.location.hostname ?? window.location.host?.split(\":\")[0];\n if (\n browserHostname &&\n (urlHostname === \"localhost\" || urlHostname === \"127.0.0.1\") &&\n browserHostname !== \"localhost\" &&\n browserHostname !== \"127.0.0.1\"\n ) {\n return `${browserHostname}:${url.port}`;\n }\n return url.host; // e.g., \"localhost:3000\"\n } catch {\n return window.location.host;\n }\n }\n return window.location.host;\n}\n\n/**\n * Extracts the path prefix from conversation URL (everything before /api/conversations)\n * This is needed for proxy deployments where agent-servers are accessed via paths like /runtime/{port}/\n * @param conversationUrl The conversation URL (e.g., \"http://localhost:3000/runtime/55313/api/conversations/123\")\n * @returns Path prefix without trailing slash (e.g., \"/runtime/55313\") or empty string\n */\nfunction extractPathPrefix(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n const pathBeforeApi = url.pathname.split(\"/api/conversations\")[0] || \"\";\n return pathBeforeApi.replace(/\\/$/, \"\"); // Remove trailing slash\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\n\n/**\n * Builds the HTTP base URL for V1 API calls\n * @param conversationUrl The conversation URL containing host/port\n * @returns HTTP base URL (e.g., \"http://localhost:3000\" or \"http://localhost:3000/runtime/55313\")\n */\nexport function buildHttpBaseUrl(\n conversationUrl: string | null | undefined,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"https:\" : \"http:\";\n return `${protocol}//${baseHost}${pathPrefix}`;\n}\n\nfunction getConversationUrlProtocol(\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationUrl || conversationUrl.startsWith(\"/\")) {\n return null;\n }\n\n try {\n return new URL(conversationUrl).protocol;\n } catch {\n return null;\n }\n}\n\n/**\n * Builds the WebSocket URL for the agent-server's bash-events endpoint.\n * The URL is derived from the same host and path prefix as the conversation\n * events socket so it works in both direct-connect and reverse-proxy deployments.\n *\n * @param conversationUrl The conversation URL containing host/port\n * @param sessionApiKey Optional session API key (appended as query param)\n * @returns WebSocket URL for the bash-events endpoint\n */\nexport function buildBashWebSocketUrl(\n conversationUrl: string | null | undefined,\n sessionApiKey?: string | null,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n const base = `${protocol}//${baseHost}${pathPrefix}/sockets/bash-events`;\n if (sessionApiKey) {\n return `${base}?session_api_key=${encodeURIComponent(sessionApiKey)}`;\n }\n return base;\n}\n\n/**\n * Builds the WebSocket URL for V1 conversations (without query params)\n * @param conversationId The conversation ID\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns WebSocket URL or null if inputs are invalid\n */\nexport function buildWebSocketUrl(\n conversationId: string | undefined,\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationId) {\n return null;\n }\n\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n // Build WebSocket URL: ws://host:port[/path-prefix]/sockets/events/{conversationId}\n // The path prefix (e.g., /runtime/55313) is needed for proxy deployments\n // Note: Query params should be passed via the useWebSocket hook options\n //\n // Protocol selection follows the actual HTTP access path. A page served\n // over HTTPS must use WSS, but an HTTP page that reaches a remote dev ingress\n // over plain HTTP (for example a Tailscale hostname) must use WS; forcing WSS\n // sends a TLS handshake to the HTTP-only ingress and Node reports it as a\n // malformed HTTP method.\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n return `${protocol}//${baseHost}${pathPrefix}/sockets/events/${conversationId}`;\n}\n"],"mappings":"6CAKA,SAAS,EAAgB,EAAoD,CAC3E,GAAI,GAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,GAAI,CACF,IAAM,EAAM,IAAI,IAAI,EAAgB,CAG9B,EAAc,EAAI,SAClB,EACJ,OAAO,SAAS,UAAY,OAAO,SAAS,MAAM,MAAM,IAAI,CAAC,GAS/D,OAPE,IACC,IAAgB,aAAe,IAAgB,cAChD,IAAoB,aACpB,IAAoB,YAEb,GAAG,EAAgB,GAAG,EAAI,OAE5B,EAAI,UACL,CACN,OAAO,OAAO,SAAS,KAG3B,OAAO,OAAO,SAAS,KASzB,SAAS,EAAkB,EAAoD,CAC7E,GAAI,GAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,GAAI,CAGF,OADsB,IADN,IAAI,EACE,CAAI,SAAS,MAAM,qBAAqB,CAAC,IAAM,IAChD,QAAQ,MAAO,GAAG,MACjC,CACN,MAAO,GAGX,MAAO,GAQT,SAAgB,EACd,EACQ,CACR,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAC/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAElD,MAAO,GADU,GAAgB,EAAiB,SAAW,QAC1C,IAAI,IAAW,IAGpC,SAAS,EACP,EACe,CACf,GAAI,CAAC,GAAmB,EAAgB,WAAW,IAAI,CACrD,OAAO,KAGT,GAAI,CACF,OAAO,IAAI,IAAI,EAAgB,CAAC,cAC1B,CACN,OAAO,MAaX,SAAgB,EACd,EACA,EACQ,CACR,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAE/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAG5C,EAAO,GAFI,GAAgB,EAAiB,OAAS,MAElC,IAAI,IAAW,EAAW,sBAInD,OAHI,EACK,GAAG,EAAK,mBAAmB,mBAAmB,EAAc,GAE9D,EAST,SAAgB,EACd,EACA,EACe,CACf,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAW/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAGlD,MAAO,GAFU,GAAgB,EAAiB,OAAS,MAExC,IAAI,IAAW,EAAW,kBAAkB"}
@@ -17,8 +17,8 @@ function t(e) {
17
17
  return "";
18
18
  }
19
19
  function n(n) {
20
- let r = e(n), i = t(n);
21
- return `${window.location.protocol === "https:" ? "https:" : "http:"}//${r}${i}`;
20
+ let i = e(n), a = t(n), o = window.location.protocol === "https:", s = r(n) === "https:";
21
+ return `${o || s ? "https:" : "http:"}//${i}${a}`;
22
22
  }
23
23
  function r(e) {
24
24
  if (!e || e.startsWith("/")) return null;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-url.js","names":[],"sources":["../../src/utils/websocket-url.ts"],"sourcesContent":["/**\n * Extracts the base host from conversation URL\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns Base host (e.g., \"localhost:3000\") or window.location.host as fallback\n */\nfunction extractBaseHost(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n // If the conversation URL points to localhost but we're accessing from external,\n // use the browser's hostname with the conversation URL's port\n const urlHostname = url.hostname;\n const browserHostname =\n window.location.hostname ?? window.location.host?.split(\":\")[0];\n if (\n browserHostname &&\n (urlHostname === \"localhost\" || urlHostname === \"127.0.0.1\") &&\n browserHostname !== \"localhost\" &&\n browserHostname !== \"127.0.0.1\"\n ) {\n return `${browserHostname}:${url.port}`;\n }\n return url.host; // e.g., \"localhost:3000\"\n } catch {\n return window.location.host;\n }\n }\n return window.location.host;\n}\n\n/**\n * Extracts the path prefix from conversation URL (everything before /api/conversations)\n * This is needed for proxy deployments where agent-servers are accessed via paths like /runtime/{port}/\n * @param conversationUrl The conversation URL (e.g., \"http://localhost:3000/runtime/55313/api/conversations/123\")\n * @returns Path prefix without trailing slash (e.g., \"/runtime/55313\") or empty string\n */\nfunction extractPathPrefix(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n const pathBeforeApi = url.pathname.split(\"/api/conversations\")[0] || \"\";\n return pathBeforeApi.replace(/\\/$/, \"\"); // Remove trailing slash\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\n\n/**\n * Builds the HTTP base URL for V1 API calls\n * @param conversationUrl The conversation URL containing host/port\n * @returns HTTP base URL (e.g., \"http://localhost:3000\" or \"http://localhost:3000/runtime/55313\")\n */\nexport function buildHttpBaseUrl(\n conversationUrl: string | null | undefined,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n const protocol = window.location.protocol === \"https:\" ? \"https:\" : \"http:\";\n return `${protocol}//${baseHost}${pathPrefix}`;\n}\n\nfunction getConversationUrlProtocol(\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationUrl || conversationUrl.startsWith(\"/\")) {\n return null;\n }\n\n try {\n return new URL(conversationUrl).protocol;\n } catch {\n return null;\n }\n}\n\n/**\n * Builds the WebSocket URL for the agent-server's bash-events endpoint.\n * The URL is derived from the same host and path prefix as the conversation\n * events socket so it works in both direct-connect and reverse-proxy deployments.\n *\n * @param conversationUrl The conversation URL containing host/port\n * @param sessionApiKey Optional session API key (appended as query param)\n * @returns WebSocket URL for the bash-events endpoint\n */\nexport function buildBashWebSocketUrl(\n conversationUrl: string | null | undefined,\n sessionApiKey?: string | null,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n const base = `${protocol}//${baseHost}${pathPrefix}/sockets/bash-events`;\n if (sessionApiKey) {\n return `${base}?session_api_key=${encodeURIComponent(sessionApiKey)}`;\n }\n return base;\n}\n\n/**\n * Builds the WebSocket URL for V1 conversations (without query params)\n * @param conversationId The conversation ID\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns WebSocket URL or null if inputs are invalid\n */\nexport function buildWebSocketUrl(\n conversationId: string | undefined,\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationId) {\n return null;\n }\n\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n // Build WebSocket URL: ws://host:port[/path-prefix]/sockets/events/{conversationId}\n // The path prefix (e.g., /runtime/55313) is needed for proxy deployments\n // Note: Query params should be passed via the useWebSocket hook options\n //\n // Protocol selection follows the actual HTTP access path. A page served\n // over HTTPS must use WSS, but an HTTP page that reaches a remote dev ingress\n // over plain HTTP (for example a Tailscale hostname) must use WS; forcing WSS\n // sends a TLS handshake to the HTTP-only ingress and Node reports it as a\n // malformed HTTP method.\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n return `${protocol}//${baseHost}${pathPrefix}/sockets/events/${conversationId}`;\n}\n"],"mappings":";AAKA,SAAS,EAAgB,GAAoD;AAC3E,KAAI,KAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,KAAI;EACF,IAAM,IAAM,IAAI,IAAI,EAAgB,EAG9B,IAAc,EAAI,UAClB,IACJ,OAAO,SAAS,YAAY,OAAO,SAAS,MAAM,MAAM,IAAI,CAAC;AAS/D,SAPE,MACC,MAAgB,eAAe,MAAgB,gBAChD,MAAoB,eACpB,MAAoB,cAEb,GAAG,EAAgB,GAAG,EAAI,SAE5B,EAAI;SACL;AACN,SAAO,OAAO,SAAS;;AAG3B,QAAO,OAAO,SAAS;;AASzB,SAAS,EAAkB,GAAoD;AAC7E,KAAI,KAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,KAAI;AAGF,UADsB,IADN,IAAI,EACE,CAAI,SAAS,MAAM,qBAAqB,CAAC,MAAM,IAChD,QAAQ,OAAO,GAAG;SACjC;AACN,SAAO;;AAGX,QAAO;;AAQT,SAAgB,EACd,GACQ;CACR,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB;AAErD,QAAO,GADU,OAAO,SAAS,aAAa,WAAW,WAAW,QACjD,IAAI,IAAW;;AAGpC,SAAS,EACP,GACe;AACf,KAAI,CAAC,KAAmB,EAAgB,WAAW,IAAI,CACrD,QAAO;AAGT,KAAI;AACF,SAAO,IAAI,IAAI,EAAgB,CAAC;SAC1B;AACN,SAAO;;;AAaX,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAE/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK,UAG5C,IAAO,GAFI,KAAgB,IAAiB,SAAS,MAElC,IAAI,IAAW,EAAW;AAInD,QAHI,IACK,GAAG,EAAK,mBAAmB,mBAAmB,EAAc,KAE9D;;AAST,SAAgB,EACd,GACA,GACe;AACf,KAAI,CAAC,EACH,QAAO;CAGT,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAW/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK;AAGlD,QAAO,GAFU,KAAgB,IAAiB,SAAS,MAExC,IAAI,IAAW,EAAW,kBAAkB"}
1
+ {"version":3,"file":"websocket-url.js","names":[],"sources":["../../src/utils/websocket-url.ts"],"sourcesContent":["/**\n * Extracts the base host from conversation URL\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns Base host (e.g., \"localhost:3000\") or window.location.host as fallback\n */\nfunction extractBaseHost(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n // If the conversation URL points to localhost but we're accessing from external,\n // use the browser's hostname with the conversation URL's port\n const urlHostname = url.hostname;\n const browserHostname =\n window.location.hostname ?? window.location.host?.split(\":\")[0];\n if (\n browserHostname &&\n (urlHostname === \"localhost\" || urlHostname === \"127.0.0.1\") &&\n browserHostname !== \"localhost\" &&\n browserHostname !== \"127.0.0.1\"\n ) {\n return `${browserHostname}:${url.port}`;\n }\n return url.host; // e.g., \"localhost:3000\"\n } catch {\n return window.location.host;\n }\n }\n return window.location.host;\n}\n\n/**\n * Extracts the path prefix from conversation URL (everything before /api/conversations)\n * This is needed for proxy deployments where agent-servers are accessed via paths like /runtime/{port}/\n * @param conversationUrl The conversation URL (e.g., \"http://localhost:3000/runtime/55313/api/conversations/123\")\n * @returns Path prefix without trailing slash (e.g., \"/runtime/55313\") or empty string\n */\nfunction extractPathPrefix(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n const pathBeforeApi = url.pathname.split(\"/api/conversations\")[0] || \"\";\n return pathBeforeApi.replace(/\\/$/, \"\"); // Remove trailing slash\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\n\n/**\n * Builds the HTTP base URL for V1 API calls\n * @param conversationUrl The conversation URL containing host/port\n * @returns HTTP base URL (e.g., \"http://localhost:3000\" or \"http://localhost:3000/runtime/55313\")\n */\nexport function buildHttpBaseUrl(\n conversationUrl: string | null | undefined,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"https:\" : \"http:\";\n return `${protocol}//${baseHost}${pathPrefix}`;\n}\n\nfunction getConversationUrlProtocol(\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationUrl || conversationUrl.startsWith(\"/\")) {\n return null;\n }\n\n try {\n return new URL(conversationUrl).protocol;\n } catch {\n return null;\n }\n}\n\n/**\n * Builds the WebSocket URL for the agent-server's bash-events endpoint.\n * The URL is derived from the same host and path prefix as the conversation\n * events socket so it works in both direct-connect and reverse-proxy deployments.\n *\n * @param conversationUrl The conversation URL containing host/port\n * @param sessionApiKey Optional session API key (appended as query param)\n * @returns WebSocket URL for the bash-events endpoint\n */\nexport function buildBashWebSocketUrl(\n conversationUrl: string | null | undefined,\n sessionApiKey?: string | null,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n const base = `${protocol}//${baseHost}${pathPrefix}/sockets/bash-events`;\n if (sessionApiKey) {\n return `${base}?session_api_key=${encodeURIComponent(sessionApiKey)}`;\n }\n return base;\n}\n\n/**\n * Builds the WebSocket URL for V1 conversations (without query params)\n * @param conversationId The conversation ID\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns WebSocket URL or null if inputs are invalid\n */\nexport function buildWebSocketUrl(\n conversationId: string | undefined,\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationId) {\n return null;\n }\n\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n // Build WebSocket URL: ws://host:port[/path-prefix]/sockets/events/{conversationId}\n // The path prefix (e.g., /runtime/55313) is needed for proxy deployments\n // Note: Query params should be passed via the useWebSocket hook options\n //\n // Protocol selection follows the actual HTTP access path. A page served\n // over HTTPS must use WSS, but an HTTP page that reaches a remote dev ingress\n // over plain HTTP (for example a Tailscale hostname) must use WS; forcing WSS\n // sends a TLS handshake to the HTTP-only ingress and Node reports it as a\n // malformed HTTP method.\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n return `${protocol}//${baseHost}${pathPrefix}/sockets/events/${conversationId}`;\n}\n"],"mappings":";AAKA,SAAS,EAAgB,GAAoD;AAC3E,KAAI,KAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,KAAI;EACF,IAAM,IAAM,IAAI,IAAI,EAAgB,EAG9B,IAAc,EAAI,UAClB,IACJ,OAAO,SAAS,YAAY,OAAO,SAAS,MAAM,MAAM,IAAI,CAAC;AAS/D,SAPE,MACC,MAAgB,eAAe,MAAgB,gBAChD,MAAoB,eACpB,MAAoB,cAEb,GAAG,EAAgB,GAAG,EAAI,SAE5B,EAAI;SACL;AACN,SAAO,OAAO,SAAS;;AAG3B,QAAO,OAAO,SAAS;;AASzB,SAAS,EAAkB,GAAoD;AAC7E,KAAI,KAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,KAAI;AAGF,UADsB,IADN,IAAI,EACE,CAAI,SAAS,MAAM,qBAAqB,CAAC,MAAM,IAChD,QAAQ,OAAO,GAAG;SACjC;AACN,SAAO;;AAGX,QAAO;;AAQT,SAAgB,EACd,GACQ;CACR,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAC/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK;AAElD,QAAO,GADU,KAAgB,IAAiB,WAAW,QAC1C,IAAI,IAAW;;AAGpC,SAAS,EACP,GACe;AACf,KAAI,CAAC,KAAmB,EAAgB,WAAW,IAAI,CACrD,QAAO;AAGT,KAAI;AACF,SAAO,IAAI,IAAI,EAAgB,CAAC;SAC1B;AACN,SAAO;;;AAaX,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAE/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK,UAG5C,IAAO,GAFI,KAAgB,IAAiB,SAAS,MAElC,IAAI,IAAW,EAAW;AAInD,QAHI,IACK,GAAG,EAAK,mBAAmB,mBAAmB,EAAc,KAE9D;;AAST,SAAgB,EACd,GACA,GACe;AACf,KAAI,CAAC,EACH,QAAO;CAGT,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAW/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK;AAGlD,QAAO,GAFU,KAAgB,IAAiB,SAAS,MAExC,IAAI,IAAW,EAAW,kBAAkB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openhands/agent-canvas",
3
- "version": "1.0.0-rc.7",
3
+ "version": "1.0.0-rc.9",
4
4
  "description": "Agent Canvas UI for OpenHands - run AI coding agents with a visual interface",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -23,7 +23,7 @@
23
23
  "@heroui/react": "2.8.10",
24
24
  "@microlink/react-json-view": "1.31.20",
25
25
  "@monaco-editor/react": "4.7.0",
26
- "@openhands/extensions": "0.4.0",
26
+ "@openhands/extensions": "0.4.1",
27
27
  "@openhands/typescript-client": "1.24.3",
28
28
  "@react-router/node": "7.17.0",
29
29
  "@react-router/serve": "7.17.0",
@@ -19,7 +19,7 @@
19
19
  *
20
20
  * Usage:
21
21
  * node scripts/check-sdk-version-sync.mjs
22
- * EXPECTED_SDK_VERSION=1.27.0 node scripts/check-sdk-version-sync.mjs
22
+ * EXPECTED_SDK_VERSION=1.28.1 node scripts/check-sdk-version-sync.mjs
23
23
  * node scripts/check-sdk-version-sync.mjs --check-pypi
24
24
  *
25
25
  * Environment variables:
@@ -79,7 +79,7 @@ Triggering from other repos:
79
79
  -H "Authorization: token \$GITHUB_TOKEN" \\
80
80
  -H "Accept: application/vnd.github.v3+json" \\
81
81
  https://api.github.com/repos/OpenHands/agent-canvas/dispatches \\
82
- -d '{"event_type": "sdk-version-check", "client_payload": {"version": "1.27.0"}}'
82
+ -d '{"event_type": "sdk-version-check", "client_payload": {"version": "1.28.1"}}'
83
83
  `);
84
84
  process.exit(0);
85
85
  }
@@ -268,9 +268,9 @@ async function fetchPyPIDependencies(packageName, version) {
268
268
  * Parse PyPI requires_dist array and extract SDK package versions
269
269
  *
270
270
  * PyPI returns dependencies in PEP 508 format like:
271
- * "openhands-sdk>=1.27.0,<2.0.0"
272
- * "openhands-tools==1.27.0"
273
- * "openhands-workspace (>=1.27.0)"
271
+ * "openhands-sdk>=1.28.1,<2.0.0"
272
+ * "openhands-tools==1.28.1"
273
+ * "openhands-workspace (>=1.28.1)"
274
274
  */
275
275
  function parseSdkVersionsFromRequiresDist(requiresDist) {
276
276
  const versions = {};
@@ -284,7 +284,7 @@ function parseSdkVersionsFromRequiresDist(requiresDist) {
284
284
  }
285
285
 
286
286
  // Extract the version number - look for patterns like:
287
- // ">=1.27.0", "==1.27.0", "(>=1.27.0)", "~=1.27.0"
287
+ // ">=1.28.1", "==1.28.1", "(>=1.28.1)", "~=1.28.1"
288
288
  // After the package name and before any comma or closing paren
289
289
  const versionPattern = /[><=~!]+\s*([0-9]+(?:\.[0-9]+)*)/;
290
290
  const match = dep.match(versionPattern);
@@ -3,86 +3,176 @@
3
3
  /**
4
4
  * Pre-commit hook script to check for translation completeness
5
5
  * This script ensures that all translation keys have entries for all supported languages
6
+ * and that values are actually translated rather than English copied to every language.
6
7
  */
7
8
 
8
9
  const fs = require('fs');
9
10
  const path = require('path');
10
11
 
11
- // Load the translation file
12
- const translationJsonPath = path.join(__dirname, '../src/i18n/translation.json');
13
- const translationJson = require(translationJsonPath);
12
+ // Keys whose value is intentionally identical in every language (brand names,
13
+ // protocol/technical terms, placeholder-only format strings). Add a key here
14
+ // only when the English value is genuinely correct for all languages.
15
+ const IDENTICAL_VALUE_ALLOWLIST = new Set([
16
+ 'ACTION_MESSAGE$ACP_TOOL',
17
+ 'API$TAVILY_KEY_EXAMPLE',
18
+ 'API$TVLY_KEY_EXAMPLE',
19
+ 'AUTOMATIONS$DOWNLOAD_TARBALL',
20
+ 'BACKEND$CLOUD_TITLE',
21
+ 'BACKEND$VERSION_LABEL',
22
+ 'BRANDING$OPENHANDS',
23
+ 'CONVERSATION$ACP_AGENT_GENERIC',
24
+ 'CONVERSATION$BUDGET_USAGE_FORMAT',
25
+ 'FILES$VSCODE',
26
+ 'GITHUB$AUTH_SCOPE',
27
+ 'LAUNCH$PLUGIN_PATH',
28
+ 'LAUNCH$PLUGIN_REF',
29
+ 'SCHEMA$LLM$SECTION_LABEL',
30
+ 'SCHEMA$LLM$TOP_K$LABEL',
31
+ 'SCHEMA$LLM$TOP_P$LABEL',
32
+ 'SCHEMA$SECURITY_ANALYZER$CHOICE$LLM',
33
+ 'SCHEMA$VERIFICATION$SECURITY_ANALYZER$CHOICE$LLM',
34
+ 'SETTINGS$AGENT_SERVER_URL_PLACEHOLDER',
35
+ 'SETTINGS$AGENT_TYPE_OPENHANDS',
36
+ 'SETTINGS$AZURE_DEVOPS',
37
+ 'SETTINGS$GITHUB',
38
+ 'SETTINGS$GITLAB',
39
+ 'SETTINGS$MCP_DEFAULT_CONFIG',
40
+ 'SETTINGS$MCP_SERVER_TYPE_SHTTP',
41
+ 'SETTINGS$MCP_SERVER_TYPE_SSE',
42
+ 'SETTINGS$MCP_SERVER_TYPE_STDIO',
43
+ 'SETTINGS$NAV_LLM',
44
+ 'SETTINGS$SKILLS_PILLS_MORE',
45
+ 'SETTINGS$SKILLS_VERSION',
46
+ 'SETTINGS$SLACK',
47
+ 'VSCODE$TITLE',
48
+ 'WORKSPACE$JUPYTER_TAB_LABEL',
49
+ ]);
50
+
51
+ // Extract the language codes from the AvailableLanguages array in the i18n index file
52
+ function getSupportedLanguageCodes() {
53
+ const i18nIndexPath = path.join(__dirname, '../src/i18n/index.ts');
54
+ const i18nIndexContent = fs.readFileSync(i18nIndexPath, 'utf8');
55
+
56
+ const languageCodesRegex = /\{ label: "[^"]+", value: "([^"]+)" \}/g;
57
+ const supportedLanguageCodes = [];
58
+ let match;
59
+
60
+ while ((match = languageCodesRegex.exec(i18nIndexContent)) !== null) {
61
+ supportedLanguageCodes.push(match[1]);
62
+ }
14
63
 
15
- // Load the available languages from the i18n index file
16
- const i18nIndexPath = path.join(__dirname, '../src/i18n/index.ts');
17
- const i18nIndexContent = fs.readFileSync(i18nIndexPath, 'utf8');
64
+ return supportedLanguageCodes;
65
+ }
18
66
 
19
- // Extract the language codes from the AvailableLanguages array
20
- const languageCodesRegex = /\{ label: "[^"]+", value: "([^"]+)" \}/g;
21
- const supportedLanguageCodes = [];
22
- let match;
67
+ // Check each translation key for missing languages, extra languages, and
68
+ // untranslated (English-copied) values
69
+ function checkTranslations(translationJson, supportedLanguageCodes) {
70
+ const missingTranslations = {};
71
+ const extraLanguages = {};
72
+ const untranslatedKeys = {};
23
73
 
24
- while ((match = languageCodesRegex.exec(i18nIndexContent)) !== null) {
25
- supportedLanguageCodes.push(match[1]);
74
+ const nonEnglishLanguageCodes = supportedLanguageCodes.filter(
75
+ (langCode) => langCode !== 'en'
76
+ );
77
+
78
+ Object.entries(translationJson).forEach(([key, translations]) => {
79
+ // Get the languages available for this key
80
+ const availableLanguages = Object.keys(translations);
81
+
82
+ // Find missing languages for this key
83
+ const missing = supportedLanguageCodes.filter(
84
+ (langCode) => !availableLanguages.includes(langCode)
85
+ );
86
+
87
+ if (missing.length > 0) {
88
+ missingTranslations[key] = missing;
89
+ }
90
+
91
+ // Find extra languages for this key
92
+ const extra = availableLanguages.filter(
93
+ (langCode) => !supportedLanguageCodes.includes(langCode)
94
+ );
95
+
96
+ if (extra.length > 0) {
97
+ extraLanguages[key] = extra;
98
+ }
99
+
100
+ // Flag keys where every non-English value is the English value copied
101
+ // verbatim — a strong signal the key was never translated. Keys whose value
102
+ // is legitimately identical everywhere belong in IDENTICAL_VALUE_ALLOWLIST.
103
+ if (
104
+ !IDENTICAL_VALUE_ALLOWLIST.has(key) &&
105
+ translations.en !== undefined &&
106
+ nonEnglishLanguageCodes.every(
107
+ (langCode) => translations[langCode] === translations.en
108
+ )
109
+ ) {
110
+ untranslatedKeys[key] = translations.en;
111
+ }
112
+ });
113
+
114
+ return { missingTranslations, extraLanguages, untranslatedKeys };
26
115
  }
27
116
 
28
- // Track missing and extra translations
29
- const missingTranslations = {};
30
- const extraLanguages = {};
31
- let hasErrors = false;
117
+ module.exports = {
118
+ IDENTICAL_VALUE_ALLOWLIST,
119
+ getSupportedLanguageCodes,
120
+ checkTranslations,
121
+ };
32
122
 
33
- // Check each translation key
34
- Object.entries(translationJson).forEach(([key, translations]) => {
35
- // Get the languages available for this key
36
- const availableLanguages = Object.keys(translations);
123
+ if (require.main === module) {
124
+ // Load the translation file
125
+ const translationJsonPath = path.join(__dirname, '../src/i18n/translation.json');
126
+ const translationJson = require(translationJsonPath);
37
127
 
38
- // Find missing languages for this key
39
- const missing = supportedLanguageCodes.filter(
40
- (langCode) => !availableLanguages.includes(langCode)
41
- );
128
+ const { missingTranslations, extraLanguages, untranslatedKeys } =
129
+ checkTranslations(translationJson, getSupportedLanguageCodes());
42
130
 
43
- if (missing.length > 0) {
44
- missingTranslations[key] = missing;
45
- hasErrors = true;
46
- }
131
+ const hasErrors =
132
+ Object.keys(missingTranslations).length > 0 ||
133
+ Object.keys(extraLanguages).length > 0 ||
134
+ Object.keys(untranslatedKeys).length > 0;
47
135
 
48
- // Find extra languages for this key
49
- const extra = availableLanguages.filter(
50
- (langCode) => !supportedLanguageCodes.includes(langCode)
51
- );
136
+ // Generate detailed error message if there are missing translations
137
+ if (Object.keys(missingTranslations).length > 0) {
138
+ console.error('\x1b[31m%s\x1b[0m', 'ERROR: Missing translations detected');
139
+ console.error(`Found ${Object.keys(missingTranslations).length} translation keys with missing languages:`);
52
140
 
53
- if (extra.length > 0) {
54
- extraLanguages[key] = extra;
55
- hasErrors = true;
141
+ Object.entries(missingTranslations).forEach(([key, langs]) => {
142
+ console.error(`- Key "${key}" is missing translations for: ${langs.join(', ')}`);
143
+ });
144
+
145
+ console.error('\nPlease add the missing translations before committing.');
56
146
  }
57
- });
58
147
 
59
- // Generate detailed error message if there are missing translations
60
- if (Object.keys(missingTranslations).length > 0) {
61
- console.error('\x1b[31m%s\x1b[0m', 'ERROR: Missing translations detected');
62
- console.error(`Found ${Object.keys(missingTranslations).length} translation keys with missing languages:`);
148
+ // Generate detailed error message if there are extra languages
149
+ if (Object.keys(extraLanguages).length > 0) {
150
+ console.error('\x1b[31m%s\x1b[0m', 'ERROR: Extra languages detected');
151
+ console.error(`Found ${Object.keys(extraLanguages).length} translation keys with extra languages not in AvailableLanguages:`);
63
152
 
64
- Object.entries(missingTranslations).forEach(([key, langs]) => {
65
- console.error(`- Key "${key}" is missing translations for: ${langs.join(', ')}`);
66
- });
153
+ Object.entries(extraLanguages).forEach(([key, langs]) => {
154
+ console.error(`- Key "${key}" has translations for unsupported languages: ${langs.join(', ')}`);
155
+ });
67
156
 
68
- console.error('\nPlease add the missing translations before committing.');
69
- }
157
+ console.error('\nPlease remove the extra languages before committing.');
158
+ }
70
159
 
71
- // Generate detailed error message if there are extra languages
72
- if (Object.keys(extraLanguages).length > 0) {
73
- console.error('\x1b[31m%s\x1b[0m', 'ERROR: Extra languages detected');
74
- console.error(`Found ${Object.keys(extraLanguages).length} translation keys with extra languages not in AvailableLanguages:`);
160
+ // Generate detailed error message if there are untranslated keys
161
+ if (Object.keys(untranslatedKeys).length > 0) {
162
+ console.error('\x1b[31m%s\x1b[0m', 'ERROR: Untranslated keys detected');
163
+ console.error(`Found ${Object.keys(untranslatedKeys).length} translation keys where the English value is copied to every language:`);
75
164
 
76
- Object.entries(extraLanguages).forEach(([key, langs]) => {
77
- console.error(`- Key "${key}" has translations for unsupported languages: ${langs.join(', ')}`);
78
- });
165
+ Object.entries(untranslatedKeys).forEach(([key, value]) => {
166
+ console.error(`- Key "${key}" has the same value ("${value}") for all languages`);
167
+ });
79
168
 
80
- console.error('\nPlease remove the extra languages before committing.');
81
- }
169
+ console.error('\nPlease translate the values before committing. If a value is intentionally identical in every language (brand name, technical term, format string), add the key to IDENTICAL_VALUE_ALLOWLIST in scripts/check-translation-completeness.cjs.');
170
+ }
82
171
 
83
- // Exit with error code if there are issues
84
- if (hasErrors) {
85
- process.exit(1);
86
- } else {
87
- console.log('\x1b[32m%s\x1b[0m', 'All translation keys have complete language coverage!');
172
+ // Exit with error code if there are issues
173
+ if (hasErrors) {
174
+ process.exit(1);
175
+ } else {
176
+ console.log('\x1b[32m%s\x1b[0m', 'All translation keys have complete language coverage!');
177
+ }
88
178
  }
@@ -394,7 +394,7 @@ export function validateFrontendDependencies(
394
394
  * edits are picked up without a manual reinstall. The agent-server itself
395
395
  * is rebuilt from local source on each invocation (--reinstall).
396
396
  * - OH_AGENT_SERVER_GIT_REF: Git commit SHA or branch name
397
- * - OH_AGENT_SERVER_VERSION: Specific PyPI version (e.g., "1.27.0")
397
+ * - OH_AGENT_SERVER_VERSION: Specific PyPI version (e.g., "1.28.1")
398
398
  *
399
399
  * If none are set, defaults to the released version specified by
400
400
  * DEFAULT_AGENT_SERVER_VERSION. Set OH_AGENT_SERVER_GIT_REF to use a
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-BFRubm34.js";import{o as t}from"./declaration-BDfM67Kl.js";import{n}from"./backend-form-modal-DY3My0us.js";var r=e({AddBackendModal:()=>a}),i=t();function a({onClose:e}){return(0,i.jsx)(n,{mode:`add`,onClose:e})}export{r as n,a as t};