@openhands/agent-canvas 1.0.0-beta.5 → 1.0.0-beta.7

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 (879) 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-CPdgcp13.js +1 -0
  7. package/build/assets/{acp-route-guard-B2yoBZ_4.js → acp-route-guard-BoVmCn0e.js} +1 -1
  8. package/build/assets/active-backend-context-Beu-LZL-.js +1 -0
  9. package/build/assets/add-backend-modal-BheqYXHK.js +1 -0
  10. package/build/assets/agent-server-client-options-HEOwGVIU.js +1 -0
  11. package/build/assets/agent-server-compatibility-CdI3N7dr.js +1 -0
  12. package/build/assets/agent-server-conversation-service.api-CORdqJZg.js +5 -0
  13. package/build/assets/{agent-settings-CnGSCmK8.js → agent-settings-UFvcGjoI.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-CVNugqzu.js} +1 -1
  16. package/build/assets/api-key-entry-screen-M6su2VSf.js +1 -0
  17. package/build/assets/{app-settings-Db9ITeJH.js → app-settings-BlvBhBdc.js} +1 -1
  18. package/build/assets/automation-detail-BWrQk4Oa.js +1 -0
  19. package/build/assets/automations-list-ux9KvYsU.js +1 -0
  20. package/build/assets/back-nav-button-7dQJ2k3O.js +1 -0
  21. package/build/assets/backend-form-modal-CDnEYjaU.js +1 -0
  22. package/build/assets/{backend-synced-settings-badge-Dc6c7GT4.js → backend-synced-settings-badge-BTIj-Ffq.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-BolbDvm5.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-D0N4dw_p.js +19 -0
  39. package/build/assets/conversation-DhRJuZLG.js +1 -0
  40. package/build/assets/conversation-panel-CNqHbS_Z.js +1 -0
  41. package/build/assets/conversation-service.api-BsJy6uuL.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-DvHgx_FE.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-BpX-t-HD.js +1 -0
  53. package/build/assets/ellipsis-button-Vh5MvRZa.js +1 -0
  54. package/build/assets/entry.client-Ck9rQCg-.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-CE9QOb5n.js +1 -0
  58. package/build/assets/{extensions-navigation-BYR8Giqq.js → extensions-navigation-DSLGNGbS.js} +1 -1
  59. package/build/assets/file-BTY6Gyy9.js +1 -0
  60. package/build/assets/files-tab-cL668j1I.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-DtIrOrie.js +27 -0
  64. package/build/assets/git-provider-icon-CHdGBdU2.js +1 -0
  65. package/build/assets/globe-Bzj_0oXT.js +1 -0
  66. package/build/assets/home-Cz2Veg56.js +1 -0
  67. package/build/assets/{i18n-CTohRuoO.js → i18n-DET2iOyh.js} +1 -1
  68. package/build/assets/install-server-modal-B9nXCS3u.js +1 -0
  69. package/build/assets/launch-CWz0dm4o.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-CYEaUjGx.js} +1 -1
  73. package/build/assets/llm-settings-DFkXHuvT.js +1 -0
  74. package/build/assets/llm-settings-DhrdCXqX.js +1 -0
  75. package/build/assets/{loading-spinner-BPtYORNK.js → loading-spinner-5GT9q1xy.js} +1 -1
  76. package/build/assets/manage-backends-modal-DpBD_vR9.js +1 -0
  77. package/build/assets/manage-workspaces-modal-CtRbxREx.js +1 -0
  78. package/build/assets/manifest-eed90ff5.js +1 -0
  79. package/build/assets/{markdown-renderer-DMzf2i4x.js → markdown-renderer-B3IAVfv4.js} +1 -1
  80. package/build/assets/mcp-BUe7kiYM.js +9 -0
  81. package/build/assets/messages-dqp_KYyl.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-BvSTrkhT.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-DmNVxAvS.js} +1 -1
  91. package/build/assets/{organization-service.api-DzYTHTYC.js → organization-service.api-DbnougaQ.js} +1 -1
  92. package/build/assets/{path-utils-C3bQf6lJ.js → path-utils-onx24uF5.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-CmIjLz7q.js} +1 -1
  95. package/build/assets/{profiles-client-D6IkTJof.js → profiles-client-fEmgWkCW.js} +1 -1
  96. package/build/assets/{providers-Bx6EfrzZ.js → providers-CbD7fiic.js} +1 -1
  97. package/build/assets/proxy-BAdHH8QB.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-BQChv2rc.js → recommended-automations-launcher-uTyODuzB.js} +3 -3
  100. package/build/assets/{root-BgEbw3S0.js → root-DmjpFpTu.js} +2 -2
  101. package/build/assets/root-Z2VHU4R3.css +1 -0
  102. package/build/assets/root-layout-DejMsKhy.js +2 -0
  103. package/build/assets/{sdk-section-page-DOIKvwSL.js → sdk-section-page-BgDlMhcq.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-B7CxNinp.js +1 -0
  107. package/build/assets/secrets-settings-yK7CqIpm.js +1 -0
  108. package/build/assets/{server-client-DyAQ3NZ_.js → server-client-Kh4QSwDJ.js} +1 -1
  109. package/build/assets/{settings-BYkVX7vW.js → settings-DN5PpgRD.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-DKC8IY1P.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-DJ4kGzUx.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-C3rxTtPj.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-h9YnBtCU.js} +1 -1
  121. package/build/assets/sidebar-mobile-menu-toggle-D0-AvsnT.js +1 -0
  122. package/build/assets/{sidebar-nav-link-BGjiJq-4.js → sidebar-nav-link-OhIeFyna.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-DNcsNF88.js} +1 -1
  127. package/build/assets/skills-settings-7liFiSY6.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-DgQk1Ay6.js → terminal-CDhQGDua.js} +2 -2
  132. package/build/assets/{terminal-RmuaSdhJ.js → terminal-CPYWdo4j.js} +1 -1
  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-DHGcmjCK.js} +1 -1
  140. package/build/assets/use-agent-settings-schema-CLoTOSJI.js +1 -0
  141. package/build/assets/{use-agent-state-Bkrd1FZq.js → use-agent-state-PKrUPMJ3.js} +1 -1
  142. package/build/assets/{use-cloud-current-user-id-CvkXFnTT.js → use-cloud-current-user-id-Ddr75hEz.js} +1 -1
  143. package/build/assets/{use-config-Co1O8-Ey.js → use-config-OIMQLQ2s.js} +1 -1
  144. package/build/assets/{use-create-conversation-CEgXpkfH.js → use-create-conversation-Bszyp13O.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-8Jby8ele.js} +1 -1
  147. package/build/assets/{use-handle-plan-click-Ckkm5eIY.js → use-handle-plan-click-CohJPvvW.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-C861aFAq.js +1 -0
  152. package/build/assets/use-runtime-is-ready-Do2h_hRl.js +1 -0
  153. package/build/assets/{use-save-settings-VUrj_QNG.js → use-save-settings-DkAOEfD9.js} +1 -1
  154. package/build/assets/use-settings-D5hbTS9t.js +1 -0
  155. package/build/assets/{use-settings-nav-items-1ZvovKSr.js → use-settings-nav-items-BcSbo02d.js} +1 -1
  156. package/build/assets/{use-skills-DAMLFjKU.js → use-skills-D7PS0fH0.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-DEoe-NRI.js} +1 -1
  159. package/build/assets/use-user-conversation-Cs5H1pUF.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-CZSK-lT2.js +1 -0
  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-hTzSytKK.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-Dlt8pINd.js} +1 -1
  183. package/build/assets/{vscode-tab-DjNArCgY.js → vscode-tab-DgepcYtF.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 +1 -51
  220. package/dist/api/agent-server-config.js +20 -70
  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 +150 -119
  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/@openhands/extensions/integrations/catalog/airtable.cjs +1 -1
  604. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs.map +1 -1
  605. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js +3 -1
  606. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js.map +1 -1
  607. package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.cjs +1 -1
  608. package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.cjs.map +1 -1
  609. package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.js +3 -1
  610. package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.js.map +1 -1
  611. package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.cjs +1 -1
  612. package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.cjs.map +1 -1
  613. package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.js +3 -1
  614. package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.js.map +1 -1
  615. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.cjs +1 -1
  616. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.cjs.map +1 -1
  617. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.js +3 -1
  618. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.js.map +1 -1
  619. package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.cjs +1 -1
  620. package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.cjs.map +1 -1
  621. package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.js +3 -1
  622. package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.js.map +1 -1
  623. package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.cjs +1 -1
  624. package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.cjs.map +1 -1
  625. package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.js +3 -1
  626. package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.js.map +1 -1
  627. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs +1 -1
  628. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs.map +1 -1
  629. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js +3 -1
  630. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js.map +1 -1
  631. package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.cjs +1 -1
  632. package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.cjs.map +1 -1
  633. package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.js +3 -1
  634. package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.js.map +1 -1
  635. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs +1 -1
  636. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs.map +1 -1
  637. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js +3 -1
  638. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js.map +1 -1
  639. package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.cjs +1 -1
  640. package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.cjs.map +1 -1
  641. package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.js +3 -1
  642. package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.js.map +1 -1
  643. package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.cjs +1 -1
  644. package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.cjs.map +1 -1
  645. package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.js +3 -1
  646. package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.js.map +1 -1
  647. package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.cjs +1 -1
  648. package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.cjs.map +1 -1
  649. package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.js +3 -1
  650. package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.js.map +1 -1
  651. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
  652. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
  653. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +3 -1
  654. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
  655. package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.cjs +1 -1
  656. package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.cjs.map +1 -1
  657. package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.js +2 -1
  658. package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.js.map +1 -1
  659. package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.cjs +1 -1
  660. package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.cjs.map +1 -1
  661. package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.js +2 -1
  662. package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.js.map +1 -1
  663. package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.cjs +1 -1
  664. package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.cjs.map +1 -1
  665. package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.js +3 -1
  666. package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.js.map +1 -1
  667. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs +1 -1
  668. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs.map +1 -1
  669. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js +8 -7
  670. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js.map +1 -1
  671. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs +1 -1
  672. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs.map +1 -1
  673. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js +2 -1
  674. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js.map +1 -1
  675. package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.cjs +1 -1
  676. package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.cjs.map +1 -1
  677. package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.js +4 -2
  678. package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.js.map +1 -1
  679. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs +2 -0
  680. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs.map +1 -0
  681. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
  682. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
  683. package/dist/package.cjs +1 -1
  684. package/dist/package.cjs.map +1 -1
  685. package/dist/package.js +2 -2
  686. package/dist/package.js.map +1 -1
  687. package/dist/routes/conversation.cjs +1 -1
  688. package/dist/routes/conversation.cjs.map +1 -1
  689. package/dist/routes/conversation.js +1 -1
  690. package/dist/routes/conversation.js.map +1 -1
  691. package/dist/routes/llm-settings.cjs +1 -1
  692. package/dist/routes/llm-settings.cjs.map +1 -1
  693. package/dist/routes/llm-settings.js +55 -54
  694. package/dist/routes/llm-settings.js.map +1 -1
  695. package/dist/routes/secrets-settings.cjs +1 -1
  696. package/dist/routes/secrets-settings.cjs.map +1 -1
  697. package/dist/routes/secrets-settings.js +19 -27
  698. package/dist/routes/secrets-settings.js.map +1 -1
  699. package/dist/stores/conversation-store.cjs +1 -1
  700. package/dist/stores/conversation-store.cjs.map +1 -1
  701. package/dist/stores/conversation-store.d.ts +4 -0
  702. package/dist/stores/conversation-store.js +6 -0
  703. package/dist/stores/conversation-store.js.map +1 -1
  704. package/dist/types/agent-server/core/events/acp-tool-call-event.d.ts +6 -4
  705. package/dist/types/agent-server/core/events/system-event.d.ts +5 -0
  706. package/dist/types/automation.d.ts +15 -0
  707. package/dist/types/settings.d.ts +3 -1
  708. package/dist/ui/combobox-caret.cjs +1 -1
  709. package/dist/ui/combobox-caret.cjs.map +1 -1
  710. package/dist/ui/combobox-caret.d.ts +1 -1
  711. package/dist/ui/combobox-caret.js +9 -8
  712. package/dist/ui/combobox-caret.js.map +1 -1
  713. package/dist/ui/context-menu.cjs +1 -1
  714. package/dist/ui/context-menu.cjs.map +1 -1
  715. package/dist/ui/context-menu.js +9 -8
  716. package/dist/ui/context-menu.js.map +1 -1
  717. package/dist/ui/dropdown/dropdown-menu.cjs +1 -1
  718. package/dist/ui/dropdown/dropdown-menu.cjs.map +1 -1
  719. package/dist/ui/dropdown/dropdown-menu.js +21 -17
  720. package/dist/ui/dropdown/dropdown-menu.js.map +1 -1
  721. package/dist/ui/dropdown/dropdown.cjs +1 -1
  722. package/dist/ui/dropdown/dropdown.cjs.map +1 -1
  723. package/dist/ui/dropdown/dropdown.js +2 -2
  724. package/dist/ui/dropdown/dropdown.js.map +1 -1
  725. package/dist/utils/automation-schedule.d.ts +1 -0
  726. package/dist/utils/dropdown-classes.cjs +2 -0
  727. package/dist/utils/dropdown-classes.cjs.map +1 -0
  728. package/dist/utils/dropdown-classes.d.ts +32 -0
  729. package/dist/utils/dropdown-classes.js +8 -0
  730. package/dist/utils/dropdown-classes.js.map +1 -0
  731. package/dist/utils/form-control-classes.cjs +1 -1
  732. package/dist/utils/form-control-classes.cjs.map +1 -1
  733. package/dist/utils/form-control-classes.d.ts +18 -2
  734. package/dist/utils/form-control-classes.js +4 -3
  735. package/dist/utils/form-control-classes.js.map +1 -1
  736. package/dist/utils/git-control-bar-classes.cjs +2 -0
  737. package/dist/utils/git-control-bar-classes.cjs.map +1 -0
  738. package/dist/utils/git-control-bar-classes.d.ts +4 -0
  739. package/dist/utils/git-control-bar-classes.js +14 -0
  740. package/dist/utils/git-control-bar-classes.js.map +1 -0
  741. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  742. package/dist/utils/handle-event-for-ui.d.ts +6 -3
  743. package/dist/utils/handle-event-for-ui.js.map +1 -1
  744. package/dist/utils/mobile-top-bar-icon-button-classes.cjs +1 -1
  745. package/dist/utils/mobile-top-bar-icon-button-classes.cjs.map +1 -1
  746. package/dist/utils/mobile-top-bar-icon-button-classes.js +3 -3
  747. package/dist/utils/mobile-top-bar-icon-button-classes.js.map +1 -1
  748. package/dist/utils/modal-classes.cjs +2 -0
  749. package/dist/utils/modal-classes.cjs.map +1 -0
  750. package/dist/utils/modal-classes.d.ts +8 -0
  751. package/dist/utils/modal-classes.js +7 -0
  752. package/dist/utils/modal-classes.js.map +1 -0
  753. package/dist/utils/openhands-llm.cjs +2 -0
  754. package/dist/utils/openhands-llm.cjs.map +1 -0
  755. package/dist/utils/openhands-llm.d.ts +2 -0
  756. package/dist/utils/openhands-llm.js +9 -0
  757. package/dist/utils/openhands-llm.js.map +1 -0
  758. package/dist/utils/redact-custom-secrets.cjs +2 -0
  759. package/dist/utils/redact-custom-secrets.cjs.map +1 -0
  760. package/dist/utils/redact-custom-secrets.d.ts +6 -0
  761. package/dist/utils/redact-custom-secrets.js +10 -0
  762. package/dist/utils/redact-custom-secrets.js.map +1 -0
  763. package/dist/utils/status.cjs +1 -1
  764. package/dist/utils/status.cjs.map +1 -1
  765. package/dist/utils/status.d.ts +2 -1
  766. package/dist/utils/status.js +9 -8
  767. package/dist/utils/status.js.map +1 -1
  768. package/dist/utils/system-message-adapter.cjs +1 -1
  769. package/dist/utils/system-message-adapter.cjs.map +1 -1
  770. package/dist/utils/system-message-adapter.js +10 -7
  771. package/dist/utils/system-message-adapter.js.map +1 -1
  772. package/dist/utils/utils.cjs +1 -1
  773. package/dist/utils/utils.cjs.map +1 -1
  774. package/dist/utils/utils.d.ts +2 -1
  775. package/dist/utils/utils.js +21 -20
  776. package/dist/utils/utils.js.map +1 -1
  777. package/package.json +2 -2
  778. package/scripts/dev-safe.mjs +3 -1
  779. package/scripts/dev-static.mjs +2 -2
  780. package/scripts/dev-with-automation.mjs +283 -108
  781. package/scripts/static-build.mjs +20 -19
  782. package/scripts/static-server.mjs +50 -3
  783. package/build/assets/acp-providers-CbiRekh9.js +0 -1
  784. package/build/assets/active-backend-context-cCM1vYYZ.js +0 -1
  785. package/build/assets/add-backend-modal-DIUQzMPa.js +0 -1
  786. package/build/assets/agent-server-client-options-Bc5ZorQZ.js +0 -1
  787. package/build/assets/agent-server-compatibility-BlkUsrX2.js +0 -1
  788. package/build/assets/agent-server-conversation-service.api-C2V5SlHu.js +0 -5
  789. package/build/assets/api-key-entry-screen-B2gynaCp.js +0 -1
  790. package/build/assets/automation-detail-DJvbVSYK.js +0 -1
  791. package/build/assets/automations-list-rMki-8au.js +0 -1
  792. package/build/assets/backend-form-modal-Dnk33xA_.js +0 -1
  793. package/build/assets/base-modal-_dYTw1ri.js +0 -1
  794. package/build/assets/brand-button-Br7f0kZJ.js +0 -1
  795. package/build/assets/browser-store-Couc4S5D.js +0 -1
  796. package/build/assets/clock-BRjCgHTc.js +0 -1
  797. package/build/assets/combobox-caret-to1O8irE.js +0 -1
  798. package/build/assets/context-menu-list-item-CWNFpuiC.js +0 -1
  799. package/build/assets/conversation-DVrKU0oz.js +0 -19
  800. package/build/assets/conversation-Dlys-D5A.js +0 -1
  801. package/build/assets/conversation-panel-iF09WjZ4.js +0 -1
  802. package/build/assets/conversation-service.api-CCfztilW.js +0 -1
  803. package/build/assets/conversation-state-store-u5jepov0.js +0 -1
  804. package/build/assets/conversation-store-Z5iMCRpc.js +0 -1
  805. package/build/assets/conversation-websocket-context-DhJhqUna.js +0 -3
  806. package/build/assets/declaration-BNMqORFE.js +0 -1
  807. package/build/assets/dist-BxBP7tFD.js +0 -1
  808. package/build/assets/edit-automation-modal-BGzR3nfZ.js +0 -1
  809. package/build/assets/ellipsis-button-ZyLMPURn.js +0 -1
  810. package/build/assets/entry.client-1VMHpktY.js +0 -2
  811. package/build/assets/enum-filter-dropdown-CEgCdu4A.js +0 -1
  812. package/build/assets/extensions-hub-C651jsVh.js +0 -1
  813. package/build/assets/files-tab-R5z0lLdY.js +0 -1
  814. package/build/assets/files-tab-store-CDyVTXNT.js +0 -1
  815. package/build/assets/git-control-bar-branch-button-COdRAYHb.js +0 -27
  816. package/build/assets/git-provider-icon-BzLbc0yC.js +0 -1
  817. package/build/assets/home-XxBpNOVq.js +0 -1
  818. package/build/assets/install-server-modal-f31_CLrW.js +0 -1
  819. package/build/assets/launch-CshDse3e.js +0 -1
  820. package/build/assets/link-external-D2POYx4c.js +0 -1
  821. package/build/assets/llm-settings-Bql-vydt.js +0 -1
  822. package/build/assets/llm-settings-C_tal6Ds.js +0 -1
  823. package/build/assets/manage-backends-modal-l7RkKfwX.js +0 -1
  824. package/build/assets/manage-workspaces-modal-DhKF_8z3.js +0 -1
  825. package/build/assets/manifest-d9077852.js +0 -1
  826. package/build/assets/mcp-D2onbwVk.js +0 -9
  827. package/build/assets/messages-D0rWot7s.js +0 -36
  828. package/build/assets/proxy-CxydCnis.js +0 -1
  829. package/build/assets/root-DHeCXo9N.css +0 -1
  830. package/build/assets/root-layout-Czo9Ma6Q.js +0 -2
  831. package/build/assets/secrets-service-BsnKFc2x.js +0 -1
  832. package/build/assets/secrets-settings-Bz_UohPJ.js +0 -1
  833. package/build/assets/settings-client-C73C7IgV.js +0 -1
  834. package/build/assets/settings-index-Dz0BmdJD.js +0 -1
  835. package/build/assets/settings-list-classes-Bf80tWtc.js +0 -1
  836. package/build/assets/settings-modal-Brzgh5Yw.js +0 -1
  837. package/build/assets/settings-service.api-CZ3uWx4v.js +0 -1
  838. package/build/assets/sidebar-mobile-menu-toggle-Do_aA9Zm.js +0 -1
  839. package/build/assets/skills-settings-DlA5hlXw.js +0 -2
  840. package/build/assets/status-hp6M6E7E.js +0 -1
  841. package/build/assets/use-agent-settings-schema-33Un7UF2.js +0 -1
  842. package/build/assets/use-is-authed-BggE5wPj.js +0 -1
  843. package/build/assets/use-llm-profiles-DDOol3gK.js +0 -1
  844. package/build/assets/use-runtime-is-ready-B7EF4BKU.js +0 -1
  845. package/build/assets/use-settings-DQIZmIov.js +0 -1
  846. package/build/assets/use-user-conversation-C6hrMMtn.js +0 -1
  847. package/build/assets/utils-i18rdUj2.js +0 -1
  848. package/build/assets/vendor~conversation-panel~conversation-a9SyrrhV.js +0 -1
  849. package/build/assets/vendor~conversation-panel~conversation~index-C23ZXO4R.js +0 -1
  850. package/build/assets/vendor~home~mcp~automations-list-Ccy2I0KU.js +0 -1
  851. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js +0 -1
  852. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DzIXV3Ui.js +0 -9
  853. /package/build/assets/{automation-IdgZq6ZK.js → automation-XDPAjiZi.js} +0 -0
  854. /package/build/assets/{color-themes-DSaoIL6A.js → color-themes-B9pm9c-R.js} +0 -0
  855. /package/build/assets/{common-DR1t-EeP.js → common-DqjLSBOt.js} +0 -0
  856. /package/build/assets/{conversation-local-storage-UYl-SX-r.js → conversation-local-storage-YmOVXxxW.js} +0 -0
  857. /package/build/assets/{dist-C6t0EXL7.js → dist-C3NfioQC.js} +0 -0
  858. /package/build/assets/{environment-switch-store-C4ulFJKp.js → environment-switch-store-CiurvTtK.js} +0 -0
  859. /package/build/assets/{health-store-BDC2rM-X.js → health-store-B5f0S2FY.js} +0 -0
  860. /package/build/assets/{map-provider-COBVzZYo.js → map-provider-BJ_8KZKU.js} +0 -0
  861. /package/build/assets/{middleware-BC9EwbB9.js → middleware-CfatjPYZ.js} +0 -0
  862. /package/build/assets/{objectWithoutPropertiesLoose-Du6eBn-V.js → objectWithoutPropertiesLoose-DSQKyRhw.js} +0 -0
  863. /package/build/assets/{react-Do0CT17Y.js → react-Dy05vyj5.js} +0 -0
  864. /package/build/assets/{sdk-settings-field-metadata-CBPmeqYa.js → sdk-settings-field-metadata-DQiaIBie.js} +0 -0
  865. /package/build/assets/{settings-D_H-qsRm.js → settings-DGY6n4J2.js} +0 -0
  866. /package/build/assets/{settings-like-page-layout-classes-I0BDBEoq.js → settings-like-page-layout-classes-D7YjdTd0.js} +0 -0
  867. /package/build/assets/{use-breakpoint-DbJ6FkQ-.js → use-breakpoint-DF_RiQ6s.js} +0 -0
  868. /package/build/assets/{use-click-outside-element-DffgWWoZ.js → use-click-outside-element-DhxCUyWl.js} +0 -0
  869. /package/build/assets/{v4-CNn21NXa.js → v4-khGvL7i2.js} +0 -0
  870. /package/build/assets/{vendor~browser-DDiZgqD3.js → vendor~browser-DisFGEp9.js} +0 -0
  871. /package/build/assets/{vendor~browser-tab-BgwV1mxF.js → vendor~browser-tab-BxhTtM9_.js} +0 -0
  872. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DbvX3OcM.js → vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js} +0 -0
  873. /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
  874. /package/build/assets/{vendor~files-tab-BGKayPiK.js → vendor~files-tab-BtkpAiMX.js} +0 -0
  875. /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
  876. /package/build/assets/{vendor~home~mcp~automations-list-DoPfwaXj.js → vendor~home~mcp~automations-list-BgV86Sti.js} +0 -0
  877. /package/build/assets/{vendor~launch-vdeRTWFu.js → vendor~launch-BXgl67Re.js} +0 -0
  878. /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
  879. /package/build/assets/{vendor~terminal-DUrOWGFE.js → vendor~terminal-DZaJIY8A.js} +0 -0
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"organization-service.api.cjs","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import axios from \"axios\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Routed through the bundled agent-server's `/api/cloud-proxy` to avoid\n * cross-origin browser calls.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (axios.isAxiosError(e) && e.response?.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{ orgId: string; userId: string }> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{ org_id: string; user_id: string }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n };\n}\n"],"mappings":"qLAeA,SAAS,EACP,EACqB,CACrB,MAAO,CACL,MAAO,GAAM,OAAS,EAAE,CACxB,aAAc,GAAM,gBAAkB,KACvC,CAGH,SAAS,EAAe,EAA4B,CAClD,GAAI,EAAS,OAAO,EACpB,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAClC,GAAI,EAAO,OAAS,QAClB,MAAU,MACR,6EACD,CAEH,OAAO,EAWT,eAAsB,EACpB,EAC8B,CAO9B,OAAO,EAAgB,MALJ,EAAA,eAA2C,CAC5D,QAFa,EAAe,EAEnB,CACT,OAAQ,MACR,KAAM,qBACP,CAAC,CAC0B,CAc9B,eAAsB,EACpB,EACyD,CACzD,IAAM,EAAS,EAAe,EAAQ,CACtC,GAAI,CAMF,MAAO,CAAE,OAAO,MALG,EAAA,eAAoC,CACrD,QAAS,EACT,OAAQ,MACR,KAAM,oBACP,CAAC,GACoB,QAAU,KAAM,YAAa,GAAO,OACnD,EAAG,CACV,GAAI,EAAA,QAAM,aAAa,EAAE,EAAI,EAAE,UAAU,SAAW,IAClD,MAAO,CAAE,MAAO,KAAM,YAAa,GAAM,CAE3C,MAAM,GAWV,eAAsB,EACpB,EACA,EAC4C,CAE5C,IAAM,EAAO,MAAM,EAAA,eAAoD,CACrE,QAFa,EAAe,EAEnB,CACT,OAAQ,MACR,KAAM,sBAAsB,mBAAmB,EAAM,CAAC,KACvD,CAAC,CACF,MAAO,CACL,MAAO,GAAM,QAAU,EACvB,OAAQ,GAAM,SAAW,GAC1B"}
1
+ {"version":3,"file":"organization-service.api.cjs","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import axios from \"axios\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Calls the cloud API directly with the backend's bearer token.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (axios.isAxiosError(e) && e.response?.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{ orgId: string; userId: string }> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{ org_id: string; user_id: string }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n };\n}\n"],"mappings":"qLAeA,SAAS,EACP,EACqB,CACrB,MAAO,CACL,MAAO,GAAM,OAAS,EAAE,CACxB,aAAc,GAAM,gBAAkB,KACvC,CAGH,SAAS,EAAe,EAA4B,CAClD,GAAI,EAAS,OAAO,EACpB,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAClC,GAAI,EAAO,OAAS,QAClB,MAAU,MACR,6EACD,CAEH,OAAO,EAUT,eAAsB,EACpB,EAC8B,CAO9B,OAAO,EAAgB,MALJ,EAAA,eAA2C,CAC5D,QAFa,EAAe,EAEnB,CACT,OAAQ,MACR,KAAM,qBACP,CAAC,CAC0B,CAc9B,eAAsB,EACpB,EACyD,CACzD,IAAM,EAAS,EAAe,EAAQ,CACtC,GAAI,CAMF,MAAO,CAAE,OAAO,MALG,EAAA,eAAoC,CACrD,QAAS,EACT,OAAQ,MACR,KAAM,oBACP,CAAC,GACoB,QAAU,KAAM,YAAa,GAAO,OACnD,EAAG,CACV,GAAI,EAAA,QAAM,aAAa,EAAE,EAAI,EAAE,UAAU,SAAW,IAClD,MAAO,CAAE,MAAO,KAAM,YAAa,GAAM,CAE3C,MAAM,GAWV,eAAsB,EACpB,EACA,EAC4C,CAE5C,IAAM,EAAO,MAAM,EAAA,eAAoD,CACrE,QAFa,EAAe,EAEnB,CACT,OAAQ,MACR,KAAM,sBAAsB,mBAAmB,EAAM,CAAC,KACvD,CAAC,CACF,MAAO,CACL,MAAO,GAAM,QAAU,EACvB,OAAQ,GAAM,SAAW,GAC1B"}
@@ -9,8 +9,7 @@ interface OrganizationsResult {
9
9
  * cloud backend; pass `backend` explicitly to fetch for an inactive cloud
10
10
  * (used by the selector to flatten all cloud rows).
11
11
  *
12
- * Routed through the bundled agent-server's `/api/cloud-proxy` to avoid
13
- * cross-origin browser calls.
12
+ * Calls the cloud API directly with the backend's bearer token.
14
13
  */
15
14
  export declare function getCloudOrganizations(backend?: Backend): Promise<OrganizationsResult>;
16
15
  /**