@openhands/agent-canvas 1.0.0-beta.6 → 1.0.0-beta.8

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 (802) hide show
  1. package/README.md +24 -7
  2. package/README.windows.md +27 -0
  3. package/bin/agent-canvas.mjs +26 -3
  4. package/build/assets/{QueryClientProvider-CkGuhXg-.js → QueryClientProvider-Cnr-Yl3j.js} +1 -1
  5. package/build/assets/{Trans-Cvm_-SMi.js → Trans-4jmk54WC.js} +1 -1
  6. package/build/assets/acp-providers-BAX8OU5C.js +1 -0
  7. package/build/assets/{acp-route-guard-B2yoBZ_4.js → acp-route-guard-HPk6TV-L.js} +1 -1
  8. package/build/assets/active-backend-context-BSPE-W72.js +1 -0
  9. package/build/assets/add-backend-modal-mXKmfMI2.js +1 -0
  10. package/build/assets/agent-server-client-options-9agOSarV.js +1 -0
  11. package/build/assets/agent-server-compatibility-B7QStIcH.js +1 -0
  12. package/build/assets/agent-server-conversation-service.api-B9TUYJon.js +5 -0
  13. package/build/assets/{agent-settings-CnGSCmK8.js → agent-settings-g3F623RJ.js} +1 -1
  14. package/build/assets/{alert-banner-DtzAX654.js → alert-banner-DFnn_lC6.js} +1 -1
  15. package/build/assets/{analytics-consent-form-modal-CHZ3I37v.js → analytics-consent-form-modal-BQCNeNVt.js} +1 -1
  16. package/build/assets/api-key-entry-screen-myuWMqzW.js +1 -0
  17. package/build/assets/{app-settings-Db9ITeJH.js → app-settings-CCcX8ZEH.js} +1 -1
  18. package/build/assets/automation-detail-BDHLHSJd.js +1 -0
  19. package/build/assets/automations-list-CiNtQhq_.js +1 -0
  20. package/build/assets/back-nav-button-7dQJ2k3O.js +1 -0
  21. package/build/assets/backend-form-modal-D3bDMO3C.js +1 -0
  22. package/build/assets/{backend-synced-settings-badge-Dc6c7GT4.js → backend-synced-settings-badge-BkW5evM0.js} +1 -1
  23. package/build/assets/base-modal-C2oy2EBG.js +1 -0
  24. package/build/assets/brand-button-DJ_S16rO.js +1 -0
  25. package/build/assets/{browser-D810xUYt.js → browser-CGM-k-sH.js} +2 -2
  26. package/build/assets/browser-store-DAsixKdU.js +1 -0
  27. package/build/assets/{browser-tab-B-aIqXRl.js → browser-tab-dvSPdvkm.js} +1 -1
  28. package/build/assets/{checkmark-DL7acQA7.js → checkmark-Dus0b6jt.js} +1 -1
  29. package/build/assets/{chevron-left-small-CVWf8TI6.js → chevron-left-small-_uvG7RVM.js} +1 -1
  30. package/build/assets/{circle-plus-check-toggle-P7ZZToV4.js → circle-plus-check-toggle-DKS8MAVV.js} +1 -1
  31. package/build/assets/{close-B5LROHR3.js → close-BU5iTc66.js} +1 -1
  32. package/build/assets/code-tag-BzyqOtPD.js +1 -0
  33. package/build/assets/combobox-caret-BJC7XJsz.js +1 -0
  34. package/build/assets/{command-store-DFN_17p1.js → command-store-CE1weJy8.js} +1 -1
  35. package/build/assets/{condenser-settings-wnEKhBof.js → condenser-settings-DCTulgLO.js} +1 -1
  36. package/build/assets/{confirmation-modal-Dau3w_sa.js → confirmation-modal-B5Ca6qFE.js} +1 -1
  37. package/build/assets/context-menu-list-item-7tAcm2c3.js +1 -0
  38. package/build/assets/conversation-BKhikfYl.js +1 -0
  39. package/build/assets/conversation-DTn8jN8L.js +19 -0
  40. package/build/assets/conversation-panel-DfHR42mG.js +1 -0
  41. package/build/assets/conversation-service.api-B6CkzaKD.js +1 -0
  42. package/build/assets/conversation-state-store-D-w0uurj.js +1 -0
  43. package/build/assets/conversation-store-CC-isCnP.js +1 -0
  44. package/build/assets/{conversation-tab-empty-state-DyssnnWa.js → conversation-tab-empty-state-CStQLPVW.js} +1 -1
  45. package/build/assets/conversation-websocket-context-DShEuLjh.js +3 -0
  46. package/build/assets/{copy-DYgmUdIw.js → copy-Chg-sFu3.js} +1 -1
  47. package/build/assets/{custom-toast-handlers-C-SZFmto.js → custom-toast-handlers-ufGJ6_Rc.js} +1 -1
  48. package/build/assets/declaration-CR6HMp29.js +1 -0
  49. package/build/assets/{device-verify-DqDlphsG.js → device-verify-C6mj28zv.js} +1 -1
  50. package/build/assets/dist-DNeWJ2bh.js +1 -0
  51. package/build/assets/dropdown-classes-BsVmxlNG.js +1 -0
  52. package/build/assets/edit-automation-modal-DamwL0s0.js +1 -0
  53. package/build/assets/ellipsis-button-Vh5MvRZa.js +1 -0
  54. package/build/assets/entry.client-Cn71WM8q.js +2 -0
  55. package/build/assets/enum-filter-dropdown-5JeF2RLb.js +1 -0
  56. package/build/assets/{environment-switch-overlay-XL8yCGP6.js → environment-switch-overlay-Tf_BIfeR.js} +1 -1
  57. package/build/assets/extensions-hub-CUEmfvGy.js +1 -0
  58. package/build/assets/{extensions-navigation-BYR8Giqq.js → extensions-navigation-VQ-3umJ7.js} +1 -1
  59. package/build/assets/file-BTY6Gyy9.js +1 -0
  60. package/build/assets/files-tab-C47fQEeL.js +1 -0
  61. package/build/assets/files-tab-store-m0ARqX_E.js +1 -0
  62. package/build/assets/{folder-ZZJVGgd7.js → folder-D1T2W1cj.js} +1 -1
  63. package/build/assets/git-control-bar-branch-button-BT0aWH-o.js +27 -0
  64. package/build/assets/git-provider-icon-Pi-Cxpgv.js +1 -0
  65. package/build/assets/globe-Bzj_0oXT.js +1 -0
  66. package/build/assets/home-C3k6sFvB.js +1 -0
  67. package/build/assets/{i18n-CTohRuoO.js → i18n-DET2iOyh.js} +1 -1
  68. package/build/assets/install-server-modal-6fuq-TU6.js +1 -0
  69. package/build/assets/launch-DGghLfGx.js +1 -0
  70. package/build/assets/{lesson-plan-dH5Bj0pN.js → lesson-plan-duSsqWVs.js} +1 -1
  71. package/build/assets/link-external-DGxVm4Ps.js +1 -0
  72. package/build/assets/{llm-client-DaH1TuyR.js → llm-client-BqyLKgUN.js} +1 -1
  73. package/build/assets/llm-settings-BKraGtOu.js +1 -0
  74. package/build/assets/llm-settings-DRQTgOF1.js +1 -0
  75. package/build/assets/{loading-spinner-BPtYORNK.js → loading-spinner-5GT9q1xy.js} +1 -1
  76. package/build/assets/manage-backends-modal-CRMwyU0t.js +1 -0
  77. package/build/assets/manage-workspaces-modal-BYmGD1W7.js +1 -0
  78. package/build/assets/manifest-99b06a11.js +1 -0
  79. package/build/assets/{markdown-renderer-DMzf2i4x.js → markdown-renderer-B3IAVfv4.js} +1 -1
  80. package/build/assets/mcp-CfDRAmPn.js +9 -0
  81. package/build/assets/messages-Ba1vaw6t.js +36 -0
  82. package/build/assets/{modal-backdrop-BAbgYsqB.js → modal-backdrop-RfNCrSpK.js} +1 -1
  83. package/build/assets/{modal-body-BI6Ru2Qr.js → modal-body-aoa2fx5W.js} +1 -1
  84. package/build/assets/modal-classes-6YqcqA6y.js +1 -0
  85. package/build/assets/{modal-close-button-t1Gh3qmL.js → modal-close-button-CtWOUMmw.js} +1 -1
  86. package/build/assets/{model-selector-SM9IUz-q.js → model-selector-DcztJSxT.js} +1 -1
  87. package/build/assets/{navigation-context-D0YWpT8d.js → navigation-context-BdKYH32C.js} +1 -1
  88. package/build/assets/{navigation-link-Cn7KP3c5.js → navigation-link-U4vY9i_C.js} +1 -1
  89. package/build/assets/{openhands-logo-CnrF6LKb.js → openhands-logo-CCo0wJZX.js} +1 -1
  90. package/build/assets/{option-service.api-KvY_mZMY.js → option-service.api-CGNANEcT.js} +1 -1
  91. package/build/assets/{organization-service.api-DzYTHTYC.js → organization-service.api-BeuMC9QL.js} +1 -1
  92. package/build/assets/{path-utils-C3bQf6lJ.js → path-utils-z12iCrQO.js} +1 -1
  93. package/build/assets/{plan-components-atxXCF0R.js → plan-components-CRDMQzsS.js} +1 -1
  94. package/build/assets/{planner-tab-BlrCpv-7.js → planner-tab-Dte6Vzza.js} +1 -1
  95. package/build/assets/{profiles-client-D6IkTJof.js → profiles-client-BrqNmaDV.js} +1 -1
  96. package/build/assets/{providers-Bx6EfrzZ.js → providers-eUyo6pgr.js} +1 -1
  97. package/build/assets/proxy-BqDMnUY-.js +1 -0
  98. package/build/assets/{query-client-config-B7u9asM0.js → query-client-config-CRnGSujB.js} +1 -1
  99. package/build/assets/{recommended-automations-launcher-CgV8FyPK.js → recommended-automations-launcher-D5ADbXao.js} +3 -3
  100. package/build/assets/{root-dNntxffj.js → root-BmhaEJJ8.js} +2 -2
  101. package/build/assets/root-Z2VHU4R3.css +1 -0
  102. package/build/assets/root-layout-CNggm0d8.js +2 -0
  103. package/build/assets/{sdk-section-page-DOIKvwSL.js → sdk-section-page-CRCRY3PG.js} +1 -1
  104. package/build/assets/{sdk-settings-schema-DsUf9wu1.js → sdk-settings-schema-CLmJ9sho.js} +1 -1
  105. package/build/assets/{search-27Owlc3A.js → search-SuJctqNJ.js} +1 -1
  106. package/build/assets/secrets-service-B9AFn9OE.js +1 -0
  107. package/build/assets/secrets-settings-0UrKMS60.js +1 -0
  108. package/build/assets/{server-client-DyAQ3NZ_.js → server-client-DYv_GHPl.js} +1 -1
  109. package/build/assets/{settings-BYkVX7vW.js → settings-6t6LGW04.js} +1 -1
  110. package/build/assets/{settings-dropdown-input-BJYvGdg-.js → settings-dropdown-input-BtoovFre.js} +1 -1
  111. package/build/assets/{settings-gear-C77PgE_O.js → settings-gear-Dd8K2_8B.js} +1 -1
  112. package/build/assets/settings-index-CR6Ou73o.js +1 -0
  113. package/build/assets/{settings-input-Bn7F5C75.js → settings-input-CehsXnb3.js} +1 -1
  114. package/build/assets/settings-list-classes-E3v_f6QG.js +1 -0
  115. package/build/assets/settings-modal-T_Yk1Zfo.js +1 -0
  116. package/build/assets/{settings-section-header-context-BgZe5YkE.js → settings-section-header-context-DewwJ0-F.js} +1 -1
  117. package/build/assets/settings-service.api-DwtyDeGh.js +1 -0
  118. package/build/assets/{settings-switch-BeIKrWms.js → settings-switch-BiBuS3xa.js} +1 -1
  119. package/build/assets/{settings-utils-B6Nl07io.js → settings-utils-DY04tWG1.js} +1 -1
  120. package/build/assets/{shared-conversation-AMyqXvpk.js → shared-conversation-BzccsVej.js} +1 -1
  121. package/build/assets/sidebar-mobile-menu-toggle-DGlRg6jG.js +1 -0
  122. package/build/assets/{sidebar-nav-link-BGjiJq-4.js → sidebar-nav-link-dgVb8Fpy.js} +1 -1
  123. package/build/assets/{sidebar-store-Uy3v0AOV.js → sidebar-store-DnQAJAE5.js} +1 -1
  124. package/build/assets/{skill-card-pill-row-DF1axQCG.js → skill-card-pill-row-BW9qvhoK.js} +1 -1
  125. package/build/assets/{skills-ChIKZPK4.js → skills-0GRKX5Xj.js} +1 -1
  126. package/build/assets/{skills-plugins-CcI_19lM.js → skills-plugins-DctDrZ8Y.js} +1 -1
  127. package/build/assets/skills-settings-rvxImDj_.js +2 -0
  128. package/build/assets/{styled-tooltip-CBzrri6o.js → styled-tooltip-hdfMXPQC.js} +1 -1
  129. package/build/assets/{switch-skeleton-DnC9wLp7.js → switch-skeleton-DSKqSx2A.js} +1 -1
  130. package/build/assets/{task-list-tab-DUJn1sgz.js → task-list-tab-DT6_zfUs.js} +1 -1
  131. package/build/assets/{terminal-RmuaSdhJ.js → terminal-CPYWdo4j.js} +1 -1
  132. package/build/assets/{terminal-DgQk1Ay6.js → terminal-KldRPIRT.js} +2 -2
  133. package/build/assets/{toggle-switch-Pvyp2RAN.js → toggle-switch-T2v6sJ6l.js} +1 -1
  134. package/build/assets/{typography-gpuWmrQO.js → typography-BDgnT7Yp.js} +1 -1
  135. package/build/assets/{u-check-circle-IUIfACQQ.js → u-check-circle-DOauqQKb.js} +1 -1
  136. package/build/assets/{u-check-circle-half-C1YxB6py.js → u-check-circle-half-steSK_JB.js} +1 -1
  137. package/build/assets/{u-circuit-BmVikJHu.js → u-circuit-x3ExjBbU.js} +1 -1
  138. package/build/assets/{u-edit-CFvXHqZk.js → u-edit-BbrptMCa.js} +1 -1
  139. package/build/assets/{use-active-conversation-BEFNwnFk.js → use-active-conversation-sPgfSkql.js} +1 -1
  140. package/build/assets/use-agent-settings-schema-B66kGIi_.js +1 -0
  141. package/build/assets/{use-agent-state-Bkrd1FZq.js → use-agent-state-Dp3pD1h3.js} +1 -1
  142. package/build/assets/{use-cloud-current-user-id-CvkXFnTT.js → use-cloud-current-user-id-ClKFPjFz.js} +1 -1
  143. package/build/assets/{use-config-Co1O8-Ey.js → use-config-C9pvb0Sm.js} +1 -1
  144. package/build/assets/{use-create-conversation-CEgXpkfH.js → use-create-conversation-B-lwTnfE.js} +1 -1
  145. package/build/assets/{use-event-store-BT_gV3ut.js → use-event-store-BomO7ywK.js} +1 -1
  146. package/build/assets/{use-get-secrets-DuhdIA59.js → use-get-secrets-oyC7PFRz.js} +1 -1
  147. package/build/assets/{use-handle-plan-click-Ckkm5eIY.js → use-handle-plan-click-DP6Rs-YP.js} +1 -1
  148. package/build/assets/use-is-authed-dw2026rR.js +1 -0
  149. package/build/assets/{use-is-creating-conversation-BZ5hB_Bg.js → use-is-creating-conversation-DX2qSlfL.js} +1 -1
  150. package/build/assets/{use-launch-skill-in-chat-fNN_xGZG.js → use-launch-skill-in-chat-sQNEOLGD.js} +1 -1
  151. package/build/assets/use-llm-profiles-Bh5JqZUZ.js +1 -0
  152. package/build/assets/use-runtime-is-ready-BakOUVU-.js +1 -0
  153. package/build/assets/{use-save-settings-VUrj_QNG.js → use-save-settings-uXXkqvD7.js} +1 -1
  154. package/build/assets/use-settings-DeO7nvpM.js +1 -0
  155. package/build/assets/{use-settings-nav-items-1ZvovKSr.js → use-settings-nav-items-BGMFn25b.js} +1 -1
  156. package/build/assets/{use-skills-DAMLFjKU.js → use-skills-DWIK3l3a.js} +1 -1
  157. package/build/assets/{use-task-list-CLJbuJgM.js → use-task-list-CsT10CBb.js} +1 -1
  158. package/build/assets/{use-unified-vscode-url-DdSRw-6P.js → use-unified-vscode-url-DXPtB317.js} +1 -1
  159. package/build/assets/use-user-conversation-DJen4YIP.js +1 -0
  160. package/build/assets/{useMutation-DqrumCWD.js → useMutation-GSSKKebK.js} +1 -1
  161. package/build/assets/{useTranslation-DCOdSSMl.js → useTranslation-B6voJV4y.js} +1 -1
  162. package/build/assets/utils-DCVfKFRt.js +1 -0
  163. package/build/assets/{vendor~browser-BNjNhjFU.js → vendor~browser-BrOJLj3y.js} +1 -1
  164. package/build/assets/vendor~conversation-panel~conversation-C9o-K1hW.js +1 -0
  165. package/build/assets/vendor~conversation-panel~conversation~index-RXYdJYxU.js +1 -0
  166. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-VnmIZrq3.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-DJS-rJdI.js} +1 -1
  167. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DpAdkv8m.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-6ByzelMS.js} +1 -1
  168. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B92czPCF.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BED5W_c4.js} +1 -1
  169. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-By5W2oHN.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CCbqAFiI.js} +1 -1
  170. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BbFOrAjI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CG96FCly.js} +1 -1
  171. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-smY2r837.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-E4d6IEfI.js} +1 -1
  172. package/build/assets/{vendor~home~mcp~automations-list-Cs-TO3fK.js → vendor~home~mcp~automations-list-CZSK-lT2.js} +1 -1
  173. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-Z3nsiNNq.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CjJdFLoM.js} +1 -1
  174. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-DbfELDJu.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-m8dOii0J.js} +2 -2
  175. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-DjAjXS5J.js → vendor~root-layout~home~conversation-panel~conversation-B5WNMnt4.js} +1 -1
  176. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-CbAhtEMv.js +1 -0
  177. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-6Rm8U_Sr.js +9 -0
  178. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-BkQGKpye.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-tTR8C6m0.js} +1 -1
  179. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-Bbs7UJ5U.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-BJbu9kpL.js} +2 -2
  180. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-DTwbEEcX.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-D8soyAAx.js} +1 -1
  181. package/build/assets/{vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-CDXvdvb2.js → vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-DYXOLEck.js} +1 -1
  182. package/build/assets/{verification-settings-CsbvQcYS.js → verification-settings-C_zHuDx9.js} +1 -1
  183. package/build/assets/{vscode-tab-DjNArCgY.js → vscode-tab-DH9x7xXS.js} +1 -1
  184. package/build/assets/{waiting-for-runtime-message-CntjExbU.js → waiting-for-runtime-message-CdK3btDZ.js} +1 -1
  185. package/build/assets/{x-mark-CrpjscNc.js → x-mark-BrkSPIiT.js} +1 -1
  186. package/build/index.html +4 -4
  187. package/build/locales/ar/openhands.json +20 -2
  188. package/build/locales/ca/openhands.json +20 -2
  189. package/build/locales/de/openhands.json +20 -2
  190. package/build/locales/en/openhands.json +20 -2
  191. package/build/locales/es/openhands.json +20 -2
  192. package/build/locales/fr/openhands.json +20 -2
  193. package/build/locales/it/openhands.json +20 -2
  194. package/build/locales/ja/openhands.json +20 -2
  195. package/build/locales/ko-KR/openhands.json +20 -2
  196. package/build/locales/no/openhands.json +20 -2
  197. package/build/locales/pt/openhands.json +20 -2
  198. package/build/locales/tr/openhands.json +20 -2
  199. package/build/locales/uk/openhands.json +20 -2
  200. package/build/locales/zh-CN/openhands.json +20 -2
  201. package/build/locales/zh-TW/openhands.json +20 -2
  202. package/dist/api/acp-service/acp-service.api.d.ts +18 -0
  203. package/dist/api/agent-server-adapter.cjs +3 -3
  204. package/dist/api/agent-server-adapter.cjs.map +1 -1
  205. package/dist/api/agent-server-adapter.js +54 -55
  206. package/dist/api/agent-server-adapter.js.map +1 -1
  207. package/dist/api/agent-server-client-options.cjs +1 -1
  208. package/dist/api/agent-server-client-options.cjs.map +1 -1
  209. package/dist/api/agent-server-client-options.d.ts +4 -0
  210. package/dist/api/agent-server-client-options.js +18 -12
  211. package/dist/api/agent-server-client-options.js.map +1 -1
  212. package/dist/api/agent-server-compatibility.cjs +1 -1
  213. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  214. package/dist/api/agent-server-compatibility.d.ts +1 -1
  215. package/dist/api/agent-server-compatibility.js +30 -25
  216. package/dist/api/agent-server-compatibility.js.map +1 -1
  217. package/dist/api/agent-server-config.cjs +1 -1
  218. package/dist/api/agent-server-config.cjs.map +1 -1
  219. package/dist/api/agent-server-config.d.ts +15 -48
  220. package/dist/api/agent-server-config.js +25 -69
  221. package/dist/api/agent-server-config.js.map +1 -1
  222. package/dist/api/backend-registry/active-store.cjs +1 -1
  223. package/dist/api/backend-registry/active-store.cjs.map +1 -1
  224. package/dist/api/backend-registry/active-store.d.ts +11 -5
  225. package/dist/api/backend-registry/active-store.js +36 -27
  226. package/dist/api/backend-registry/active-store.js.map +1 -1
  227. package/dist/api/backend-registry/auth.cjs +1 -1
  228. package/dist/api/backend-registry/auth.cjs.map +1 -1
  229. package/dist/api/backend-registry/auth.js +3 -9
  230. package/dist/api/backend-registry/auth.js.map +1 -1
  231. package/dist/api/backend-registry/default-backend.cjs +1 -1
  232. package/dist/api/backend-registry/default-backend.cjs.map +1 -1
  233. package/dist/api/backend-registry/default-backend.d.ts +9 -16
  234. package/dist/api/backend-registry/default-backend.js +5 -4
  235. package/dist/api/backend-registry/default-backend.js.map +1 -1
  236. package/dist/api/backend-registry/storage.cjs +1 -1
  237. package/dist/api/backend-registry/storage.cjs.map +1 -1
  238. package/dist/api/backend-registry/storage.js +67 -34
  239. package/dist/api/backend-registry/storage.js.map +1 -1
  240. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  241. package/dist/api/cloud/conversation-service.api.d.ts +8 -13
  242. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  243. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  244. package/dist/api/cloud/organization-service.api.d.ts +1 -2
  245. package/dist/api/cloud/organization-service.api.js.map +1 -1
  246. package/dist/api/cloud/proxy.cjs +1 -1
  247. package/dist/api/cloud/proxy.cjs.map +1 -1
  248. package/dist/api/cloud/proxy.d.ts +6 -6
  249. package/dist/api/cloud/proxy.js +33 -24
  250. package/dist/api/cloud/proxy.js.map +1 -1
  251. package/dist/api/cloud/sandbox-service.api.cjs.map +1 -1
  252. package/dist/api/cloud/sandbox-service.api.d.ts +3 -3
  253. package/dist/api/cloud/sandbox-service.api.js.map +1 -1
  254. package/dist/api/cloud/secrets-service.api.cjs.map +1 -1
  255. package/dist/api/cloud/secrets-service.api.d.ts +3 -4
  256. package/dist/api/cloud/secrets-service.api.js.map +1 -1
  257. package/dist/api/cloud/settings-service.api.cjs +1 -1
  258. package/dist/api/cloud/settings-service.api.cjs.map +1 -1
  259. package/dist/api/cloud/settings-service.api.js +5 -1
  260. package/dist/api/cloud/settings-service.api.js.map +1 -1
  261. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  262. package/dist/api/cloud/skills-service.api.d.ts +5 -5
  263. package/dist/api/cloud/skills-service.api.js.map +1 -1
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  265. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  266. package/dist/api/conversation-service/agent-server-conversation-service.api.js +115 -108
  267. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  268. package/dist/api/device-flow-client.cjs +1 -1
  269. package/dist/api/device-flow-client.cjs.map +1 -1
  270. package/dist/api/device-flow-client.d.ts +3 -5
  271. package/dist/api/device-flow-client.js +55 -66
  272. package/dist/api/device-flow-client.js.map +1 -1
  273. package/dist/api/event-service/event-service.api.cjs +1 -1
  274. package/dist/api/event-service/event-service.api.cjs.map +1 -1
  275. package/dist/api/event-service/event-service.api.d.ts +3 -3
  276. package/dist/api/event-service/event-service.api.js +17 -17
  277. package/dist/api/event-service/event-service.api.js.map +1 -1
  278. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  279. package/dist/api/git-service/agent-server-git-service.api.js +11 -11
  280. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  281. package/dist/api/runtime-service/agent-server-runtime-service.js +6 -6
  282. package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.cjs +2 -2
  283. package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.js +10 -10
  284. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.cjs.map +1 -1
  285. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.d.ts +5 -5
  286. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.js.map +1 -1
  287. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +1 -1
  288. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  289. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +1 -1
  290. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  291. package/dist/components/features/automations/automation-action-button-classes.d.ts +2 -2
  292. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  293. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  294. package/dist/components/features/backends/backend-form-modal.d.ts +1 -0
  295. package/dist/components/features/backends/backend-form-modal.js +203 -140
  296. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  297. package/dist/components/features/backends/backend-selector.cjs +1 -1
  298. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  299. package/dist/components/features/backends/backend-selector.js +117 -105
  300. package/dist/components/features/backends/backend-selector.js.map +1 -1
  301. package/dist/components/features/backends/backend-status-dot.cjs +1 -1
  302. package/dist/components/features/backends/backend-status-dot.cjs.map +1 -1
  303. package/dist/components/features/backends/backend-status-dot.d.ts +1 -1
  304. package/dist/components/features/backends/backend-status-dot.js +1 -1
  305. package/dist/components/features/backends/backend-status-dot.js.map +1 -1
  306. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  307. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  308. package/dist/components/features/backends/manage-backends-modal.js +81 -70
  309. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  310. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  311. package/dist/components/features/chat/change-agent-button.cjs.map +1 -1
  312. package/dist/components/features/chat/change-agent-button.js +59 -57
  313. package/dist/components/features/chat/change-agent-button.js.map +1 -1
  314. package/dist/components/features/chat/change-agent-context-menu.cjs +1 -1
  315. package/dist/components/features/chat/change-agent-context-menu.cjs.map +1 -1
  316. package/dist/components/features/chat/change-agent-context-menu.d.ts +3 -1
  317. package/dist/components/features/chat/change-agent-context-menu.js +30 -25
  318. package/dist/components/features/chat/change-agent-context-menu.js.map +1 -1
  319. package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
  320. package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
  321. package/dist/components/features/chat/chat-add-file-button.js +39 -38
  322. package/dist/components/features/chat/chat-add-file-button.js.map +1 -1
  323. package/dist/components/features/chat/chat-message.cjs +1 -1
  324. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  325. package/dist/components/features/chat/chat-message.d.ts +2 -1
  326. package/dist/components/features/chat/chat-message.js +185 -57
  327. package/dist/components/features/chat/chat-message.js.map +1 -1
  328. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  329. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  330. package/dist/components/features/chat/components/chat-input-actions.js +113 -113
  331. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  332. package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
  333. package/dist/components/features/chat/components/chat-input-model.cjs.map +1 -1
  334. package/dist/components/features/chat/components/chat-input-model.js +52 -51
  335. package/dist/components/features/chat/components/chat-input-model.js.map +1 -1
  336. package/dist/components/features/chat/components/slash-command-menu.cjs +2 -2
  337. package/dist/components/features/chat/components/slash-command-menu.cjs.map +1 -1
  338. package/dist/components/features/chat/components/slash-command-menu.js +38 -34
  339. package/dist/components/features/chat/components/slash-command-menu.js.map +1 -1
  340. package/dist/components/features/chat/git-control-bar-pr-button.cjs +1 -1
  341. package/dist/components/features/chat/git-control-bar-pr-button.cjs.map +1 -1
  342. package/dist/components/features/chat/git-control-bar-pr-button.js +16 -15
  343. package/dist/components/features/chat/git-control-bar-pr-button.js.map +1 -1
  344. package/dist/components/features/chat/git-control-bar-pull-button.cjs +1 -1
  345. package/dist/components/features/chat/git-control-bar-pull-button.cjs.map +1 -1
  346. package/dist/components/features/chat/git-control-bar-pull-button.js +16 -15
  347. package/dist/components/features/chat/git-control-bar-pull-button.js.map +1 -1
  348. package/dist/components/features/chat/git-control-bar-push-button.cjs +1 -1
  349. package/dist/components/features/chat/git-control-bar-push-button.cjs.map +1 -1
  350. package/dist/components/features/chat/git-control-bar-push-button.js +16 -15
  351. package/dist/components/features/chat/git-control-bar-push-button.js.map +1 -1
  352. package/dist/components/features/chat/git-control-bar.cjs +1 -1
  353. package/dist/components/features/chat/git-control-bar.cjs.map +1 -1
  354. package/dist/components/features/chat/git-control-bar.js +63 -62
  355. package/dist/components/features/chat/git-control-bar.js.map +1 -1
  356. package/dist/components/features/chat/pending-user-messages.cjs +1 -1
  357. package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
  358. package/dist/components/features/chat/pending-user-messages.js +27 -23
  359. package/dist/components/features/chat/pending-user-messages.js.map +1 -1
  360. package/dist/components/features/chat/switch-profile-button.cjs +1 -1
  361. package/dist/components/features/chat/switch-profile-button.cjs.map +1 -1
  362. package/dist/components/features/chat/switch-profile-button.js +26 -25
  363. package/dist/components/features/chat/switch-profile-button.js.map +1 -1
  364. package/dist/components/features/chat/switch-profile-context-menu.cjs +1 -1
  365. package/dist/components/features/chat/switch-profile-context-menu.cjs.map +1 -1
  366. package/dist/components/features/chat/switch-profile-context-menu.js +77 -67
  367. package/dist/components/features/chat/switch-profile-context-menu.js.map +1 -1
  368. package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs +1 -1
  369. package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs.map +1 -1
  370. package/dist/components/features/context-menu/context-menu-icon-text-with-description.d.ts +2 -1
  371. package/dist/components/features/context-menu/context-menu-icon-text-with-description.js +3 -2
  372. package/dist/components/features/context-menu/context-menu-icon-text-with-description.js.map +1 -1
  373. package/dist/components/features/context-menu/context-menu-icon-text.cjs +1 -1
  374. package/dist/components/features/context-menu/context-menu-icon-text.cjs.map +1 -1
  375. package/dist/components/features/context-menu/context-menu-icon-text.d.ts +2 -1
  376. package/dist/components/features/context-menu/context-menu-icon-text.js +20 -10
  377. package/dist/components/features/context-menu/context-menu-icon-text.js.map +1 -1
  378. package/dist/components/features/context-menu/context-menu-list-item.cjs +1 -1
  379. package/dist/components/features/context-menu/context-menu-list-item.cjs.map +1 -1
  380. package/dist/components/features/context-menu/context-menu-list-item.js +10 -9
  381. package/dist/components/features/context-menu/context-menu-list-item.js.map +1 -1
  382. package/dist/components/features/controls/agent-status.cjs +1 -1
  383. package/dist/components/features/controls/agent-status.js +12 -12
  384. package/dist/components/features/controls/git-tools-submenu.cjs +1 -1
  385. package/dist/components/features/controls/git-tools-submenu.cjs.map +1 -1
  386. package/dist/components/features/controls/git-tools-submenu.js +1 -1
  387. package/dist/components/features/controls/git-tools-submenu.js.map +1 -1
  388. package/dist/components/features/controls/macros-submenu.cjs +1 -1
  389. package/dist/components/features/controls/macros-submenu.cjs.map +1 -1
  390. package/dist/components/features/controls/macros-submenu.js +1 -1
  391. package/dist/components/features/controls/macros-submenu.js.map +1 -1
  392. package/dist/components/features/controls/server-status-context-menu-icon-text.cjs +1 -1
  393. package/dist/components/features/controls/server-status-context-menu-icon-text.cjs.map +1 -1
  394. package/dist/components/features/controls/server-status-context-menu-icon-text.js +14 -15
  395. package/dist/components/features/controls/server-status-context-menu-icon-text.js.map +1 -1
  396. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  397. package/dist/components/features/controls/server-status-context-menu.js +4 -4
  398. package/dist/components/features/controls/server-status.cjs +1 -1
  399. package/dist/components/features/controls/server-status.js +7 -7
  400. package/dist/components/features/controls/tools-context-menu-icon-text.cjs +1 -1
  401. package/dist/components/features/controls/tools-context-menu-icon-text.cjs.map +1 -1
  402. package/dist/components/features/controls/tools-context-menu-icon-text.js +16 -16
  403. package/dist/components/features/controls/tools-context-menu-icon-text.js.map +1 -1
  404. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs +1 -1
  405. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs.map +1 -1
  406. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js +11 -11
  407. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js.map +1 -1
  408. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  409. package/dist/components/features/conversation/conversation-name-with-status.js +11 -11
  410. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  411. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  412. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +60 -47
  413. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  414. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
  415. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
  416. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +86 -82
  417. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
  418. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  419. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +4 -4
  420. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  421. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +9 -9
  422. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  423. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  424. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +93 -93
  425. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  426. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  427. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  428. package/dist/components/features/conversation-panel/conversation-panel.js +177 -177
  429. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  430. package/dist/components/features/conversation-panel/ellipsis-button.cjs +1 -1
  431. package/dist/components/features/conversation-panel/ellipsis-button.cjs.map +1 -1
  432. package/dist/components/features/conversation-panel/ellipsis-button.js +13 -13
  433. package/dist/components/features/conversation-panel/ellipsis-button.js.map +1 -1
  434. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
  435. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
  436. package/dist/components/features/conversation-panel/local-new-conversation-menu.js +57 -53
  437. package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
  438. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs +1 -1
  439. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs.map +1 -1
  440. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js +3 -2
  441. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js.map +1 -1
  442. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs +1 -1
  443. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs.map +1 -1
  444. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js +11 -8
  445. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js.map +1 -1
  446. package/dist/components/features/conversation-panel/system-message-modal/tab-content.cjs.map +1 -1
  447. package/dist/components/features/conversation-panel/system-message-modal/tab-content.d.ts +2 -5
  448. package/dist/components/features/conversation-panel/system-message-modal/tab-content.js.map +1 -1
  449. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  450. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  451. package/dist/components/features/files-tab/file-content-viewer.js +45 -42
  452. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  453. package/dist/components/features/home/llm-not-configured-banner.d.ts +11 -0
  454. package/dist/components/features/home/shared/dropdown-item.cjs +1 -1
  455. package/dist/components/features/home/shared/dropdown-item.cjs.map +1 -1
  456. package/dist/components/features/home/shared/dropdown-item.js +20 -16
  457. package/dist/components/features/home/shared/dropdown-item.js.map +1 -1
  458. package/dist/components/features/home/shared/generic-dropdown-menu.cjs +1 -1
  459. package/dist/components/features/home/shared/generic-dropdown-menu.cjs.map +1 -1
  460. package/dist/components/features/home/shared/generic-dropdown-menu.js +23 -22
  461. package/dist/components/features/home/shared/generic-dropdown-menu.js.map +1 -1
  462. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
  463. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs.map +1 -1
  464. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +103 -102
  465. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js.map +1 -1
  466. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
  467. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs.map +1 -1
  468. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +68 -67
  469. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js.map +1 -1
  470. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  471. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  472. package/dist/components/features/mcp-page/custom-server-editor.js +62 -60
  473. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  474. package/dist/components/features/mcp-page/index.cjs +1 -1
  475. package/dist/components/features/mcp-page/index.d.ts +1 -0
  476. package/dist/components/features/mcp-page/index.js +1 -0
  477. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  478. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  479. package/dist/components/features/mcp-page/install-server-modal.js +141 -121
  480. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  481. package/dist/components/features/mcp-page/save-as-secret-toggle.cjs +2 -0
  482. package/dist/components/features/mcp-page/save-as-secret-toggle.cjs.map +1 -0
  483. package/dist/components/features/mcp-page/save-as-secret-toggle.d.ts +7 -0
  484. package/dist/components/features/mcp-page/save-as-secret-toggle.js +50 -0
  485. package/dist/components/features/mcp-page/save-as-secret-toggle.js.map +1 -0
  486. package/dist/components/features/onboarding/onboarding-modal.d.ts +2 -2
  487. package/dist/components/features/onboarding/steps/check-backend-step.d.ts +1 -1
  488. package/dist/components/features/onboarding/steps/choose-agent-step.d.ts +2 -1
  489. package/dist/components/features/onboarding/steps/setup-acp-secrets-step.d.ts +19 -10
  490. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  491. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.d.ts +5 -0
  492. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -0
  493. package/dist/components/features/settings/llm-profiles/profile-actions-menu.cjs +1 -1
  494. package/dist/components/features/settings/llm-profiles/profile-actions-menu.js +1 -0
  495. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  496. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  497. package/dist/components/features/skills/extensions-navigation.js +1 -1
  498. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  499. package/dist/components/shared/buttons/back-nav-button.cjs +2 -0
  500. package/dist/components/shared/buttons/back-nav-button.cjs.map +1 -0
  501. package/dist/components/shared/buttons/back-nav-button.d.ts +17 -0
  502. package/dist/components/shared/buttons/back-nav-button.js +33 -0
  503. package/dist/components/shared/buttons/back-nav-button.js.map +1 -0
  504. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  505. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +5 -5
  506. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  507. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  508. package/dist/components/shared/filters/enum-filter-dropdown.js +32 -31
  509. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  510. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  511. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  512. package/dist/components/shared/modals/confirmation-modals/base-modal.js +14 -13
  513. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  514. package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
  515. package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
  516. package/dist/components/shared/modals/settings/settings-modal.js +17 -16
  517. package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
  518. package/dist/components/shared/text-shimmer.cjs +2 -0
  519. package/dist/components/shared/text-shimmer.cjs.map +1 -0
  520. package/dist/components/shared/text-shimmer.d.ts +11 -0
  521. package/dist/components/shared/text-shimmer.js +43 -0
  522. package/dist/components/shared/text-shimmer.js.map +1 -0
  523. package/dist/constants/acp-providers.cjs +1 -1
  524. package/dist/constants/acp-providers.cjs.map +1 -1
  525. package/dist/constants/acp-providers.d.ts +16 -3
  526. package/dist/constants/acp-providers.js +0 -1
  527. package/dist/constants/acp-providers.js.map +1 -1
  528. package/dist/contexts/active-backend-context.cjs +1 -1
  529. package/dist/contexts/active-backend-context.cjs.map +1 -1
  530. package/dist/contexts/active-backend-context.js +32 -32
  531. package/dist/contexts/active-backend-context.js.map +1 -1
  532. package/dist/hooks/chat/use-chat-input-logic.cjs +1 -1
  533. package/dist/hooks/chat/use-chat-input-logic.cjs.map +1 -1
  534. package/dist/hooks/chat/use-chat-input-logic.js +13 -6
  535. package/dist/hooks/chat/use-chat-input-logic.js.map +1 -1
  536. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs +2 -0
  537. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs.map +1 -0
  538. package/dist/hooks/mutation/use-save-fields-as-secrets.d.ts +9 -0
  539. package/dist/hooks/mutation/use-save-fields-as-secrets.js +24 -0
  540. package/dist/hooks/mutation/use-save-fields-as-secrets.js.map +1 -0
  541. package/dist/hooks/mutation/use-unified-start-conversation.cjs +1 -1
  542. package/dist/hooks/mutation/use-unified-start-conversation.js +8 -8
  543. package/dist/hooks/mutation/use-unified-stop-conversation.cjs +1 -1
  544. package/dist/hooks/mutation/use-unified-stop-conversation.js +15 -15
  545. package/dist/hooks/query/use-acp-auth-status.d.ts +36 -0
  546. package/dist/hooks/query/use-agent-settings-schema.cjs +1 -1
  547. package/dist/hooks/query/use-agent-settings-schema.cjs.map +1 -1
  548. package/dist/hooks/query/use-agent-settings-schema.js +26 -16
  549. package/dist/hooks/query/use-agent-settings-schema.js.map +1 -1
  550. package/dist/hooks/query/use-backends-health.cjs +1 -1
  551. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  552. package/dist/hooks/query/use-backends-health.d.ts +2 -0
  553. package/dist/hooks/query/use-backends-health.js +31 -21
  554. package/dist/hooks/query/use-backends-health.js.map +1 -1
  555. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  556. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  557. package/dist/hooks/query/use-paginated-conversations.js +15 -14
  558. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  559. package/dist/hooks/query/use-settings.cjs +1 -1
  560. package/dist/hooks/query/use-settings.cjs.map +1 -1
  561. package/dist/hooks/query/use-settings.js +65 -52
  562. package/dist/hooks/query/use-settings.js.map +1 -1
  563. package/dist/hooks/query/use-user-conversation.cjs +1 -1
  564. package/dist/hooks/query/use-user-conversation.cjs.map +1 -1
  565. package/dist/hooks/query/use-user-conversation.js +20 -11
  566. package/dist/hooks/query/use-user-conversation.js.map +1 -1
  567. package/dist/hooks/use-agent-state.cjs +1 -1
  568. package/dist/hooks/use-agent-state.js +13 -13
  569. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  570. package/dist/hooks/use-conversation-name-context-menu.js +10 -10
  571. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  572. package/dist/hooks/use-llm-configured.d.ts +25 -0
  573. package/dist/hooks/use-runtime-is-ready.cjs +1 -1
  574. package/dist/hooks/use-runtime-is-ready.js +5 -5
  575. package/dist/i18n/declaration.cjs +1 -1
  576. package/dist/i18n/declaration.cjs.map +1 -1
  577. package/dist/i18n/declaration.d.ts +19 -1
  578. package/dist/i18n/declaration.js +1 -1
  579. package/dist/i18n/declaration.js.map +1 -1
  580. package/dist/i18n/translation.cjs +3 -3
  581. package/dist/i18n/translation.cjs.map +1 -1
  582. package/dist/i18n/translation.js +321 -15
  583. package/dist/i18n/translation.js.map +1 -1
  584. package/dist/icons/stop-circle.cjs +1 -1
  585. package/dist/icons/stop-circle.cjs.map +1 -1
  586. package/dist/icons/stop-circle.js +7 -10
  587. package/dist/icons/stop-circle.js.map +1 -1
  588. package/dist/locales/ar/openhands.json +20 -2
  589. package/dist/locales/ca/openhands.json +20 -2
  590. package/dist/locales/de/openhands.json +20 -2
  591. package/dist/locales/en/openhands.json +20 -2
  592. package/dist/locales/es/openhands.json +20 -2
  593. package/dist/locales/fr/openhands.json +20 -2
  594. package/dist/locales/it/openhands.json +20 -2
  595. package/dist/locales/ja/openhands.json +20 -2
  596. package/dist/locales/ko-KR/openhands.json +20 -2
  597. package/dist/locales/no/openhands.json +20 -2
  598. package/dist/locales/pt/openhands.json +20 -2
  599. package/dist/locales/tr/openhands.json +20 -2
  600. package/dist/locales/uk/openhands.json +20 -2
  601. package/dist/locales/zh-CN/openhands.json +20 -2
  602. package/dist/locales/zh-TW/openhands.json +20 -2
  603. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs +2 -0
  604. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs.map +1 -0
  605. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
  606. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
  607. package/dist/package.cjs +1 -1
  608. package/dist/package.cjs.map +1 -1
  609. package/dist/package.js +1 -1
  610. package/dist/package.js.map +1 -1
  611. package/dist/routes/conversation.cjs +1 -1
  612. package/dist/routes/conversation.cjs.map +1 -1
  613. package/dist/routes/conversation.js +1 -1
  614. package/dist/routes/conversation.js.map +1 -1
  615. package/dist/routes/llm-settings.cjs +1 -1
  616. package/dist/routes/llm-settings.cjs.map +1 -1
  617. package/dist/routes/llm-settings.js +55 -54
  618. package/dist/routes/llm-settings.js.map +1 -1
  619. package/dist/routes/secrets-settings.cjs +1 -1
  620. package/dist/routes/secrets-settings.cjs.map +1 -1
  621. package/dist/routes/secrets-settings.js +19 -27
  622. package/dist/routes/secrets-settings.js.map +1 -1
  623. package/dist/stores/conversation-store.cjs +1 -1
  624. package/dist/stores/conversation-store.cjs.map +1 -1
  625. package/dist/stores/conversation-store.d.ts +4 -0
  626. package/dist/stores/conversation-store.js +6 -0
  627. package/dist/stores/conversation-store.js.map +1 -1
  628. package/dist/types/agent-server/core/events/acp-tool-call-event.d.ts +6 -4
  629. package/dist/types/agent-server/core/events/system-event.d.ts +5 -0
  630. package/dist/types/automation.d.ts +15 -0
  631. package/dist/types/settings.d.ts +3 -1
  632. package/dist/ui/combobox-caret.cjs +1 -1
  633. package/dist/ui/combobox-caret.cjs.map +1 -1
  634. package/dist/ui/combobox-caret.d.ts +1 -1
  635. package/dist/ui/combobox-caret.js +9 -8
  636. package/dist/ui/combobox-caret.js.map +1 -1
  637. package/dist/ui/context-menu.cjs +1 -1
  638. package/dist/ui/context-menu.cjs.map +1 -1
  639. package/dist/ui/context-menu.js +9 -8
  640. package/dist/ui/context-menu.js.map +1 -1
  641. package/dist/ui/dropdown/dropdown-menu.cjs +1 -1
  642. package/dist/ui/dropdown/dropdown-menu.cjs.map +1 -1
  643. package/dist/ui/dropdown/dropdown-menu.js +21 -17
  644. package/dist/ui/dropdown/dropdown-menu.js.map +1 -1
  645. package/dist/ui/dropdown/dropdown.cjs +1 -1
  646. package/dist/ui/dropdown/dropdown.cjs.map +1 -1
  647. package/dist/ui/dropdown/dropdown.js +2 -2
  648. package/dist/ui/dropdown/dropdown.js.map +1 -1
  649. package/dist/utils/automation-schedule.d.ts +1 -0
  650. package/dist/utils/dropdown-classes.cjs +2 -0
  651. package/dist/utils/dropdown-classes.cjs.map +1 -0
  652. package/dist/utils/dropdown-classes.d.ts +32 -0
  653. package/dist/utils/dropdown-classes.js +8 -0
  654. package/dist/utils/dropdown-classes.js.map +1 -0
  655. package/dist/utils/form-control-classes.cjs +1 -1
  656. package/dist/utils/form-control-classes.cjs.map +1 -1
  657. package/dist/utils/form-control-classes.d.ts +18 -2
  658. package/dist/utils/form-control-classes.js +4 -3
  659. package/dist/utils/form-control-classes.js.map +1 -1
  660. package/dist/utils/git-control-bar-classes.cjs +2 -0
  661. package/dist/utils/git-control-bar-classes.cjs.map +1 -0
  662. package/dist/utils/git-control-bar-classes.d.ts +4 -0
  663. package/dist/utils/git-control-bar-classes.js +14 -0
  664. package/dist/utils/git-control-bar-classes.js.map +1 -0
  665. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  666. package/dist/utils/handle-event-for-ui.d.ts +6 -3
  667. package/dist/utils/handle-event-for-ui.js.map +1 -1
  668. package/dist/utils/mobile-top-bar-icon-button-classes.cjs +1 -1
  669. package/dist/utils/mobile-top-bar-icon-button-classes.cjs.map +1 -1
  670. package/dist/utils/mobile-top-bar-icon-button-classes.js +3 -3
  671. package/dist/utils/mobile-top-bar-icon-button-classes.js.map +1 -1
  672. package/dist/utils/modal-classes.cjs +2 -0
  673. package/dist/utils/modal-classes.cjs.map +1 -0
  674. package/dist/utils/modal-classes.d.ts +8 -0
  675. package/dist/utils/modal-classes.js +7 -0
  676. package/dist/utils/modal-classes.js.map +1 -0
  677. package/dist/utils/openhands-llm.cjs +2 -0
  678. package/dist/utils/openhands-llm.cjs.map +1 -0
  679. package/dist/utils/openhands-llm.d.ts +2 -0
  680. package/dist/utils/openhands-llm.js +9 -0
  681. package/dist/utils/openhands-llm.js.map +1 -0
  682. package/dist/utils/redact-custom-secrets.cjs +2 -0
  683. package/dist/utils/redact-custom-secrets.cjs.map +1 -0
  684. package/dist/utils/redact-custom-secrets.d.ts +6 -0
  685. package/dist/utils/redact-custom-secrets.js +10 -0
  686. package/dist/utils/redact-custom-secrets.js.map +1 -0
  687. package/dist/utils/status.cjs +1 -1
  688. package/dist/utils/status.cjs.map +1 -1
  689. package/dist/utils/status.d.ts +2 -1
  690. package/dist/utils/status.js +9 -8
  691. package/dist/utils/status.js.map +1 -1
  692. package/dist/utils/system-message-adapter.cjs +1 -1
  693. package/dist/utils/system-message-adapter.cjs.map +1 -1
  694. package/dist/utils/system-message-adapter.js +10 -7
  695. package/dist/utils/system-message-adapter.js.map +1 -1
  696. package/dist/utils/utils.cjs +1 -1
  697. package/dist/utils/utils.cjs.map +1 -1
  698. package/dist/utils/utils.d.ts +2 -1
  699. package/dist/utils/utils.js +21 -20
  700. package/dist/utils/utils.js.map +1 -1
  701. package/package.json +1 -1
  702. package/scripts/dev-safe.mjs +3 -1
  703. package/scripts/dev-static.mjs +2 -2
  704. package/scripts/dev-with-automation.mjs +283 -108
  705. package/scripts/static-build.mjs +20 -19
  706. package/scripts/static-server.mjs +65 -6
  707. package/build/assets/acp-providers-CbiRekh9.js +0 -1
  708. package/build/assets/active-backend-context-cCM1vYYZ.js +0 -1
  709. package/build/assets/add-backend-modal-DIUQzMPa.js +0 -1
  710. package/build/assets/agent-server-client-options-Bc5ZorQZ.js +0 -1
  711. package/build/assets/agent-server-compatibility-BlkUsrX2.js +0 -1
  712. package/build/assets/agent-server-conversation-service.api-C2V5SlHu.js +0 -5
  713. package/build/assets/api-key-entry-screen-B2gynaCp.js +0 -1
  714. package/build/assets/automation-detail-DJvbVSYK.js +0 -1
  715. package/build/assets/automations-list-6FDbI5dc.js +0 -1
  716. package/build/assets/backend-form-modal-Dnk33xA_.js +0 -1
  717. package/build/assets/base-modal-_dYTw1ri.js +0 -1
  718. package/build/assets/brand-button-Br7f0kZJ.js +0 -1
  719. package/build/assets/browser-store-Couc4S5D.js +0 -1
  720. package/build/assets/clock-BRjCgHTc.js +0 -1
  721. package/build/assets/combobox-caret-to1O8irE.js +0 -1
  722. package/build/assets/context-menu-list-item-CWNFpuiC.js +0 -1
  723. package/build/assets/conversation-DVrKU0oz.js +0 -19
  724. package/build/assets/conversation-Dlys-D5A.js +0 -1
  725. package/build/assets/conversation-panel-iF09WjZ4.js +0 -1
  726. package/build/assets/conversation-service.api-CCfztilW.js +0 -1
  727. package/build/assets/conversation-state-store-u5jepov0.js +0 -1
  728. package/build/assets/conversation-store-Z5iMCRpc.js +0 -1
  729. package/build/assets/conversation-websocket-context-DhJhqUna.js +0 -3
  730. package/build/assets/declaration-BNMqORFE.js +0 -1
  731. package/build/assets/dist-BxBP7tFD.js +0 -1
  732. package/build/assets/edit-automation-modal-BGzR3nfZ.js +0 -1
  733. package/build/assets/ellipsis-button-ZyLMPURn.js +0 -1
  734. package/build/assets/entry.client-1VMHpktY.js +0 -2
  735. package/build/assets/enum-filter-dropdown-CEgCdu4A.js +0 -1
  736. package/build/assets/extensions-hub-C651jsVh.js +0 -1
  737. package/build/assets/files-tab-R5z0lLdY.js +0 -1
  738. package/build/assets/files-tab-store-CDyVTXNT.js +0 -1
  739. package/build/assets/git-control-bar-branch-button-COdRAYHb.js +0 -27
  740. package/build/assets/git-provider-icon-BzLbc0yC.js +0 -1
  741. package/build/assets/home-e-egNUXZ.js +0 -1
  742. package/build/assets/install-server-modal-DHlbgqVH.js +0 -1
  743. package/build/assets/launch-CshDse3e.js +0 -1
  744. package/build/assets/link-external-D2POYx4c.js +0 -1
  745. package/build/assets/llm-settings-Bql-vydt.js +0 -1
  746. package/build/assets/llm-settings-C_tal6Ds.js +0 -1
  747. package/build/assets/manage-backends-modal-l7RkKfwX.js +0 -1
  748. package/build/assets/manage-workspaces-modal-DhKF_8z3.js +0 -1
  749. package/build/assets/manifest-3bf30d69.js +0 -1
  750. package/build/assets/mcp-ByeBfdfU.js +0 -9
  751. package/build/assets/messages-D0rWot7s.js +0 -36
  752. package/build/assets/proxy-CxydCnis.js +0 -1
  753. package/build/assets/root-DHeCXo9N.css +0 -1
  754. package/build/assets/root-layout-Czo9Ma6Q.js +0 -2
  755. package/build/assets/secrets-service-BsnKFc2x.js +0 -1
  756. package/build/assets/secrets-settings-Bz_UohPJ.js +0 -1
  757. package/build/assets/settings-client-C73C7IgV.js +0 -1
  758. package/build/assets/settings-index-Dz0BmdJD.js +0 -1
  759. package/build/assets/settings-list-classes-Bf80tWtc.js +0 -1
  760. package/build/assets/settings-modal-Brzgh5Yw.js +0 -1
  761. package/build/assets/settings-service.api-CZ3uWx4v.js +0 -1
  762. package/build/assets/sidebar-mobile-menu-toggle-Do_aA9Zm.js +0 -1
  763. package/build/assets/skills-settings-DlA5hlXw.js +0 -2
  764. package/build/assets/status-hp6M6E7E.js +0 -1
  765. package/build/assets/use-agent-settings-schema-33Un7UF2.js +0 -1
  766. package/build/assets/use-is-authed-BggE5wPj.js +0 -1
  767. package/build/assets/use-llm-profiles-DDOol3gK.js +0 -1
  768. package/build/assets/use-runtime-is-ready-B7EF4BKU.js +0 -1
  769. package/build/assets/use-settings-DQIZmIov.js +0 -1
  770. package/build/assets/use-user-conversation-C6hrMMtn.js +0 -1
  771. package/build/assets/utils-i18rdUj2.js +0 -1
  772. package/build/assets/vendor~conversation-panel~conversation-a9SyrrhV.js +0 -1
  773. package/build/assets/vendor~conversation-panel~conversation~index-C23ZXO4R.js +0 -1
  774. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js +0 -1
  775. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DzIXV3Ui.js +0 -9
  776. /package/build/assets/{automation-IdgZq6ZK.js → automation-XDPAjiZi.js} +0 -0
  777. /package/build/assets/{color-themes-DSaoIL6A.js → color-themes-B9pm9c-R.js} +0 -0
  778. /package/build/assets/{common-DR1t-EeP.js → common-DqjLSBOt.js} +0 -0
  779. /package/build/assets/{conversation-local-storage-UYl-SX-r.js → conversation-local-storage-YmOVXxxW.js} +0 -0
  780. /package/build/assets/{dist-C6t0EXL7.js → dist-C3NfioQC.js} +0 -0
  781. /package/build/assets/{environment-switch-store-C4ulFJKp.js → environment-switch-store-CiurvTtK.js} +0 -0
  782. /package/build/assets/{health-store-BDC2rM-X.js → health-store-B5f0S2FY.js} +0 -0
  783. /package/build/assets/{map-provider-COBVzZYo.js → map-provider-BJ_8KZKU.js} +0 -0
  784. /package/build/assets/{middleware-BC9EwbB9.js → middleware-CfatjPYZ.js} +0 -0
  785. /package/build/assets/{objectWithoutPropertiesLoose-Du6eBn-V.js → objectWithoutPropertiesLoose-DSQKyRhw.js} +0 -0
  786. /package/build/assets/{react-Do0CT17Y.js → react-Dy05vyj5.js} +0 -0
  787. /package/build/assets/{sdk-settings-field-metadata-CBPmeqYa.js → sdk-settings-field-metadata-DQiaIBie.js} +0 -0
  788. /package/build/assets/{settings-D_H-qsRm.js → settings-DGY6n4J2.js} +0 -0
  789. /package/build/assets/{settings-like-page-layout-classes-I0BDBEoq.js → settings-like-page-layout-classes-D7YjdTd0.js} +0 -0
  790. /package/build/assets/{use-breakpoint-DbJ6FkQ-.js → use-breakpoint-DF_RiQ6s.js} +0 -0
  791. /package/build/assets/{use-click-outside-element-DffgWWoZ.js → use-click-outside-element-DhxCUyWl.js} +0 -0
  792. /package/build/assets/{v4-CNn21NXa.js → v4-khGvL7i2.js} +0 -0
  793. /package/build/assets/{vendor~browser-DDiZgqD3.js → vendor~browser-DisFGEp9.js} +0 -0
  794. /package/build/assets/{vendor~browser-tab-BgwV1mxF.js → vendor~browser-tab-BxhTtM9_.js} +0 -0
  795. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DbvX3OcM.js → vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js} +0 -0
  796. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-iOsylxCS.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-BClAMeFe.js} +0 -0
  797. /package/build/assets/{vendor~files-tab-BGKayPiK.js → vendor~files-tab-BtkpAiMX.js} +0 -0
  798. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BW6261Sb.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CyZ-3lDQ.js} +0 -0
  799. /package/build/assets/{vendor~home~mcp~automations-list-DoPfwaXj.js → vendor~home~mcp~automations-list-BgV86Sti.js} +0 -0
  800. /package/build/assets/{vendor~launch-vdeRTWFu.js → vendor~launch-BXgl67Re.js} +0 -0
  801. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-D9P8e98a.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-CLlsvdNP.js} +0 -0
  802. /package/build/assets/{vendor~terminal-DUrOWGFE.js → vendor~terminal-DZaJIY8A.js} +0 -0
