@openhands/agent-canvas 1.0.0-beta.7 → 1.0.0-beta.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 (385) hide show
  1. package/README.md +2 -2
  2. package/README.windows.md +2 -2
  3. package/build/assets/{QueryClientProvider-Cnr-Yl3j.js → QueryClientProvider-w1cZWY41.js} +1 -1
  4. package/build/assets/{Trans-4jmk54WC.js → Trans-BJeYqz2A.js} +1 -1
  5. package/build/assets/{acp-providers-CPdgcp13.js → acp-providers-DJr8DlNG.js} +1 -1
  6. package/build/assets/{acp-route-guard-BoVmCn0e.js → acp-route-guard-A__sWgbc.js} +1 -1
  7. package/build/assets/{active-backend-context-Beu-LZL-.js → active-backend-context-I2w666XY.js} +1 -1
  8. package/build/assets/add-backend-modal-BDBDBXsJ.js +1 -0
  9. package/build/assets/agent-server-client-options-9agOSarV.js +1 -0
  10. package/build/assets/{agent-server-compatibility-CdI3N7dr.js → agent-server-compatibility-B7QStIcH.js} +1 -1
  11. package/build/assets/agent-server-conversation-service.api-Cagoqq1V.js +5 -0
  12. package/build/assets/agent-settings-BXBaybB_.js +2 -0
  13. package/build/assets/{alert-banner-DFnn_lC6.js → alert-banner-NeUl1-PQ.js} +1 -1
  14. package/build/assets/analytics-consent-form-modal-CmWcFlc6.js +1 -0
  15. package/build/assets/{api-key-entry-screen-M6su2VSf.js → api-key-entry-screen-ByXA4hXH.js} +1 -1
  16. package/build/assets/{app-settings-BlvBhBdc.js → app-settings-C-U6jONZ.js} +1 -1
  17. package/build/assets/automation-detail-Dbmgt974.js +1 -0
  18. package/build/assets/automations-list-BLJzAd-p.js +1 -0
  19. package/build/assets/{back-nav-button-7dQJ2k3O.js → back-nav-button-DgkK0Ka6.js} +1 -1
  20. package/build/assets/{backend-form-modal-CDnEYjaU.js → backend-form-modal-CeB983Sj.js} +1 -1
  21. package/build/assets/{backend-synced-settings-badge-BTIj-Ffq.js → backend-synced-settings-badge-BktJcGgH.js} +1 -1
  22. package/build/assets/{base-modal-C2oy2EBG.js → base-modal-DZCNv0A4.js} +1 -1
  23. package/build/assets/{brand-button-DJ_S16rO.js → brand-button-LBFNic99.js} +1 -1
  24. package/build/assets/browser-D08Sp3ZY.js +5 -0
  25. package/build/assets/{browser-tab-dvSPdvkm.js → browser-tab-be3QvXg9.js} +1 -1
  26. package/build/assets/chat-send-button-5qz0zj6R.js +1 -0
  27. package/build/assets/{checkmark-Dus0b6jt.js → checkmark-Rmpruj7q.js} +1 -1
  28. package/build/assets/{chevron-left-small-_uvG7RVM.js → chevron-left-small-6nyFCWVQ.js} +1 -1
  29. package/build/assets/{circle-plus-check-toggle-DKS8MAVV.js → circle-plus-check-toggle-DquBwJ_6.js} +1 -1
  30. package/build/assets/{close-BU5iTc66.js → close-D_o3d8QM.js} +1 -1
  31. package/build/assets/{code-tag-BzyqOtPD.js → code-tag-DhsjDB-v.js} +1 -1
  32. package/build/assets/{combobox-caret-BJC7XJsz.js → combobox-caret-CO7eozIY.js} +1 -1
  33. package/build/assets/{condenser-settings-BolbDvm5.js → condenser-settings-BulzYEuW.js} +1 -1
  34. package/build/assets/{confirmation-modal-B5Ca6qFE.js → confirmation-modal-CMAtd9R0.js} +1 -1
  35. package/build/assets/{context-menu-list-item-7tAcm2c3.js → context-menu-list-item-D0swnhFt.js} +1 -1
  36. package/build/assets/conversation-BrjF2-Ky.js +1 -0
  37. package/build/assets/conversation-HgR_TTPE.js +19 -0
  38. package/build/assets/conversation-panel-BlRcO5AC.js +1 -0
  39. package/build/assets/conversation-service.api-B_Pdmwsa.js +1 -0
  40. package/build/assets/{conversation-tab-empty-state-CStQLPVW.js → conversation-tab-empty-state-DYjKsg_c.js} +1 -1
  41. package/build/assets/conversation-websocket-context-G95yfL81.js +3 -0
  42. package/build/assets/{copy-Chg-sFu3.js → copy-BM0RpLez.js} +1 -1
  43. package/build/assets/{custom-toast-handlers-ufGJ6_Rc.js → custom-toast-handlers-BohXx7uh.js} +1 -1
  44. package/build/assets/{declaration-CR6HMp29.js → declaration-DaUdB2Wg.js} +1 -1
  45. package/build/assets/{device-verify-C6mj28zv.js → device-verify-DiEJqpJb.js} +1 -1
  46. package/build/assets/dist-Bl-1K5Tv.js +1 -0
  47. package/build/assets/{dist-C3NfioQC.js → dist-xtCm0O6P.js} +1 -1
  48. package/build/assets/{dropdown-classes-BsVmxlNG.js → dropdown-classes-Vqz86I0R.js} +1 -1
  49. package/build/assets/{edit-automation-modal-BpX-t-HD.js → edit-automation-modal-CNZgSSiH.js} +1 -1
  50. package/build/assets/{entry.client-Ck9rQCg-.js → entry.client-BvKgdCQ9.js} +2 -2
  51. package/build/assets/{enum-filter-dropdown-5JeF2RLb.js → enum-filter-dropdown-DdFgk0EM.js} +1 -1
  52. package/build/assets/{environment-switch-overlay-Tf_BIfeR.js → environment-switch-overlay-CuBuZOaa.js} +1 -1
  53. package/build/assets/{extensions-hub-CE9QOb5n.js → extensions-hub-Dayqvv0n.js} +1 -1
  54. package/build/assets/{extensions-navigation-DSLGNGbS.js → extensions-navigation-yFLAU06N.js} +1 -1
  55. package/build/assets/{file-BTY6Gyy9.js → file-DwHCkWZT.js} +1 -1
  56. package/build/assets/files-tab-CMredyYX.js +1 -0
  57. package/build/assets/{folder-D1T2W1cj.js → folder-2h1hR1Qb.js} +1 -1
  58. package/build/assets/git-control-bar-branch-button-D8blTNXh.js +27 -0
  59. package/build/assets/{globe-Bzj_0oXT.js → globe-qFjFNG6J.js} +1 -1
  60. package/build/assets/home-TrU0fLgG.js +1 -0
  61. package/build/assets/{i18n-DET2iOyh.js → i18n-zDndR1Ne.js} +1 -1
  62. package/build/assets/install-server-modal-D8Q0xZcN.js +1 -0
  63. package/build/assets/{launch-CWz0dm4o.js → launch-I00QV8YT.js} +1 -1
  64. package/build/assets/{lesson-plan-duSsqWVs.js → lesson-plan-C18uB_56.js} +1 -1
  65. package/build/assets/{link-external-DGxVm4Ps.js → link-external-DtcdPFbw.js} +1 -1
  66. package/build/assets/{llm-client-CYEaUjGx.js → llm-client-BqyLKgUN.js} +1 -1
  67. package/build/assets/llm-settings-C4R4HMUO.js +1 -0
  68. package/build/assets/llm-settings-Dq3w2cob.js +1 -0
  69. package/build/assets/{loading-spinner-5GT9q1xy.js → loading-spinner-DNwR4--Z.js} +1 -1
  70. package/build/assets/{manage-backends-modal-DpBD_vR9.js → manage-backends-modal-Ceo_SOcf.js} +1 -1
  71. package/build/assets/manifest-8c2efa8a.js +1 -0
  72. package/build/assets/{markdown-renderer-B3IAVfv4.js → markdown-renderer-D6B-u2nM.js} +1 -1
  73. package/build/assets/{mcp-BUe7kiYM.js → mcp-EvrLVTla.js} +1 -1
  74. package/build/assets/messages-Bz9TWjlh.js +36 -0
  75. package/build/assets/modal-backdrop-BDqI1zBV.js +1 -0
  76. package/build/assets/{modal-body-aoa2fx5W.js → modal-body-CCLCqX1J.js} +1 -1
  77. package/build/assets/{modal-classes-6YqcqA6y.js → modal-classes-DwTdT3IK.js} +1 -1
  78. package/build/assets/{modal-close-button-CtWOUMmw.js → modal-close-button-gQgKqUf-.js} +1 -1
  79. package/build/assets/{model-selector-BvSTrkhT.js → model-selector-DoL0CL0_.js} +1 -1
  80. package/build/assets/{mutation-D0OogFCz.js → mutation-CaJwPR9O.js} +1 -1
  81. package/build/assets/{navigation-context-BdKYH32C.js → navigation-context-aNGUUtdq.js} +1 -1
  82. package/build/assets/{navigation-link-U4vY9i_C.js → navigation-link-CYkF2y3K.js} +1 -1
  83. package/build/assets/onboarding-DLr9jbKH.js +1 -0
  84. package/build/assets/{openhands-logo-CCo0wJZX.js → openhands-logo-CHmtDV-t.js} +1 -1
  85. package/build/assets/{option-service.api-DmNVxAvS.js → option-service.api-CGNANEcT.js} +1 -1
  86. package/build/assets/{organization-service.api-DbnougaQ.js → organization-service.api-Dn74hBTH.js} +1 -1
  87. package/build/assets/path-utils-BjxzIGLp.js +1 -0
  88. package/build/assets/{plan-components-CRDMQzsS.js → plan-components--aLlpASH.js} +1 -1
  89. package/build/assets/{planner-tab-CmIjLz7q.js → planner-tab-B-5EeCEm.js} +1 -1
  90. package/build/assets/{profiles-client-fEmgWkCW.js → profiles-client-BrqNmaDV.js} +1 -1
  91. package/build/assets/{providers-CbD7fiic.js → providers-DknP6O2g.js} +1 -1
  92. package/build/assets/{proxy-BAdHH8QB.js → proxy-sRh0WKI7.js} +1 -1
  93. package/build/assets/{query-client-config-CRnGSujB.js → query-client-config-CWWGQWvw.js} +1 -1
  94. package/build/assets/{recommended-automations-launcher-uTyODuzB.js → recommended-automations-launcher-BIul0osB.js} +3 -3
  95. package/build/assets/root-BietmyRa.js +2 -0
  96. package/build/assets/{root-Z2VHU4R3.css → root-CN7qsvxg.css} +1 -1
  97. package/build/assets/root-layout-BgPi-t57.js +2 -0
  98. package/build/assets/{sdk-section-page-BgDlMhcq.js → sdk-section-page-VmtJWH3A.js} +1 -1
  99. package/build/assets/{sdk-settings-schema-CLmJ9sho.js → sdk-settings-schema-DFievvEK.js} +1 -1
  100. package/build/assets/{search-SuJctqNJ.js → search-BeVRXvX7.js} +1 -1
  101. package/build/assets/{secrets-service-B7CxNinp.js → secrets-service-DVtlLWY8.js} +1 -1
  102. package/build/assets/{secrets-settings-yK7CqIpm.js → secrets-settings-BLMvCkKm.js} +1 -1
  103. package/build/assets/{server-client-Kh4QSwDJ.js → server-client-DYv_GHPl.js} +1 -1
  104. package/build/assets/{settings-DN5PpgRD.js → settings-CXvJUx_j.js} +1 -1
  105. package/build/assets/{settings-dropdown-input-BtoovFre.js → settings-dropdown-input-DA_pzHWE.js} +1 -1
  106. package/build/assets/{settings-gear-Dd8K2_8B.js → settings-gear-aNebYlCy.js} +1 -1
  107. package/build/assets/{settings-index-DKC8IY1P.js → settings-index-CycvkOoq.js} +1 -1
  108. package/build/assets/{settings-input-CehsXnb3.js → settings-input-8y5p4kze.js} +1 -1
  109. package/build/assets/{settings-list-classes-E3v_f6QG.js → settings-list-classes-Qk7zl0Wu.js} +1 -1
  110. package/build/assets/settings-modal-nJYxCsyp.js +1 -0
  111. package/build/assets/{settings-section-header-context-DewwJ0-F.js → settings-section-header-context-B77tsYlx.js} +1 -1
  112. package/build/assets/{settings-service.api-C3rxTtPj.js → settings-service.api-DxIEtvx6.js} +1 -1
  113. package/build/assets/{settings-switch-BiBuS3xa.js → settings-switch-ba4DuiNO.js} +1 -1
  114. package/build/assets/{settings-utils-DY04tWG1.js → settings-utils-BxzHqLmZ.js} +1 -1
  115. package/build/assets/{shared-conversation-h9YnBtCU.js → shared-conversation-x41nZQi7.js} +1 -1
  116. package/build/assets/{sidebar-mobile-menu-toggle-D0-AvsnT.js → sidebar-mobile-menu-toggle-C0mmabKj.js} +1 -1
  117. package/build/assets/{sidebar-nav-link-OhIeFyna.js → sidebar-nav-link-BsYdDFfb.js} +1 -1
  118. package/build/assets/{skill-card-pill-row-BW9qvhoK.js → skill-card-pill-row-BhUlGcYB.js} +1 -1
  119. package/build/assets/{skills-0GRKX5Xj.js → skills-TYjOUQ2d.js} +1 -1
  120. package/build/assets/{skills-plugins-DNcsNF88.js → skills-plugins-D0pdqgKa.js} +1 -1
  121. package/build/assets/{skills-settings-7liFiSY6.js → skills-settings-VqKTkmVl.js} +2 -2
  122. package/build/assets/{styled-tooltip-hdfMXPQC.js → styled-tooltip-TCp7svY3.js} +1 -1
  123. package/build/assets/{switch-skeleton-DSKqSx2A.js → switch-skeleton-cKrdaYGj.js} +1 -1
  124. package/build/assets/{task-list-tab-DT6_zfUs.js → task-list-tab-BiizRsY3.js} +1 -1
  125. package/build/assets/telemetry-3piyXm5H.js +2 -0
  126. package/build/assets/{terminal-CPYWdo4j.js → terminal-BSYITdM0.js} +1 -1
  127. package/build/assets/{terminal-CDhQGDua.js → terminal-CpgZx6go.js} +1 -1
  128. package/build/assets/{toggle-switch-T2v6sJ6l.js → toggle-switch-CUgOZqZu.js} +1 -1
  129. package/build/assets/{typography-BDgnT7Yp.js → typography-Bvw0IxaN.js} +1 -1
  130. package/build/assets/{u-check-circle-half-steSK_JB.js → u-check-circle-half-DjpjzWu3.js} +1 -1
  131. package/build/assets/{u-check-circle-DOauqQKb.js → u-check-circle-u9QiS4Fr.js} +1 -1
  132. package/build/assets/{u-circuit-x3ExjBbU.js → u-circuit-DlBlOwx9.js} +1 -1
  133. package/build/assets/{u-edit-BbrptMCa.js → u-edit-BIYzjs3v.js} +1 -1
  134. package/build/assets/{use-active-conversation-DHGcmjCK.js → use-active-conversation-q1wT8LI5.js} +1 -1
  135. package/build/assets/{use-agent-settings-schema-CLoTOSJI.js → use-agent-settings-schema-Yxf7KGyG.js} +1 -1
  136. package/build/assets/{use-agent-state-PKrUPMJ3.js → use-agent-state-CCHlVqvY.js} +1 -1
  137. package/build/assets/{use-cloud-current-user-id-Ddr75hEz.js → use-cloud-current-user-id-BAKf91Zx.js} +1 -1
  138. package/build/assets/{use-config-OIMQLQ2s.js → use-config-DwfigQ_Y.js} +1 -1
  139. package/build/assets/use-create-conversation-BEzddjXn.js +1 -0
  140. package/build/assets/{use-get-secrets-8Jby8ele.js → use-get-secrets-BlO1BfUo.js} +1 -1
  141. package/build/assets/{use-handle-plan-click-CohJPvvW.js → use-handle-plan-click-Bfl0zIBr.js} +1 -1
  142. package/build/assets/use-is-authed-hHndEep7.js +1 -0
  143. package/build/assets/{use-launch-skill-in-chat-sQNEOLGD.js → use-launch-skill-in-chat-3ydwpi_M.js} +1 -1
  144. package/build/assets/use-llm-profiles-E-jjZMZw.js +1 -0
  145. package/build/assets/use-runtime-is-ready-DBWzvAmc.js +1 -0
  146. package/build/assets/use-save-settings-rE9aA29R.js +1 -0
  147. package/build/assets/{use-settings-D5hbTS9t.js → use-settings-BPTbE7lg.js} +1 -1
  148. package/build/assets/{use-settings-nav-items-BcSbo02d.js → use-settings-nav-items-C7MOWj09.js} +1 -1
  149. package/build/assets/{use-skills-D7PS0fH0.js → use-skills-QhoaIYGF.js} +1 -1
  150. package/build/assets/{use-task-list-CsT10CBb.js → use-task-list-YMkSzdDv.js} +1 -1
  151. package/build/assets/use-tracking-DQYdZpxi.js +1 -0
  152. package/build/assets/{use-unified-vscode-url-DEoe-NRI.js → use-unified-vscode-url-DFtNIC1Q.js} +1 -1
  153. package/build/assets/{use-user-conversation-Cs5H1pUF.js → use-user-conversation-BRAseenw.js} +1 -1
  154. package/build/assets/{useMutation-GSSKKebK.js → useMutation-DDo48A8t.js} +1 -1
  155. package/build/assets/{useTranslation-B6voJV4y.js → useTranslation-CEcjrme-.js} +1 -1
  156. package/build/assets/{utils-DCVfKFRt.js → utils-CdgBzLA7.js} +1 -1
  157. package/build/assets/{vendor~browser-BrOJLj3y.js → vendor~browser-DWk6fNtJ.js} +1 -1
  158. package/build/assets/{vendor~browser-tab-BxhTtM9_.js → vendor~browser-tab-NZdVoI2Z.js} +1 -1
  159. package/build/assets/{vendor~conversation-panel~conversation-C9o-K1hW.js → vendor~conversation-panel~conversation-gp03cWZW.js} +1 -1
  160. package/build/assets/{vendor~conversation-panel~conversation~index-RXYdJYxU.js → vendor~conversation-panel~conversation~index-BZ5C6Xpz.js} +1 -1
  161. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-DJS-rJdI.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~oli4dvxu-BodGsxSf.js} +1 -1
  162. package/build/assets/{vendor~files-tab-BtkpAiMX.js → vendor~files-tab-Buz36Y-q.js} +1 -1
  163. package/build/assets/{vendor~home~conversation-panel~conversation-PK1-gtXU.js → vendor~home~conversation-panel~conversation-DG0H5SkJ.js} +2 -2
  164. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-6ByzelMS.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-1pTajrpX.js} +1 -1
  165. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BED5W_c4.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9Il_wz8U.js} +1 -1
  166. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CCbqAFiI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B7I1ZxCx.js} +1 -1
  167. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-E4d6IEfI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Ceeqkj0k.js} +1 -1
  168. package/build/assets/{vendor~launch-BXgl67Re.js → vendor~launch-DXL78kBf.js} +1 -1
  169. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-DW31UyBp.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-CfAc3nMS.js} +1 -1
  170. package/build/assets/vendor~root-layout~home~conversation-panel~conversation-DkwcKRtv.js +1 -0
  171. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-tTR8C6m0.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-BC9XTECT.js} +1 -1
  172. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-6Rm8U_Sr.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DSqEbr0N.js} +1 -1
  173. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-BJbu9kpL.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-D0XUSHNN.js} +2 -2
  174. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-hTzSytKK.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-D8soyAAx.js} +1 -1
  175. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-d2oallMa.js → vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CcFtthyg.js} +1 -1
  176. package/build/assets/vendor~root-layout~home~mcp~automations-list-BnIlGhjl.js +1 -0
  177. package/build/assets/{vendor~home~mcp~automations-list-BgV86Sti.js → vendor~root-layout~home~mcp~automations-list-cNHi83v_.js} +1 -1
  178. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CjJdFLoM.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BGWUbqUq.js} +1 -1
  179. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-m8dOii0J.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BuCSnjsW.js} +2 -2
  180. package/build/assets/{vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-DYXOLEck.js → vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~jaomi49z-Cw89stA6.js} +1 -1
  181. package/build/assets/{verification-settings-Dlt8pINd.js → verification-settings-CIqtxWat.js} +1 -1
  182. package/build/assets/{vscode-tab-DgepcYtF.js → vscode-tab-DEt72yJX.js} +1 -1
  183. package/build/assets/{waiting-for-runtime-message-CdK3btDZ.js → waiting-for-runtime-message-DSjJfeoj.js} +1 -1
  184. package/build/assets/{x-mark-BrkSPIiT.js → x-mark-DsJ9tDD0.js} +1 -1
  185. package/build/index.html +4 -4
  186. package/build/locales/ar/openhands.json +4 -2
  187. package/build/locales/ca/openhands.json +4 -2
  188. package/build/locales/de/openhands.json +4 -2
  189. package/build/locales/en/openhands.json +4 -2
  190. package/build/locales/es/openhands.json +4 -2
  191. package/build/locales/fr/openhands.json +4 -2
  192. package/build/locales/it/openhands.json +4 -2
  193. package/build/locales/ja/openhands.json +4 -2
  194. package/build/locales/ko-KR/openhands.json +4 -2
  195. package/build/locales/no/openhands.json +4 -2
  196. package/build/locales/pt/openhands.json +4 -2
  197. package/build/locales/tr/openhands.json +4 -2
  198. package/build/locales/uk/openhands.json +4 -2
  199. package/build/locales/zh-CN/openhands.json +4 -2
  200. package/build/locales/zh-TW/openhands.json +4 -2
  201. package/config/defaults.json +1 -1
  202. package/dist/api/agent-server-config.cjs +1 -1
  203. package/dist/api/agent-server-config.cjs.map +1 -1
  204. package/dist/api/agent-server-config.d.ts +17 -0
  205. package/dist/api/agent-server-config.js +7 -1
  206. package/dist/api/agent-server-config.js.map +1 -1
  207. package/dist/api/agent-server-home.cjs +2 -0
  208. package/dist/api/agent-server-home.cjs.map +1 -0
  209. package/dist/api/agent-server-home.d.ts +34 -0
  210. package/dist/api/agent-server-home.js +33 -0
  211. package/dist/api/agent-server-home.js.map +1 -0
  212. package/dist/api/conversation-file-upload.api.cjs +1 -1
  213. package/dist/api/conversation-file-upload.api.cjs.map +1 -1
  214. package/dist/api/conversation-file-upload.api.js +4 -1
  215. package/dist/api/conversation-file-upload.api.js.map +1 -1
  216. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  217. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  218. package/dist/api/conversation-service/agent-server-conversation-service.api.js +101 -100
  219. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  220. package/dist/api/option-service/option-service.api.cjs.map +1 -1
  221. package/dist/api/option-service/option-service.api.js.map +1 -1
  222. package/dist/api/workspace-upload-path.cjs +1 -1
  223. package/dist/api/workspace-upload-path.cjs.map +1 -1
  224. package/dist/api/workspace-upload-path.d.ts +44 -2
  225. package/dist/api/workspace-upload-path.js +16 -14
  226. package/dist/api/workspace-upload-path.js.map +1 -1
  227. package/dist/components/features/automations/recommended-automations-launcher.d.ts +3 -1
  228. package/dist/components/features/automations/recommended-automations-section.d.ts +3 -1
  229. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  230. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  231. package/dist/components/features/backends/backend-form-modal.d.ts +7 -1
  232. package/dist/components/features/backends/backend-form-modal.js +94 -91
  233. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  234. package/dist/components/features/chat/chat-interface.cjs +2 -2
  235. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  236. package/dist/components/features/chat/chat-interface.js +66 -66
  237. package/dist/components/features/chat/chat-interface.js.map +1 -1
  238. package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
  239. package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
  240. package/dist/components/features/chat/switch-profile-button.cjs +1 -1
  241. package/dist/components/features/chat/switch-profile-button.js +3 -3
  242. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  243. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  244. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +5 -5
  245. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  246. package/dist/components/features/onboarding/index.d.ts +1 -0
  247. package/dist/components/features/onboarding/onboarding-host.d.ts +3 -1
  248. package/dist/components/features/onboarding/onboarding-modal.d.ts +7 -3
  249. package/dist/components/features/onboarding/onboarding-preview.d.ts +4 -0
  250. package/dist/components/features/onboarding/steps/say-hello-step.d.ts +3 -1
  251. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  252. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
  253. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  254. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
  255. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +3 -1
  256. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +56 -56
  257. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  258. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  259. package/dist/components/features/skills/extensions-navigation.js +7 -7
  260. package/dist/components/shared/modals/modal-backdrop.cjs +1 -1
  261. package/dist/components/shared/modals/modal-backdrop.cjs.map +1 -1
  262. package/dist/components/shared/modals/modal-backdrop.d.ts +3 -1
  263. package/dist/components/shared/modals/modal-backdrop.js +3 -3
  264. package/dist/components/shared/modals/modal-backdrop.js.map +1 -1
  265. package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
  266. package/dist/components/shared/modals/settings/settings-form.cjs.map +1 -1
  267. package/dist/components/shared/modals/settings/settings-form.js +7 -7
  268. package/dist/components/shared/modals/settings/settings-form.js.map +1 -1
  269. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  270. package/dist/hooks/chat/use-model-interceptor.js +4 -4
  271. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  272. package/dist/hooks/mutation/use-save-settings.cjs.map +1 -1
  273. package/dist/hooks/mutation/use-save-settings.js +13 -14
  274. package/dist/hooks/mutation/use-save-settings.js.map +1 -1
  275. package/dist/hooks/query/use-llm-profiles.cjs +1 -1
  276. package/dist/hooks/query/use-llm-profiles.js +5 -5
  277. package/dist/hooks/use-download-conversation.cjs +1 -1
  278. package/dist/hooks/use-download-conversation.cjs.map +1 -1
  279. package/dist/hooks/use-download-conversation.js +4 -4
  280. package/dist/hooks/use-download-conversation.js.map +1 -1
  281. package/dist/hooks/use-tracking.cjs +1 -1
  282. package/dist/hooks/use-tracking.cjs.map +1 -1
  283. package/dist/hooks/use-tracking.d.ts +31 -0
  284. package/dist/hooks/use-tracking.js +51 -14
  285. package/dist/hooks/use-tracking.js.map +1 -1
  286. package/dist/i18n/declaration.cjs +1 -1
  287. package/dist/i18n/declaration.cjs.map +1 -1
  288. package/dist/i18n/declaration.d.ts +2 -0
  289. package/dist/i18n/declaration.js +1 -1
  290. package/dist/i18n/declaration.js.map +1 -1
  291. package/dist/i18n/translation.cjs +1 -1
  292. package/dist/i18n/translation.cjs.map +1 -1
  293. package/dist/i18n/translation.js +64 -30
  294. package/dist/i18n/translation.js.map +1 -1
  295. package/dist/locales/ar/openhands.json +4 -2
  296. package/dist/locales/ca/openhands.json +4 -2
  297. package/dist/locales/de/openhands.json +4 -2
  298. package/dist/locales/en/openhands.json +4 -2
  299. package/dist/locales/es/openhands.json +4 -2
  300. package/dist/locales/fr/openhands.json +4 -2
  301. package/dist/locales/it/openhands.json +4 -2
  302. package/dist/locales/ja/openhands.json +4 -2
  303. package/dist/locales/ko-KR/openhands.json +4 -2
  304. package/dist/locales/no/openhands.json +4 -2
  305. package/dist/locales/pt/openhands.json +4 -2
  306. package/dist/locales/tr/openhands.json +4 -2
  307. package/dist/locales/uk/openhands.json +4 -2
  308. package/dist/locales/zh-CN/openhands.json +4 -2
  309. package/dist/locales/zh-TW/openhands.json +4 -2
  310. package/dist/package.cjs +1 -1
  311. package/dist/package.cjs.map +1 -1
  312. package/dist/package.js +1 -1
  313. package/dist/package.js.map +1 -1
  314. package/dist/routes/llm-settings.cjs +1 -1
  315. package/dist/routes/llm-settings.cjs.map +1 -1
  316. package/dist/routes/llm-settings.d.ts +3 -1
  317. package/dist/routes/llm-settings.js +17 -16
  318. package/dist/routes/llm-settings.js.map +1 -1
  319. package/package.json +1 -1
  320. package/scripts/dev-static.mjs +0 -2
  321. package/scripts/dev-with-automation.mjs +0 -2
  322. package/scripts/static-server.mjs +28 -6
  323. package/build/assets/add-backend-modal-BheqYXHK.js +0 -1
  324. package/build/assets/agent-server-client-options-HEOwGVIU.js +0 -1
  325. package/build/assets/agent-server-conversation-service.api-CORdqJZg.js +0 -5
  326. package/build/assets/agent-settings-UFvcGjoI.js +0 -2
  327. package/build/assets/analytics-consent-form-modal-CVNugqzu.js +0 -1
  328. package/build/assets/automation-detail-BWrQk4Oa.js +0 -1
  329. package/build/assets/automations-list-ux9KvYsU.js +0 -1
  330. package/build/assets/browser-CGM-k-sH.js +0 -5
  331. package/build/assets/conversation-D0N4dw_p.js +0 -19
  332. package/build/assets/conversation-DhRJuZLG.js +0 -1
  333. package/build/assets/conversation-panel-CNqHbS_Z.js +0 -1
  334. package/build/assets/conversation-service.api-BsJy6uuL.js +0 -1
  335. package/build/assets/conversation-websocket-context-DvHgx_FE.js +0 -3
  336. package/build/assets/dist-DNeWJ2bh.js +0 -1
  337. package/build/assets/ellipsis-button-Vh5MvRZa.js +0 -1
  338. package/build/assets/files-tab-cL668j1I.js +0 -1
  339. package/build/assets/git-branch-DQS2nMK4.js +0 -1
  340. package/build/assets/git-control-bar-branch-button-DtIrOrie.js +0 -27
  341. package/build/assets/git-provider-icon-CHdGBdU2.js +0 -1
  342. package/build/assets/home-Cz2Veg56.js +0 -1
  343. package/build/assets/install-server-modal-B9nXCS3u.js +0 -1
  344. package/build/assets/llm-settings-DFkXHuvT.js +0 -1
  345. package/build/assets/llm-settings-DhrdCXqX.js +0 -1
  346. package/build/assets/manage-workspaces-modal-CtRbxREx.js +0 -1
  347. package/build/assets/manifest-eed90ff5.js +0 -1
  348. package/build/assets/messages-dqp_KYyl.js +0 -36
  349. package/build/assets/modal-backdrop-RfNCrSpK.js +0 -1
  350. package/build/assets/path-utils-onx24uF5.js +0 -1
  351. package/build/assets/root-DmjpFpTu.js +0 -2
  352. package/build/assets/root-layout-DejMsKhy.js +0 -2
  353. package/build/assets/settings-modal-DJ4kGzUx.js +0 -1
  354. package/build/assets/use-create-conversation-Bszyp13O.js +0 -1
  355. package/build/assets/use-is-authed-dw2026rR.js +0 -1
  356. package/build/assets/use-is-creating-conversation-DX2qSlfL.js +0 -1
  357. package/build/assets/use-llm-profiles-C861aFAq.js +0 -1
  358. package/build/assets/use-runtime-is-ready-Do2h_hRl.js +0 -1
  359. package/build/assets/use-save-settings-DkAOEfD9.js +0 -1
  360. package/build/assets/vendor~home~mcp~automations-list-CZSK-lT2.js +0 -1
  361. package/build/assets/vendor~root-layout~home~conversation-panel~conversation-B5WNMnt4.js +0 -1
  362. /package/build/assets/{automation-XDPAjiZi.js → automation-DJ_3GeXD.js} +0 -0
  363. /package/build/assets/{browser-store-DAsixKdU.js → browser-store-JRrcGdlk.js} +0 -0
  364. /package/build/assets/{check-CYxAHs85.js → check-CZhEL6rP.js} +0 -0
  365. /package/build/assets/{chevron-down-Bnmd5iG-.js → chevron-down-KhWYEjeW.js} +0 -0
  366. /package/build/assets/{color-themes-B9pm9c-R.js → color-themes-0biOprdo.js} +0 -0
  367. /package/build/assets/{command-store-CE1weJy8.js → command-store-UzKGSUC2.js} +0 -0
  368. /package/build/assets/{files-tab-store-m0ARqX_E.js → files-tab-store-DLU28g8C.js} +0 -0
  369. /package/build/assets/{iconBase-DE30Zj_-.js → iconBase-BVhFI-0E.js} +0 -0
  370. /package/build/assets/{map-provider-BJ_8KZKU.js → map-provider-C3Z5Dx2J.js} +0 -0
  371. /package/build/assets/{sdk-settings-field-metadata-DQiaIBie.js → sdk-settings-field-metadata-C6KMD-jZ.js} +0 -0
  372. /package/build/assets/{settings-like-page-layout-classes-D7YjdTd0.js → settings-like-page-layout-classes-DNg2vKSM.js} +0 -0
  373. /package/build/assets/{use-breakpoint-DF_RiQ6s.js → use-breakpoint-DpxHDmuH.js} +0 -0
  374. /package/build/assets/{use-event-store-BomO7ywK.js → use-event-store-Cxqc45Sw.js} +0 -0
  375. /package/build/assets/{vendor~browser-DisFGEp9.js → vendor~browser-BDNLFng6.js} +0 -0
  376. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js → vendor~conversation-panel~conversation~alert-banner-D_hRW_zc.js} +0 -0
  377. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~g56ukk6u-DsSvIDZQ.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~h07fzaqi-D15MEcqi.js} +0 -0
  378. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~hkqzh1hb-BZ0HXuHD.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~j8sdb9mk-OFpe9fX_.js} +0 -0
  379. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-BClAMeFe.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~lpdshwee-BPuuVEqr.js} +0 -0
  380. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CG96FCly.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CXivI4Ym.js} +0 -0
  381. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CyZ-3lDQ.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Dr3Ow7Ms.js} +0 -0
  382. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-CbAhtEMv.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-B1TKKuuH.js} +0 -0
  383. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-CLlsvdNP.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~e9ykmtgh-Fa-nXZ4M.js} +0 -0
  384. /package/build/assets/{vendor~terminal-DZaJIY8A.js → vendor~terminal-0ObOedYm.js} +0 -0
  385. /package/build/assets/{vscode-url-helper-Cwy1A62q.js → vscode-url-helper-BMq8JBhB.js} +0 -0
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "Check your backend",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands talks to an agent server. Make sure the default backend is reachable.",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "You're connected! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "Your agent server is up and running. Let's keep going.",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "We've started a default backend to run your agents, but you can connect as many agent backends as you want. You could have one on your laptop, one sandboxed in Docker, and one on a remote VM.",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Show configuration",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Hide configuration",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "Checking your backend connection…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "We can't reach your backend",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "Update the connection details below and save to retry.",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "Pick a provider and model. We've pre-selected Anthropic Claude Opus.",
1635
1637
  "ONBOARDING$HELLO_TITLE": "Say hello 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "Send your first message to OpenHands. We'll start a fresh conversation with no workspace.",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Create a basic webpage explaining what OpenHands can do",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Create a basic webpage explaining what OpenHands can do.",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "Send",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "Starting conversation…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "Add your API keys",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "Comprueba tu backend",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands se comunica con un servidor de agentes. Asegúrate de que el backend predeterminado sea accesible.",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "¡Conectado! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "Tu servidor de agentes está en marcha. Sigamos.",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "Hemos iniciado un backend predeterminado para ejecutar tus agentes, pero puedes conectar tantos backends de agente como quieras. Podrías tener uno en tu portátil, otro en un sandbox de Docker y otro en una VM remota.",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Mostrar configuración",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Ocultar configuración",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "Comprobando la conexión con el backend…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "No se puede acceder a tu backend",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "Actualiza los detalles de conexión a continuación y guarda para reintentar.",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "Elige un proveedor y un modelo. Hemos preseleccionado Anthropic Claude Opus.",
1635
1637
  "ONBOARDING$HELLO_TITLE": "Saluda 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "Envía tu primer mensaje a OpenHands. Iniciaremos una nueva conversación sin espacio de trabajo.",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crea una página web sencilla que explique lo que puede hacer OpenHands",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crea una página web sencilla que explique lo que puede hacer OpenHands.",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "Enviar",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "Iniciando conversación…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "Añade tus claves de API",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "Vérifiez votre backend",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands communique avec un serveur d'agent. Assurez-vous que le backend par défaut est accessible.",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "Connexion réussie ! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "Votre serveur d'agent est opérationnel. Continuons.",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "Nous avons démarré un backend par défaut pour exécuter vos agents, mais vous pouvez connecter autant de backends d'agent que vous le souhaitez. Vous pourriez en avoir un sur votre ordinateur portable, un dans Docker et un sur une VM distante.",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Afficher la configuration",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Masquer la configuration",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "Vérification de la connexion au backend…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Impossible de joindre votre backend",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "Mettez à jour les détails de connexion ci-dessous, puis enregistrez pour réessayer.",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "Choisissez un fournisseur et un modèle. Nous avons présélectionné Anthropic Claude Opus.",
1635
1637
  "ONBOARDING$HELLO_TITLE": "Dites bonjour 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "Envoyez votre premier message à OpenHands. Nous démarrerons une nouvelle conversation sans espace de travail.",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crée une page web simple expliquant ce que peut faire OpenHands",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crée une page web simple expliquant ce que peut faire OpenHands.",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "Envoyer",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "Démarrage de la conversation…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "Ajoutez vos clés API",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "Verifica il backend",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands comunica con un server agente. Assicurati che il backend predefinito sia raggiungibile.",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "Connessione riuscita! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "Il tuo server agente è attivo. Andiamo avanti.",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "Abbiamo avviato un backend predefinito per eseguire i tuoi agenti, ma puoi collegarne quanti ne vuoi. Potresti averne uno sul laptop, uno in sandbox Docker e uno su una VM remota.",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Mostra configurazione",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Nascondi configurazione",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "Verifica della connessione al backend…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Impossibile raggiungere il backend",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "Aggiorna i dettagli di connessione qui sotto e salva per riprovare.",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "Scegli un provider e un modello. Abbiamo preselezionato Anthropic Claude Opus.",