@@ -1,2 +1,2 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../agent-server-config.cjs`);require(`./default-backend.cjs`);function t(t){if(t.kind===`local`&&t.id===`default-local`){let t=e.getAgentServerSessionApiKey();if(t)return{"X-Session-API-Key":t}}return t.apiKey?t.kind===`cloud`?{Authorization:`Bearer ${t.apiKey}`}:{"X-Session-API-Key":t.apiKey}:{}}exports.buildAuthHeaders=t;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);function e(e){return e.apiKey?e.kind===`cloud`?{Authorization:`Bearer ${e.apiKey}`}:{"X-Session-API-Key":e.apiKey}:{}}exports.buildAuthHeaders=e;
2
2
  //# sourceMappingURL=auth.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.cjs","names":[],"sources":["../../../src/api/backend-registry/auth.ts"],"sourcesContent":["import { getAgentServerSessionApiKey } from \"../agent-server-config\";\nimport { DEFAULT_LOCAL_BACKEND_ID } from \"./default-backend\";\nimport type { Backend } from \"./types\";\n\n/**\n * Build the auth headers to send to a backend.\n *\n * Local agent-server uses `X-Session-API-Key`. Cloud expects a bearer\n * token in the `Authorization` header.\n */\nexport function buildAuthHeaders(backend: Backend): Record<string, string> {\n if (backend.kind === \"local\" && backend.id === DEFAULT_LOCAL_BACKEND_ID) {\n const configuredSessionApiKey = getAgentServerSessionApiKey();\n if (configuredSessionApiKey) {\n return { \"X-Session-API-Key\": configuredSessionApiKey };\n }\n }\n\n if (!backend.apiKey) return {};\n\n if (backend.kind === \"cloud\") {\n return { Authorization: `Bearer ${backend.apiKey}` };\n }\n\n return { \"X-Session-API-Key\": backend.apiKey };\n}\n"],"mappings":"+HAUA,SAAgB,EAAiB,EAA0C,CACzE,GAAI,EAAQ,OAAS,SAAW,EAAQ,KAAA,gBAAiC,CACvE,IAAM,EAA0B,EAAA,6BAA6B,CAC7D,GAAI,EACF,MAAO,CAAE,oBAAqB,EAAyB,CAU3D,OANK,EAAQ,OAET,EAAQ,OAAS,QACZ,CAAE,cAAe,UAAU,EAAQ,SAAU,CAG/C,CAAE,oBAAqB,EAAQ,OAAQ,CANlB,EAAE"}
1
+ {"version":3,"file":"auth.cjs","names":[],"sources":["../../../src/api/backend-registry/auth.ts"],"sourcesContent":["import type { Backend } from \"./types\";\n\n/**\n * Build the auth headers to send to a backend.\n *\n * Local agent-server uses `X-Session-API-Key`. Cloud expects a bearer\n * token in the `Authorization` header.\n */\nexport function buildAuthHeaders(backend: Backend): Record<string, string> {\n if (!backend.apiKey) return {};\n\n if (backend.kind === \"cloud\") {\n return { Authorization: `Bearer ${backend.apiKey}` };\n }\n\n return { \"X-Session-API-Key\": backend.apiKey };\n}\n"],"mappings":"gDAQA,SAAgB,EAAiB,EAA0C,CAOzE,OANK,EAAQ,OAET,EAAQ,OAAS,QACZ,CAAE,cAAe,UAAU,EAAQ,SAAU,CAG/C,CAAE,oBAAqB,EAAQ,OAAQ,CANlB,EAAE"}
@@ -1,14 +1,8 @@
1
- import { getAgentServerSessionApiKey as e } from "../agent-server-config.js";
2
- import "./default-backend.js";
3
1
  //#region src/api/backend-registry/auth.ts
4
- function t(t) {
5
- if (t.kind === "local" && t.id === "default-local") {
6
- let t = e();
7
- if (t) return { "X-Session-API-Key": t };
8
- }
9
- return t.apiKey ? t.kind === "cloud" ? { Authorization: `Bearer ${t.apiKey}` } : { "X-Session-API-Key": t.apiKey } : {};
2
+ function e(e) {
3
+ return e.apiKey ? e.kind === "cloud" ? { Authorization: `Bearer ${e.apiKey}` } : { "X-Session-API-Key": e.apiKey } : {};
10
4
  }
11
5
  //#endregion
12
- export { t as buildAuthHeaders };
6
+ export { e as buildAuthHeaders };
13
7
 
14
8
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","names":[],"sources":["../../../src/api/backend-registry/auth.ts"],"sourcesContent":["import { getAgentServerSessionApiKey } from \"../agent-server-config\";\nimport { DEFAULT_LOCAL_BACKEND_ID } from \"./default-backend\";\nimport type { Backend } from \"./types\";\n\n/**\n * Build the auth headers to send to a backend.\n *\n * Local agent-server uses `X-Session-API-Key`. Cloud expects a bearer\n * token in the `Authorization` header.\n */\nexport function buildAuthHeaders(backend: Backend): Record<string, string> {\n if (backend.kind === \"local\" && backend.id === DEFAULT_LOCAL_BACKEND_ID) {\n const configuredSessionApiKey = getAgentServerSessionApiKey();\n if (configuredSessionApiKey) {\n return { \"X-Session-API-Key\": configuredSessionApiKey };\n }\n }\n\n if (!backend.apiKey) return {};\n\n if (backend.kind === \"cloud\") {\n return { Authorization: `Bearer ${backend.apiKey}` };\n }\n\n return { \"X-Session-API-Key\": backend.apiKey };\n}\n"],"mappings":";;;AAUA,SAAgB,EAAiB,GAA0C;AACzE,KAAI,EAAQ,SAAS,WAAW,EAAQ,OAAA,iBAAiC;EACvE,IAAM,IAA0B,GAA6B;AAC7D,MAAI,EACF,QAAO,EAAE,qBAAqB,GAAyB;;AAU3D,QANK,EAAQ,SAET,EAAQ,SAAS,UACZ,EAAE,eAAe,UAAU,EAAQ,UAAU,GAG/C,EAAE,qBAAqB,EAAQ,QAAQ,GANlB,EAAE"}
1
+ {"version":3,"file":"auth.js","names":[],"sources":["../../../src/api/backend-registry/auth.ts"],"sourcesContent":["import type { Backend } from \"./types\";\n\n/**\n * Build the auth headers to send to a backend.\n *\n * Local agent-server uses `X-Session-API-Key`. Cloud expects a bearer\n * token in the `Authorization` header.\n */\nexport function buildAuthHeaders(backend: Backend): Record<string, string> {\n if (!backend.apiKey) return {};\n\n if (backend.kind === \"cloud\") {\n return { Authorization: `Bearer ${backend.apiKey}` };\n }\n\n return { \"X-Session-API-Key\": backend.apiKey };\n}\n"],"mappings":";AAQA,SAAgB,EAAiB,GAA0C;AAOzE,QANK,EAAQ,SAET,EAAQ,SAAS,UACZ,EAAE,eAAe,UAAU,EAAQ,UAAU,GAG/C,EAAE,qBAAqB,EAAQ,QAAQ,GANlB,EAAE"}
@@ -1,2 +1,2 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../agent-server-config.cjs`);var t=`default-local`,n=`Local`;function r(){return{id:t,name:n,host:e.getAgentServerBaseUrl(),apiKey:e.getAgentServerSessionApiKey()??``,kind:`local`}}exports.DEFAULT_LOCAL_BACKEND_ID=t,exports.makeDefaultLocalBackend=r;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../agent-server-config.cjs`);var t=`default-local`,n=`Local`;function r(){let r=e.getAgentServerBaseUrl(),i=e.getAgentServerSessionApiKey();return!r||!i?null:{id:t,name:n,host:r,apiKey:i,kind:`local`}}exports.DEFAULT_LOCAL_BACKEND_ID=t,exports.DEFAULT_LOCAL_BACKEND_NAME=n,exports.makeDefaultLocalBackend=r;
2
2
  //# sourceMappingURL=default-backend.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"default-backend.cjs","names":[],"sources":["../../../src/api/backend-registry/default-backend.ts"],"sourcesContent":["import {\n getAgentServerBaseUrl,\n getAgentServerSessionApiKey,\n} from \"../agent-server-config\";\nimport type { Backend } from \"./types\";\n\n/**\n * Stable id for the default local backend that is auto-seeded into the\n * registry on a fresh install. After seeding, this backend is a normal\n * registered entry — the user can rename it, edit its host/api key, or\n * remove it like any other backend.\n *\n * The id is also used by `saveAgentServerConfig` to keep the registry\n * entry in sync with the legacy `openhands-agent-server-config` storage\n * that the recovery / agent-server settings page edits.\n */\nexport const DEFAULT_LOCAL_BACKEND_ID = \"default-local\";\n\nexport const DEFAULT_LOCAL_BACKEND_NAME = \"Local\";\n\n/**\n * Construct the default local backend from environment / agent-server\n * config (`VITE_BACKEND_BASE_URL`, `VITE_SESSION_API_KEY`, plus the\n * `openhands-agent-server-config` localStorage overrides).\n *\n * Used in two places:\n * 1. As the seed entry written to `openhands-backends` on first load.\n * 2. As a last-resort fallback inside the active store when the\n * registry has no local backend at all (e.g. the user removed\n * every entry). The synthetic fallback is never persisted.\n */\nexport function makeDefaultLocalBackend(): Backend {\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host: getAgentServerBaseUrl(),\n apiKey: getAgentServerSessionApiKey() ?? \"\",\n kind: \"local\",\n };\n}\n"],"mappings":"8FAgBA,IAAa,EAA2B,gBAE3B,EAA6B,QAa1C,SAAgB,GAAmC,CACjD,MAAO,CACL,GAAI,EACJ,KAAM,EACN,KAAM,EAAA,uBAAuB,CAC7B,OAAQ,EAAA,6BAA6B,EAAI,GACzC,KAAM,QACP"}
1
+ {"version":3,"file":"default-backend.cjs","names":[],"sources":["../../../src/api/backend-registry/default-backend.ts"],"sourcesContent":["import {\n getAgentServerBaseUrl,\n getAgentServerSessionApiKey,\n} from \"../agent-server-config\";\nimport type { Backend } from \"./types\";\n\n/**\n * Stable id for the default local backend that is auto-seeded into the\n * registry when the launcher provides both a backend host and API key.\n * After seeding, this backend is a normal registered entry — the user can\n * rename it, edit its host/api key, or remove it like any other backend.\n */\nexport const DEFAULT_LOCAL_BACKEND_ID = \"default-local\";\n\nexport const DEFAULT_LOCAL_BACKEND_NAME = \"Local\";\n\n/**\n * Construct the default local backend from environment/runtime config.\n * Returns null unless both a backend location and API key are available.\n *\n * Used as the seed entry written to `openhands-backends` on first load;\n * if it returns null, onboarding is responsible for collecting backend\n * connection details from the user.\n */\nexport function makeDefaultLocalBackend(): Backend | null {\n const host = getAgentServerBaseUrl();\n const apiKey = getAgentServerSessionApiKey();\n\n if (!host || !apiKey) return null;\n\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host,\n apiKey,\n kind: \"local\",\n };\n}\n"],"mappings":"8FAYA,IAAa,EAA2B,gBAE3B,EAA6B,QAU1C,SAAgB,GAA0C,CACxD,IAAM,EAAO,EAAA,uBAAuB,CAC9B,EAAS,EAAA,6BAA6B,CAI5C,MAFI,CAAC,GAAQ,CAAC,EAAe,KAEtB,CACL,GAAI,EACJ,KAAM,EACN,OACA,SACA,KAAM,QACP"}
@@ -1,25 +1,18 @@
1
1
  import type { Backend } from "./types";
2
2
  /**
3
3
  * Stable id for the default local backend that is auto-seeded into the
4
- * registry on a fresh install. After seeding, this backend is a normal
5
- * registered entry the user can rename it, edit its host/api key, or
6
- * remove it like any other backend.
7
- *
8
- * The id is also used by `saveAgentServerConfig` to keep the registry
9
- * entry in sync with the legacy `openhands-agent-server-config` storage
10
- * that the recovery / agent-server settings page edits.
4
+ * registry when the launcher provides both a backend host and API key.
5
+ * After seeding, this backend is a normal registered entry the user can
6
+ * rename it, edit its host/api key, or remove it like any other backend.
11
7
  */
12
8
  export declare const DEFAULT_LOCAL_BACKEND_ID = "default-local";
13
9
  export declare const DEFAULT_LOCAL_BACKEND_NAME = "Local";
14
10
  /**
15
- * Construct the default local backend from environment / agent-server
16
- * config (`VITE_BACKEND_BASE_URL`, `VITE_SESSION_API_KEY`, plus the
17
- * `openhands-agent-server-config` localStorage overrides).
11
+ * Construct the default local backend from environment/runtime config.
12
+ * Returns null unless both a backend location and API key are available.
18
13
  *
19
- * Used in two places:
20
- * 1. As the seed entry written to `openhands-backends` on first load.
21
- * 2. As a last-resort fallback inside the active store when the
22
- * registry has no local backend at all (e.g. the user removed
23
- * every entry). The synthetic fallback is never persisted.
14
+ * Used as the seed entry written to `openhands-backends` on first load;
15
+ * if it returns null, onboarding is responsible for collecting backend
16
+ * connection details from the user.
24
17
  */
25
- export declare function makeDefaultLocalBackend(): Backend;
18
+ export declare function makeDefaultLocalBackend(): Backend | null;
@@ -2,15 +2,16 @@ import { getAgentServerBaseUrl as e, getAgentServerSessionApiKey as t } from "..
2
2
  //#region src/api/backend-registry/default-backend.ts
3
3
  var n = "default-local", r = "Local";
4
4
  function i() {
5
- return {
5
+ let i = e(), a = t();
6
+ return !i || !a ? null : {
6
7
  id: n,
7
8
  name: r,
8
- host: e(),
9
- apiKey: t() ?? "",
9
+ host: i,
10
+ apiKey: a,
10
11
  kind: "local"
11
12
  };
12
13
  }
13
14
  //#endregion
14
- export { n as DEFAULT_LOCAL_BACKEND_ID, i as makeDefaultLocalBackend };
15
+ export { n as DEFAULT_LOCAL_BACKEND_ID, r as DEFAULT_LOCAL_BACKEND_NAME, i as makeDefaultLocalBackend };
15
16
 
16
17
  //# sourceMappingURL=default-backend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"default-backend.js","names":[],"sources":["../../../src/api/backend-registry/default-backend.ts"],"sourcesContent":["import {\n getAgentServerBaseUrl,\n getAgentServerSessionApiKey,\n} from \"../agent-server-config\";\nimport type { Backend } from \"./types\";\n\n/**\n * Stable id for the default local backend that is auto-seeded into the\n * registry on a fresh install. After seeding, this backend is a normal\n * registered entry — the user can rename it, edit its host/api key, or\n * remove it like any other backend.\n *\n * The id is also used by `saveAgentServerConfig` to keep the registry\n * entry in sync with the legacy `openhands-agent-server-config` storage\n * that the recovery / agent-server settings page edits.\n */\nexport const DEFAULT_LOCAL_BACKEND_ID = \"default-local\";\n\nexport const DEFAULT_LOCAL_BACKEND_NAME = \"Local\";\n\n/**\n * Construct the default local backend from environment / agent-server\n * config (`VITE_BACKEND_BASE_URL`, `VITE_SESSION_API_KEY`, plus the\n * `openhands-agent-server-config` localStorage overrides).\n *\n * Used in two places:\n * 1. As the seed entry written to `openhands-backends` on first load.\n * 2. As a last-resort fallback inside the active store when the\n * registry has no local backend at all (e.g. the user removed\n * every entry). The synthetic fallback is never persisted.\n */\nexport function makeDefaultLocalBackend(): Backend {\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host: getAgentServerBaseUrl(),\n apiKey: getAgentServerSessionApiKey() ?? \"\",\n kind: \"local\",\n };\n}\n"],"mappings":";;AAgBA,IAAa,IAA2B,iBAE3B,IAA6B;AAa1C,SAAgB,IAAmC;AACjD,QAAO;EACL,IAAI;EACJ,MAAM;EACN,MAAM,GAAuB;EAC7B,QAAQ,GAA6B,IAAI;EACzC,MAAM;EACP"}
1
+ {"version":3,"file":"default-backend.js","names":[],"sources":["../../../src/api/backend-registry/default-backend.ts"],"sourcesContent":["import {\n getAgentServerBaseUrl,\n getAgentServerSessionApiKey,\n} from \"../agent-server-config\";\nimport type { Backend } from \"./types\";\n\n/**\n * Stable id for the default local backend that is auto-seeded into the\n * registry when the launcher provides both a backend host and API key.\n * After seeding, this backend is a normal registered entry — the user can\n * rename it, edit its host/api key, or remove it like any other backend.\n */\nexport const DEFAULT_LOCAL_BACKEND_ID = \"default-local\";\n\nexport const DEFAULT_LOCAL_BACKEND_NAME = \"Local\";\n\n/**\n * Construct the default local backend from environment/runtime config.\n * Returns null unless both a backend location and API key are available.\n *\n * Used as the seed entry written to `openhands-backends` on first load;\n * if it returns null, onboarding is responsible for collecting backend\n * connection details from the user.\n */\nexport function makeDefaultLocalBackend(): Backend | null {\n const host = getAgentServerBaseUrl();\n const apiKey = getAgentServerSessionApiKey();\n\n if (!host || !apiKey) return null;\n\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host,\n apiKey,\n kind: \"local\",\n };\n}\n"],"mappings":";;AAYA,IAAa,IAA2B,iBAE3B,IAA6B;AAU1C,SAAgB,IAA0C;CACxD,IAAM,IAAO,GAAuB,EAC9B,IAAS,GAA6B;AAI5C,QAFI,CAAC,KAAQ,CAAC,IAAe,OAEtB;EACL,IAAI;EACJ,MAAM;EACN;EACA;EACA,MAAM;EACP"}
@@ -1,2 +1,2 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../agent-server-config.cjs`),t=require(`./default-backend.cjs`);var n=`openhands-backends`,r=`openhands-active-backend`;function i(e){return e===`local`||e===`cloud`}function a(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.name==`string`&&typeof t.host==`string`&&typeof t.apiKey==`string`&&i(t.kind)}function o(e){try{return new URL(e).origin}catch{return e.replace(/\/+$/,``)}}function s(e){let n=t.makeDefaultLocalBackend();return e.id!==n.id||e.kind!==`local`||!n.apiKey||o(e.host)!==o(n.host)||e.apiKey===n.apiKey?e:{...e,apiKey:n.apiKey}}function c(e){if(!(typeof window>`u`))try{window.localStorage.setItem(n,JSON.stringify(e))}catch{}}function l(){if(typeof window>`u`)return[];e.syncBakedSessionApiKey();try{let e=window.localStorage.getItem(n);if(e===null){let e=[t.makeDefaultLocalBackend()];return c(e),e}let r=JSON.parse(e);if(!Array.isArray(r))return[];let i=r.filter(a);if(i.length===0){let e=[t.makeDefaultLocalBackend()];return c(e),e}let o=i.map(s);return o.some((e,t)=>e!==i[t])&&c(o),o}catch{return[]}}function u(){if(typeof window>`u`)return null;try{let e=window.localStorage.getItem(r);if(!e)return null;let t=JSON.parse(e);if(typeof t!=`object`||!t||typeof t.backendId!=`string`)return null;let n=t.orgId;return{backendId:t.backendId,orgId:typeof n==`string`&&n.length>0?n:null}}catch{return null}}function d(e){if(!(typeof window>`u`))try{if(!e){window.localStorage.removeItem(r);return}window.localStorage.setItem(r,JSON.stringify({backendId:e.backendId,orgId:e.orgId??null}))}catch{}}exports.readStoredActiveBackend=u,exports.readStoredBackends=l,exports.writeStoredActiveBackend=d,exports.writeStoredBackends=c;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`./default-backend.cjs`);var t=`openhands-backends`,n=`openhands-active-backend`,r=`openhands-agent-server-config`;function i(e){return e===`local`||e===`cloud`}function a(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.name==`string`&&typeof t.host==`string`&&typeof t.apiKey==`string`&&i(t.kind)}function o(e){if(typeof e!=`string`)return null;let t=e.trim().replace(/\/+$/,``);return t?/^https?:\/\//i.test(t)?t:`http://${t}`:null}function s(){let t=window.localStorage.getItem(r);if(!t)return null;try{let n=JSON.parse(t),r=o(n.baseUrl),i=typeof n.sessionApiKey==`string`?n.sessionApiKey.trim():``;return!r||!i?null:{id:e.DEFAULT_LOCAL_BACKEND_ID,name:e.DEFAULT_LOCAL_BACKEND_NAME,host:r,apiKey:i,kind:`local`}}catch{return null}}function c(){window.localStorage.removeItem(r)}function l(e){return p(e),c(),e}function u(e){try{let{hostname:t}=new URL(e);return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function d(e,t){return e.id!==`default-local`||e.kind!==`local`?!1:e.host===t.host||u(e.host)&&u(t.host)}function f(t){let n=e.makeDefaultLocalBackend();if(!n)return t;let r=!1,i=t.map(e=>!d(e,n)||e.apiKey===n.apiKey?e:(r=!0,{...e,apiKey:n.apiKey}));return r?(p(i),i):t}function p(e){if(!(typeof window>`u`))try{window.localStorage.setItem(t,JSON.stringify(e))}catch{}}function m(){if(typeof window>`u`)return[];try{let n=window.localStorage.getItem(t);if(n===null){let t=s();if(t)return l([t]);let n=e.makeDefaultLocalBackend();return n?l([n]):[]}let r=JSON.parse(n);if(!Array.isArray(r))return[];let i=r.filter(a);if(i.length===0){let t=e.makeDefaultLocalBackend();return t?l([t]):[]}let o=f(i);return c(),o}catch{return[]}}function h(){if(typeof window>`u`)return null;try{let e=window.localStorage.getItem(n);if(!e)return null;let t=JSON.parse(e);if(typeof t!=`object`||!t||typeof t.backendId!=`string`)return null;let r=t.orgId;return{backendId:t.backendId,orgId:typeof r==`string`&&r.length>0?r:null}}catch{return null}}function g(e){if(!(typeof window>`u`))try{if(!e){window.localStorage.removeItem(n);return}window.localStorage.setItem(n,JSON.stringify({backendId:e.backendId,orgId:e.orgId??null}))}catch{}}exports.readStoredActiveBackend=h,exports.readStoredBackends=m,exports.writeStoredActiveBackend=g,exports.writeStoredBackends=p;
2
2
  //# sourceMappingURL=storage.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.cjs","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import { syncBakedSessionApiKey } from \"../agent-server-config\";\nimport { makeDefaultLocalBackend } from \"./default-backend\";\nimport type { Backend, BackendKind, BackendSelection } from \"./types\";\n\nexport const BACKENDS_STORAGE_KEY = \"openhands-backends\";\nexport const ACTIVE_BACKEND_STORAGE_KEY = \"openhands-active-backend\";\n\nfunction isValidKind(value: unknown): value is BackendKind {\n return value === \"local\" || value === \"cloud\";\n}\n\nfunction isValidBackend(value: unknown): value is Backend {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Partial<Backend>;\n return (\n typeof v.id === \"string\" &&\n v.id.length > 0 &&\n typeof v.name === \"string\" &&\n typeof v.host === \"string\" &&\n typeof v.apiKey === \"string\" &&\n isValidKind(v.kind)\n );\n}\n\nfunction normalizeHostForComparison(host: string): string {\n try {\n return new URL(host).origin;\n } catch {\n return host.replace(/\\/+$/, \"\");\n }\n}\n\nfunction syncDefaultLocalBackendAuth(backend: Backend): Backend {\n const defaultBackend = makeDefaultLocalBackend();\n\n if (\n backend.id !== defaultBackend.id ||\n backend.kind !== \"local\" ||\n !defaultBackend.apiKey ||\n normalizeHostForComparison(backend.host) !==\n normalizeHostForComparison(defaultBackend.host)\n ) {\n return backend;\n }\n\n if (backend.apiKey === defaultBackend.apiKey) {\n return backend;\n }\n\n return {\n ...backend,\n apiKey: defaultBackend.apiKey,\n };\n}\n\nexport function writeStoredBackends(backends: Backend[]): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(BACKENDS_STORAGE_KEY, JSON.stringify(backends));\n } catch {\n /* ignore quota / serialization errors */\n }\n}\n\nexport function readStoredBackends(): Backend[] {\n if (typeof window === \"undefined\") return [];\n\n // Ensure the baked-in session API key (VITE_SESSION_API_KEY) is synced\n // into the legacy `openhands-agent-server-config` localStorage entry\n // BEFORE we read the backend registry. This matters when the user\n // restarts the stack with a different LOCAL_BACKEND_API_KEY — without\n // this call the stale key in `openhands-agent-server-config` shadows\n // the new baked key, making `makeDefaultLocalBackend()` (and the\n // downstream `syncDefaultLocalBackendAuth`) read the wrong value.\n syncBakedSessionApiKey();\n\n try {\n const raw = window.localStorage.getItem(BACKENDS_STORAGE_KEY);\n\n // First install: the storage key has never been written. Seed the\n // registry with one default local backend derived from the env /\n // agent-server-config so the user has something to talk to out of\n // the box.\n if (raw === null) {\n const seeded = [makeDefaultLocalBackend()];\n writeStoredBackends(seeded);\n return seeded;\n }\n\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const valid = parsed.filter(isValidBackend);\n\n // If the stored array is empty (or everything in it failed validation),\n // re-seed with the default Local backend so the user always has a\n // working entry pointing at VITE_SESSION_API_KEY. With the dev scripts\n // persisting that key to ~/.openhands/agent-canvas/session-api-key.txt,\n // re-seeding is safe — the seeded entry will keep working across\n // restarts instead of going stale.\n if (valid.length === 0) {\n const seeded = [makeDefaultLocalBackend()];\n writeStoredBackends(seeded);\n return seeded;\n }\n\n const synced = valid.map(syncDefaultLocalBackendAuth);\n if (synced.some((backend, index) => backend !== valid[index])) {\n writeStoredBackends(synced);\n }\n\n return synced;\n } catch {\n return [];\n }\n}\n\nexport function readStoredActiveBackend(): BackendSelection | null {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(ACTIVE_BACKEND_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as BackendSelection).backendId !== \"string\"\n ) {\n return null;\n }\n const orgIdRaw = (parsed as BackendSelection).orgId;\n return {\n backendId: (parsed as BackendSelection).backendId,\n orgId:\n typeof orgIdRaw === \"string\" && orgIdRaw.length > 0 ? orgIdRaw : null,\n };\n } catch {\n return null;\n }\n}\n\nexport function writeStoredActiveBackend(\n selection: BackendSelection | null,\n): void {\n if (typeof window === \"undefined\") return;\n try {\n if (!selection) {\n window.localStorage.removeItem(ACTIVE_BACKEND_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(\n ACTIVE_BACKEND_STORAGE_KEY,\n JSON.stringify({\n backendId: selection.backendId,\n orgId: selection.orgId ?? null,\n }),\n );\n } catch {\n /* ignore */\n }\n}\n"],"mappings":"iIAIA,IAAa,EAAuB,qBACvB,EAA6B,2BAE1C,SAAS,EAAY,EAAsC,CACzD,OAAO,IAAU,SAAW,IAAU,QAGxC,SAAS,EAAe,EAAkC,CACxD,GAAI,OAAO,GAAU,WAAY,EAAgB,MAAO,GACxD,IAAM,EAAI,EACV,OACE,OAAO,EAAE,IAAO,UAChB,EAAE,GAAG,OAAS,GACd,OAAO,EAAE,MAAS,UAClB,OAAO,EAAE,MAAS,UAClB,OAAO,EAAE,QAAW,UACpB,EAAY,EAAE,KAAK,CAIvB,SAAS,EAA2B,EAAsB,CACxD,GAAI,CACF,OAAO,IAAI,IAAI,EAAK,CAAC,YACf,CACN,OAAO,EAAK,QAAQ,OAAQ,GAAG,EAInC,SAAS,EAA4B,EAA2B,CAC9D,IAAM,EAAiB,EAAA,yBAAyB,CAgBhD,OAbE,EAAQ,KAAO,EAAe,IAC9B,EAAQ,OAAS,SACjB,CAAC,EAAe,QAChB,EAA2B,EAAQ,KAAK,GACtC,EAA2B,EAAe,KAAK,EAK/C,EAAQ,SAAW,EAAe,OAC7B,EAGF,CACL,GAAG,EACH,OAAQ,EAAe,OACxB,CAGH,SAAgB,EAAoB,EAA2B,CACzD,YAAO,OAAW,KACtB,GAAI,CACF,OAAO,aAAa,QAAQ,EAAsB,KAAK,UAAU,EAAS,CAAC,MACrE,GAKV,SAAgB,GAAgC,CAC9C,GAAI,OAAO,OAAW,IAAa,MAAO,EAAE,CAS5C,EAAA,wBAAwB,CAExB,GAAI,CACF,IAAM,EAAM,OAAO,aAAa,QAAQ,EAAqB,CAM7D,GAAI,IAAQ,KAAM,CAChB,IAAM,EAAS,CAAC,EAAA,yBAAyB,CAAC,CAE1C,OADA,EAAoB,EAAO,CACpB,EAGT,IAAM,EAAS,KAAK,MAAM,EAAI,CAC9B,GAAI,CAAC,MAAM,QAAQ,EAAO,CAAE,MAAO,EAAE,CACrC,IAAM,EAAQ,EAAO,OAAO,EAAe,CAQ3C,GAAI,EAAM,SAAW,EAAG,CACtB,IAAM,EAAS,CAAC,EAAA,yBAAyB,CAAC,CAE1C,OADA,EAAoB,EAAO,CACpB,EAGT,IAAM,EAAS,EAAM,IAAI,EAA4B,CAKrD,OAJI,EAAO,MAAM,EAAS,IAAU,IAAY,EAAM,GAAO,EAC3D,EAAoB,EAAO,CAGtB,OACD,CACN,MAAO,EAAE,EAIb,SAAgB,GAAmD,CACjE,GAAI,OAAO,OAAW,IAAa,OAAO,KAC1C,GAAI,CACF,IAAM,EAAM,OAAO,aAAa,QAAQ,EAA2B,CACnE,GAAI,CAAC,EAAK,OAAO,KACjB,IAAM,EAAS,KAAK,MAAM,EAAI,CAC9B,GACE,OAAO,GAAW,WAClB,GACA,OAAQ,EAA4B,WAAc,SAElD,OAAO,KAET,IAAM,EAAY,EAA4B,MAC9C,MAAO,CACL,UAAY,EAA4B,UACxC,MACE,OAAO,GAAa,UAAY,EAAS,OAAS,EAAI,EAAW,KACpE,MACK,CACN,OAAO,MAIX,SAAgB,EACd,EACM,CACF,YAAO,OAAW,KACtB,GAAI,CACF,GAAI,CAAC,EAAW,CACd,OAAO,aAAa,WAAW,EAA2B,CAC1D,OAEF,OAAO,aAAa,QAClB,EACA,KAAK,UAAU,CACb,UAAW,EAAU,UACrB,MAAO,EAAU,OAAS,KAC3B,CAAC,CACH,MACK"}
1
+ {"version":3,"file":"storage.cjs","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {\n DEFAULT_LOCAL_BACKEND_ID,\n DEFAULT_LOCAL_BACKEND_NAME,\n makeDefaultLocalBackend,\n} from \"./default-backend\";\nimport type { Backend, BackendKind, BackendSelection } from \"./types\";\n\nexport const BACKENDS_STORAGE_KEY = \"openhands-backends\";\nexport const ACTIVE_BACKEND_STORAGE_KEY = \"openhands-active-backend\";\n\nconst LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY = \"openhands-agent-server-config\";\n\nfunction isValidKind(value: unknown): value is BackendKind {\n return value === \"local\" || value === \"cloud\";\n}\n\nfunction isValidBackend(value: unknown): value is Backend {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Partial<Backend>;\n return (\n typeof v.id === \"string\" &&\n v.id.length > 0 &&\n typeof v.name === \"string\" &&\n typeof v.host === \"string\" &&\n typeof v.apiKey === \"string\" &&\n isValidKind(v.kind)\n );\n}\n\nfunction normalizeLegacyBaseUrl(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim().replace(/\\/+$/, \"\");\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n return `http://${trimmed}`;\n}\n\nfunction readLegacyBackend(): Backend | null {\n const raw = window.localStorage.getItem(\n LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY,\n );\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const host = normalizeLegacyBaseUrl(parsed.baseUrl);\n const apiKey =\n typeof parsed.sessionApiKey === \"string\"\n ? parsed.sessionApiKey.trim()\n : \"\";\n\n if (!host || !apiKey) return null;\n\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host,\n apiKey,\n kind: \"local\",\n };\n } catch {\n return null;\n }\n}\n\nfunction clearLegacyBackendConfig(): void {\n window.localStorage.removeItem(LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY);\n}\n\nfunction seedBackends(backends: Backend[]): Backend[] {\n writeStoredBackends(backends);\n clearLegacyBackendConfig();\n return backends;\n}\n\nfunction isLoopbackUrl(value: string): boolean {\n try {\n const { hostname } = new URL(value);\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"[::1]\"\n );\n } catch {\n return false;\n }\n}\n\nfunction shouldSyncLauncherDefaultLocalBackend(\n backend: Backend,\n defaultBackend: Backend,\n): boolean {\n if (backend.id !== DEFAULT_LOCAL_BACKEND_ID || backend.kind !== \"local\") {\n return false;\n }\n\n return (\n backend.host === defaultBackend.host ||\n (isLoopbackUrl(backend.host) && isLoopbackUrl(defaultBackend.host))\n );\n}\n\nfunction syncLauncherDefaultLocalBackend(backends: Backend[]): Backend[] {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return backends;\n\n let didSync = false;\n const syncedBackends = backends.map((backend) => {\n if (!shouldSyncLauncherDefaultLocalBackend(backend, defaultBackend)) {\n return backend;\n }\n\n if (backend.apiKey === defaultBackend.apiKey) return backend;\n\n didSync = true;\n return {\n ...backend,\n apiKey: defaultBackend.apiKey,\n };\n });\n\n if (!didSync) return backends;\n\n writeStoredBackends(syncedBackends);\n return syncedBackends;\n}\n\nexport function writeStoredBackends(backends: Backend[]): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(BACKENDS_STORAGE_KEY, JSON.stringify(backends));\n } catch {\n /* ignore quota / serialization errors */\n }\n}\n\nexport function readStoredBackends(): Backend[] {\n if (typeof window === \"undefined\") return [];\n\n try {\n const raw = window.localStorage.getItem(BACKENDS_STORAGE_KEY);\n\n // First install: migrate one legacy local backend if present, otherwise\n // seed only when the launcher supplied enough information for a usable\n // local backend.\n if (raw === null) {\n const legacyBackend = readLegacyBackend();\n if (legacyBackend) return seedBackends([legacyBackend]);\n\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n return seedBackends([defaultBackend]);\n }\n\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const valid = parsed.filter(isValidBackend);\n\n // If the stored array is empty (or everything in it failed validation),\n // only re-seed when the launcher supplied both a host and API key.\n if (valid.length === 0) {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n return seedBackends([defaultBackend]);\n }\n\n const synced = syncLauncherDefaultLocalBackend(valid);\n clearLegacyBackendConfig();\n return synced;\n } catch {\n return [];\n }\n}\n\nexport function readStoredActiveBackend(): BackendSelection | null {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(ACTIVE_BACKEND_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as BackendSelection).backendId !== \"string\"\n ) {\n return null;\n }\n const orgIdRaw = (parsed as BackendSelection).orgId;\n return {\n backendId: (parsed as BackendSelection).backendId,\n orgId:\n typeof orgIdRaw === \"string\" && orgIdRaw.length > 0 ? orgIdRaw : null,\n };\n } catch {\n return null;\n }\n}\n\nexport function writeStoredActiveBackend(\n selection: BackendSelection | null,\n): void {\n if (typeof window === \"undefined\") return;\n try {\n if (!selection) {\n window.localStorage.removeItem(ACTIVE_BACKEND_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(\n ACTIVE_BACKEND_STORAGE_KEY,\n JSON.stringify({\n backendId: selection.backendId,\n orgId: selection.orgId ?? null,\n }),\n );\n } catch {\n /* ignore */\n }\n}\n"],"mappings":"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"}
@@ -1,60 +1,93 @@
1
- import { syncBakedSessionApiKey as e } from "../agent-server-config.js";
2
- import { makeDefaultLocalBackend as t } from "./default-backend.js";
1
+ import { DEFAULT_LOCAL_BACKEND_ID as e, DEFAULT_LOCAL_BACKEND_NAME as t, makeDefaultLocalBackend as n } from "./default-backend.js";
3
2
  //#region src/api/backend-registry/storage.ts