1635
1637
  "ONBOARDING$HELLO_TITLE": "Saluta 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "Invia il tuo primo messaggio a OpenHands. Avvieremo una nuova conversazione senza area di lavoro.",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crea una pagina web semplice che spieghi cosa può fare OpenHands",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crea una pagina web semplice che spieghi cosa può fare OpenHands.",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "Invia",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "Avvio della conversazione…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "Aggiungi le tue chiavi API",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "バックエンドを確認",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands はエージェントサーバーと通信します。デフォルトのバックエンドに接続できることを確認してください。",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "接続できました! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "エージェントサーバーが稼働しています。次に進みましょう。",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "エージェント実行用のデフォルトバックエンドを起動しましたが、エージェントバックエンドは必要な数だけ接続できます。ノートPC上、Dockerでサンドボックス化したもの、リモートVM上など、複数を使い分けられます。",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "設定を表示",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "設定を非表示",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "バックエンドの接続を確認しています…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "バックエンドに接続できません",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "下の接続情報を更新し、保存して再試行してください。",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "プロバイダーとモデルを選択してください。Anthropic Claude Opus を事前に選択しています。",
1635
1637
  "ONBOARDING$HELLO_TITLE": "ハローと挨拶 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "OpenHands に最初のメッセージを送信しましょう。ワークスペースなしの新しい会話を開始します。",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands でできることを説明する簡単な Web ページを作成して",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands でできることを説明する簡単な Web ページを作成して。",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "送信",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "会話を開始しています…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "API キーを追加",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "백엔드 확인",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands는 에이전트 서버와 통신합니다. 기본 백엔드에 접근할 수 있는지 확인하세요.",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "연결되었습니다! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "에이전트 서버가 정상적으로 실행 중입니다. 계속 진행합시다.",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "에이전트를 실행할 기본 백엔드를 시작했지만, 원하는 만큼 많은 에이전트 백엔드를 연결할 있습니다. 노트북, Docker 샌드박스, 원격 VM에 각각 하나씩 둘 수 있습니다.",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "구성 표시",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "구성 숨기기",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "백엔드 연결을 확인 중입니다…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "백엔드에 연결할 수 없습니다",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "아래 연결 정보를 수정한 뒤 저장하여 다시 시도하세요.",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "공급자와 모델을 선택하세요. 기본값으로 Anthropic Claude Opus가 선택되어 있습니다.",
1635
1637
  "ONBOARDING$HELLO_TITLE": "인사하기 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "OpenHands에 첫 메시지를 보내세요. 작업 공간 없이 새 대화를 시작합니다.",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands가 무엇을 할 수 있는지 설명하는 간단한 웹페이지를 만들어 ",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands가 무엇을 할 수 있는지 설명하는 간단한 웹페이지를 만들어 줘.",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "보내기",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "대화를 시작하는 중…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "API 키 추가",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "Sjekk backend",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands kommuniserer med en agent-server. Sjekk at standard backend er tilgjengelig.",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "Du er tilkoblet! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "Agent-serveren din kjører. La oss videre.",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "Vi har startet en standard backend for å kjøre agentene dine, men du kan koble til så mange agent-backends du vil. Du kan ha én på laptopen, én i Docker-sandbox og én på en ekstern VM.",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Vis konfigurasjon",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Skjul konfigurasjon",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "Sjekker backend-tilkoblingen din…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Vi når ikke backend-en din",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "Oppdater tilkoblingsdetaljene under og lagre for å prøve igjen.",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "Velg en leverandør og modell. Vi har forhåndsvalgt Anthropic Claude Opus.",
1635
1637
  "ONBOARDING$HELLO_TITLE": "Si hei 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "Send din første melding til OpenHands. Vi starter en ny samtale uten arbeidsområde.",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Lag en enkel nettside som forklarer hva OpenHands kan gjøre",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Lag en enkel nettside som forklarer hva OpenHands kan gjøre.",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "Send",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "Starter samtale…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "Legg til API-nøklene dine",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "Verifique seu backend",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "O OpenHands se comunica com um servidor de agente. Verifique se o backend padrão está acessível.",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "Conectado! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "Seu servidor de agente está em execução. Vamos continuar.",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "Iniciamos um backend padrão para executar seus agentes, mas você pode conectar quantos backends de agente quiser. Você pode ter um no laptop, um em sandbox no Docker e um em uma VM remota.",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Mostrar configuração",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Ocultar configuração",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "Verificando a conexão com o backend…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Não foi possível conectar ao seu backend",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "Atualize os detalhes de conexão abaixo e salve para tentar novamente.",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "Escolha um provedor e modelo. Já selecionamos o Anthropic Claude Opus.",
1635
1637
  "ONBOARDING$HELLO_TITLE": "Diga olá 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "Envie sua primeira mensagem ao OpenHands. Vamos iniciar uma nova conversa sem workspace.",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crie uma página web básica explicando o que o OpenHands pode fazer",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crie uma página web básica explicando o que o OpenHands pode fazer.",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "Enviar",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "Iniciando conversa…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "Adicione suas chaves de API",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "Sunucu tarafını kontrol edin",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands bir aracı sunucusuyla iletişim kurar. Varsayılan sunucuya erişilebildiğinden emin olun.",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "Bağlandınız! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "Aracı sunucunuz çalışıyor. Devam edelim.",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "Ajanlarınızı çalıştırmak için varsayılan bir backend başlattık, ancak istediğiniz kadar ajan backend'i bağlayabilirsiniz. Dizüstü bilgisayarınızda bir tane, Docker'da sandbox'lanmış bir tane ve uzak bir VM'de bir tane olabilir.",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Yapılandırmayı göster",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Yapılandırmayı gizle",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "Sunucu bağlantınız kontrol ediliyor…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Sunucunuza ulaşılamıyor",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "Aşağıdaki bağlantı bilgilerini güncelleyin ve yeniden denemek için kaydedin.",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "Bir sağlayıcı ve model seçin. Anthropic Claude Opus'u önceden seçtik.",
1635
1637
  "ONBOARDING$HELLO_TITLE": "Selam ver 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "OpenHands'e ilk mesajınızı gönderin. Çalışma alanı olmadan yeni bir sohbet başlatacağız.",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands'in neler yapabileceğini anlatan basit bir web sayfası oluştur",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands'in neler yapabileceğini anlatan basit bir web sayfası oluştur.",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "Gönder",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "Sohbet başlatılıyor…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "API anahtarlarınızı ekleyin",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "Перевірте бекенд",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands взаємодіє з агент-сервером. Переконайтеся, що типовий бекенд доступний.",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "З'єднання встановлено! 🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "Ваш агент-сервер працює. Продовжимо.",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "Ми запустили типовий бекенд для ваших агентів, але ви можете підключити скільки завгодно бекендів агентів. Один може бути на ноутбуці, один у Docker sandbox і один на віддаленій VM.",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Показати конфігурацію",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Приховати конфігурацію",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "Перевірка з'єднання з бекендом…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Не вдається з'єднатися з бекендом",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "Оновіть нижче параметри з'єднання та збережіть, щоб повторити спробу.",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "Виберіть провайдера та модель. Anthropic Claude Opus уже обрано.",
1635
1637
  "ONBOARDING$HELLO_TITLE": "Привітайтеся 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "Надішліть перше повідомлення до OpenHands. Почнемо нову розмову без робочого простору.",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Створи просту вебсторінку, що пояснює, на що здатний OpenHands",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "Створи просту вебсторінку, що пояснює, на що здатний OpenHands.",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "Надіслати",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "Розпочинаємо розмову…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "Додайте свої ключі API",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "检查后端",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands 通过智能体服务器进行通信。请确认默认后端可访问。",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "已连接!🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "智能体服务器已就绪。让我们继续。",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "我们已启动默认后端来运行您的智能体,但您可以连接任意数量的智能体后端。例如,您可以在笔记本电脑、Docker 沙箱或远程 VM 上各运行一个。",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "显示配置",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "隐藏配置",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "正在检查后端连接…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "无法连接到后端",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "请更新下方的连接信息并保存以重试。",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "选择提供商和模型。我们已为你预先选择 Anthropic Claude Opus。",
1635
1637
  "ONBOARDING$HELLO_TITLE": "打个招呼 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "向 OpenHands 发送你的第一条消息。我们将启动一个无工作区的新对话。",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "创建一个简单的网页,说明 OpenHands 能做什么",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "创建一个简单的网页,说明 OpenHands 能做什么。",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "发送",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "正在开始对话…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "添加你的 API 密钥",
@@ -1623,7 +1623,9 @@
1623
1623
  "ONBOARDING$BACKEND_TITLE": "檢查後端",
1624
1624
  "ONBOARDING$BACKEND_SUBTITLE": "OpenHands 透過代理伺服器溝通。請確認預設後端可連線。",
1625
1625
  "ONBOARDING$BACKEND_CONNECTED_TITLE": "已連線!🎉",
1626
- "ONBOARDING$BACKEND_CONNECTED_BODY": "代理伺服器已啟動並執行中。讓我們繼續。",
1626
+ "ONBOARDING$BACKEND_CONNECTED_BODY": "我們已啟動預設後端來執行您的代理,但您可以連接任意數量的代理後端。您可以在筆記型電腦、Docker 沙箱或遠端 VM 上各執行一個。",
1627
+ "ONBOARDING$BACKEND_SHOW_CONFIGURATION": "顯示設定",
1628
+ "ONBOARDING$BACKEND_HIDE_CONFIGURATION": "隱藏設定",
1627
1629
  "ONBOARDING$BACKEND_CHECKING": "正在檢查後端連線…",
1628
1630
  "ONBOARDING$BACKEND_DISCONNECTED_TITLE": "無法連線到後端",
1629
1631
  "ONBOARDING$BACKEND_DISCONNECTED_BODY": "請更新下方連線資訊並儲存以重試。",
@@ -1634,7 +1636,7 @@
1634
1636
  "ONBOARDING$LLM_SUBTITLE": "選擇供應商與模型。我們已預先選好 Anthropic Claude Opus。",
1635
1637
  "ONBOARDING$HELLO_TITLE": "打個招呼 👋",
1636
1638
  "ONBOARDING$HELLO_SUBTITLE": "向 OpenHands 傳送第一則訊息。我們會開始一個沒有工作區的新對話。",
1637
- "ONBOARDING$HELLO_DEFAULT_MESSAGE": "建立一個簡單的網頁,說明 OpenHands 能做什麼",
1639
+ "ONBOARDING$HELLO_DEFAULT_MESSAGE": "建立一個簡單的網頁,說明 OpenHands 能做什麼。",
1638
1640
  "ONBOARDING$HELLO_LAUNCH": "傳送",
1639
1641
  "ONBOARDING$HELLO_LAUNCHING": "對話開始中…",
1640
1642
  "ONBOARDING$ACP_SECRETS_TITLE": "新增你的 API 金鑰",
@@ -3,7 +3,7 @@
3
3
 
4
4
  "versions": {
5
5
  "agentServer": "1.24.0",
6
- "automation": "1.0.0a5",
6
+ "automation": "1.0.0a6",
7
7
  "automationSdk": "1.22.1"
8
8
  },
9
9
 
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);var e=`workspace/project`;function t(e){return e?.trim()||null}function n(e){if(!e)return null;let t=e.trim().replace(/\/$/,``);return t?/^https?:\/\//i.test(t)?t:typeof window<`u`?`${window.location.protocol}//${t}`:`http://${t}`:null}function r(){return n(void 0)}function i(){return t(void 0)}function a(){return r()||(typeof window<`u`?window.location.origin:null)}function o(){return i()}function s(){return(void 0)?.trim()||e}function c(e){return`${s().replace(/\/+$/,``)}/${e.replace(/-/g,``)}`}function l(){let e=o();return e?{"X-Session-API-Key":e}:{}}function u(){return!0}function d(){return typeof window<`u`&&window.__AGENT_CANVAS_AUTH_REQUIRED__===!0}exports.DEFAULT_WORKING_DIR=e,exports.buildConversationWorkingDir=c,exports.getAgentServerBaseUrl=a,exports.getAgentServerHeaders=l,exports.getAgentServerSessionApiKey=o,exports.getAgentServerWorkingDir=s,exports.isAuthRequired=d,exports.shouldLoadPublicSkills=u;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);var e=`workspace/project`;function t(e){return e?.trim()||null}function n(e){if(!e)return null;let t=e.trim().replace(/\/$/,``);return t?/^https?:\/\//i.test(t)?t:typeof window<`u`?`${window.location.protocol}//${t}`:`http://${t}`:null}function r(){return n(void 0)}function i(){let e=t(void 0);if(e)return e;if(typeof window<`u`){let e=window.__AGENT_CANVAS_SESSION_API_KEY__;if(typeof e==`string`)return t(e)}return null}function a(){return r()||(typeof window<`u`?window.location.origin:null)}function o(){return i()}function s(){return(void 0)?.trim()||e}function c(e){return`${s().replace(/\/+$/,``)}/${e.replace(/-/g,``)}`}function l(){let e=o();return e?{"X-Session-API-Key":e}:{}}function u(){return!0}function d(){return typeof window<`u`&&window.__AGENT_CANVAS_AUTH_REQUIRED__===!0}exports.DEFAULT_WORKING_DIR=e,exports.buildConversationWorkingDir=c,exports.getAgentServerBaseUrl=a,exports.getAgentServerHeaders=l,exports.getAgentServerSessionApiKey=o,exports.getAgentServerWorkingDir=s,exports.isAuthRequired=d,exports.shouldLoadPublicSkills=u;
2
2
  //# sourceMappingURL=agent-server-config.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server-config.cjs","names":[],"sources":["../../src/api/agent-server-config.ts"],"sourcesContent":["export const DEFAULT_WORKING_DIR = \"workspace/project\";\n\nexport interface AgentServerFormDefaults {\n baseUrl: string;\n sessionApiKey: string;\n}\n\nfunction trimToNull(value?: string | null): string | null {\n return value?.trim() || null;\n}\n\nfunction normalizeBaseUrl(value?: string | null): string | null {\n if (!value) return null;\n\n const trimmed = value.trim().replace(/\\/$/, \"\");\n if (!trimmed) return null;\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n if (typeof window !== \"undefined\") {\n return `${window.location.protocol}//${trimmed}`;\n }\n\n return `http://${trimmed}`;\n}\n\nfunction getConfiguredBaseUrl(): string | null {\n return normalizeBaseUrl(import.meta.env.VITE_BACKEND_BASE_URL);\n}\n\nexport function getBakedSessionApiKey(): string | null {\n return trimToNull(import.meta.env.VITE_SESSION_API_KEY);\n}\n\nexport function getAgentServerFormDefaults(): AgentServerFormDefaults {\n return {\n baseUrl: getAgentServerBaseUrl() ?? \"\",\n sessionApiKey: getAgentServerSessionApiKey() ?? \"\",\n };\n}\n\nexport function getAgentServerBaseUrl(): string | null {\n const configuredUrl = getConfiguredBaseUrl();\n if (configuredUrl) return configuredUrl;\n\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n\n return null;\n}\n\nexport function getAgentServerSessionApiKey(): string | null {\n return getBakedSessionApiKey();\n}\n\nexport function getAgentServerWorkingDir(): string {\n const envDir = import.meta.env.VITE_WORKING_DIR?.trim();\n if (envDir) return envDir;\n\n return DEFAULT_WORKING_DIR;\n}\n\nexport function buildConversationWorkingDir(conversationId: string): string {\n const base = getAgentServerWorkingDir().replace(/\\/+$/, \"\");\n const hex = conversationId.replace(/-/g, \"\");\n return `${base}/${hex}`;\n}\n\nexport function getConfiguredWorkerUrls(): string[] {\n const raw = import.meta.env.VITE_WORKER_URLS?.trim();\n if (!raw) return [];\n\n return raw\n .split(\",\")\n .map((url: string) => normalizeBaseUrl(url))\n .filter((url: string | null): url is string => Boolean(url));\n}\n\nexport function getAgentServerHeaders(): Record<string, string> {\n const sessionApiKey = getAgentServerSessionApiKey();\n return sessionApiKey ? { \"X-Session-API-Key\": sessionApiKey } : {};\n}\n\nexport function shouldLoadPublicSkills(): boolean {\n return import.meta.env.VITE_LOAD_PUBLIC_SKILLS !== \"false\";\n}\n\nexport function isAuthRequired(): boolean {\n return (\n import.meta.env.VITE_AUTH_REQUIRED === \"true\" ||\n (typeof window !== \"undefined\" &&\n (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_AUTH_REQUIRED__ === true)\n );\n}\n\nexport function isAuthRequiredAndMissing(): boolean {\n if (!isAuthRequired()) return false;\n return !getAgentServerSessionApiKey();\n}\n"],"mappings":"6CAAA,IAAa,EAAsB,oBAOnC,SAAS,EAAW,EAAsC,CACxD,OAAO,GAAO,MAAM,EAAI,KAG1B,SAAS,EAAiB,EAAsC,CAC9D,GAAI,CAAC,EAAO,OAAO,KAEnB,IAAM,EAAU,EAAM,MAAM,CAAC,QAAQ,MAAO,GAAG,CAW/C,OAVK,EAED,gBAAgB,KAAK,EAAQ,CACxB,EAGL,OAAO,OAAW,IACb,GAAG,OAAO,SAAS,SAAS,IAAI,IAGlC,UAAU,IAVI,KAavB,SAAS,GAAsC,CAC7C,OAAO,EAAA,IAAA,GAAuD,CAGhE,SAAgB,GAAuC,CACrD,OAAO,EAAA,IAAA,GAAgD,CAUzD,SAAgB,GAAuC,CAQrD,OAPsB,GAClB,GAEA,OAAO,OAAW,IACb,OAAO,SAAS,OAGlB,MAGT,SAAgB,GAA6C,CAC3D,OAAO,GAAuB,CAGhC,SAAgB,GAAmC,CAIjD,OAHM,IAAA,KAA2C,MAAM,EAGhD,EAGT,SAAgB,EAA4B,EAAgC,CAG1E,MAAO,GAFM,GAA0B,CAAC,QAAQ,OAAQ,GAE9C,CAAK,GADH,EAAe,QAAQ,KAAM,GACvB,GAapB,SAAgB,GAAgD,CAC9D,IAAM,EAAgB,GAA6B,CACnD,OAAO,EAAgB,CAAE,oBAAqB,EAAe,CAAG,EAAE,CAGpE,SAAgB,GAAkC,CAChD,MAAO,GAGT,SAAgB,GAA0B,CACxC,OAEG,OAAO,OAAW,KAChB,OACE,iCAAmC"}
1
+ {"version":3,"file":"agent-server-config.cjs","names":[],"sources":["../../src/api/agent-server-config.ts"],"sourcesContent":["export const DEFAULT_WORKING_DIR = \"workspace/project\";\n\nexport interface AgentServerFormDefaults {\n baseUrl: string;\n sessionApiKey: string;\n}\n\nfunction trimToNull(value?: string | null): string | null {\n return value?.trim() || null;\n}\n\nfunction normalizeBaseUrl(value?: string | null): string | null {\n if (!value) return null;\n\n const trimmed = value.trim().replace(/\\/$/, \"\");\n if (!trimmed) return null;\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n if (typeof window !== \"undefined\") {\n return `${window.location.protocol}//${trimmed}`;\n }\n\n return `http://${trimmed}`;\n}\n\nfunction getConfiguredBaseUrl(): string | null {\n return normalizeBaseUrl(import.meta.env.VITE_BACKEND_BASE_URL);\n}\n\n/**\n * Return the session API key supplied by the deployment host.\n *\n * Two sources are consulted, in order:\n * 1. `VITE_SESSION_API_KEY` — baked into the bundle at build time (used by\n * `npm run dev` so the dev server has the key without a round-trip).\n * 2. `window.__AGENT_CANVAS_SESSION_API_KEY__` — injected into `index.html`\n * at serve time by `scripts/static-server.mjs --session-api-key <key>`.\n * This is the path used by the published `agent-canvas` binary, where\n * `VITE_SESSION_API_KEY` is empty in the prebuilt bundle and the\n * runtime key is generated when the user launches the CLI.\n *\n * Without the window-global fallback, the published binary cannot construct a\n * default local backend (`makeDefaultLocalBackend()` returns null), the\n * registry is left empty, and the user sees the Manage Backends modal\n * instead of the onboarding flow.\n */\nexport function getBakedSessionApiKey(): string | null {\n const envKey = trimToNull(import.meta.env.VITE_SESSION_API_KEY);\n if (envKey) return envKey;\n\n if (typeof window !== \"undefined\") {\n const injected = (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_SESSION_API_KEY__;\n if (typeof injected === \"string\") {\n return trimToNull(injected);\n }\n }\n\n return null;\n}\n\nexport function getAgentServerFormDefaults(): AgentServerFormDefaults {\n return {\n baseUrl: getAgentServerBaseUrl() ?? \"\",\n sessionApiKey: getAgentServerSessionApiKey() ?? \"\",\n };\n}\n\nexport function getAgentServerBaseUrl(): string | null {\n const configuredUrl = getConfiguredBaseUrl();\n if (configuredUrl) return configuredUrl;\n\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n\n return null;\n}\n\nexport function getAgentServerSessionApiKey(): string | null {\n return getBakedSessionApiKey();\n}\n\nexport function getAgentServerWorkingDir(): string {\n const envDir = import.meta.env.VITE_WORKING_DIR?.trim();\n if (envDir) return envDir;\n\n return DEFAULT_WORKING_DIR;\n}\n\nexport function buildConversationWorkingDir(conversationId: string): string {\n const base = getAgentServerWorkingDir().replace(/\\/+$/, \"\");\n const hex = conversationId.replace(/-/g, \"\");\n return `${base}/${hex}`;\n}\n\nexport function getConfiguredWorkerUrls(): string[] {\n const raw = import.meta.env.VITE_WORKER_URLS?.trim();\n if (!raw) return [];\n\n return raw\n .split(\",\")\n .map((url: string) => normalizeBaseUrl(url))\n .filter((url: string | null): url is string => Boolean(url));\n}\n\nexport function getAgentServerHeaders(): Record<string, string> {\n const sessionApiKey = getAgentServerSessionApiKey();\n return sessionApiKey ? { \"X-Session-API-Key\": sessionApiKey } : {};\n}\n\nexport function shouldLoadPublicSkills(): boolean {\n return import.meta.env.VITE_LOAD_PUBLIC_SKILLS !== \"false\";\n}\n\nexport function isAuthRequired(): boolean {\n return (\n import.meta.env.VITE_AUTH_REQUIRED === \"true\" ||\n (typeof window !== \"undefined\" &&\n (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_AUTH_REQUIRED__ === true)\n );\n}\n\nexport function isAuthRequiredAndMissing(): boolean {\n if (!isAuthRequired()) return false;\n return !getAgentServerSessionApiKey();\n}\n"],"mappings":"6CAAA,IAAa,EAAsB,oBAOnC,SAAS,EAAW,EAAsC,CACxD,OAAO,GAAO,MAAM,EAAI,KAG1B,SAAS,EAAiB,EAAsC,CAC9D,GAAI,CAAC,EAAO,OAAO,KAEnB,IAAM,EAAU,EAAM,MAAM,CAAC,QAAQ,MAAO,GAAG,CAW/C,OAVK,EAED,gBAAgB,KAAK,EAAQ,CACxB,EAGL,OAAO,OAAW,IACb,GAAG,OAAO,SAAS,SAAS,IAAI,IAGlC,UAAU,IAVI,KAavB,SAAS,GAAsC,CAC7C,OAAO,EAAA,IAAA,GAAuD,CAoBhE,SAAgB,GAAuC,CACrD,IAAM,EAAS,EAAA,IAAA,GAAgD,CAC/D,GAAI,EAAQ,OAAO,EAEnB,GAAI,OAAO,OAAW,IAAa,CACjC,IAAM,EAAY,OACf,iCACH,GAAI,OAAO,GAAa,SACtB,OAAO,EAAW,EAAS,CAI/B,OAAO,KAUT,SAAgB,GAAuC,CAQrD,OAPsB,GAClB,GAEA,OAAO,OAAW,IACb,OAAO,SAAS,OAGlB,MAGT,SAAgB,GAA6C,CAC3D,OAAO,GAAuB,CAGhC,SAAgB,GAAmC,CAIjD,OAHM,IAAA,KAA2C,MAAM,EAGhD,EAGT,SAAgB,EAA4B,EAAgC,CAG1E,MAAO,GAFM,GAA0B,CAAC,QAAQ,OAAQ,GAE9C,CAAK,GADH,EAAe,QAAQ,KAAM,GACvB,GAapB,SAAgB,GAAgD,CAC9D,IAAM,EAAgB,GAA6B,CACnD,OAAO,EAAgB,CAAE,oBAAqB,EAAe,CAAG,EAAE,CAGpE,SAAgB,GAAkC,CAChD,MAAO,GAGT,SAAgB,GAA0B,CACxC,OAEG,OAAO,OAAW,KAChB,OACE,iCAAmC"}
@@ -3,6 +3,23 @@ export interface AgentServerFormDefaults {
3
3
  baseUrl: string;
4
4
  sessionApiKey: string;
5
5
  }
6
+ /**
7
+ * Return the session API key supplied by the deployment host.
8
+ *
9
+ * Two sources are consulted, in order:
10
+ * 1. `VITE_SESSION_API_KEY` — baked into the bundle at build time (used by
11
+ * `npm run dev` so the dev server has the key without a round-trip).
12
+ * 2. `window.__AGENT_CANVAS_SESSION_API_KEY__` — injected into `index.html`
13
+ * at serve time by `scripts/static-server.mjs --session-api-key <key>`.
14
+ * This is the path used by the published `agent-canvas` binary, where
15
+ * `VITE_SESSION_API_KEY` is empty in the prebuilt bundle and the
16
+ * runtime key is generated when the user launches the CLI.
17
+ *
18
+ * Without the window-global fallback, the published binary cannot construct a
19
+ * default local backend (`makeDefaultLocalBackend()` returns null), the
20
+ * registry is left empty, and the user sees the Manage Backends modal
21
+ * instead of the onboarding flow.
22
+ */
6
23
  export declare function getBakedSessionApiKey(): string | null;
7
24
  export declare function getAgentServerFormDefaults(): AgentServerFormDefaults;
8
25
  export declare function getAgentServerBaseUrl(): string | null;
@@ -12,7 +12,13 @@ function r() {
12
12
  return n(void 0);
13
13
  }
14
14
  function i() {
15
- return t(void 0);
15
+ let e = t(void 0);
16
+ if (e) return e;
17
+ if (typeof window < "u") {
18
+ let e = window.__AGENT_CANVAS_SESSION_API_KEY__;
19
+ if (typeof e == "string") return t(e);
20
+ }
21
+ return null;
16
22
  }
17
23
  function a() {
18
24
  return r() || (typeof window < "u" ? window.location.origin : null);
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server-config.js","names":[],"sources":["../../src/api/agent-server-config.ts"],"sourcesContent":["export const DEFAULT_WORKING_DIR = \"workspace/project\";\n\nexport interface AgentServerFormDefaults {\n baseUrl: string;\n sessionApiKey: string;\n}\n\nfunction trimToNull(value?: string | null): string | null {\n return value?.trim() || null;\n}\n\nfunction normalizeBaseUrl(value?: string | null): string | null {\n if (!value) return null;\n\n const trimmed = value.trim().replace(/\\/$/, \"\");\n if (!trimmed) return null;\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n if (typeof window !== \"undefined\") {\n return `${window.location.protocol}//${trimmed}`;\n }\n\n return `http://${trimmed}`;\n}\n\nfunction getConfiguredBaseUrl(): string | null {\n return normalizeBaseUrl(import.meta.env.VITE_BACKEND_BASE_URL);\n}\n\nexport function getBakedSessionApiKey(): string | null {\n return trimToNull(import.meta.env.VITE_SESSION_API_KEY);\n}\n\nexport function getAgentServerFormDefaults(): AgentServerFormDefaults {\n return {\n baseUrl: getAgentServerBaseUrl() ?? \"\",\n sessionApiKey: getAgentServerSessionApiKey() ?? \"\",\n };\n}\n\nexport function getAgentServerBaseUrl(): string | null {\n const configuredUrl = getConfiguredBaseUrl();\n if (configuredUrl) return configuredUrl;\n\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n\n return null;\n}\n\nexport function getAgentServerSessionApiKey(): string | null {\n return getBakedSessionApiKey();\n}\n\nexport function getAgentServerWorkingDir(): string {\n const envDir = import.meta.env.VITE_WORKING_DIR?.trim();\n if (envDir) return envDir;\n\n return DEFAULT_WORKING_DIR;\n}\n\nexport function buildConversationWorkingDir(conversationId: string): string {\n const base = getAgentServerWorkingDir().replace(/\\/+$/, \"\");\n const hex = conversationId.replace(/-/g, \"\");\n return `${base}/${hex}`;\n}\n\nexport function getConfiguredWorkerUrls(): string[] {\n const raw = import.meta.env.VITE_WORKER_URLS?.trim();\n if (!raw) return [];\n\n return raw\n .split(\",\")\n .map((url: string) => normalizeBaseUrl(url))\n .filter((url: string | null): url is string => Boolean(url));\n}\n\nexport function getAgentServerHeaders(): Record<string, string> {\n const sessionApiKey = getAgentServerSessionApiKey();\n return sessionApiKey ? { \"X-Session-API-Key\": sessionApiKey } : {};\n}\n\nexport function shouldLoadPublicSkills(): boolean {\n return import.meta.env.VITE_LOAD_PUBLIC_SKILLS !== \"false\";\n}\n\nexport function isAuthRequired(): boolean {\n return (\n import.meta.env.VITE_AUTH_REQUIRED === \"true\" ||\n (typeof window !== \"undefined\" &&\n (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_AUTH_REQUIRED__ === true)\n );\n}\n\nexport function isAuthRequiredAndMissing(): boolean {\n if (!isAuthRequired()) return false;\n return !getAgentServerSessionApiKey();\n}\n"],"mappings":";AAAA,IAAa,IAAsB;AAOnC,SAAS,EAAW,GAAsC;AACxD,QAAO,GAAO,MAAM,IAAI;;AAG1B,SAAS,EAAiB,GAAsC;AAC9D,KAAI,CAAC,EAAO,QAAO;CAEnB,IAAM,IAAU,EAAM,MAAM,CAAC,QAAQ,OAAO,GAAG;AAW/C,QAVK,IAED,gBAAgB,KAAK,EAAQ,GACxB,IAGL,OAAO,SAAW,MACb,GAAG,OAAO,SAAS,SAAS,IAAI,MAGlC,UAAU,MAVI;;AAavB,SAAS,IAAsC;AAC7C,QAAO,EAAA,KAAA,EAAuD;;AAGhE,SAAgB,IAAuC;AACrD,QAAO,EAAA,KAAA,EAAgD;;AAUzD,SAAgB,IAAuC;AAQrD,QAPsB,GAClB,KAEA,OAAO,SAAW,MACb,OAAO,SAAS,SAGlB;;AAGT,SAAgB,IAA6C;AAC3D,QAAO,GAAuB;;AAGhC,SAAgB,IAAmC;AAIjD,SAHM,KAAA,IAA2C,MAAM,IAGhD;;AAGT,SAAgB,EAA4B,GAAgC;AAG1E,QAAO,GAFM,GAA0B,CAAC,QAAQ,QAAQ,GAE9C,CAAK,GADH,EAAe,QAAQ,MAAM,GACvB;;AAapB,SAAgB,IAAgD;CAC9D,IAAM,IAAgB,GAA6B;AACnD,QAAO,IAAgB,EAAE,qBAAqB,GAAe,GAAG,EAAE;;AAGpE,SAAgB,IAAkC;AAChD,QAAO;;AAGT,SAAgB,IAA0B;AACxC,QAEG,OAAO,SAAW,OAChB,OACE,mCAAmC"}
1
+ {"version":3,"file":"agent-server-config.js","names":[],"sources":["../../src/api/agent-server-config.ts"],"sourcesContent":["export const DEFAULT_WORKING_DIR = \"workspace/project\";\n\nexport interface AgentServerFormDefaults {\n baseUrl: string;\n sessionApiKey: string;\n}\n\nfunction trimToNull(value?: string | null): string | null {\n return value?.trim() || null;\n}\n\nfunction normalizeBaseUrl(value?: string | null): string | null {\n if (!value) return null;\n\n const trimmed = value.trim().replace(/\\/$/, \"\");\n if (!trimmed) return null;\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n if (typeof window !== \"undefined\") {\n return `${window.location.protocol}//${trimmed}`;\n }\n\n return `http://${trimmed}`;\n}\n\nfunction getConfiguredBaseUrl(): string | null {\n return normalizeBaseUrl(import.meta.env.VITE_BACKEND_BASE_URL);\n}\n\n/**\n * Return the session API key supplied by the deployment host.\n *\n * Two sources are consulted, in order:\n * 1. `VITE_SESSION_API_KEY` — baked into the bundle at build time (used by\n * `npm run dev` so the dev server has the key without a round-trip).\n * 2. `window.__AGENT_CANVAS_SESSION_API_KEY__` — injected into `index.html`\n * at serve time by `scripts/static-server.mjs --session-api-key <key>`.\n * This is the path used by the published `agent-canvas` binary, where\n * `VITE_SESSION_API_KEY` is empty in the prebuilt bundle and the\n * runtime key is generated when the user launches the CLI.\n *\n * Without the window-global fallback, the published binary cannot construct a\n * default local backend (`makeDefaultLocalBackend()` returns null), the\n * registry is left empty, and the user sees the Manage Backends modal\n * instead of the onboarding flow.\n */\nexport function getBakedSessionApiKey(): string | null {\n const envKey = trimToNull(import.meta.env.VITE_SESSION_API_KEY);\n if (envKey) return envKey;\n\n if (typeof window !== \"undefined\") {\n const injected = (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_SESSION_API_KEY__;\n if (typeof injected === \"string\") {\n return trimToNull(injected);\n }\n }\n\n return null;\n}\n\nexport function getAgentServerFormDefaults(): AgentServerFormDefaults {\n return {\n baseUrl: getAgentServerBaseUrl() ?? \"\",\n sessionApiKey: getAgentServerSessionApiKey() ?? \"\",\n };\n}\n\nexport function getAgentServerBaseUrl(): string | null {\n const configuredUrl = getConfiguredBaseUrl();\n if (configuredUrl) return configuredUrl;\n\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n\n return null;\n}\n\nexport function getAgentServerSessionApiKey(): string | null {\n return getBakedSessionApiKey();\n}\n\nexport function getAgentServerWorkingDir(): string {\n const envDir = import.meta.env.VITE_WORKING_DIR?.trim();\n if (envDir) return envDir;\n\n return DEFAULT_WORKING_DIR;\n}\n\nexport function buildConversationWorkingDir(conversationId: string): string {\n const base = getAgentServerWorkingDir().replace(/\\/+$/, \"\");\n const hex = conversationId.replace(/-/g, \"\");\n return `${base}/${hex}`;\n}\n\nexport function getConfiguredWorkerUrls(): string[] {\n const raw = import.meta.env.VITE_WORKER_URLS?.trim();\n if (!raw) return [];\n\n return raw\n .split(\",\")\n .map((url: string) => normalizeBaseUrl(url))\n .filter((url: string | null): url is string => Boolean(url));\n}\n\nexport function getAgentServerHeaders(): Record<string, string> {\n const sessionApiKey = getAgentServerSessionApiKey();\n return sessionApiKey ? { \"X-Session-API-Key\": sessionApiKey } : {};\n}\n\nexport function shouldLoadPublicSkills(): boolean {\n return import.meta.env.VITE_LOAD_PUBLIC_SKILLS !== \"false\";\n}\n\nexport function isAuthRequired(): boolean {\n return (\n import.meta.env.VITE_AUTH_REQUIRED === \"true\" ||\n (typeof window !== \"undefined\" &&\n (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_AUTH_REQUIRED__ === true)\n );\n}\n\nexport function isAuthRequiredAndMissing(): boolean {\n if (!isAuthRequired()) return false;\n return !getAgentServerSessionApiKey();\n}\n"],"mappings":";AAAA,IAAa,IAAsB;AAOnC,SAAS,EAAW,GAAsC;AACxD,QAAO,GAAO,MAAM,IAAI;;AAG1B,SAAS,EAAiB,GAAsC;AAC9D,KAAI,CAAC,EAAO,QAAO;CAEnB,IAAM,IAAU,EAAM,MAAM,CAAC,QAAQ,OAAO,GAAG;AAW/C,QAVK,IAED,gBAAgB,KAAK,EAAQ,GACxB,IAGL,OAAO,SAAW,MACb,GAAG,OAAO,SAAS,SAAS,IAAI,MAGlC,UAAU,MAVI;;AAavB,SAAS,IAAsC;AAC7C,QAAO,EAAA,KAAA,EAAuD;;AAoBhE,SAAgB,IAAuC;CACrD,IAAM,IAAS,EAAA,KAAA,EAAgD;AAC/D,KAAI,EAAQ,QAAO;AAEnB,KAAI,OAAO,SAAW,KAAa;EACjC,IAAM,IAAY,OACf;AACH,MAAI,OAAO,KAAa,SACtB,QAAO,EAAW,EAAS;;AAI/B,QAAO;;AAUT,SAAgB,IAAuC;AAQrD,QAPsB,GAClB,KAEA,OAAO,SAAW,MACb,OAAO,SAAS,SAGlB;;AAGT,SAAgB,IAA6C;AAC3D,QAAO,GAAuB;;AAGhC,SAAgB,IAAmC;AAIjD,SAHM,KAAA,IAA2C,MAAM,IAGhD;;AAGT,SAAgB,EAA4B,GAAgC;AAG1E,QAAO,GAFM,GAA0B,CAAC,QAAQ,QAAQ,GAE9C,CAAK,GADH,EAAe,QAAQ,MAAM,GACvB;;AAapB,SAAgB,IAAgD;CAC9D,IAAM,IAAgB,GAA6B;AACnD,QAAO,IAAgB,EAAE,qBAAqB,GAAe,GAAG,EAAE;;AAGpE,SAAgB,IAAkC;AAChD,QAAO;;AAGT,SAAgB,IAA0B;AACxC,QAEG,OAAO,SAAW,OAChB,OACE,mCAAmC"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../node_modules/@openhands/typescript-client/dist/client/file-client.cjs`),t=require(`./agent-server-client-options.cjs`);var n=new Map;function r(e){return/^([/\\]|[a-zA-Z]:[/\\])/.test(e)}function i(e,t){return`${e.replace(/[/\\]+$/,``)}/${t.replace(/^[/\\]+/,``)}`}async function a(r={}){let i=t.getAgentServerClientOptions(r),a=i.host,o=n.get(a);if(o)return o;let s=(async()=>{let{home:t}=await new e.FileClient(i).getHome();if(!t||typeof t!=`string`)throw Error(`Agent server returned an empty home directory`);return t.replace(/[/\\]+$/,``)})();n.set(a,s);try{return await s}catch(e){throw n.delete(a),e}}async function o(e,t={}){let n=e.replace(/[/\\]+$/,``);return n?r(n)?n:i(await a(t),n):a(t)}exports.resolveAbsoluteAgentServerPath=o;
2
+ //# sourceMappingURL=agent-server-home.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-server-home.cjs","names":[],"sources":["../../src/api/agent-server-home.ts"],"sourcesContent":["// @spec WUP-001 — Resolve relative working dirs against /api/file/home\nimport { FileClient } from \"@openhands/typescript-client/clients\";\nimport {\n getAgentServerClientOptions,\n type AgentServerClientOverrides,\n} from \"./agent-server-client-options\";\n\n/**\n * Cache the agent-server's home directory per host so we only round-trip\n * `/api/file/home` once per backend. The home dir is effectively static for\n * the lifetime of a running agent-server (it's `Path.home()` on the host),\n * so caching is safe and avoids hammering the endpoint on every upload.\n *\n * The cache holds `Promise<string>` rather than `string` so concurrent\n * callers share a single in-flight request.\n */\nconst homeDirCache = new Map<string, Promise<string>>();\n\nfunction isAbsolutePath(path: string): boolean {\n // Treat POSIX-style and Windows-style absolute paths as absolute.\n // The agent-server itself is POSIX on Linux/macOS and uses `\\\\` style\n // on Windows; we just need to know whether `Path(path).is_absolute()`\n // would return true on the server.\n //\n // Patterns covered:\n // POSIX absolute: /foo/bar\n // Windows drive: C:\\foo or C:/foo\n // Windows UNC: \\\\server\\share (starts with `\\`, matches `[/\\\\]`)\n return /^([/\\\\]|[a-zA-Z]:[/\\\\])/.test(path);\n}\n\n/**\n * Join a parent directory and a relative child segment with a forward slash,\n * collapsing any duplicate separators that result from the join.\n */\nfunction joinPath(parent: string, child: string): string {\n const left = parent.replace(/[/\\\\]+$/, \"\");\n const right = child.replace(/^[/\\\\]+/, \"\");\n return `${left}/${right}`;\n}\n\n/**\n * Fetch and cache the agent-server's home directory via `GET /api/file/home`.\n *\n * The result is the absolute path returned by `Path.home()` on the\n * agent-server host (e.g. `/Users/foo`, `/root`, or `C:\\\\Users\\\\Foo`). This\n * is the most reliable absolute, writable anchor the agent-server API\n * currently exposes — `/server_info` doesn't include the process CWD.\n *\n * @param overrides Same shape as `getAgentServerClientOptions` — lets cloud\n * sandboxes pass a `conversationUrl` + `sessionApiKey` so the lookup goes\n * to the per-conversation runtime rather than the bundled local backend.\n */\nexport async function getAgentServerHomeDir(\n overrides: AgentServerClientOverrides = {},\n): Promise<string> {\n const options = getAgentServerClientOptions(overrides);\n const cacheKey = options.host;\n const cached = homeDirCache.get(cacheKey);\n if (cached) return cached;\n\n const lookup = (async () => {\n const { home } = await new FileClient(options).getHome();\n if (!home || typeof home !== \"string\") {\n throw new Error(\"Agent server returned an empty home directory\");\n }\n return home.replace(/[/\\\\]+$/, \"\");\n })();\n\n homeDirCache.set(cacheKey, lookup);\n try {\n return await lookup;\n } catch (error) {\n // Don't cache failures — let the next call retry.\n homeDirCache.delete(cacheKey);\n throw error;\n }\n}\n\n/** Test-only helper. */\nexport function clearAgentServerHomeDirCache(): void {\n homeDirCache.clear();\n}\n\n/**\n * Resolve a (possibly relative) working dir to an absolute path the\n * agent-server's file APIs will accept.\n *\n * - If `workingDir` is already absolute, returns it unchanged.\n * - Otherwise prepends the agent-server's home dir (looked up via\n * `/api/file/home` and cached). This matches how the published binary\n * and Docker entrypoint expect to anchor relative working dirs: under\n * `~/workspace/project` rather than the filesystem root.\n *\n * Why this matters: the agent-server's `/api/file/upload` endpoint requires\n * an absolute path and `mkdir -p`s the parent. Naively prepending `/` to a\n * relative dir like `workspace/project/<hex>` produces `/workspace/...`,\n * which on macOS lives under the SIP-protected read-only root and fails\n * with `Errno 30: Read-only file system: '/workspace'`. Resolving against\n * `Path.home()` instead puts the path somewhere reliably writable.\n */\nexport async function resolveAbsoluteAgentServerPath(\n workingDir: string,\n overrides: AgentServerClientOverrides = {},\n): Promise<string> {\n const trimmed = workingDir.replace(/[/\\\\]+$/, \"\");\n if (!trimmed) {\n return getAgentServerHomeDir(overrides);\n }\n if (isAbsolutePath(trimmed)) return trimmed;\n\n const home = await getAgentServerHomeDir(overrides);\n return joinPath(home, trimmed);\n}\n"],"mappings":"wLAgBA,IAAM,EAAe,IAAI,IAEzB,SAAS,EAAe,EAAuB,CAU7C,MAAO,0BAA0B,KAAK,EAAK,CAO7C,SAAS,EAAS,EAAgB,EAAuB,CAGvD,MAAO,GAFM,EAAO,QAAQ,UAAW,GAE7B,CAAK,GADD,EAAM,QAAQ,UAAW,GACrB,GAepB,eAAsB,EACpB,EAAwC,EAAE,CACzB,CACjB,IAAM,EAAU,EAAA,4BAA4B,EAAU,CAChD,EAAW,EAAQ,KACnB,EAAS,EAAa,IAAI,EAAS,CACzC,GAAI,EAAQ,OAAO,EAEnB,IAAM,GAAU,SAAY,CAC1B,GAAM,CAAE,QAAS,MAAM,IAAI,EAAA,WAAW,EAAQ,CAAC,SAAS,CACxD,GAAI,CAAC,GAAQ,OAAO,GAAS,SAC3B,MAAU,MAAM,gDAAgD,CAElE,OAAO,EAAK,QAAQ,UAAW,GAAG,IAChC,CAEJ,EAAa,IAAI,EAAU,EAAO,CAClC,GAAI,CACF,OAAO,MAAM,QACN,EAAO,CAGd,MADA,EAAa,OAAO,EAAS,CACvB,GA0BV,eAAsB,EACpB,EACA,EAAwC,EAAE,CACzB,CACjB,IAAM,EAAU,EAAW,QAAQ,UAAW,GAAG,CAOjD,OANK,EAGD,EAAe,EAAQ,CAAS,EAG7B,EAAS,MADG,EAAsB,EAAU,CAC7B,EAAQ,CALrB,EAAsB,EAAU"}
@@ -0,0 +1,34 @@
1
+ import { type AgentServerClientOverrides } from "./agent-server-client-options";
2
+ /**
3
+ * Fetch and cache the agent-server's home directory via `GET /api/file/home`.
4
+ *
5
+ * The result is the absolute path returned by `Path.home()` on the
6
+ * agent-server host (e.g. `/Users/foo`, `/root`, or `C:\\Users\\Foo`). This
7
+ * is the most reliable absolute, writable anchor the agent-server API
8
+ * currently exposes — `/server_info` doesn't include the process CWD.
9
+ *
10
+ * @param overrides Same shape as `getAgentServerClientOptions` — lets cloud
11
+ * sandboxes pass a `conversationUrl` + `sessionApiKey` so the lookup goes
12
+ * to the per-conversation runtime rather than the bundled local backend.
13
+ */
14
+ export declare function getAgentServerHomeDir(overrides?: AgentServerClientOverrides): Promise<string>;
15
+ /** Test-only helper. */
16
+ export declare function clearAgentServerHomeDirCache(): void;
17
+ /**
18
+ * Resolve a (possibly relative) working dir to an absolute path the
19
+ * agent-server's file APIs will accept.
20
+ *
21
+ * - If `workingDir` is already absolute, returns it unchanged.
22
+ * - Otherwise prepends the agent-server's home dir (looked up via
23
+ * `/api/file/home` and cached). This matches how the published binary
24
+ * and Docker entrypoint expect to anchor relative working dirs: under
25
+ * `~/workspace/project` rather than the filesystem root.
26
+ *
27
+ * Why this matters: the agent-server's `/api/file/upload` endpoint requires
28
+ * an absolute path and `mkdir -p`s the parent. Naively prepending `/` to a
29
+ * relative dir like `workspace/project/<hex>` produces `/workspace/...`,
30
+ * which on macOS lives under the SIP-protected read-only root and fails
31
+ * with `Errno 30: Read-only file system: '/workspace'`. Resolving against
32
+ * `Path.home()` instead puts the path somewhere reliably writable.
33
+ */
34
+ export declare function resolveAbsoluteAgentServerPath(workingDir: string, overrides?: AgentServerClientOverrides): Promise<string>;
@@ -0,0 +1,33 @@
1
+ import { FileClient as e } from "../node_modules/@openhands/typescript-client/dist/client/file-client.js";
2
+ import { getAgentServerClientOptions as t } from "./agent-server-client-options.js";
3
+ //#region src/api/agent-server-home.ts
4
+ var n = /* @__PURE__ */ new Map();
5
+ function r(e) {
6
+ return /^([/\\]|[a-zA-Z]:[/\\])/.test(e);
7
+ }
8
+ function i(e, t) {
9
+ return `${e.replace(/[/\\]+$/, "")}/${t.replace(/^[/\\]+/, "")}`;
10
+ }
11
+ async function a(r = {}) {
12
+ let i = t(r), a = i.host, o = n.get(a);
13
+ if (o) return o;
14
+ let s = (async () => {
15
+ let { home: t } = await new e(i).getHome();
16
+ if (!t || typeof t != "string") throw Error("Agent server returned an empty home directory");
17
+ return t.replace(/[/\\]+$/, "");
18
+ })();
19
+ n.set(a, s);
20
+ try {
21
+ return await s;
22
+ } catch (e) {
23
+ throw n.delete(a), e;
24
+ }
25
+ }
26
+ async function o(e, t = {}) {
27
+ let n = e.replace(/[/\\]+$/, "");
28
+ return n ? r(n) ? n : i(await a(t), n) : a(t);
29
+ }
30
+ //#endregion
31
+ export { o as resolveAbsoluteAgentServerPath };
32
+
33
+ //# sourceMappingURL=agent-server-home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-server-home.js","names":[],"sources":["../../src/api/agent-server-home.ts"],"sourcesContent":["// @spec WUP-001 — Resolve relative working dirs against /api/file/home\nimport { FileClient } from \"@openhands/typescript-client/clients\";\nimport {\n getAgentServerClientOptions,\n type AgentServerClientOverrides,\n} from \"./agent-server-client-options\";\n\n/**\n * Cache the agent-server's home directory per host so we only round-trip\n * `/api/file/home` once per backend. The home dir is effectively static for\n * the lifetime of a running agent-server (it's `Path.home()` on the host),\n * so caching is safe and avoids hammering the endpoint on every upload.\n *\n * The cache holds `Promise<string>` rather than `string` so concurrent\n * callers share a single in-flight request.\n */\nconst homeDirCache = new Map<string, Promise<string>>();\n\nfunction isAbsolutePath(path: string): boolean {\n // Treat POSIX-style and Windows-style absolute paths as absolute.\n // The agent-server itself is POSIX on Linux/macOS and uses `\\\\` style\n // on Windows; we just need to know whether `Path(path).is_absolute()`\n // would return true on the server.\n //\n // Patterns covered:\n // POSIX absolute: /foo/bar\n // Windows drive: C:\\foo or C:/foo\n // Windows UNC: \\\\server\\share (starts with `\\`, matches `[/\\\\]`)\n return /^([/\\\\]|[a-zA-Z]:[/\\\\])/.test(path);\n}\n\n/**\n * Join a parent directory and a relative child segment with a forward slash,\n * collapsing any duplicate separators that result from the join.\n */\nfunction joinPath(parent: string, child: string): string {\n const left = parent.replace(/[/\\\\]+$/, \"\");\n const right = child.replace(/^[/\\\\]+/, \"\");\n return `${left}/${right}`;\n}\n\n/**\n * Fetch and cache the agent-server's home directory via `GET /api/file/home`.\n *\n * The result is the absolute path returned by `Path.home()` on the\n * agent-server host (e.g. `/Users/foo`, `/root`, or `C:\\\\Users\\\\Foo`). This\n * is the most reliable absolute, writable anchor the agent-server API\n * currently exposes — `/server_info` doesn't include the process CWD.\n *\n * @param overrides Same shape as `getAgentServerClientOptions` — lets cloud\n * sandboxes pass a `conversationUrl` + `sessionApiKey` so the lookup goes\n * to the per-conversation runtime rather than the bundled local backend.\n */\nexport async function getAgentServerHomeDir(\n overrides: AgentServerClientOverrides = {},\n): Promise<string> {\n const options = getAgentServerClientOptions(overrides);\n const cacheKey = options.host;\n const cached = homeDirCache.get(cacheKey);\n if (cached) return cached;\n\n const lookup = (async () => {\n const { home } = await new FileClient(options).getHome();\n if (!home || typeof home !== \"string\") {\n throw new Error(\"Agent server returned an empty home directory\");\n }\n return home.replace(/[/\\\\]+$/, \"\");\n })();\n\n homeDirCache.set(cacheKey, lookup);\n try {\n return await lookup;\n } catch (error) {\n // Don't cache failures — let the next call retry.\n homeDirCache.delete(cacheKey);\n throw error;\n }\n}\n\n/** Test-only helper. */\nexport function clearAgentServerHomeDirCache(): void {\n homeDirCache.clear();\n}\n\n/**\n * Resolve a (possibly relative) working dir to an absolute path the\n * agent-server's file APIs will accept.\n *\n * - If `workingDir` is already absolute, returns it unchanged.\n * - Otherwise prepends the agent-server's home dir (looked up via\n * `/api/file/home` and cached). This matches how the published binary\n * and Docker entrypoint expect to anchor relative working dirs: under\n * `~/workspace/project` rather than the filesystem root.\n *\n * Why this matters: the agent-server's `/api/file/upload` endpoint requires\n * an absolute path and `mkdir -p`s the parent. Naively prepending `/` to a\n * relative dir like `workspace/project/<hex>` produces `/workspace/...`,\n * which on macOS lives under the SIP-protected read-only root and fails\n * with `Errno 30: Read-only file system: '/workspace'`. Resolving against\n * `Path.home()` instead puts the path somewhere reliably writable.\n */\nexport async function resolveAbsoluteAgentServerPath(\n workingDir: string,\n overrides: AgentServerClientOverrides = {},\n): Promise<string> {\n const trimmed = workingDir.replace(/[/\\\\]+$/, \"\");\n if (!trimmed) {\n return getAgentServerHomeDir(overrides);\n }\n if (isAbsolutePath(trimmed)) return trimmed;\n\n const home = await getAgentServerHomeDir(overrides);\n return joinPath(home, trimmed);\n}\n"],"mappings":";;;AAgBA,IAAM,oBAAe,IAAI,KAA8B;AAEvD,SAAS,EAAe,GAAuB;AAU7C,QAAO,0BAA0B,KAAK,EAAK;;AAO7C,SAAS,EAAS,GAAgB,GAAuB;AAGvD,QAAO,GAFM,EAAO,QAAQ,WAAW,GAE7B,CAAK,GADD,EAAM,QAAQ,WAAW,GACrB;;AAepB,eAAsB,EACpB,IAAwC,EAAE,EACzB;CACjB,IAAM,IAAU,EAA4B,EAAU,EAChD,IAAW,EAAQ,MACnB,IAAS,EAAa,IAAI,EAAS;AACzC,KAAI,EAAQ,QAAO;CAEnB,IAAM,KAAU,YAAY;EAC1B,IAAM,EAAE,YAAS,MAAM,IAAI,EAAW,EAAQ,CAAC,SAAS;AACxD,MAAI,CAAC,KAAQ,OAAO,KAAS,SAC3B,OAAU,MAAM,gDAAgD;AAElE,SAAO,EAAK,QAAQ,WAAW,GAAG;KAChC;AAEJ,GAAa,IAAI,GAAU,EAAO;AAClC,KAAI;AACF,SAAO,MAAM;UACN,GAAO;AAGd,QADA,EAAa,OAAO,EAAS,EACvB;;;AA0BV,eAAsB,EACpB,GACA,IAAwC,EAAE,EACzB;CACjB,IAAM,IAAU,EAAW,QAAQ,WAAW,GAAG;AAOjD,QANK,IAGD,EAAe,EAAQ,GAAS,IAG7B,EAAS,MADG,EAAsB,EAAU,EAC7B,EAAQ,GALrB,EAAsB,EAAU"}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./backend-registry/active-store.cjs`),t=require(`./agent-server-client-options.cjs`),n=require(`../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs`),r=require(`./cloud/conversation-service.api.cjs`),i=require(`./workspace-upload-path.cjs`);var a=5;async function o(t,n){if(n?.id===t&&n.conversation_url?.trim()&&n.session_api_key?.trim())return{conversationUrl:n.conversation_url.trim(),sessionApiKey:n.session_api_key.trim()};if(e.getActiveBackend().backend.kind===`cloud`){let[e]=await r.batchGetCloudConversations([t]);return{conversationUrl:e?.conversation_url?.trim()??null,sessionApiKey:e?.session_api_key?.trim()??null}}return{conversationUrl:null,sessionApiKey:null}}function s(e){if(!e.conversationUrl||!e.sessionApiKey)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return{conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey}}async function c(t,n,r){let a=await i.resolveConversationUploadWorkingDir(t,r),c=await o(t,r),u=e.getActiveBackend().backend.kind===`cloud`,d=r?.id===t?r.session_api_key??c.sessionApiKey:c.sessionApiKey,f=r?.id===t?r.conversation_url??c.conversationUrl:c.conversationUrl;if(u){let e=s({conversationUrl:f,sessionApiKey:d});return l({files:n,workingDir:a,conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey})}return l({files:n,workingDir:a,conversationUrl:f,sessionApiKey:d})}async function l(e){let{files:r,workingDir:o,conversationUrl:s,sessionApiKey:c}=e,l=new n.RemoteWorkspace(t.getAgentServerClientOptions({conversationUrl:s,sessionApiKey:c,workingDir:o})),u=async e=>{try{let t=i.getSafeUploadFileName(e.name),n=i.buildWorkspaceUploadPath(e.name,o);return await l.fileUpload(e,n),{uploadedFile:t,skippedFile:null}}catch(t){return{uploadedFile:null,skippedFile:{name:e.name,reason:t instanceof Error?t.message:`Upload failed`}}}},d=[];for(let e=0;e<r.length;e+=a){let t=r.slice(e,e+a);d.push(...await Promise.all(t.map(u)))}return{uploaded_files:d.flatMap(e=>e.uploadedFile?[e.uploadedFile]:[]),skipped_files:d.flatMap(e=>e.skippedFile?[e.skippedFile]:[])}}exports.resolveConversationRuntime=o,exports.uploadFilesToConversation=c;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./backend-registry/active-store.cjs`),t=require(`./agent-server-client-options.cjs`),n=require(`../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs`),r=require(`./cloud/conversation-service.api.cjs`),i=require(`./workspace-upload-path.cjs`);var a=5;async function o(t,n){if(n?.id===t&&n.conversation_url?.trim()&&n.session_api_key?.trim())return{conversationUrl:n.conversation_url.trim(),sessionApiKey:n.session_api_key.trim()};if(e.getActiveBackend().backend.kind===`cloud`){let[e]=await r.batchGetCloudConversations([t]);return{conversationUrl:e?.conversation_url?.trim()??null,sessionApiKey:e?.session_api_key?.trim()??null}}return{conversationUrl:null,sessionApiKey:null}}function s(e){if(!e.conversationUrl||!e.sessionApiKey)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return{conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey}}async function c(t,n,r){let a=await i.resolveConversationUploadWorkingDir(t,r),c=await o(t,r),u=e.getActiveBackend().backend.kind===`cloud`,d=r?.id===t?r.session_api_key??c.sessionApiKey:c.sessionApiKey,f=r?.id===t?r.conversation_url??c.conversationUrl:c.conversationUrl;if(u){let e=s({conversationUrl:f,sessionApiKey:d});return l({files:n,workingDir:a,conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey})}return l({files:n,workingDir:a,conversationUrl:f,sessionApiKey:d})}async function l(e){let{files:r,workingDir:o,conversationUrl:s,sessionApiKey:c}=e,l=new n.RemoteWorkspace(t.getAgentServerClientOptions({conversationUrl:s,sessionApiKey:c,workingDir:o})),u=async e=>{try{let t=i.getSafeUploadFileName(e.name),n=await i.buildWorkspaceUploadPath(e.name,o,{conversationUrl:s,sessionApiKey:c});return await l.fileUpload(e,n),{uploadedFile:t,skippedFile:null}}catch(t){return{uploadedFile:null,skippedFile:{name:e.name,reason:t instanceof Error?t.message:`Upload failed`}}}},d=[];for(let e=0;e<r.length;e+=a){let t=r.slice(e,e+a);d.push(...await Promise.all(t.map(u)))}return{uploaded_files:d.flatMap(e=>e.uploadedFile?[e.uploadedFile]:[]),skipped_files:d.flatMap(e=>e.skippedFile?[e.skippedFile]:[])}}exports.resolveConversationRuntime=o,exports.uploadFilesToConversation=c;
2
2
  //# sourceMappingURL=conversation-file-upload.api.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-file-upload.api.cjs","names":[],"sources":["../../src/api/conversation-file-upload.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { batchGetCloudConversations } from \"#/api/cloud/conversation-service.api\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { FileUploadSuccessResponse } from \"#/api/open-hands.types\";\nimport {\n buildWorkspaceUploadPath,\n getSafeUploadFileName,\n resolveConversationUploadWorkingDir,\n} from \"#/api/workspace-upload-path\";\n\nconst FILE_UPLOAD_CONCURRENCY = 5;\n\nexport interface ConversationRuntimeContext {\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}\n\n/**\n * Resolve the sandbox runtime URL + session key needed for file upload and\n * send-event calls. Cloud conversations only exist on the provisioned runtime,\n * not on the bundled local agent-server.\n */\nexport async function resolveConversationRuntime(\n conversationId: string,\n currentConversation?: AppConversation | null,\n): Promise<ConversationRuntimeContext> {\n if (\n currentConversation?.id === conversationId &&\n currentConversation.conversation_url?.trim() &&\n currentConversation.session_api_key?.trim()\n ) {\n return {\n conversationUrl: currentConversation.conversation_url.trim(),\n sessionApiKey: currentConversation.session_api_key.trim(),\n };\n }\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n const [conversation] = await batchGetCloudConversations([conversationId]);\n return {\n conversationUrl: conversation?.conversation_url?.trim() ?? null,\n sessionApiKey: conversation?.session_api_key?.trim() ?? null,\n };\n }\n\n return { conversationUrl: null, sessionApiKey: null };\n}\n\nfunction requireCloudRuntime(\n runtime: ConversationRuntimeContext,\n): ConversationRuntimeContext & {\n conversationUrl: string;\n sessionApiKey: string;\n} {\n if (!runtime.conversationUrl || !runtime.sessionApiKey) {\n throw new Error(\n \"Conversation sandbox is still starting. Wait for it to finish, then try again.\",\n );\n }\n return {\n conversationUrl: runtime.conversationUrl,\n sessionApiKey: runtime.sessionApiKey,\n };\n}\n\n/**\n * Upload attachments into the conversation workspace. Local conversations use\n * the bundled agent-server; cloud conversations target the provisioned runtime.\n */\nexport async function uploadFilesToConversation(\n conversationId: string,\n files: File[],\n currentConversation?: AppConversation | null,\n): Promise<FileUploadSuccessResponse> {\n const workingDir = await resolveConversationUploadWorkingDir(\n conversationId,\n currentConversation,\n );\n const runtime = await resolveConversationRuntime(\n conversationId,\n currentConversation,\n );\n const isCloud = getActiveBackend().backend.kind === \"cloud\";\n\n const sessionApiKey =\n currentConversation?.id === conversationId\n ? (currentConversation.session_api_key ?? runtime.sessionApiKey)\n : runtime.sessionApiKey;\n const conversationUrl =\n currentConversation?.id === conversationId\n ? (currentConversation.conversation_url ?? runtime.conversationUrl)\n : runtime.conversationUrl;\n\n if (isCloud) {\n const cloudRuntime = requireCloudRuntime({\n conversationUrl,\n sessionApiKey,\n });\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl: cloudRuntime.conversationUrl,\n sessionApiKey: cloudRuntime.sessionApiKey,\n });\n }\n\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl,\n sessionApiKey,\n });\n}\n\nasync function uploadFilesToRuntime(options: {\n files: File[];\n workingDir: string;\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}): Promise<FileUploadSuccessResponse> {\n const { files, workingDir, conversationUrl, sessionApiKey } = options;\n const workspace = new RemoteWorkspace(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n workingDir,\n }),\n );\n\n const uploadFile = async (file: File) => {\n try {\n const safeName = getSafeUploadFileName(file.name);\n const uploadPath = buildWorkspaceUploadPath(file.name, workingDir);\n await workspace.fileUpload(file, uploadPath);\n return { uploadedFile: safeName, skippedFile: null };\n } catch (error) {\n return {\n uploadedFile: null,\n skippedFile: {\n name: file.name,\n reason: error instanceof Error ? error.message : \"Upload failed\",\n },\n };\n }\n };\n\n const results: Awaited<ReturnType<typeof uploadFile>>[] = [];\n for (let index = 0; index < files.length; index += FILE_UPLOAD_CONCURRENCY) {\n const batch = files.slice(index, index + FILE_UPLOAD_CONCURRENCY);\n results.push(...(await Promise.all(batch.map(uploadFile))));\n }\n\n return {\n uploaded_files: results.flatMap((result) =>\n result.uploadedFile ? [result.uploadedFile] : [],\n ),\n skipped_files: results.flatMap((result) =>\n result.skippedFile ? [result.skippedFile] : [],\n ),\n };\n}\n"],"mappings":"4UAYA,IAAM,EAA0B,EAYhC,eAAsB,EACpB,EACA,EACqC,CACrC,GACE,GAAqB,KAAO,GAC5B,EAAoB,kBAAkB,MAAM,EAC5C,EAAoB,iBAAiB,MAAM,CAE3C,MAAO,CACL,gBAAiB,EAAoB,iBAAiB,MAAM,CAC5D,cAAe,EAAoB,gBAAgB,MAAM,CAC1D,CAGH,GAAI,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAAS,CAC/C,GAAM,CAAC,GAAgB,MAAM,EAAA,2BAA2B,CAAC,EAAe,CAAC,CACzE,MAAO,CACL,gBAAiB,GAAc,kBAAkB,MAAM,EAAI,KAC3D,cAAe,GAAc,iBAAiB,MAAM,EAAI,KACzD,CAGH,MAAO,CAAE,gBAAiB,KAAM,cAAe,KAAM,CAGvD,SAAS,EACP,EAIA,CACA,GAAI,CAAC,EAAQ,iBAAmB,CAAC,EAAQ,cACvC,MAAU,MACR,iFACD,CAEH,MAAO,CACL,gBAAiB,EAAQ,gBACzB,cAAe,EAAQ,cACxB,CAOH,eAAsB,EACpB,EACA,EACA,EACoC,CACpC,IAAM,EAAa,MAAM,EAAA,oCACvB,EACA,EACD,CACK,EAAU,MAAM,EACpB,EACA,EACD,CACK,EAAU,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAE9C,EACJ,GAAqB,KAAO,EACvB,EAAoB,iBAAmB,EAAQ,cAChD,EAAQ,cACR,EACJ,GAAqB,KAAO,EACvB,EAAoB,kBAAoB,EAAQ,gBACjD,EAAQ,gBAEd,GAAI,EAAS,CACX,IAAM,EAAe,EAAoB,CACvC,kBACA,gBACD,CAAC,CACF,OAAO,EAAqB,CAC1B,QACA,aACA,gBAAiB,EAAa,gBAC9B,cAAe,EAAa,cAC7B,CAAC,CAGJ,OAAO,EAAqB,CAC1B,QACA,aACA,kBACA,gBACD,CAAC,CAGJ,eAAe,EAAqB,EAKG,CACrC,GAAM,CAAE,QAAO,aAAY,kBAAiB,iBAAkB,EACxD,EAAY,IAAI,EAAA,gBACpB,EAAA,4BAA4B,CAC1B,kBACA,gBACA,aACD,CAAC,CACH,CAEK,EAAa,KAAO,IAAe,CACvC,GAAI,CACF,IAAM,EAAW,EAAA,sBAAsB,EAAK,KAAK,CAC3C,EAAa,EAAA,yBAAyB,EAAK,KAAM,EAAW,CAElE,OADA,MAAM,EAAU,WAAW,EAAM,EAAW,CACrC,CAAE,aAAc,EAAU,YAAa,KAAM,OAC7C,EAAO,CACd,MAAO,CACL,aAAc,KACd,YAAa,CACX,KAAM,EAAK,KACX,OAAQ,aAAiB,MAAQ,EAAM,QAAU,gBAClD,CACF,GAIC,EAAoD,EAAE,CAC5D,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAM,OAAQ,GAAS,EAAyB,CAC1E,IAAM,EAAQ,EAAM,MAAM,EAAO,EAAQ,EAAwB,CACjE,EAAQ,KAAK,GAAI,MAAM,QAAQ,IAAI,EAAM,IAAI,EAAW,CAAC,CAAE,CAG7D,MAAO,CACL,eAAgB,EAAQ,QAAS,GAC/B,EAAO,aAAe,CAAC,EAAO,aAAa,CAAG,EAAE,CACjD,CACD,cAAe,EAAQ,QAAS,GAC9B,EAAO,YAAc,CAAC,EAAO,YAAY,CAAG,EAAE,CAC/C,CACF"}
1
+ {"version":3,"file":"conversation-file-upload.api.cjs","names":[],"sources":["../../src/api/conversation-file-upload.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { batchGetCloudConversations } from \"#/api/cloud/conversation-service.api\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { FileUploadSuccessResponse } from \"#/api/open-hands.types\";\nimport {\n buildWorkspaceUploadPath,\n getSafeUploadFileName,\n resolveConversationUploadWorkingDir,\n} from \"#/api/workspace-upload-path\";\n\nconst FILE_UPLOAD_CONCURRENCY = 5;\n\nexport interface ConversationRuntimeContext {\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}\n\n/**\n * Resolve the sandbox runtime URL + session key needed for file upload and\n * send-event calls. Cloud conversations only exist on the provisioned runtime,\n * not on the bundled local agent-server.\n */\nexport async function resolveConversationRuntime(\n conversationId: string,\n currentConversation?: AppConversation | null,\n): Promise<ConversationRuntimeContext> {\n if (\n currentConversation?.id === conversationId &&\n currentConversation.conversation_url?.trim() &&\n currentConversation.session_api_key?.trim()\n ) {\n return {\n conversationUrl: currentConversation.conversation_url.trim(),\n sessionApiKey: currentConversation.session_api_key.trim(),\n };\n }\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n const [conversation] = await batchGetCloudConversations([conversationId]);\n return {\n conversationUrl: conversation?.conversation_url?.trim() ?? null,\n sessionApiKey: conversation?.session_api_key?.trim() ?? null,\n };\n }\n\n return { conversationUrl: null, sessionApiKey: null };\n}\n\nfunction requireCloudRuntime(\n runtime: ConversationRuntimeContext,\n): ConversationRuntimeContext & {\n conversationUrl: string;\n sessionApiKey: string;\n} {\n if (!runtime.conversationUrl || !runtime.sessionApiKey) {\n throw new Error(\n \"Conversation sandbox is still starting. Wait for it to finish, then try again.\",\n );\n }\n return {\n conversationUrl: runtime.conversationUrl,\n sessionApiKey: runtime.sessionApiKey,\n };\n}\n\n/**\n * Upload attachments into the conversation workspace. Local conversations use\n * the bundled agent-server; cloud conversations target the provisioned runtime.\n */\nexport async function uploadFilesToConversation(\n conversationId: string,\n files: File[],\n currentConversation?: AppConversation | null,\n): Promise<FileUploadSuccessResponse> {\n const workingDir = await resolveConversationUploadWorkingDir(\n conversationId,\n currentConversation,\n );\n const runtime = await resolveConversationRuntime(\n conversationId,\n currentConversation,\n );\n const isCloud = getActiveBackend().backend.kind === \"cloud\";\n\n const sessionApiKey =\n currentConversation?.id === conversationId\n ? (currentConversation.session_api_key ?? runtime.sessionApiKey)\n : runtime.sessionApiKey;\n const conversationUrl =\n currentConversation?.id === conversationId\n ? (currentConversation.conversation_url ?? runtime.conversationUrl)\n : runtime.conversationUrl;\n\n if (isCloud) {\n const cloudRuntime = requireCloudRuntime({\n conversationUrl,\n sessionApiKey,\n });\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl: cloudRuntime.conversationUrl,\n sessionApiKey: cloudRuntime.sessionApiKey,\n });\n }\n\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl,\n sessionApiKey,\n });\n}\n\nasync function uploadFilesToRuntime(options: {\n files: File[];\n workingDir: string;\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}): Promise<FileUploadSuccessResponse> {\n const { files, workingDir, conversationUrl, sessionApiKey } = options;\n const workspace = new RemoteWorkspace(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n workingDir,\n }),\n );\n\n const uploadFile = async (file: File) => {\n try {\n const safeName = getSafeUploadFileName(file.name);\n // @spec WUP-001 — Build an absolute upload path that's anchored against\n // the agent-server's home dir (when `workingDir` is relative) instead\n // of the filesystem root. Without this, default conversations whose\n // working_dir is `workspace/project/<hex>` (relative) land at\n // `/workspace/project/<hex>/...` on the agent-server, which on macOS\n // and fresh containers is a read-only mount.\n const uploadPath = await buildWorkspaceUploadPath(file.name, workingDir, {\n conversationUrl,\n sessionApiKey,\n });\n await workspace.fileUpload(file, uploadPath);\n return { uploadedFile: safeName, skippedFile: null };\n } catch (error) {\n return {\n uploadedFile: null,\n skippedFile: {\n name: file.name,\n reason: error instanceof Error ? error.message : \"Upload failed\",\n },\n };\n }\n };\n\n const results: Awaited<ReturnType<typeof uploadFile>>[] = [];\n for (let index = 0; index < files.length; index += FILE_UPLOAD_CONCURRENCY) {\n const batch = files.slice(index, index + FILE_UPLOAD_CONCURRENCY);\n results.push(...(await Promise.all(batch.map(uploadFile))));\n }\n\n return {\n uploaded_files: results.flatMap((result) =>\n result.uploadedFile ? [result.uploadedFile] : [],\n ),\n skipped_files: results.flatMap((result) =>\n result.skippedFile ? [result.skippedFile] : [],\n ),\n };\n}\n"],"mappings":"4UAYA,IAAM,EAA0B,EAYhC,eAAsB,EACpB,EACA,EACqC,CACrC,GACE,GAAqB,KAAO,GAC5B,EAAoB,kBAAkB,MAAM,EAC5C,EAAoB,iBAAiB,MAAM,CAE3C,MAAO,CACL,gBAAiB,EAAoB,iBAAiB,MAAM,CAC5D,cAAe,EAAoB,gBAAgB,MAAM,CAC1D,CAGH,GAAI,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAAS,CAC/C,GAAM,CAAC,GAAgB,MAAM,EAAA,2BAA2B,CAAC,EAAe,CAAC,CACzE,MAAO,CACL,gBAAiB,GAAc,kBAAkB,MAAM,EAAI,KAC3D,cAAe,GAAc,iBAAiB,MAAM,EAAI,KACzD,CAGH,MAAO,CAAE,gBAAiB,KAAM,cAAe,KAAM,CAGvD,SAAS,EACP,EAIA,CACA,GAAI,CAAC,EAAQ,iBAAmB,CAAC,EAAQ,cACvC,MAAU,MACR,iFACD,CAEH,MAAO,CACL,gBAAiB,EAAQ,gBACzB,cAAe,EAAQ,cACxB,CAOH,eAAsB,EACpB,EACA,EACA,EACoC,CACpC,IAAM,EAAa,MAAM,EAAA,oCACvB,EACA,EACD,CACK,EAAU,MAAM,EACpB,EACA,EACD,CACK,EAAU,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAE9C,EACJ,GAAqB,KAAO,EACvB,EAAoB,iBAAmB,EAAQ,cAChD,EAAQ,cACR,EACJ,GAAqB,KAAO,EACvB,EAAoB,kBAAoB,EAAQ,gBACjD,EAAQ,gBAEd,GAAI,EAAS,CACX,IAAM,EAAe,EAAoB,CACvC,kBACA,gBACD,CAAC,CACF,OAAO,EAAqB,CAC1B,QACA,aACA,gBAAiB,EAAa,gBAC9B,cAAe,EAAa,cAC7B,CAAC,CAGJ,OAAO,EAAqB,CAC1B,QACA,aACA,kBACA,gBACD,CAAC,CAGJ,eAAe,EAAqB,EAKG,CACrC,GAAM,CAAE,QAAO,aAAY,kBAAiB,iBAAkB,EACxD,EAAY,IAAI,EAAA,gBACpB,EAAA,4BAA4B,CAC1B,kBACA,gBACA,aACD,CAAC,CACH,CAEK,EAAa,KAAO,IAAe,CACvC,GAAI,CACF,IAAM,EAAW,EAAA,sBAAsB,EAAK,KAAK,CAO3C,EAAa,MAAM,EAAA,yBAAyB,EAAK,KAAM,EAAY,CACvE,kBACA,gBACD,CAAC,CAEF,OADA,MAAM,EAAU,WAAW,EAAM,EAAW,CACrC,CAAE,aAAc,EAAU,YAAa,KAAM,OAC7C,EAAO,CACd,MAAO,CACL,aAAc,KACd,YAAa,CACX,KAAM,EAAK,KACX,OAAQ,aAAiB,MAAQ,EAAM,QAAU,gBAClD,CACF,GAIC,EAAoD,EAAE,CAC5D,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAM,OAAQ,GAAS,EAAyB,CAC1E,IAAM,EAAQ,EAAM,MAAM,EAAO,EAAQ,EAAwB,CACjE,EAAQ,KAAK,GAAI,MAAM,QAAQ,IAAI,EAAM,IAAI,EAAW,CAAC,CAAE,CAG7D,MAAO,CACL,eAAgB,EAAQ,QAAS,GAC/B,EAAO,aAAe,CAAC,EAAO,aAAa,CAAG,EAAE,CACjD,CACD,cAAe,EAAQ,QAAS,GAC9B,EAAO,YAAc,CAAC,EAAO,YAAY,CAAG,EAAE,CAC/C,CACF"}
@@ -57,7 +57,10 @@ async function d(e) {
57
57
  workingDir: o
58
58
  })), d = async (e) => {
59
59
  try {
60
- let t = a(e.name), n = i(e.name, o);
60
+ let t = a(e.name), n = await i(e.name, o, {
61
+ conversationUrl: c,
62
+ sessionApiKey: l
63
+ });
61
64
  return await u.fileUpload(e, n), {
62
65
  uploadedFile: t,
63
66
  skippedFile: null
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-file-upload.api.js","names":[],"sources":["../../src/api/conversation-file-upload.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { batchGetCloudConversations } from \"#/api/cloud/conversation-service.api\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { FileUploadSuccessResponse } from \"#/api/open-hands.types\";\nimport {\n buildWorkspaceUploadPath,\n getSafeUploadFileName,\n resolveConversationUploadWorkingDir,\n} from \"#/api/workspace-upload-path\";\n\nconst FILE_UPLOAD_CONCURRENCY = 5;\n\nexport interface ConversationRuntimeContext {\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}\n\n/**\n * Resolve the sandbox runtime URL + session key needed for file upload and\n * send-event calls. Cloud conversations only exist on the provisioned runtime,\n * not on the bundled local agent-server.\n */\nexport async function resolveConversationRuntime(\n conversationId: string,\n currentConversation?: AppConversation | null,\n): Promise<ConversationRuntimeContext> {\n if (\n currentConversation?.id === conversationId &&\n currentConversation.conversation_url?.trim() &&\n currentConversation.session_api_key?.trim()\n ) {\n return {\n conversationUrl: currentConversation.conversation_url.trim(),\n sessionApiKey: currentConversation.session_api_key.trim(),\n };\n }\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n const [conversation] = await batchGetCloudConversations([conversationId]);\n return {\n conversationUrl: conversation?.conversation_url?.trim() ?? null,\n sessionApiKey: conversation?.session_api_key?.trim() ?? null,\n };\n }\n\n return { conversationUrl: null, sessionApiKey: null };\n}\n\nfunction requireCloudRuntime(\n runtime: ConversationRuntimeContext,\n): ConversationRuntimeContext & {\n conversationUrl: string;\n sessionApiKey: string;\n} {\n if (!runtime.conversationUrl || !runtime.sessionApiKey) {\n throw new Error(\n \"Conversation sandbox is still starting. Wait for it to finish, then try again.\",\n );\n }\n return {\n conversationUrl: runtime.conversationUrl,\n sessionApiKey: runtime.sessionApiKey,\n };\n}\n\n/**\n * Upload attachments into the conversation workspace. Local conversations use\n * the bundled agent-server; cloud conversations target the provisioned runtime.\n */\nexport async function uploadFilesToConversation(\n conversationId: string,\n files: File[],\n currentConversation?: AppConversation | null,\n): Promise<FileUploadSuccessResponse> {\n const workingDir = await resolveConversationUploadWorkingDir(\n conversationId,\n currentConversation,\n );\n const runtime = await resolveConversationRuntime(\n conversationId,\n currentConversation,\n );\n const isCloud = getActiveBackend().backend.kind === \"cloud\";\n\n const sessionApiKey =\n currentConversation?.id === conversationId\n ? (currentConversation.session_api_key ?? runtime.sessionApiKey)\n : runtime.sessionApiKey;\n const conversationUrl =\n currentConversation?.id === conversationId\n ? (currentConversation.conversation_url ?? runtime.conversationUrl)\n : runtime.conversationUrl;\n\n if (isCloud) {\n const cloudRuntime = requireCloudRuntime({\n conversationUrl,\n sessionApiKey,\n });\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl: cloudRuntime.conversationUrl,\n sessionApiKey: cloudRuntime.sessionApiKey,\n });\n }\n\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl,\n sessionApiKey,\n });\n}\n\nasync function uploadFilesToRuntime(options: {\n files: File[];\n workingDir: string;\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}): Promise<FileUploadSuccessResponse> {\n const { files, workingDir, conversationUrl, sessionApiKey } = options;\n const workspace = new RemoteWorkspace(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n workingDir,\n }),\n );\n\n const uploadFile = async (file: File) => {\n try {\n const safeName = getSafeUploadFileName(file.name);\n const uploadPath = buildWorkspaceUploadPath(file.name, workingDir);\n await workspace.fileUpload(file, uploadPath);\n return { uploadedFile: safeName, skippedFile: null };\n } catch (error) {\n return {\n uploadedFile: null,\n skippedFile: {\n name: file.name,\n reason: error instanceof Error ? error.message : \"Upload failed\",\n },\n };\n }\n };\n\n const results: Awaited<ReturnType<typeof uploadFile>>[] = [];\n for (let index = 0; index < files.length; index += FILE_UPLOAD_CONCURRENCY) {\n const batch = files.slice(index, index + FILE_UPLOAD_CONCURRENCY);\n results.push(...(await Promise.all(batch.map(uploadFile))));\n }\n\n return {\n uploaded_files: results.flatMap((result) =>\n result.uploadedFile ? [result.uploadedFile] : [],\n ),\n skipped_files: results.flatMap((result) =>\n result.skippedFile ? [result.skippedFile] : [],\n ),\n };\n}\n"],"mappings":";;;;;;AAYA,IAAM,IAA0B;AAYhC,eAAsB,EACpB,GACA,GACqC;AACrC,KACE,GAAqB,OAAO,KAC5B,EAAoB,kBAAkB,MAAM,IAC5C,EAAoB,iBAAiB,MAAM,CAE3C,QAAO;EACL,iBAAiB,EAAoB,iBAAiB,MAAM;EAC5D,eAAe,EAAoB,gBAAgB,MAAM;EAC1D;AAGH,KAAI,GAAkB,CAAC,QAAQ,SAAS,SAAS;EAC/C,IAAM,CAAC,KAAgB,MAAM,EAA2B,CAAC,EAAe,CAAC;AACzE,SAAO;GACL,iBAAiB,GAAc,kBAAkB,MAAM,IAAI;GAC3D,eAAe,GAAc,iBAAiB,MAAM,IAAI;GACzD;;AAGH,QAAO;EAAE,iBAAiB;EAAM,eAAe;EAAM;;AAGvD,SAAS,EACP,GAIA;AACA,KAAI,CAAC,EAAQ,mBAAmB,CAAC,EAAQ,cACvC,OAAU,MACR,iFACD;AAEH,QAAO;EACL,iBAAiB,EAAQ;EACzB,eAAe,EAAQ;EACxB;;AAOH,eAAsB,EACpB,GACA,GACA,GACoC;CACpC,IAAM,IAAa,MAAM,EACvB,GACA,EACD,EACK,IAAU,MAAM,EACpB,GACA,EACD,EACK,IAAU,GAAkB,CAAC,QAAQ,SAAS,SAE9C,IACJ,GAAqB,OAAO,IACvB,EAAoB,mBAAmB,EAAQ,gBAChD,EAAQ,eACR,IACJ,GAAqB,OAAO,IACvB,EAAoB,oBAAoB,EAAQ,kBACjD,EAAQ;AAEd,KAAI,GAAS;EACX,IAAM,IAAe,EAAoB;GACvC;GACA;GACD,CAAC;AACF,SAAO,EAAqB;GAC1B;GACA;GACA,iBAAiB,EAAa;GAC9B,eAAe,EAAa;GAC7B,CAAC;;AAGJ,QAAO,EAAqB;EAC1B;EACA;EACA;EACA;EACD,CAAC;;AAGJ,eAAe,EAAqB,GAKG;CACrC,IAAM,EAAE,UAAO,eAAY,oBAAiB,qBAAkB,GACxD,IAAY,IAAI,EACpB,EAA4B;EAC1B;EACA;EACA;EACD,CAAC,CACH,EAEK,IAAa,OAAO,MAAe;AACvC,MAAI;GACF,IAAM,IAAW,EAAsB,EAAK,KAAK,EAC3C,IAAa,EAAyB,EAAK,MAAM,EAAW;AAElE,UADA,MAAM,EAAU,WAAW,GAAM,EAAW,EACrC;IAAE,cAAc;IAAU,aAAa;IAAM;WAC7C,GAAO;AACd,UAAO;IACL,cAAc;IACd,aAAa;KACX,MAAM,EAAK;KACX,QAAQ,aAAiB,QAAQ,EAAM,UAAU;KAClD;IACF;;IAIC,IAAoD,EAAE;AAC5D,MAAK,IAAI,IAAQ,GAAG,IAAQ,EAAM,QAAQ,KAAS,GAAyB;EAC1E,IAAM,IAAQ,EAAM,MAAM,GAAO,IAAQ,EAAwB;AACjE,IAAQ,KAAK,GAAI,MAAM,QAAQ,IAAI,EAAM,IAAI,EAAW,CAAC,CAAE;;AAG7D,QAAO;EACL,gBAAgB,EAAQ,SAAS,MAC/B,EAAO,eAAe,CAAC,EAAO,aAAa,GAAG,EAAE,CACjD;EACD,eAAe,EAAQ,SAAS,MAC9B,EAAO,cAAc,CAAC,EAAO,YAAY,GAAG,EAAE,CAC/C;EACF"}
1
+ {"version":3,"file":"conversation-file-upload.api.js","names":[],"sources":["../../src/api/conversation-file-upload.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { batchGetCloudConversations } from \"#/api/cloud/conversation-service.api\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { FileUploadSuccessResponse } from \"#/api/open-hands.types\";\nimport {\n buildWorkspaceUploadPath,\n getSafeUploadFileName,\n resolveConversationUploadWorkingDir,\n} from \"#/api/workspace-upload-path\";\n\nconst FILE_UPLOAD_CONCURRENCY = 5;\n\nexport interface ConversationRuntimeContext {\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}\n\n/**\n * Resolve the sandbox runtime URL + session key needed for file upload and\n * send-event calls. Cloud conversations only exist on the provisioned runtime,\n * not on the bundled local agent-server.\n */\nexport async function resolveConversationRuntime(\n conversationId: string,\n currentConversation?: AppConversation | null,\n): Promise<ConversationRuntimeContext> {\n if (\n currentConversation?.id === conversationId &&\n currentConversation.conversation_url?.trim() &&\n currentConversation.session_api_key?.trim()\n ) {\n return {\n conversationUrl: currentConversation.conversation_url.trim(),\n sessionApiKey: currentConversation.session_api_key.trim(),\n };\n }\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n const [conversation] = await batchGetCloudConversations([conversationId]);\n return {\n conversationUrl: conversation?.conversation_url?.trim() ?? null,\n sessionApiKey: conversation?.session_api_key?.trim() ?? null,\n };\n }\n\n return { conversationUrl: null, sessionApiKey: null };\n}\n\nfunction requireCloudRuntime(\n runtime: ConversationRuntimeContext,\n): ConversationRuntimeContext & {\n conversationUrl: string;\n sessionApiKey: string;\n} {\n if (!runtime.conversationUrl || !runtime.sessionApiKey) {\n throw new Error(\n \"Conversation sandbox is still starting. Wait for it to finish, then try again.\",\n );\n }\n return {\n conversationUrl: runtime.conversationUrl,\n sessionApiKey: runtime.sessionApiKey,\n };\n}\n\n/**\n * Upload attachments into the conversation workspace. Local conversations use\n * the bundled agent-server; cloud conversations target the provisioned runtime.\n */\nexport async function uploadFilesToConversation(\n conversationId: string,\n files: File[],\n currentConversation?: AppConversation | null,\n): Promise<FileUploadSuccessResponse> {\n const workingDir = await resolveConversationUploadWorkingDir(\n conversationId,\n currentConversation,\n );\n const runtime = await resolveConversationRuntime(\n conversationId,\n currentConversation,\n );\n const isCloud = getActiveBackend().backend.kind === \"cloud\";\n\n const sessionApiKey =\n currentConversation?.id === conversationId\n ? (currentConversation.session_api_key ?? runtime.sessionApiKey)\n : runtime.sessionApiKey;\n const conversationUrl =\n currentConversation?.id === conversationId\n ? (currentConversation.conversation_url ?? runtime.conversationUrl)\n : runtime.conversationUrl;\n\n if (isCloud) {\n const cloudRuntime = requireCloudRuntime({\n conversationUrl,\n sessionApiKey,\n });\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl: cloudRuntime.conversationUrl,\n sessionApiKey: cloudRuntime.sessionApiKey,\n });\n }\n\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl,\n sessionApiKey,\n });\n}\n\nasync function uploadFilesToRuntime(options: {\n files: File[];\n workingDir: string;\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}): Promise<FileUploadSuccessResponse> {\n const { files, workingDir, conversationUrl, sessionApiKey } = options;\n const workspace = new RemoteWorkspace(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n workingDir,\n }),\n );\n\n const uploadFile = async (file: File) => {\n try {\n const safeName = getSafeUploadFileName(file.name);\n // @spec WUP-001 — Build an absolute upload path that's anchored against\n // the agent-server's home dir (when `workingDir` is relative) instead\n // of the filesystem root. Without this, default conversations whose\n // working_dir is `workspace/project/<hex>` (relative) land at\n // `/workspace/project/<hex>/...` on the agent-server, which on macOS\n // and fresh containers is a read-only mount.\n const uploadPath = await buildWorkspaceUploadPath(file.name, workingDir, {\n conversationUrl,\n sessionApiKey,\n });\n await workspace.fileUpload(file, uploadPath);\n return { uploadedFile: safeName, skippedFile: null };\n } catch (error) {\n return {\n uploadedFile: null,\n skippedFile: {\n name: file.name,\n reason: error instanceof Error ? error.message : \"Upload failed\",\n },\n };\n }\n };\n\n const results: Awaited<ReturnType<typeof uploadFile>>[] = [];\n for (let index = 0; index < files.length; index += FILE_UPLOAD_CONCURRENCY) {\n const batch = files.slice(index, index + FILE_UPLOAD_CONCURRENCY);\n results.push(...(await Promise.all(batch.map(uploadFile))));\n }\n\n return {\n uploaded_files: results.flatMap((result) =>\n result.uploadedFile ? [result.uploadedFile] : [],\n ),\n skipped_files: results.flatMap((result) =>\n result.skippedFile ? [result.skippedFile] : [],\n ),\n };\n}\n"],"mappings":";;;;;;AAYA,IAAM,IAA0B;AAYhC,eAAsB,EACpB,GACA,GACqC;AACrC,KACE,GAAqB,OAAO,KAC5B,EAAoB,kBAAkB,MAAM,IAC5C,EAAoB,iBAAiB,MAAM,CAE3C,QAAO;EACL,iBAAiB,EAAoB,iBAAiB,MAAM;EAC5D,eAAe,EAAoB,gBAAgB,MAAM;EAC1D;AAGH,KAAI,GAAkB,CAAC,QAAQ,SAAS,SAAS;EAC/C,IAAM,CAAC,KAAgB,MAAM,EAA2B,CAAC,EAAe,CAAC;AACzE,SAAO;GACL,iBAAiB,GAAc,kBAAkB,MAAM,IAAI;GAC3D,eAAe,GAAc,iBAAiB,MAAM,IAAI;GACzD;;AAGH,QAAO;EAAE,iBAAiB;EAAM,eAAe;EAAM;;AAGvD,SAAS,EACP,GAIA;AACA,KAAI,CAAC,EAAQ,mBAAmB,CAAC,EAAQ,cACvC,OAAU,MACR,iFACD;AAEH,QAAO;EACL,iBAAiB,EAAQ;EACzB,eAAe,EAAQ;EACxB;;AAOH,eAAsB,EACpB,GACA,GACA,GACoC;CACpC,IAAM,IAAa,MAAM,EACvB,GACA,EACD,EACK,IAAU,MAAM,EACpB,GACA,EACD,EACK,IAAU,GAAkB,CAAC,QAAQ,SAAS,SAE9C,IACJ,GAAqB,OAAO,IACvB,EAAoB,mBAAmB,EAAQ,gBAChD,EAAQ,eACR,IACJ,GAAqB,OAAO,IACvB,EAAoB,oBAAoB,EAAQ,kBACjD,EAAQ;AAEd,KAAI,GAAS;EACX,IAAM,IAAe,EAAoB;GACvC;GACA;GACD,CAAC;AACF,SAAO,EAAqB;GAC1B;GACA;GACA,iBAAiB,EAAa;GAC9B,eAAe,EAAa;GAC7B,CAAC;;AAGJ,QAAO,EAAqB;EAC1B;EACA;EACA;EACA;EACD,CAAC;;AAGJ,eAAe,EAAqB,GAKG;CACrC,IAAM,EAAE,UAAO,eAAY,oBAAiB,qBAAkB,GACxD,IAAY,IAAI,EACpB,EAA4B;EAC1B;EACA;EACA;EACD,CAAC,CACH,EAEK,IAAa,OAAO,MAAe;AACvC,MAAI;GACF,IAAM,IAAW,EAAsB,EAAK,KAAK,EAO3C,IAAa,MAAM,EAAyB,EAAK,MAAM,GAAY;IACvE;IACA;IACD,CAAC;AAEF,UADA,MAAM,EAAU,WAAW,GAAM,EAAW,EACrC;IAAE,cAAc;IAAU,aAAa;IAAM;WAC7C,GAAO;AACd,UAAO;IACL,cAAc;IACd,aAAa;KACX,MAAM,EAAK;KACX,QAAQ,aAAiB,QAAQ,EAAM,UAAU;KAClD;IACF;;IAIC,IAAoD,EAAE;AAC5D,MAAK,IAAI,IAAQ,GAAG,IAAQ,EAAM,QAAQ,KAAS,GAAyB;EAC1E,IAAM,IAAQ,EAAM,MAAM,GAAO,IAAQ,EAAwB;AACjE,IAAQ,KAAK,GAAI,MAAM,QAAQ,IAAI,EAAM,IAAI,EAAW,CAAC,CAAE;;AAG7D,QAAO;EACL,gBAAgB,EAAQ,SAAS,MAC/B,EAAO,eAAe,CAAC,EAAO,aAAa,GAAG,EAAE,CACjD;EACD,eAAe,EAAQ,SAAS,MAC9B,EAAO,cAAc,CAAC,EAAO,YAAY,GAAG,EAAE,CAC/C;EACF"}