4
- var n = "openhands-backends", r = "openhands-active-backend";
5
- function i(e) {
3
+ var r = "openhands-backends", i = "openhands-active-backend", a = "openhands-agent-server-config";
4
+ function o(e) {
6
5
  return e === "local" || e === "cloud";
7
6
  }
8
- function a(e) {
7
+ function s(e) {
9
8
  if (typeof e != "object" || !e) return !1;
10
9
  let t = e;
11
- return typeof t.id == "string" && t.id.length > 0 && typeof t.name == "string" && typeof t.host == "string" && typeof t.apiKey == "string" && i(t.kind);
10
+ return typeof t.id == "string" && t.id.length > 0 && typeof t.name == "string" && typeof t.host == "string" && typeof t.apiKey == "string" && o(t.kind);
12
11
  }
13
- function o(e) {
12
+ function c(e) {
13
+ if (typeof e != "string") return null;
14
+ let t = e.trim().replace(/\/+$/, "");
15
+ return t ? /^https?:\/\//i.test(t) ? t : `http://${t}` : null;
16
+ }
17
+ function l() {
18
+ let n = window.localStorage.getItem(a);
19
+ if (!n) return null;
14
20
  try {
15
- return new URL(e).origin;
21
+ let r = JSON.parse(n), i = c(r.baseUrl), a = typeof r.sessionApiKey == "string" ? r.sessionApiKey.trim() : "";
22
+ return !i || !a ? null : {
23
+ id: e,
24
+ name: t,
25
+ host: i,
26
+ apiKey: a,
27
+ kind: "local"
28
+ };
16
29
  } catch {
17
- return e.replace(/\/+$/, "");
30
+ return null;
18
31
  }
19
32
  }
20
- function s(e) {
21
- let n = t();
22
- return e.id !== n.id || e.kind !== "local" || !n.apiKey || o(e.host) !== o(n.host) || e.apiKey === n.apiKey ? e : {
33
+ function u() {
34
+ window.localStorage.removeItem(a);
35
+ }
36
+ function d(e) {
37
+ return h(e), u(), e;
38
+ }
39
+ function f(e) {
40
+ try {
41
+ let { hostname: t } = new URL(e);
42
+ return t === "localhost" || t === "127.0.0.1" || t === "::1" || t === "[::1]";
43
+ } catch {
44
+ return !1;
45
+ }
46
+ }
47
+ function p(e, t) {
48
+ return e.id !== "default-local" || e.kind !== "local" ? !1 : e.host === t.host || f(e.host) && f(t.host);
49
+ }
50
+ function m(e) {
51
+ let t = n();
52
+ if (!t) return e;
53
+ let r = !1, i = e.map((e) => !p(e, t) || e.apiKey === t.apiKey ? e : (r = !0, {
23
54
  ...e,
24
- apiKey: n.apiKey
25
- };
55
+ apiKey: t.apiKey
56
+ }));
57
+ return r ? (h(i), i) : e;
26
58
  }
27
- function c(e) {
59
+ function h(e) {
28
60
  if (!(typeof window > "u")) try {
29
- window.localStorage.setItem(n, JSON.stringify(e));
61
+ window.localStorage.setItem(r, JSON.stringify(e));
30
62
  } catch {}
31
63
  }
32
- function l() {
64
+ function g() {
33
65
  if (typeof window > "u") return [];
34
- e();
35
66
  try {
36
- let e = window.localStorage.getItem(n);
67
+ let e = window.localStorage.getItem(r);
37
68
  if (e === null) {
38
- let e = [t()];
39
- return c(e), e;
69
+ let e = l();
70
+ if (e) return d([e]);
71
+ let t = n();
72
+ return t ? d([t]) : [];
40
73
  }
41
- let r = JSON.parse(e);
42
- if (!Array.isArray(r)) return [];
43
- let i = r.filter(a);
74
+ let t = JSON.parse(e);
75
+ if (!Array.isArray(t)) return [];
76
+ let i = t.filter(s);
44
77
  if (i.length === 0) {
45
- let e = [t()];
46
- return c(e), e;
78
+ let e = n();
79
+ return e ? d([e]) : [];
47
80
  }
48
- let o = i.map(s);
49
- return o.some((e, t) => e !== i[t]) && c(o), o;
81
+ let a = m(i);
82
+ return u(), a;
50
83
  } catch {
51
84
  return [];
52
85
  }
53
86
  }
54
- function u() {
87
+ function _() {
55
88
  if (typeof window > "u") return null;
56
89
  try {
57
- let e = window.localStorage.getItem(r);
90
+ let e = window.localStorage.getItem(i);
58
91
  if (!e) return null;
59
92
  let t = JSON.parse(e);
60
93
  if (typeof t != "object" || !t || typeof t.backendId != "string") return null;
@@ -67,19 +100,19 @@ function u() {
67
100
  return null;
68
101
  }
69
102
  }
70
- function d(e) {
103
+ function v(e) {
71
104
  if (!(typeof window > "u")) try {
72
105
  if (!e) {
73
- window.localStorage.removeItem(r);
106
+ window.localStorage.removeItem(i);
74
107
  return;
75
108
  }
76
- window.localStorage.setItem(r, JSON.stringify({
109
+ window.localStorage.setItem(i, JSON.stringify({
77
110
  backendId: e.backendId,
78
111
  orgId: e.orgId ?? null
79
112
  }));
80
113
  } catch {}
81
114
  }
82
115
  //#endregion
83
- export { u as readStoredActiveBackend, l as readStoredBackends, d as writeStoredActiveBackend, c as writeStoredBackends };
116
+ export { _ as readStoredActiveBackend, g as readStoredBackends, v as writeStoredActiveBackend, h as writeStoredBackends };
84
117
 
85
118
  //# sourceMappingURL=storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import { syncBakedSessionApiKey } from \"../agent-server-config\";\nimport { makeDefaultLocalBackend } from \"./default-backend\";\nimport type { Backend, BackendKind, BackendSelection } from \"./types\";\n\nexport const BACKENDS_STORAGE_KEY = \"openhands-backends\";\nexport const ACTIVE_BACKEND_STORAGE_KEY = \"openhands-active-backend\";\n\nfunction isValidKind(value: unknown): value is BackendKind {\n return value === \"local\" || value === \"cloud\";\n}\n\nfunction isValidBackend(value: unknown): value is Backend {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Partial<Backend>;\n return (\n typeof v.id === \"string\" &&\n v.id.length > 0 &&\n typeof v.name === \"string\" &&\n typeof v.host === \"string\" &&\n typeof v.apiKey === \"string\" &&\n isValidKind(v.kind)\n );\n}\n\nfunction normalizeHostForComparison(host: string): string {\n try {\n return new URL(host).origin;\n } catch {\n return host.replace(/\\/+$/, \"\");\n }\n}\n\nfunction syncDefaultLocalBackendAuth(backend: Backend): Backend {\n const defaultBackend = makeDefaultLocalBackend();\n\n if (\n backend.id !== defaultBackend.id ||\n backend.kind !== \"local\" ||\n !defaultBackend.apiKey ||\n normalizeHostForComparison(backend.host) !==\n normalizeHostForComparison(defaultBackend.host)\n ) {\n return backend;\n }\n\n if (backend.apiKey === defaultBackend.apiKey) {\n return backend;\n }\n\n return {\n ...backend,\n apiKey: defaultBackend.apiKey,\n };\n}\n\nexport function writeStoredBackends(backends: Backend[]): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(BACKENDS_STORAGE_KEY, JSON.stringify(backends));\n } catch {\n /* ignore quota / serialization errors */\n }\n}\n\nexport function readStoredBackends(): Backend[] {\n if (typeof window === \"undefined\") return [];\n\n // Ensure the baked-in session API key (VITE_SESSION_API_KEY) is synced\n // into the legacy `openhands-agent-server-config` localStorage entry\n // BEFORE we read the backend registry. This matters when the user\n // restarts the stack with a different LOCAL_BACKEND_API_KEY — without\n // this call the stale key in `openhands-agent-server-config` shadows\n // the new baked key, making `makeDefaultLocalBackend()` (and the\n // downstream `syncDefaultLocalBackendAuth`) read the wrong value.\n syncBakedSessionApiKey();\n\n try {\n const raw = window.localStorage.getItem(BACKENDS_STORAGE_KEY);\n\n // First install: the storage key has never been written. Seed the\n // registry with one default local backend derived from the env /\n // agent-server-config so the user has something to talk to out of\n // the box.\n if (raw === null) {\n const seeded = [makeDefaultLocalBackend()];\n writeStoredBackends(seeded);\n return seeded;\n }\n\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const valid = parsed.filter(isValidBackend);\n\n // If the stored array is empty (or everything in it failed validation),\n // re-seed with the default Local backend so the user always has a\n // working entry pointing at VITE_SESSION_API_KEY. With the dev scripts\n // persisting that key to ~/.openhands/agent-canvas/session-api-key.txt,\n // re-seeding is safe — the seeded entry will keep working across\n // restarts instead of going stale.\n if (valid.length === 0) {\n const seeded = [makeDefaultLocalBackend()];\n writeStoredBackends(seeded);\n return seeded;\n }\n\n const synced = valid.map(syncDefaultLocalBackendAuth);\n if (synced.some((backend, index) => backend !== valid[index])) {\n writeStoredBackends(synced);\n }\n\n return synced;\n } catch {\n return [];\n }\n}\n\nexport function readStoredActiveBackend(): BackendSelection | null {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(ACTIVE_BACKEND_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as BackendSelection).backendId !== \"string\"\n ) {\n return null;\n }\n const orgIdRaw = (parsed as BackendSelection).orgId;\n return {\n backendId: (parsed as BackendSelection).backendId,\n orgId:\n typeof orgIdRaw === \"string\" && orgIdRaw.length > 0 ? orgIdRaw : null,\n };\n } catch {\n return null;\n }\n}\n\nexport function writeStoredActiveBackend(\n selection: BackendSelection | null,\n): void {\n if (typeof window === \"undefined\") return;\n try {\n if (!selection) {\n window.localStorage.removeItem(ACTIVE_BACKEND_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(\n ACTIVE_BACKEND_STORAGE_KEY,\n JSON.stringify({\n backendId: selection.backendId,\n orgId: selection.orgId ?? null,\n }),\n );\n } catch {\n /* ignore */\n }\n}\n"],"mappings":";;;AAIA,IAAa,IAAuB,sBACvB,IAA6B;AAE1C,SAAS,EAAY,GAAsC;AACzD,QAAO,MAAU,WAAW,MAAU;;AAGxC,SAAS,EAAe,GAAkC;AACxD,KAAI,OAAO,KAAU,aAAY,EAAgB,QAAO;CACxD,IAAM,IAAI;AACV,QACE,OAAO,EAAE,MAAO,YAChB,EAAE,GAAG,SAAS,KACd,OAAO,EAAE,QAAS,YAClB,OAAO,EAAE,QAAS,YAClB,OAAO,EAAE,UAAW,YACpB,EAAY,EAAE,KAAK;;AAIvB,SAAS,EAA2B,GAAsB;AACxD,KAAI;AACF,SAAO,IAAI,IAAI,EAAK,CAAC;SACf;AACN,SAAO,EAAK,QAAQ,QAAQ,GAAG;;;AAInC,SAAS,EAA4B,GAA2B;CAC9D,IAAM,IAAiB,GAAyB;AAgBhD,QAbE,EAAQ,OAAO,EAAe,MAC9B,EAAQ,SAAS,WACjB,CAAC,EAAe,UAChB,EAA2B,EAAQ,KAAK,KACtC,EAA2B,EAAe,KAAK,IAK/C,EAAQ,WAAW,EAAe,SAC7B,IAGF;EACL,GAAG;EACH,QAAQ,EAAe;EACxB;;AAGH,SAAgB,EAAoB,GAA2B;AACzD,cAAO,SAAW,KACtB,KAAI;AACF,SAAO,aAAa,QAAQ,GAAsB,KAAK,UAAU,EAAS,CAAC;SACrE;;AAKV,SAAgB,IAAgC;AAC9C,KAAI,OAAO,SAAW,IAAa,QAAO,EAAE;AAS5C,IAAwB;AAExB,KAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,EAAqB;AAM7D,MAAI,MAAQ,MAAM;GAChB,IAAM,IAAS,CAAC,GAAyB,CAAC;AAE1C,UADA,EAAoB,EAAO,EACpB;;EAGT,IAAM,IAAS,KAAK,MAAM,EAAI;AAC9B,MAAI,CAAC,MAAM,QAAQ,EAAO,CAAE,QAAO,EAAE;EACrC,IAAM,IAAQ,EAAO,OAAO,EAAe;AAQ3C,MAAI,EAAM,WAAW,GAAG;GACtB,IAAM,IAAS,CAAC,GAAyB,CAAC;AAE1C,UADA,EAAoB,EAAO,EACpB;;EAGT,IAAM,IAAS,EAAM,IAAI,EAA4B;AAKrD,SAJI,EAAO,MAAM,GAAS,MAAU,MAAY,EAAM,GAAO,IAC3D,EAAoB,EAAO,EAGtB;SACD;AACN,SAAO,EAAE;;;AAIb,SAAgB,IAAmD;AACjE,KAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,KAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,EAA2B;AACnE,MAAI,CAAC,EAAK,QAAO;EACjB,IAAM,IAAS,KAAK,MAAM,EAAI;AAC9B,MACE,OAAO,KAAW,aAClB,KACA,OAAQ,EAA4B,aAAc,SAElD,QAAO;EAET,IAAM,IAAY,EAA4B;AAC9C,SAAO;GACL,WAAY,EAA4B;GACxC,OACE,OAAO,KAAa,YAAY,EAAS,SAAS,IAAI,IAAW;GACpE;SACK;AACN,SAAO;;;AAIX,SAAgB,EACd,GACM;AACF,cAAO,SAAW,KACtB,KAAI;AACF,MAAI,CAAC,GAAW;AACd,UAAO,aAAa,WAAW,EAA2B;AAC1D;;AAEF,SAAO,aAAa,QAClB,GACA,KAAK,UAAU;GACb,WAAW,EAAU;GACrB,OAAO,EAAU,SAAS;GAC3B,CAAC,CACH;SACK"}
1
+ {"version":3,"file":"storage.js","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {\n DEFAULT_LOCAL_BACKEND_ID,\n DEFAULT_LOCAL_BACKEND_NAME,\n makeDefaultLocalBackend,\n} from \"./default-backend\";\nimport type { Backend, BackendKind, BackendSelection } from \"./types\";\n\nexport const BACKENDS_STORAGE_KEY = \"openhands-backends\";\nexport const ACTIVE_BACKEND_STORAGE_KEY = \"openhands-active-backend\";\n\nconst LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY = \"openhands-agent-server-config\";\n\nfunction isValidKind(value: unknown): value is BackendKind {\n return value === \"local\" || value === \"cloud\";\n}\n\nfunction isValidBackend(value: unknown): value is Backend {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Partial<Backend>;\n return (\n typeof v.id === \"string\" &&\n v.id.length > 0 &&\n typeof v.name === \"string\" &&\n typeof v.host === \"string\" &&\n typeof v.apiKey === \"string\" &&\n isValidKind(v.kind)\n );\n}\n\nfunction normalizeLegacyBaseUrl(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim().replace(/\\/+$/, \"\");\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n return `http://${trimmed}`;\n}\n\nfunction readLegacyBackend(): Backend | null {\n const raw = window.localStorage.getItem(\n LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY,\n );\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const host = normalizeLegacyBaseUrl(parsed.baseUrl);\n const apiKey =\n typeof parsed.sessionApiKey === \"string\"\n ? parsed.sessionApiKey.trim()\n : \"\";\n\n if (!host || !apiKey) return null;\n\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host,\n apiKey,\n kind: \"local\",\n };\n } catch {\n return null;\n }\n}\n\nfunction clearLegacyBackendConfig(): void {\n window.localStorage.removeItem(LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY);\n}\n\nfunction seedBackends(backends: Backend[]): Backend[] {\n writeStoredBackends(backends);\n clearLegacyBackendConfig();\n return backends;\n}\n\nfunction isLoopbackUrl(value: string): boolean {\n try {\n const { hostname } = new URL(value);\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"[::1]\"\n );\n } catch {\n return false;\n }\n}\n\nfunction shouldSyncLauncherDefaultLocalBackend(\n backend: Backend,\n defaultBackend: Backend,\n): boolean {\n if (backend.id !== DEFAULT_LOCAL_BACKEND_ID || backend.kind !== \"local\") {\n return false;\n }\n\n return (\n backend.host === defaultBackend.host ||\n (isLoopbackUrl(backend.host) && isLoopbackUrl(defaultBackend.host))\n );\n}\n\nfunction syncLauncherDefaultLocalBackend(backends: Backend[]): Backend[] {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return backends;\n\n let didSync = false;\n const syncedBackends = backends.map((backend) => {\n if (!shouldSyncLauncherDefaultLocalBackend(backend, defaultBackend)) {\n return backend;\n }\n\n if (backend.apiKey === defaultBackend.apiKey) return backend;\n\n didSync = true;\n return {\n ...backend,\n apiKey: defaultBackend.apiKey,\n };\n });\n\n if (!didSync) return backends;\n\n writeStoredBackends(syncedBackends);\n return syncedBackends;\n}\n\nexport function writeStoredBackends(backends: Backend[]): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(BACKENDS_STORAGE_KEY, JSON.stringify(backends));\n } catch {\n /* ignore quota / serialization errors */\n }\n}\n\nexport function readStoredBackends(): Backend[] {\n if (typeof window === \"undefined\") return [];\n\n try {\n const raw = window.localStorage.getItem(BACKENDS_STORAGE_KEY);\n\n // First install: migrate one legacy local backend if present, otherwise\n // seed only when the launcher supplied enough information for a usable\n // local backend.\n if (raw === null) {\n const legacyBackend = readLegacyBackend();\n if (legacyBackend) return seedBackends([legacyBackend]);\n\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n return seedBackends([defaultBackend]);\n }\n\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const valid = parsed.filter(isValidBackend);\n\n // If the stored array is empty (or everything in it failed validation),\n // only re-seed when the launcher supplied both a host and API key.\n if (valid.length === 0) {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n return seedBackends([defaultBackend]);\n }\n\n const synced = syncLauncherDefaultLocalBackend(valid);\n clearLegacyBackendConfig();\n return synced;\n } catch {\n return [];\n }\n}\n\nexport function readStoredActiveBackend(): BackendSelection | null {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(ACTIVE_BACKEND_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as BackendSelection).backendId !== \"string\"\n ) {\n return null;\n }\n const orgIdRaw = (parsed as BackendSelection).orgId;\n return {\n backendId: (parsed as BackendSelection).backendId,\n orgId:\n typeof orgIdRaw === \"string\" && orgIdRaw.length > 0 ? orgIdRaw : null,\n };\n } catch {\n return null;\n }\n}\n\nexport function writeStoredActiveBackend(\n selection: BackendSelection | null,\n): void {\n if (typeof window === \"undefined\") return;\n try {\n if (!selection) {\n window.localStorage.removeItem(ACTIVE_BACKEND_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(\n ACTIVE_BACKEND_STORAGE_KEY,\n JSON.stringify({\n backendId: selection.backendId,\n orgId: selection.orgId ?? null,\n }),\n );\n } catch {\n /* ignore */\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-service.api.cjs","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but routes\n * through the bundled agent-server's cloud proxy and hits the cloud\n * endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token (via the proxy's headers), and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * routes through the bundled agent-server's cloud proxy and hits\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but routes\n * through the bundled agent-server's cloud proxy and hits\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag` —\n * routes through the bundled agent-server's cloud proxy and hits\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox` — routes through the\n * bundled agent-server's cloud proxy and hits\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * — routes through the bundled agent-server's cloud proxy and hits\n * `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"conversation-service.api.cjs","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but calls\n * the cloud endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token, and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * calls\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but calls\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox`:\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":"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"}
@@ -1,9 +1,8 @@
1
1
  import type { AppConversation, AppConversationPage, AppConversationStartRequest, AppConversationStartTask } from "../conversation-service/agent-server-conversation-service.types";
2
2
  /**
3
3
  * Search the cloud app-conversations list. Mirrors the local
4
- * `AgentServerConversationService.searchConversations` interface but routes
5
- * through the bundled agent-server's cloud proxy and hits the cloud
6
- * endpoint `/api/v1/app-conversations/search`.
4
+ * `AgentServerConversationService.searchConversations` interface but calls
5
+ * the cloud endpoint `/api/v1/app-conversations/search`.
7
6
  */
8
7
  export declare function searchCloudConversations(limit?: number, pageId?: string): Promise<AppConversationPage>;
9
8
  /**
@@ -23,7 +22,7 @@ export declare function batchGetCloudConversations(ids: string[]): Promise<(AppC
23
22
  *
24
23
  * This path does NOT use encrypted-settings round-tripping. Secrets stay
25
24
  * server-side on the cloud backend — the only auth carried is the cloud bearer
26
- * token (via the proxy's headers), and the conversation runtime is
25
+ * token, and the conversation runtime is
27
26
  * provisioned with its own ephemeral session_api_key returned in the
28
27
  * task.
29
28
  */
@@ -31,15 +30,14 @@ export declare function createCloudAppConversation(request: AppConversationStart
31
30
  /**
32
31
  * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors
33
32
  * the local `AgentServerConversationService.downloadConversation` interface but
34
- * routes through the bundled agent-server's cloud proxy and hits
33
+ * calls
35
34
  * `GET /api/v1/app-conversations/{id}/download`, which returns
36
35
  * `application/zip` with `Content-Disposition` set by the cloud backend.
37
36
  */
38
37
  export declare function downloadCloudConversation(conversationId: string): Promise<Blob>;
39
38
  /**
40
39
  * Delete a v1 app-conversation on the cloud backend. Mirrors the local
41
- * `AgentServerConversationService.deleteConversation` interface but routes
42
- * through the bundled agent-server's cloud proxy and hits
40
+ * `AgentServerConversationService.deleteConversation` interface but calls
43
41
  * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON
44
42
  * `Success` envelope (discarded here — the caller only needs to know
45
43
  * the request didn't error).
@@ -47,24 +45,21 @@ export declare function downloadCloudConversation(conversationId: string): Promi
47
45
  export declare function deleteCloudConversation(conversationId: string): Promise<void>;
48
46
  /**
49
47
  * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors
50
- * OpenHands' `AgentServerConversationService.updateConversationPublicFlag` —
51
- * routes through the bundled agent-server's cloud proxy and hits
48
+ * OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:
52
49
  * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning
53
50
  * the updated conversation.
54
51
  */
55
52
  export declare function updateCloudConversationPublicFlag(conversationId: string, isPublic: boolean): Promise<AppConversation>;
56
53
  /**
57
54
  * Pause the cloud sandbox backing a v1 app-conversation. Mirrors
58
- * OpenHands' `SandboxService.pauseSandbox` — routes through the
59
- * bundled agent-server's cloud proxy and hits
55
+ * OpenHands' `SandboxService.pauseSandbox`:
60
56
  * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops
61
57
  * the runtime owning the conversation.
62
58
  */
63
59
  export declare function pauseCloudSandbox(sandboxId: string): Promise<void>;
64
60
  /**
65
61
  * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`
66
- * routes through the bundled agent-server's cloud proxy and hits
67
- * `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.
62
+ * by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.
68
63
  *
69
64
  * This is the correct endpoint for waking a PAUSED sandbox. It is a
70
65
  * lightweight unpause — NOT the same as creating a new start task via
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-service.api.js","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but routes\n * through the bundled agent-server's cloud proxy and hits the cloud\n * endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token (via the proxy's headers), and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * routes through the bundled agent-server's cloud proxy and hits\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but routes\n * through the bundled agent-server's cloud proxy and hits\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag` —\n * routes through the bundled agent-server's cloud proxy and hits\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox` — routes through the\n * bundled agent-server's cloud proxy and hits\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * — routes through the bundled agent-server's cloud proxy and hits\n * `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":";;;;AAyBA,SAAS,EACP,GACwB;AACxB,KAAI,CAAC,GAAc,GAAI,QAAO;CAC9B,IAAM,IAAS,EAA8B,EAAa,GAAG;AAG7D,QAFK,IAEE;EACL,GAAG;EACH,qBACE,EAAa,uBAAuB,EAAO,uBAAuB;EACpE,iBACE,EAAa,mBAAmB,EAAO,mBAAmB;EAC5D,cAAc,EAAa,gBAAgB,EAAO,gBAAgB;EAClE,oBACE,EAAa,sBAAsB,EAAO,sBAAsB;EACnE,GAXmB;;AActB,SAAS,IAAiC;CACxC,IAAM,IAAS,GAAkB,CAAC;AAClC,KAAI,EAAO,SAAS,QAClB,OAAU,MAAM,qDAAqD;AAEvE,QAAO;;AAST,eAAsB,EACpB,IAAgB,IAChB,GAC8B;CAC9B,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAGpC,CAFA,EAAO,IAAI,SAAS,OAAO,EAAM,CAAC,EAC9B,KAAQ,EAAO,IAAI,WAAW,EAAO,EACzC,EAAO,IAAI,cAAc,kBAAkB;CAE3C,IAAM,IAAO,MAAM,EAGhB;EACD;EACA,QAAQ;EACR,MAAM,oCAAoC,EAAO,UAAU;EAC5D,CAAC;AAEF,QAAO;EACL,QAAQ,GAAM,SAAS,EAAE,EAAE,KACxB,MAAS,EAA2B,EAAK,CAC3C;EACD,cAAc,GAAM,gBAAgB;EACrC;;AAOH,eAAsB,EACpB,GACqC;AACrC,KAAI,EAAI,WAAW,EAAG,QAAO,EAAE;CAC/B,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AACpC,MAAK,IAAM,KAAM,EAAK,GAAO,OAAO,OAAO,EAAG;AAM9C,SAAQ,MALW,EAA2C;EAC5D;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAO,UAAU;EACrD,CAAC,IACc,EAAE,EAAE,IAAI,EAA2B;;AAmBrD,eAAsB,EACpB,GACmC;AAQnC,QAAO,MANY,EAAyC;EAC1D,SAFc,GAEd;EACA,QAAQ;EACR,MAAM;EACN,MAAM;EACP,CAAC;;AAWJ,eAAsB,EACpB,GACe;AAEf,QAAO,EAAqB;EAC1B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe;EAClD,cAAc;EACf,CAAC;;AAWJ,eAAsB,EACpB,GACe;AAEf,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACpC,CAAC;;AAUJ,eAAsB,EACpB,GACA,GAC0B;AAQ1B,QAAO,MANY,EAAgC;EACjD,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACnC,MAAM,EAAE,QAAQ,GAAU;EAC3B,CAAC;;AAWJ,eAAsB,EAAkB,GAAkC;AAExE,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;EACtC,CAAC;;AAaJ,eAAsB,EAAmB,GAAkC;AAEzE,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;EACtC,CAAC;;AASJ,eAAsB,EACpB,GACA,GACiB;CACjB,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAOpC,QANA,EAAO,OAAO,aAAa,EAAS,EAM7B,MALY,EAAuB;EACxC;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe,QAAQ,EAAO,UAAU;EAC5E,CAAC,IACa;;AAQjB,eAAsB,EACpB,GAC0C;CAC1C,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAOpC,QANA,EAAO,IAAI,OAAO,EAAO,GAMlB,MALY,EAAoD;EACrE;EACA,QAAQ;EACR,MAAM,yCAAyC,EAAO,UAAU;EACjE,CAAC,IACY,MAAM"}
1
+ {"version":3,"file":"conversation-service.api.js","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but calls\n * the cloud endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token, and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * calls\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but calls\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox`:\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":";;;;AAyBA,SAAS,EACP,GACwB;AACxB,KAAI,CAAC,GAAc,GAAI,QAAO;CAC9B,IAAM,IAAS,EAA8B,EAAa,GAAG;AAG7D,QAFK,IAEE;EACL,GAAG;EACH,qBACE,EAAa,uBAAuB,EAAO,uBAAuB;EACpE,iBACE,EAAa,mBAAmB,EAAO,mBAAmB;EAC5D,cAAc,EAAa,gBAAgB,EAAO,gBAAgB;EAClE,oBACE,EAAa,sBAAsB,EAAO,sBAAsB;EACnE,GAXmB;;AActB,SAAS,IAAiC;CACxC,IAAM,IAAS,GAAkB,CAAC;AAClC,KAAI,EAAO,SAAS,QAClB,OAAU,MAAM,qDAAqD;AAEvE,QAAO;;AAQT,eAAsB,EACpB,IAAgB,IAChB,GAC8B;CAC9B,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAGpC,CAFA,EAAO,IAAI,SAAS,OAAO,EAAM,CAAC,EAC9B,KAAQ,EAAO,IAAI,WAAW,EAAO,EACzC,EAAO,IAAI,cAAc,kBAAkB;CAE3C,IAAM,IAAO,MAAM,EAGhB;EACD;EACA,QAAQ;EACR,MAAM,oCAAoC,EAAO,UAAU;EAC5D,CAAC;AAEF,QAAO;EACL,QAAQ,GAAM,SAAS,EAAE,EAAE,KACxB,MAAS,EAA2B,EAAK,CAC3C;EACD,cAAc,GAAM,gBAAgB;EACrC;;AAOH,eAAsB,EACpB,GACqC;AACrC,KAAI,EAAI,WAAW,EAAG,QAAO,EAAE;CAC/B,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AACpC,MAAK,IAAM,KAAM,EAAK,GAAO,OAAO,OAAO,EAAG;AAM9C,SAAQ,MALW,EAA2C;EAC5D;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAO,UAAU;EACrD,CAAC,IACc,EAAE,EAAE,IAAI,EAA2B;;AAmBrD,eAAsB,EACpB,GACmC;AAQnC,QAAO,MANY,EAAyC;EAC1D,SAFc,GAEd;EACA,QAAQ;EACR,MAAM;EACN,MAAM;EACP,CAAC;;AAWJ,eAAsB,EACpB,GACe;AAEf,QAAO,EAAqB;EAC1B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe;EAClD,cAAc;EACf,CAAC;;AAUJ,eAAsB,EACpB,GACe;AAEf,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACpC,CAAC;;AASJ,eAAsB,EACpB,GACA,GAC0B;AAQ1B,QAAO,MANY,EAAgC;EACjD,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACnC,MAAM,EAAE,QAAQ,GAAU;EAC3B,CAAC;;AAUJ,eAAsB,EAAkB,GAAkC;AAExE,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;EACtC,CAAC;;AAYJ,eAAsB,EAAmB,GAAkC;AAEzE,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;EACtC,CAAC;;AASJ,eAAsB,EACpB,GACA,GACiB;CACjB,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAOpC,QANA,EAAO,OAAO,aAAa,EAAS,EAM7B,MALY,EAAuB;EACxC;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe,QAAQ,EAAO,UAAU;EAC5E,CAAC,IACa;;AAQjB,eAAsB,EACpB,GAC0C;CAC1C,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAOpC,QANA,EAAO,IAAI,OAAO,EAAO,GAMlB,MALY,EAAoD;EACrE;EACA,QAAQ;EACR,MAAM,yCAAyC,EAAO,UAAU;EACjE,CAAC,IACY,MAAM"}