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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (802) hide show
  1. package/README.md +24 -7
  2. package/README.windows.md +27 -0
  3. package/bin/agent-canvas.mjs +26 -3
  4. package/build/assets/{QueryClientProvider-CkGuhXg-.js → QueryClientProvider-Cnr-Yl3j.js} +1 -1
  5. package/build/assets/{Trans-Cvm_-SMi.js → Trans-4jmk54WC.js} +1 -1
  6. package/build/assets/acp-providers-BAX8OU5C.js +1 -0
  7. package/build/assets/{acp-route-guard-B2yoBZ_4.js → acp-route-guard-HPk6TV-L.js} +1 -1
  8. package/build/assets/active-backend-context-BSPE-W72.js +1 -0
  9. package/build/assets/add-backend-modal-mXKmfMI2.js +1 -0
  10. package/build/assets/agent-server-client-options-9agOSarV.js +1 -0
  11. package/build/assets/agent-server-compatibility-B7QStIcH.js +1 -0
  12. package/build/assets/agent-server-conversation-service.api-B9TUYJon.js +5 -0
  13. package/build/assets/{agent-settings-CnGSCmK8.js → agent-settings-g3F623RJ.js} +1 -1
  14. package/build/assets/{alert-banner-DtzAX654.js → alert-banner-DFnn_lC6.js} +1 -1
  15. package/build/assets/{analytics-consent-form-modal-CHZ3I37v.js → analytics-consent-form-modal-BQCNeNVt.js} +1 -1
  16. package/build/assets/api-key-entry-screen-myuWMqzW.js +1 -0
  17. package/build/assets/{app-settings-Db9ITeJH.js → app-settings-CCcX8ZEH.js} +1 -1
  18. package/build/assets/automation-detail-BDHLHSJd.js +1 -0
  19. package/build/assets/automations-list-CiNtQhq_.js +1 -0
  20. package/build/assets/back-nav-button-7dQJ2k3O.js +1 -0
  21. package/build/assets/backend-form-modal-D3bDMO3C.js +1 -0
  22. package/build/assets/{backend-synced-settings-badge-Dc6c7GT4.js → backend-synced-settings-badge-BkW5evM0.js} +1 -1
  23. package/build/assets/base-modal-C2oy2EBG.js +1 -0
  24. package/build/assets/brand-button-DJ_S16rO.js +1 -0
  25. package/build/assets/{browser-D810xUYt.js → browser-CGM-k-sH.js} +2 -2
  26. package/build/assets/browser-store-DAsixKdU.js +1 -0
  27. package/build/assets/{browser-tab-B-aIqXRl.js → browser-tab-dvSPdvkm.js} +1 -1
  28. package/build/assets/{checkmark-DL7acQA7.js → checkmark-Dus0b6jt.js} +1 -1
  29. package/build/assets/{chevron-left-small-CVWf8TI6.js → chevron-left-small-_uvG7RVM.js} +1 -1
  30. package/build/assets/{circle-plus-check-toggle-P7ZZToV4.js → circle-plus-check-toggle-DKS8MAVV.js} +1 -1
  31. package/build/assets/{close-B5LROHR3.js → close-BU5iTc66.js} +1 -1
  32. package/build/assets/code-tag-BzyqOtPD.js +1 -0
  33. package/build/assets/combobox-caret-BJC7XJsz.js +1 -0
  34. package/build/assets/{command-store-DFN_17p1.js → command-store-CE1weJy8.js} +1 -1
  35. package/build/assets/{condenser-settings-wnEKhBof.js → condenser-settings-DCTulgLO.js} +1 -1
  36. package/build/assets/{confirmation-modal-Dau3w_sa.js → confirmation-modal-B5Ca6qFE.js} +1 -1
  37. package/build/assets/context-menu-list-item-7tAcm2c3.js +1 -0
  38. package/build/assets/conversation-BKhikfYl.js +1 -0
  39. package/build/assets/conversation-DTn8jN8L.js +19 -0
  40. package/build/assets/conversation-panel-DfHR42mG.js +1 -0
  41. package/build/assets/conversation-service.api-B6CkzaKD.js +1 -0
  42. package/build/assets/conversation-state-store-D-w0uurj.js +1 -0
  43. package/build/assets/conversation-store-CC-isCnP.js +1 -0
  44. package/build/assets/{conversation-tab-empty-state-DyssnnWa.js → conversation-tab-empty-state-CStQLPVW.js} +1 -1
  45. package/build/assets/conversation-websocket-context-DShEuLjh.js +3 -0
  46. package/build/assets/{copy-DYgmUdIw.js → copy-Chg-sFu3.js} +1 -1
  47. package/build/assets/{custom-toast-handlers-C-SZFmto.js → custom-toast-handlers-ufGJ6_Rc.js} +1 -1
  48. package/build/assets/declaration-CR6HMp29.js +1 -0
  49. package/build/assets/{device-verify-DqDlphsG.js → device-verify-C6mj28zv.js} +1 -1
  50. package/build/assets/dist-DNeWJ2bh.js +1 -0
  51. package/build/assets/dropdown-classes-BsVmxlNG.js +1 -0
  52. package/build/assets/edit-automation-modal-DamwL0s0.js +1 -0
  53. package/build/assets/ellipsis-button-Vh5MvRZa.js +1 -0
  54. package/build/assets/entry.client-Cn71WM8q.js +2 -0
  55. package/build/assets/enum-filter-dropdown-5JeF2RLb.js +1 -0
  56. package/build/assets/{environment-switch-overlay-XL8yCGP6.js → environment-switch-overlay-Tf_BIfeR.js} +1 -1
  57. package/build/assets/extensions-hub-CUEmfvGy.js +1 -0
  58. package/build/assets/{extensions-navigation-BYR8Giqq.js → extensions-navigation-VQ-3umJ7.js} +1 -1
  59. package/build/assets/file-BTY6Gyy9.js +1 -0
  60. package/build/assets/files-tab-C47fQEeL.js +1 -0
  61. package/build/assets/files-tab-store-m0ARqX_E.js +1 -0
  62. package/build/assets/{folder-ZZJVGgd7.js → folder-D1T2W1cj.js} +1 -1
  63. package/build/assets/git-control-bar-branch-button-BT0aWH-o.js +27 -0
  64. package/build/assets/git-provider-icon-Pi-Cxpgv.js +1 -0
  65. package/build/assets/globe-Bzj_0oXT.js +1 -0
  66. package/build/assets/home-C3k6sFvB.js +1 -0
  67. package/build/assets/{i18n-CTohRuoO.js → i18n-DET2iOyh.js} +1 -1
  68. package/build/assets/install-server-modal-6fuq-TU6.js +1 -0
  69. package/build/assets/launch-DGghLfGx.js +1 -0
  70. package/build/assets/{lesson-plan-dH5Bj0pN.js → lesson-plan-duSsqWVs.js} +1 -1
  71. package/build/assets/link-external-DGxVm4Ps.js +1 -0
  72. package/build/assets/{llm-client-DaH1TuyR.js → llm-client-BqyLKgUN.js} +1 -1
  73. package/build/assets/llm-settings-BKraGtOu.js +1 -0
  74. package/build/assets/llm-settings-DRQTgOF1.js +1 -0
  75. package/build/assets/{loading-spinner-BPtYORNK.js → loading-spinner-5GT9q1xy.js} +1 -1
  76. package/build/assets/manage-backends-modal-CRMwyU0t.js +1 -0
  77. package/build/assets/manage-workspaces-modal-BYmGD1W7.js +1 -0
  78. package/build/assets/manifest-99b06a11.js +1 -0
  79. package/build/assets/{markdown-renderer-DMzf2i4x.js → markdown-renderer-B3IAVfv4.js} +1 -1
  80. package/build/assets/mcp-CfDRAmPn.js +9 -0
  81. package/build/assets/messages-Ba1vaw6t.js +36 -0
  82. package/build/assets/{modal-backdrop-BAbgYsqB.js → modal-backdrop-RfNCrSpK.js} +1 -1
  83. package/build/assets/{modal-body-BI6Ru2Qr.js → modal-body-aoa2fx5W.js} +1 -1
  84. package/build/assets/modal-classes-6YqcqA6y.js +1 -0
  85. package/build/assets/{modal-close-button-t1Gh3qmL.js → modal-close-button-CtWOUMmw.js} +1 -1
  86. package/build/assets/{model-selector-SM9IUz-q.js → model-selector-DcztJSxT.js} +1 -1
  87. package/build/assets/{navigation-context-D0YWpT8d.js → navigation-context-BdKYH32C.js} +1 -1
  88. package/build/assets/{navigation-link-Cn7KP3c5.js → navigation-link-U4vY9i_C.js} +1 -1
  89. package/build/assets/{openhands-logo-CnrF6LKb.js → openhands-logo-CCo0wJZX.js} +1 -1
  90. package/build/assets/{option-service.api-KvY_mZMY.js → option-service.api-CGNANEcT.js} +1 -1
  91. package/build/assets/{organization-service.api-DzYTHTYC.js → organization-service.api-BeuMC9QL.js} +1 -1
  92. package/build/assets/{path-utils-C3bQf6lJ.js → path-utils-z12iCrQO.js} +1 -1
  93. package/build/assets/{plan-components-atxXCF0R.js → plan-components-CRDMQzsS.js} +1 -1
  94. package/build/assets/{planner-tab-BlrCpv-7.js → planner-tab-Dte6Vzza.js} +1 -1
  95. package/build/assets/{profiles-client-D6IkTJof.js → profiles-client-BrqNmaDV.js} +1 -1
  96. package/build/assets/{providers-Bx6EfrzZ.js → providers-eUyo6pgr.js} +1 -1
  97. package/build/assets/proxy-BqDMnUY-.js +1 -0
  98. package/build/assets/{query-client-config-B7u9asM0.js → query-client-config-CRnGSujB.js} +1 -1
  99. package/build/assets/{recommended-automations-launcher-CgV8FyPK.js → recommended-automations-launcher-D5ADbXao.js} +3 -3
  100. package/build/assets/{root-dNntxffj.js → root-BmhaEJJ8.js} +2 -2
  101. package/build/assets/root-Z2VHU4R3.css +1 -0
  102. package/build/assets/root-layout-CNggm0d8.js +2 -0
  103. package/build/assets/{sdk-section-page-DOIKvwSL.js → sdk-section-page-CRCRY3PG.js} +1 -1
  104. package/build/assets/{sdk-settings-schema-DsUf9wu1.js → sdk-settings-schema-CLmJ9sho.js} +1 -1
  105. package/build/assets/{search-27Owlc3A.js → search-SuJctqNJ.js} +1 -1
  106. package/build/assets/secrets-service-B9AFn9OE.js +1 -0
  107. package/build/assets/secrets-settings-0UrKMS60.js +1 -0
  108. package/build/assets/{server-client-DyAQ3NZ_.js → server-client-DYv_GHPl.js} +1 -1
  109. package/build/assets/{settings-BYkVX7vW.js → settings-6t6LGW04.js} +1 -1
  110. package/build/assets/{settings-dropdown-input-BJYvGdg-.js → settings-dropdown-input-BtoovFre.js} +1 -1
  111. package/build/assets/{settings-gear-C77PgE_O.js → settings-gear-Dd8K2_8B.js} +1 -1
  112. package/build/assets/settings-index-CR6Ou73o.js +1 -0
  113. package/build/assets/{settings-input-Bn7F5C75.js → settings-input-CehsXnb3.js} +1 -1
  114. package/build/assets/settings-list-classes-E3v_f6QG.js +1 -0
  115. package/build/assets/settings-modal-T_Yk1Zfo.js +1 -0
  116. package/build/assets/{settings-section-header-context-BgZe5YkE.js → settings-section-header-context-DewwJ0-F.js} +1 -1
  117. package/build/assets/settings-service.api-DwtyDeGh.js +1 -0
  118. package/build/assets/{settings-switch-BeIKrWms.js → settings-switch-BiBuS3xa.js} +1 -1
  119. package/build/assets/{settings-utils-B6Nl07io.js → settings-utils-DY04tWG1.js} +1 -1
  120. package/build/assets/{shared-conversation-AMyqXvpk.js → shared-conversation-BzccsVej.js} +1 -1
  121. package/build/assets/sidebar-mobile-menu-toggle-DGlRg6jG.js +1 -0
  122. package/build/assets/{sidebar-nav-link-BGjiJq-4.js → sidebar-nav-link-dgVb8Fpy.js} +1 -1
  123. package/build/assets/{sidebar-store-Uy3v0AOV.js → sidebar-store-DnQAJAE5.js} +1 -1
  124. package/build/assets/{skill-card-pill-row-DF1axQCG.js → skill-card-pill-row-BW9qvhoK.js} +1 -1
  125. package/build/assets/{skills-ChIKZPK4.js → skills-0GRKX5Xj.js} +1 -1
  126. package/build/assets/{skills-plugins-CcI_19lM.js → skills-plugins-DctDrZ8Y.js} +1 -1
  127. package/build/assets/skills-settings-rvxImDj_.js +2 -0
  128. package/build/assets/{styled-tooltip-CBzrri6o.js → styled-tooltip-hdfMXPQC.js} +1 -1
  129. package/build/assets/{switch-skeleton-DnC9wLp7.js → switch-skeleton-DSKqSx2A.js} +1 -1
  130. package/build/assets/{task-list-tab-DUJn1sgz.js → task-list-tab-DT6_zfUs.js} +1 -1
  131. package/build/assets/{terminal-RmuaSdhJ.js → terminal-CPYWdo4j.js} +1 -1
  132. package/build/assets/{terminal-DgQk1Ay6.js → terminal-KldRPIRT.js} +2 -2
  133. package/build/assets/{toggle-switch-Pvyp2RAN.js → toggle-switch-T2v6sJ6l.js} +1 -1
  134. package/build/assets/{typography-gpuWmrQO.js → typography-BDgnT7Yp.js} +1 -1
  135. package/build/assets/{u-check-circle-IUIfACQQ.js → u-check-circle-DOauqQKb.js} +1 -1
  136. package/build/assets/{u-check-circle-half-C1YxB6py.js → u-check-circle-half-steSK_JB.js} +1 -1
  137. package/build/assets/{u-circuit-BmVikJHu.js → u-circuit-x3ExjBbU.js} +1 -1
  138. package/build/assets/{u-edit-CFvXHqZk.js → u-edit-BbrptMCa.js} +1 -1
  139. package/build/assets/{use-active-conversation-BEFNwnFk.js → use-active-conversation-sPgfSkql.js} +1 -1
  140. package/build/assets/use-agent-settings-schema-B66kGIi_.js +1 -0
  141. package/build/assets/{use-agent-state-Bkrd1FZq.js → use-agent-state-Dp3pD1h3.js} +1 -1
  142. package/build/assets/{use-cloud-current-user-id-CvkXFnTT.js → use-cloud-current-user-id-ClKFPjFz.js} +1 -1
  143. package/build/assets/{use-config-Co1O8-Ey.js → use-config-C9pvb0Sm.js} +1 -1
  144. package/build/assets/{use-create-conversation-CEgXpkfH.js → use-create-conversation-B-lwTnfE.js} +1 -1
  145. package/build/assets/{use-event-store-BT_gV3ut.js → use-event-store-BomO7ywK.js} +1 -1
  146. package/build/assets/{use-get-secrets-DuhdIA59.js → use-get-secrets-oyC7PFRz.js} +1 -1
  147. package/build/assets/{use-handle-plan-click-Ckkm5eIY.js → use-handle-plan-click-DP6Rs-YP.js} +1 -1
  148. package/build/assets/use-is-authed-dw2026rR.js +1 -0
  149. package/build/assets/{use-is-creating-conversation-BZ5hB_Bg.js → use-is-creating-conversation-DX2qSlfL.js} +1 -1
  150. package/build/assets/{use-launch-skill-in-chat-fNN_xGZG.js → use-launch-skill-in-chat-sQNEOLGD.js} +1 -1
  151. package/build/assets/use-llm-profiles-Bh5JqZUZ.js +1 -0
  152. package/build/assets/use-runtime-is-ready-BakOUVU-.js +1 -0
  153. package/build/assets/{use-save-settings-VUrj_QNG.js → use-save-settings-uXXkqvD7.js} +1 -1
  154. package/build/assets/use-settings-DeO7nvpM.js +1 -0
  155. package/build/assets/{use-settings-nav-items-1ZvovKSr.js → use-settings-nav-items-BGMFn25b.js} +1 -1
  156. package/build/assets/{use-skills-DAMLFjKU.js → use-skills-DWIK3l3a.js} +1 -1
  157. package/build/assets/{use-task-list-CLJbuJgM.js → use-task-list-CsT10CBb.js} +1 -1
  158. package/build/assets/{use-unified-vscode-url-DdSRw-6P.js → use-unified-vscode-url-DXPtB317.js} +1 -1
  159. package/build/assets/use-user-conversation-DJen4YIP.js +1 -0
  160. package/build/assets/{useMutation-DqrumCWD.js → useMutation-GSSKKebK.js} +1 -1
  161. package/build/assets/{useTranslation-DCOdSSMl.js → useTranslation-B6voJV4y.js} +1 -1
  162. package/build/assets/utils-DCVfKFRt.js +1 -0
  163. package/build/assets/{vendor~browser-BNjNhjFU.js → vendor~browser-BrOJLj3y.js} +1 -1
  164. package/build/assets/vendor~conversation-panel~conversation-C9o-K1hW.js +1 -0
  165. package/build/assets/vendor~conversation-panel~conversation~index-RXYdJYxU.js +1 -0
  166. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-VnmIZrq3.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-DJS-rJdI.js} +1 -1
  167. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DpAdkv8m.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-6ByzelMS.js} +1 -1
  168. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B92czPCF.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BED5W_c4.js} +1 -1
  169. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-By5W2oHN.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CCbqAFiI.js} +1 -1
  170. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BbFOrAjI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CG96FCly.js} +1 -1
  171. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-smY2r837.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-E4d6IEfI.js} +1 -1
  172. package/build/assets/{vendor~home~mcp~automations-list-Cs-TO3fK.js → vendor~home~mcp~automations-list-CZSK-lT2.js} +1 -1
  173. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-Z3nsiNNq.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CjJdFLoM.js} +1 -1
  174. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-DbfELDJu.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-m8dOii0J.js} +2 -2
  175. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-DjAjXS5J.js → vendor~root-layout~home~conversation-panel~conversation-B5WNMnt4.js} +1 -1
  176. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-CbAhtEMv.js +1 -0
  177. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-6Rm8U_Sr.js +9 -0
  178. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-BkQGKpye.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-tTR8C6m0.js} +1 -1
  179. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-Bbs7UJ5U.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-BJbu9kpL.js} +2 -2
  180. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-DTwbEEcX.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-D8soyAAx.js} +1 -1
  181. package/build/assets/{vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-CDXvdvb2.js → vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-DYXOLEck.js} +1 -1
  182. package/build/assets/{verification-settings-CsbvQcYS.js → verification-settings-C_zHuDx9.js} +1 -1
  183. package/build/assets/{vscode-tab-DjNArCgY.js → vscode-tab-DH9x7xXS.js} +1 -1
  184. package/build/assets/{waiting-for-runtime-message-CntjExbU.js → waiting-for-runtime-message-CdK3btDZ.js} +1 -1
  185. package/build/assets/{x-mark-CrpjscNc.js → x-mark-BrkSPIiT.js} +1 -1
  186. package/build/index.html +4 -4
  187. package/build/locales/ar/openhands.json +20 -2
  188. package/build/locales/ca/openhands.json +20 -2
  189. package/build/locales/de/openhands.json +20 -2
  190. package/build/locales/en/openhands.json +20 -2
  191. package/build/locales/es/openhands.json +20 -2
  192. package/build/locales/fr/openhands.json +20 -2
  193. package/build/locales/it/openhands.json +20 -2
  194. package/build/locales/ja/openhands.json +20 -2
  195. package/build/locales/ko-KR/openhands.json +20 -2
  196. package/build/locales/no/openhands.json +20 -2
  197. package/build/locales/pt/openhands.json +20 -2
  198. package/build/locales/tr/openhands.json +20 -2
  199. package/build/locales/uk/openhands.json +20 -2
  200. package/build/locales/zh-CN/openhands.json +20 -2
  201. package/build/locales/zh-TW/openhands.json +20 -2
  202. package/dist/api/acp-service/acp-service.api.d.ts +18 -0
  203. package/dist/api/agent-server-adapter.cjs +3 -3
  204. package/dist/api/agent-server-adapter.cjs.map +1 -1
  205. package/dist/api/agent-server-adapter.js +54 -55
  206. package/dist/api/agent-server-adapter.js.map +1 -1
  207. package/dist/api/agent-server-client-options.cjs +1 -1
  208. package/dist/api/agent-server-client-options.cjs.map +1 -1
  209. package/dist/api/agent-server-client-options.d.ts +4 -0
  210. package/dist/api/agent-server-client-options.js +18 -12
  211. package/dist/api/agent-server-client-options.js.map +1 -1
  212. package/dist/api/agent-server-compatibility.cjs +1 -1
  213. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  214. package/dist/api/agent-server-compatibility.d.ts +1 -1
  215. package/dist/api/agent-server-compatibility.js +30 -25
  216. package/dist/api/agent-server-compatibility.js.map +1 -1
  217. package/dist/api/agent-server-config.cjs +1 -1
  218. package/dist/api/agent-server-config.cjs.map +1 -1
  219. package/dist/api/agent-server-config.d.ts +15 -48
  220. package/dist/api/agent-server-config.js +25 -69
  221. package/dist/api/agent-server-config.js.map +1 -1
  222. package/dist/api/backend-registry/active-store.cjs +1 -1
  223. package/dist/api/backend-registry/active-store.cjs.map +1 -1
  224. package/dist/api/backend-registry/active-store.d.ts +11 -5
  225. package/dist/api/backend-registry/active-store.js +36 -27
  226. package/dist/api/backend-registry/active-store.js.map +1 -1
  227. package/dist/api/backend-registry/auth.cjs +1 -1
  228. package/dist/api/backend-registry/auth.cjs.map +1 -1
  229. package/dist/api/backend-registry/auth.js +3 -9
  230. package/dist/api/backend-registry/auth.js.map +1 -1
  231. package/dist/api/backend-registry/default-backend.cjs +1 -1
  232. package/dist/api/backend-registry/default-backend.cjs.map +1 -1
  233. package/dist/api/backend-registry/default-backend.d.ts +9 -16
  234. package/dist/api/backend-registry/default-backend.js +5 -4
  235. package/dist/api/backend-registry/default-backend.js.map +1 -1
  236. package/dist/api/backend-registry/storage.cjs +1 -1
  237. package/dist/api/backend-registry/storage.cjs.map +1 -1
  238. package/dist/api/backend-registry/storage.js +67 -34
  239. package/dist/api/backend-registry/storage.js.map +1 -1
  240. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  241. package/dist/api/cloud/conversation-service.api.d.ts +8 -13
  242. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  243. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  244. package/dist/api/cloud/organization-service.api.d.ts +1 -2
  245. package/dist/api/cloud/organization-service.api.js.map +1 -1
  246. package/dist/api/cloud/proxy.cjs +1 -1
  247. package/dist/api/cloud/proxy.cjs.map +1 -1
  248. package/dist/api/cloud/proxy.d.ts +6 -6
  249. package/dist/api/cloud/proxy.js +33 -24
  250. package/dist/api/cloud/proxy.js.map +1 -1
  251. package/dist/api/cloud/sandbox-service.api.cjs.map +1 -1
  252. package/dist/api/cloud/sandbox-service.api.d.ts +3 -3
  253. package/dist/api/cloud/sandbox-service.api.js.map +1 -1
  254. package/dist/api/cloud/secrets-service.api.cjs.map +1 -1
  255. package/dist/api/cloud/secrets-service.api.d.ts +3 -4
  256. package/dist/api/cloud/secrets-service.api.js.map +1 -1
  257. package/dist/api/cloud/settings-service.api.cjs +1 -1
  258. package/dist/api/cloud/settings-service.api.cjs.map +1 -1
  259. package/dist/api/cloud/settings-service.api.js +5 -1
  260. package/dist/api/cloud/settings-service.api.js.map +1 -1
  261. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  262. package/dist/api/cloud/skills-service.api.d.ts +5 -5
  263. package/dist/api/cloud/skills-service.api.js.map +1 -1
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  265. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  266. package/dist/api/conversation-service/agent-server-conversation-service.api.js +115 -108
  267. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  268. package/dist/api/device-flow-client.cjs +1 -1
  269. package/dist/api/device-flow-client.cjs.map +1 -1
  270. package/dist/api/device-flow-client.d.ts +3 -5
  271. package/dist/api/device-flow-client.js +55 -66
  272. package/dist/api/device-flow-client.js.map +1 -1
  273. package/dist/api/event-service/event-service.api.cjs +1 -1
  274. package/dist/api/event-service/event-service.api.cjs.map +1 -1
  275. package/dist/api/event-service/event-service.api.d.ts +3 -3
  276. package/dist/api/event-service/event-service.api.js +17 -17
  277. package/dist/api/event-service/event-service.api.js.map +1 -1
  278. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  279. package/dist/api/git-service/agent-server-git-service.api.js +11 -11
  280. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  281. package/dist/api/runtime-service/agent-server-runtime-service.js +6 -6
  282. package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.cjs +2 -2
  283. package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.js +10 -10
  284. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.cjs.map +1 -1
  285. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.d.ts +5 -5
  286. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.js.map +1 -1
  287. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +1 -1
  288. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  289. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +1 -1
  290. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  291. package/dist/components/features/automations/automation-action-button-classes.d.ts +2 -2
  292. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  293. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  294. package/dist/components/features/backends/backend-form-modal.d.ts +1 -0
  295. package/dist/components/features/backends/backend-form-modal.js +203 -140
  296. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  297. package/dist/components/features/backends/backend-selector.cjs +1 -1
  298. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  299. package/dist/components/features/backends/backend-selector.js +117 -105
  300. package/dist/components/features/backends/backend-selector.js.map +1 -1
  301. package/dist/components/features/backends/backend-status-dot.cjs +1 -1
  302. package/dist/components/features/backends/backend-status-dot.cjs.map +1 -1
  303. package/dist/components/features/backends/backend-status-dot.d.ts +1 -1
  304. package/dist/components/features/backends/backend-status-dot.js +1 -1
  305. package/dist/components/features/backends/backend-status-dot.js.map +1 -1
  306. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  307. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  308. package/dist/components/features/backends/manage-backends-modal.js +81 -70
  309. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  310. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  311. package/dist/components/features/chat/change-agent-button.cjs.map +1 -1
  312. package/dist/components/features/chat/change-agent-button.js +59 -57
  313. package/dist/components/features/chat/change-agent-button.js.map +1 -1
  314. package/dist/components/features/chat/change-agent-context-menu.cjs +1 -1
  315. package/dist/components/features/chat/change-agent-context-menu.cjs.map +1 -1
  316. package/dist/components/features/chat/change-agent-context-menu.d.ts +3 -1
  317. package/dist/components/features/chat/change-agent-context-menu.js +30 -25
  318. package/dist/components/features/chat/change-agent-context-menu.js.map +1 -1
  319. package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
  320. package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
  321. package/dist/components/features/chat/chat-add-file-button.js +39 -38
  322. package/dist/components/features/chat/chat-add-file-button.js.map +1 -1
  323. package/dist/components/features/chat/chat-message.cjs +1 -1
  324. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  325. package/dist/components/features/chat/chat-message.d.ts +2 -1
  326. package/dist/components/features/chat/chat-message.js +185 -57
  327. package/dist/components/features/chat/chat-message.js.map +1 -1
  328. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  329. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  330. package/dist/components/features/chat/components/chat-input-actions.js +113 -113
  331. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  332. package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
  333. package/dist/components/features/chat/components/chat-input-model.cjs.map +1 -1
  334. package/dist/components/features/chat/components/chat-input-model.js +52 -51
  335. package/dist/components/features/chat/components/chat-input-model.js.map +1 -1
  336. package/dist/components/features/chat/components/slash-command-menu.cjs +2 -2
  337. package/dist/components/features/chat/components/slash-command-menu.cjs.map +1 -1
  338. package/dist/components/features/chat/components/slash-command-menu.js +38 -34
  339. package/dist/components/features/chat/components/slash-command-menu.js.map +1 -1
  340. package/dist/components/features/chat/git-control-bar-pr-button.cjs +1 -1
  341. package/dist/components/features/chat/git-control-bar-pr-button.cjs.map +1 -1
  342. package/dist/components/features/chat/git-control-bar-pr-button.js +16 -15
  343. package/dist/components/features/chat/git-control-bar-pr-button.js.map +1 -1
  344. package/dist/components/features/chat/git-control-bar-pull-button.cjs +1 -1
  345. package/dist/components/features/chat/git-control-bar-pull-button.cjs.map +1 -1
  346. package/dist/components/features/chat/git-control-bar-pull-button.js +16 -15
  347. package/dist/components/features/chat/git-control-bar-pull-button.js.map +1 -1
  348. package/dist/components/features/chat/git-control-bar-push-button.cjs +1 -1
  349. package/dist/components/features/chat/git-control-bar-push-button.cjs.map +1 -1
  350. package/dist/components/features/chat/git-control-bar-push-button.js +16 -15
  351. package/dist/components/features/chat/git-control-bar-push-button.js.map +1 -1
  352. package/dist/components/features/chat/git-control-bar.cjs +1 -1
  353. package/dist/components/features/chat/git-control-bar.cjs.map +1 -1
  354. package/dist/components/features/chat/git-control-bar.js +63 -62
  355. package/dist/components/features/chat/git-control-bar.js.map +1 -1
  356. package/dist/components/features/chat/pending-user-messages.cjs +1 -1
  357. package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
  358. package/dist/components/features/chat/pending-user-messages.js +27 -23
  359. package/dist/components/features/chat/pending-user-messages.js.map +1 -1
  360. package/dist/components/features/chat/switch-profile-button.cjs +1 -1
  361. package/dist/components/features/chat/switch-profile-button.cjs.map +1 -1
  362. package/dist/components/features/chat/switch-profile-button.js +26 -25
  363. package/dist/components/features/chat/switch-profile-button.js.map +1 -1
  364. package/dist/components/features/chat/switch-profile-context-menu.cjs +1 -1
  365. package/dist/components/features/chat/switch-profile-context-menu.cjs.map +1 -1
  366. package/dist/components/features/chat/switch-profile-context-menu.js +77 -67
  367. package/dist/components/features/chat/switch-profile-context-menu.js.map +1 -1
  368. package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs +1 -1
  369. package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs.map +1 -1
  370. package/dist/components/features/context-menu/context-menu-icon-text-with-description.d.ts +2 -1
  371. package/dist/components/features/context-menu/context-menu-icon-text-with-description.js +3 -2
  372. package/dist/components/features/context-menu/context-menu-icon-text-with-description.js.map +1 -1
  373. package/dist/components/features/context-menu/context-menu-icon-text.cjs +1 -1
  374. package/dist/components/features/context-menu/context-menu-icon-text.cjs.map +1 -1
  375. package/dist/components/features/context-menu/context-menu-icon-text.d.ts +2 -1
  376. package/dist/components/features/context-menu/context-menu-icon-text.js +20 -10
  377. package/dist/components/features/context-menu/context-menu-icon-text.js.map +1 -1
  378. package/dist/components/features/context-menu/context-menu-list-item.cjs +1 -1
  379. package/dist/components/features/context-menu/context-menu-list-item.cjs.map +1 -1
  380. package/dist/components/features/context-menu/context-menu-list-item.js +10 -9
  381. package/dist/components/features/context-menu/context-menu-list-item.js.map +1 -1
  382. package/dist/components/features/controls/agent-status.cjs +1 -1
  383. package/dist/components/features/controls/agent-status.js +12 -12
  384. package/dist/components/features/controls/git-tools-submenu.cjs +1 -1
  385. package/dist/components/features/controls/git-tools-submenu.cjs.map +1 -1
  386. package/dist/components/features/controls/git-tools-submenu.js +1 -1
  387. package/dist/components/features/controls/git-tools-submenu.js.map +1 -1
  388. package/dist/components/features/controls/macros-submenu.cjs +1 -1
  389. package/dist/components/features/controls/macros-submenu.cjs.map +1 -1
  390. package/dist/components/features/controls/macros-submenu.js +1 -1
  391. package/dist/components/features/controls/macros-submenu.js.map +1 -1
  392. package/dist/components/features/controls/server-status-context-menu-icon-text.cjs +1 -1
  393. package/dist/components/features/controls/server-status-context-menu-icon-text.cjs.map +1 -1
  394. package/dist/components/features/controls/server-status-context-menu-icon-text.js +14 -15
  395. package/dist/components/features/controls/server-status-context-menu-icon-text.js.map +1 -1
  396. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  397. package/dist/components/features/controls/server-status-context-menu.js +4 -4
  398. package/dist/components/features/controls/server-status.cjs +1 -1
  399. package/dist/components/features/controls/server-status.js +7 -7
  400. package/dist/components/features/controls/tools-context-menu-icon-text.cjs +1 -1
  401. package/dist/components/features/controls/tools-context-menu-icon-text.cjs.map +1 -1
  402. package/dist/components/features/controls/tools-context-menu-icon-text.js +16 -16
  403. package/dist/components/features/controls/tools-context-menu-icon-text.js.map +1 -1
  404. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs +1 -1
  405. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs.map +1 -1
  406. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js +11 -11
  407. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js.map +1 -1
  408. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  409. package/dist/components/features/conversation/conversation-name-with-status.js +11 -11
  410. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  411. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  412. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +60 -47
  413. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  414. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
  415. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
  416. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +86 -82
  417. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
  418. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  419. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +4 -4
  420. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  421. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +9 -9
  422. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  423. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  424. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +93 -93
  425. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  426. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  427. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  428. package/dist/components/features/conversation-panel/conversation-panel.js +177 -177
  429. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  430. package/dist/components/features/conversation-panel/ellipsis-button.cjs +1 -1
  431. package/dist/components/features/conversation-panel/ellipsis-button.cjs.map +1 -1
  432. package/dist/components/features/conversation-panel/ellipsis-button.js +13 -13
  433. package/dist/components/features/conversation-panel/ellipsis-button.js.map +1 -1
  434. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
  435. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
  436. package/dist/components/features/conversation-panel/local-new-conversation-menu.js +57 -53
  437. package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
  438. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs +1 -1
  439. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs.map +1 -1
  440. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js +3 -2
  441. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js.map +1 -1
  442. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs +1 -1
  443. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs.map +1 -1
  444. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js +11 -8
  445. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js.map +1 -1
  446. package/dist/components/features/conversation-panel/system-message-modal/tab-content.cjs.map +1 -1
  447. package/dist/components/features/conversation-panel/system-message-modal/tab-content.d.ts +2 -5
  448. package/dist/components/features/conversation-panel/system-message-modal/tab-content.js.map +1 -1
  449. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  450. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  451. package/dist/components/features/files-tab/file-content-viewer.js +45 -42
  452. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  453. package/dist/components/features/home/llm-not-configured-banner.d.ts +11 -0
  454. package/dist/components/features/home/shared/dropdown-item.cjs +1 -1
  455. package/dist/components/features/home/shared/dropdown-item.cjs.map +1 -1
  456. package/dist/components/features/home/shared/dropdown-item.js +20 -16
  457. package/dist/components/features/home/shared/dropdown-item.js.map +1 -1
  458. package/dist/components/features/home/shared/generic-dropdown-menu.cjs +1 -1
  459. package/dist/components/features/home/shared/generic-dropdown-menu.cjs.map +1 -1
  460. package/dist/components/features/home/shared/generic-dropdown-menu.js +23 -22
  461. package/dist/components/features/home/shared/generic-dropdown-menu.js.map +1 -1
  462. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
  463. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs.map +1 -1
  464. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +103 -102
  465. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js.map +1 -1
  466. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
  467. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs.map +1 -1
  468. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +68 -67
  469. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js.map +1 -1
  470. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  471. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  472. package/dist/components/features/mcp-page/custom-server-editor.js +62 -60
  473. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  474. package/dist/components/features/mcp-page/index.cjs +1 -1
  475. package/dist/components/features/mcp-page/index.d.ts +1 -0
  476. package/dist/components/features/mcp-page/index.js +1 -0
  477. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  478. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  479. package/dist/components/features/mcp-page/install-server-modal.js +141 -121
  480. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  481. package/dist/components/features/mcp-page/save-as-secret-toggle.cjs +2 -0
  482. package/dist/components/features/mcp-page/save-as-secret-toggle.cjs.map +1 -0
  483. package/dist/components/features/mcp-page/save-as-secret-toggle.d.ts +7 -0
  484. package/dist/components/features/mcp-page/save-as-secret-toggle.js +50 -0
  485. package/dist/components/features/mcp-page/save-as-secret-toggle.js.map +1 -0
  486. package/dist/components/features/onboarding/onboarding-modal.d.ts +2 -2
  487. package/dist/components/features/onboarding/steps/check-backend-step.d.ts +1 -1
  488. package/dist/components/features/onboarding/steps/choose-agent-step.d.ts +2 -1
  489. package/dist/components/features/onboarding/steps/setup-acp-secrets-step.d.ts +19 -10
  490. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  491. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.d.ts +5 -0
  492. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -0
  493. package/dist/components/features/settings/llm-profiles/profile-actions-menu.cjs +1 -1
  494. package/dist/components/features/settings/llm-profiles/profile-actions-menu.js +1 -0
  495. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  496. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  497. package/dist/components/features/skills/extensions-navigation.js +1 -1
  498. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  499. package/dist/components/shared/buttons/back-nav-button.cjs +2 -0
  500. package/dist/components/shared/buttons/back-nav-button.cjs.map +1 -0
  501. package/dist/components/shared/buttons/back-nav-button.d.ts +17 -0
  502. package/dist/components/shared/buttons/back-nav-button.js +33 -0
  503. package/dist/components/shared/buttons/back-nav-button.js.map +1 -0
  504. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  505. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +5 -5
  506. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  507. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  508. package/dist/components/shared/filters/enum-filter-dropdown.js +32 -31
  509. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  510. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  511. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  512. package/dist/components/shared/modals/confirmation-modals/base-modal.js +14 -13
  513. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  514. package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
  515. package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
  516. package/dist/components/shared/modals/settings/settings-modal.js +17 -16
  517. package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
  518. package/dist/components/shared/text-shimmer.cjs +2 -0
  519. package/dist/components/shared/text-shimmer.cjs.map +1 -0
  520. package/dist/components/shared/text-shimmer.d.ts +11 -0
  521. package/dist/components/shared/text-shimmer.js +43 -0
  522. package/dist/components/shared/text-shimmer.js.map +1 -0
  523. package/dist/constants/acp-providers.cjs +1 -1
  524. package/dist/constants/acp-providers.cjs.map +1 -1
  525. package/dist/constants/acp-providers.d.ts +16 -3
  526. package/dist/constants/acp-providers.js +0 -1
  527. package/dist/constants/acp-providers.js.map +1 -1
  528. package/dist/contexts/active-backend-context.cjs +1 -1
  529. package/dist/contexts/active-backend-context.cjs.map +1 -1
  530. package/dist/contexts/active-backend-context.js +32 -32
  531. package/dist/contexts/active-backend-context.js.map +1 -1
  532. package/dist/hooks/chat/use-chat-input-logic.cjs +1 -1
  533. package/dist/hooks/chat/use-chat-input-logic.cjs.map +1 -1
  534. package/dist/hooks/chat/use-chat-input-logic.js +13 -6
  535. package/dist/hooks/chat/use-chat-input-logic.js.map +1 -1
  536. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs +2 -0
  537. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs.map +1 -0
  538. package/dist/hooks/mutation/use-save-fields-as-secrets.d.ts +9 -0
  539. package/dist/hooks/mutation/use-save-fields-as-secrets.js +24 -0
  540. package/dist/hooks/mutation/use-save-fields-as-secrets.js.map +1 -0
  541. package/dist/hooks/mutation/use-unified-start-conversation.cjs +1 -1
  542. package/dist/hooks/mutation/use-unified-start-conversation.js +8 -8
  543. package/dist/hooks/mutation/use-unified-stop-conversation.cjs +1 -1
  544. package/dist/hooks/mutation/use-unified-stop-conversation.js +15 -15
  545. package/dist/hooks/query/use-acp-auth-status.d.ts +36 -0
  546. package/dist/hooks/query/use-agent-settings-schema.cjs +1 -1
  547. package/dist/hooks/query/use-agent-settings-schema.cjs.map +1 -1
  548. package/dist/hooks/query/use-agent-settings-schema.js +26 -16
  549. package/dist/hooks/query/use-agent-settings-schema.js.map +1 -1
  550. package/dist/hooks/query/use-backends-health.cjs +1 -1
  551. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  552. package/dist/hooks/query/use-backends-health.d.ts +2 -0
  553. package/dist/hooks/query/use-backends-health.js +31 -21
  554. package/dist/hooks/query/use-backends-health.js.map +1 -1
  555. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  556. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  557. package/dist/hooks/query/use-paginated-conversations.js +15 -14
  558. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  559. package/dist/hooks/query/use-settings.cjs +1 -1
  560. package/dist/hooks/query/use-settings.cjs.map +1 -1
  561. package/dist/hooks/query/use-settings.js +65 -52
  562. package/dist/hooks/query/use-settings.js.map +1 -1
  563. package/dist/hooks/query/use-user-conversation.cjs +1 -1
  564. package/dist/hooks/query/use-user-conversation.cjs.map +1 -1
  565. package/dist/hooks/query/use-user-conversation.js +20 -11
  566. package/dist/hooks/query/use-user-conversation.js.map +1 -1
  567. package/dist/hooks/use-agent-state.cjs +1 -1
  568. package/dist/hooks/use-agent-state.js +13 -13
  569. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  570. package/dist/hooks/use-conversation-name-context-menu.js +10 -10
  571. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  572. package/dist/hooks/use-llm-configured.d.ts +25 -0
  573. package/dist/hooks/use-runtime-is-ready.cjs +1 -1
  574. package/dist/hooks/use-runtime-is-ready.js +5 -5
  575. package/dist/i18n/declaration.cjs +1 -1
  576. package/dist/i18n/declaration.cjs.map +1 -1
  577. package/dist/i18n/declaration.d.ts +19 -1
  578. package/dist/i18n/declaration.js +1 -1
  579. package/dist/i18n/declaration.js.map +1 -1
  580. package/dist/i18n/translation.cjs +3 -3
  581. package/dist/i18n/translation.cjs.map +1 -1
  582. package/dist/i18n/translation.js +321 -15
  583. package/dist/i18n/translation.js.map +1 -1
  584. package/dist/icons/stop-circle.cjs +1 -1
  585. package/dist/icons/stop-circle.cjs.map +1 -1
  586. package/dist/icons/stop-circle.js +7 -10
  587. package/dist/icons/stop-circle.js.map +1 -1
  588. package/dist/locales/ar/openhands.json +20 -2
  589. package/dist/locales/ca/openhands.json +20 -2
  590. package/dist/locales/de/openhands.json +20 -2
  591. package/dist/locales/en/openhands.json +20 -2
  592. package/dist/locales/es/openhands.json +20 -2
  593. package/dist/locales/fr/openhands.json +20 -2
  594. package/dist/locales/it/openhands.json +20 -2
  595. package/dist/locales/ja/openhands.json +20 -2
  596. package/dist/locales/ko-KR/openhands.json +20 -2
  597. package/dist/locales/no/openhands.json +20 -2
  598. package/dist/locales/pt/openhands.json +20 -2
  599. package/dist/locales/tr/openhands.json +20 -2
  600. package/dist/locales/uk/openhands.json +20 -2
  601. package/dist/locales/zh-CN/openhands.json +20 -2
  602. package/dist/locales/zh-TW/openhands.json +20 -2
  603. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs +2 -0
  604. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs.map +1 -0
  605. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
  606. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
  607. package/dist/package.cjs +1 -1
  608. package/dist/package.cjs.map +1 -1
  609. package/dist/package.js +1 -1
  610. package/dist/package.js.map +1 -1
  611. package/dist/routes/conversation.cjs +1 -1
  612. package/dist/routes/conversation.cjs.map +1 -1
  613. package/dist/routes/conversation.js +1 -1
  614. package/dist/routes/conversation.js.map +1 -1
  615. package/dist/routes/llm-settings.cjs +1 -1
  616. package/dist/routes/llm-settings.cjs.map +1 -1
  617. package/dist/routes/llm-settings.js +55 -54
  618. package/dist/routes/llm-settings.js.map +1 -1
  619. package/dist/routes/secrets-settings.cjs +1 -1
  620. package/dist/routes/secrets-settings.cjs.map +1 -1
  621. package/dist/routes/secrets-settings.js +19 -27
  622. package/dist/routes/secrets-settings.js.map +1 -1
  623. package/dist/stores/conversation-store.cjs +1 -1
  624. package/dist/stores/conversation-store.cjs.map +1 -1
  625. package/dist/stores/conversation-store.d.ts +4 -0
  626. package/dist/stores/conversation-store.js +6 -0
  627. package/dist/stores/conversation-store.js.map +1 -1
  628. package/dist/types/agent-server/core/events/acp-tool-call-event.d.ts +6 -4
  629. package/dist/types/agent-server/core/events/system-event.d.ts +5 -0
  630. package/dist/types/automation.d.ts +15 -0
  631. package/dist/types/settings.d.ts +3 -1
  632. package/dist/ui/combobox-caret.cjs +1 -1
  633. package/dist/ui/combobox-caret.cjs.map +1 -1
  634. package/dist/ui/combobox-caret.d.ts +1 -1
  635. package/dist/ui/combobox-caret.js +9 -8
  636. package/dist/ui/combobox-caret.js.map +1 -1
  637. package/dist/ui/context-menu.cjs +1 -1
  638. package/dist/ui/context-menu.cjs.map +1 -1
  639. package/dist/ui/context-menu.js +9 -8
  640. package/dist/ui/context-menu.js.map +1 -1
  641. package/dist/ui/dropdown/dropdown-menu.cjs +1 -1
  642. package/dist/ui/dropdown/dropdown-menu.cjs.map +1 -1
  643. package/dist/ui/dropdown/dropdown-menu.js +21 -17
  644. package/dist/ui/dropdown/dropdown-menu.js.map +1 -1
  645. package/dist/ui/dropdown/dropdown.cjs +1 -1
  646. package/dist/ui/dropdown/dropdown.cjs.map +1 -1
  647. package/dist/ui/dropdown/dropdown.js +2 -2
  648. package/dist/ui/dropdown/dropdown.js.map +1 -1
  649. package/dist/utils/automation-schedule.d.ts +1 -0
  650. package/dist/utils/dropdown-classes.cjs +2 -0
  651. package/dist/utils/dropdown-classes.cjs.map +1 -0
  652. package/dist/utils/dropdown-classes.d.ts +32 -0
  653. package/dist/utils/dropdown-classes.js +8 -0
  654. package/dist/utils/dropdown-classes.js.map +1 -0
  655. package/dist/utils/form-control-classes.cjs +1 -1
  656. package/dist/utils/form-control-classes.cjs.map +1 -1
  657. package/dist/utils/form-control-classes.d.ts +18 -2
  658. package/dist/utils/form-control-classes.js +4 -3
  659. package/dist/utils/form-control-classes.js.map +1 -1
  660. package/dist/utils/git-control-bar-classes.cjs +2 -0
  661. package/dist/utils/git-control-bar-classes.cjs.map +1 -0
  662. package/dist/utils/git-control-bar-classes.d.ts +4 -0
  663. package/dist/utils/git-control-bar-classes.js +14 -0
  664. package/dist/utils/git-control-bar-classes.js.map +1 -0
  665. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  666. package/dist/utils/handle-event-for-ui.d.ts +6 -3
  667. package/dist/utils/handle-event-for-ui.js.map +1 -1
  668. package/dist/utils/mobile-top-bar-icon-button-classes.cjs +1 -1
  669. package/dist/utils/mobile-top-bar-icon-button-classes.cjs.map +1 -1
  670. package/dist/utils/mobile-top-bar-icon-button-classes.js +3 -3
  671. package/dist/utils/mobile-top-bar-icon-button-classes.js.map +1 -1
  672. package/dist/utils/modal-classes.cjs +2 -0
  673. package/dist/utils/modal-classes.cjs.map +1 -0
  674. package/dist/utils/modal-classes.d.ts +8 -0
  675. package/dist/utils/modal-classes.js +7 -0
  676. package/dist/utils/modal-classes.js.map +1 -0
  677. package/dist/utils/openhands-llm.cjs +2 -0
  678. package/dist/utils/openhands-llm.cjs.map +1 -0
  679. package/dist/utils/openhands-llm.d.ts +2 -0
  680. package/dist/utils/openhands-llm.js +9 -0
  681. package/dist/utils/openhands-llm.js.map +1 -0
  682. package/dist/utils/redact-custom-secrets.cjs +2 -0
  683. package/dist/utils/redact-custom-secrets.cjs.map +1 -0
  684. package/dist/utils/redact-custom-secrets.d.ts +6 -0
  685. package/dist/utils/redact-custom-secrets.js +10 -0
  686. package/dist/utils/redact-custom-secrets.js.map +1 -0
  687. package/dist/utils/status.cjs +1 -1
  688. package/dist/utils/status.cjs.map +1 -1
  689. package/dist/utils/status.d.ts +2 -1
  690. package/dist/utils/status.js +9 -8
  691. package/dist/utils/status.js.map +1 -1
  692. package/dist/utils/system-message-adapter.cjs +1 -1
  693. package/dist/utils/system-message-adapter.cjs.map +1 -1
  694. package/dist/utils/system-message-adapter.js +10 -7
  695. package/dist/utils/system-message-adapter.js.map +1 -1
  696. package/dist/utils/utils.cjs +1 -1
  697. package/dist/utils/utils.cjs.map +1 -1
  698. package/dist/utils/utils.d.ts +2 -1
  699. package/dist/utils/utils.js +21 -20
  700. package/dist/utils/utils.js.map +1 -1
  701. package/package.json +1 -1
  702. package/scripts/dev-safe.mjs +3 -1
  703. package/scripts/dev-static.mjs +2 -2
  704. package/scripts/dev-with-automation.mjs +283 -108
  705. package/scripts/static-build.mjs +20 -19
  706. package/scripts/static-server.mjs +65 -6
  707. package/build/assets/acp-providers-CbiRekh9.js +0 -1
  708. package/build/assets/active-backend-context-cCM1vYYZ.js +0 -1
  709. package/build/assets/add-backend-modal-DIUQzMPa.js +0 -1
  710. package/build/assets/agent-server-client-options-Bc5ZorQZ.js +0 -1
  711. package/build/assets/agent-server-compatibility-BlkUsrX2.js +0 -1
  712. package/build/assets/agent-server-conversation-service.api-C2V5SlHu.js +0 -5
  713. package/build/assets/api-key-entry-screen-B2gynaCp.js +0 -1
  714. package/build/assets/automation-detail-DJvbVSYK.js +0 -1
  715. package/build/assets/automations-list-6FDbI5dc.js +0 -1
  716. package/build/assets/backend-form-modal-Dnk33xA_.js +0 -1
  717. package/build/assets/base-modal-_dYTw1ri.js +0 -1
  718. package/build/assets/brand-button-Br7f0kZJ.js +0 -1
  719. package/build/assets/browser-store-Couc4S5D.js +0 -1
  720. package/build/assets/clock-BRjCgHTc.js +0 -1
  721. package/build/assets/combobox-caret-to1O8irE.js +0 -1
  722. package/build/assets/context-menu-list-item-CWNFpuiC.js +0 -1
  723. package/build/assets/conversation-DVrKU0oz.js +0 -19
  724. package/build/assets/conversation-Dlys-D5A.js +0 -1
  725. package/build/assets/conversation-panel-iF09WjZ4.js +0 -1
  726. package/build/assets/conversation-service.api-CCfztilW.js +0 -1
  727. package/build/assets/conversation-state-store-u5jepov0.js +0 -1
  728. package/build/assets/conversation-store-Z5iMCRpc.js +0 -1
  729. package/build/assets/conversation-websocket-context-DhJhqUna.js +0 -3
  730. package/build/assets/declaration-BNMqORFE.js +0 -1
  731. package/build/assets/dist-BxBP7tFD.js +0 -1
  732. package/build/assets/edit-automation-modal-BGzR3nfZ.js +0 -1
  733. package/build/assets/ellipsis-button-ZyLMPURn.js +0 -1
  734. package/build/assets/entry.client-1VMHpktY.js +0 -2
  735. package/build/assets/enum-filter-dropdown-CEgCdu4A.js +0 -1
  736. package/build/assets/extensions-hub-C651jsVh.js +0 -1
  737. package/build/assets/files-tab-R5z0lLdY.js +0 -1
  738. package/build/assets/files-tab-store-CDyVTXNT.js +0 -1
  739. package/build/assets/git-control-bar-branch-button-COdRAYHb.js +0 -27
  740. package/build/assets/git-provider-icon-BzLbc0yC.js +0 -1
  741. package/build/assets/home-e-egNUXZ.js +0 -1
  742. package/build/assets/install-server-modal-DHlbgqVH.js +0 -1
  743. package/build/assets/launch-CshDse3e.js +0 -1
  744. package/build/assets/link-external-D2POYx4c.js +0 -1
  745. package/build/assets/llm-settings-Bql-vydt.js +0 -1
  746. package/build/assets/llm-settings-C_tal6Ds.js +0 -1
  747. package/build/assets/manage-backends-modal-l7RkKfwX.js +0 -1
  748. package/build/assets/manage-workspaces-modal-DhKF_8z3.js +0 -1
  749. package/build/assets/manifest-3bf30d69.js +0 -1
  750. package/build/assets/mcp-ByeBfdfU.js +0 -9
  751. package/build/assets/messages-D0rWot7s.js +0 -36
  752. package/build/assets/proxy-CxydCnis.js +0 -1
  753. package/build/assets/root-DHeCXo9N.css +0 -1
  754. package/build/assets/root-layout-Czo9Ma6Q.js +0 -2
  755. package/build/assets/secrets-service-BsnKFc2x.js +0 -1
  756. package/build/assets/secrets-settings-Bz_UohPJ.js +0 -1
  757. package/build/assets/settings-client-C73C7IgV.js +0 -1
  758. package/build/assets/settings-index-Dz0BmdJD.js +0 -1
  759. package/build/assets/settings-list-classes-Bf80tWtc.js +0 -1
  760. package/build/assets/settings-modal-Brzgh5Yw.js +0 -1
  761. package/build/assets/settings-service.api-CZ3uWx4v.js +0 -1
  762. package/build/assets/sidebar-mobile-menu-toggle-Do_aA9Zm.js +0 -1
  763. package/build/assets/skills-settings-DlA5hlXw.js +0 -2
  764. package/build/assets/status-hp6M6E7E.js +0 -1
  765. package/build/assets/use-agent-settings-schema-33Un7UF2.js +0 -1
  766. package/build/assets/use-is-authed-BggE5wPj.js +0 -1
  767. package/build/assets/use-llm-profiles-DDOol3gK.js +0 -1
  768. package/build/assets/use-runtime-is-ready-B7EF4BKU.js +0 -1
  769. package/build/assets/use-settings-DQIZmIov.js +0 -1
  770. package/build/assets/use-user-conversation-C6hrMMtn.js +0 -1
  771. package/build/assets/utils-i18rdUj2.js +0 -1
  772. package/build/assets/vendor~conversation-panel~conversation-a9SyrrhV.js +0 -1
  773. package/build/assets/vendor~conversation-panel~conversation~index-C23ZXO4R.js +0 -1
  774. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js +0 -1
  775. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DzIXV3Ui.js +0 -9
  776. /package/build/assets/{automation-IdgZq6ZK.js → automation-XDPAjiZi.js} +0 -0
  777. /package/build/assets/{color-themes-DSaoIL6A.js → color-themes-B9pm9c-R.js} +0 -0
  778. /package/build/assets/{common-DR1t-EeP.js → common-DqjLSBOt.js} +0 -0
  779. /package/build/assets/{conversation-local-storage-UYl-SX-r.js → conversation-local-storage-YmOVXxxW.js} +0 -0
  780. /package/build/assets/{dist-C6t0EXL7.js → dist-C3NfioQC.js} +0 -0
  781. /package/build/assets/{environment-switch-store-C4ulFJKp.js → environment-switch-store-CiurvTtK.js} +0 -0
  782. /package/build/assets/{health-store-BDC2rM-X.js → health-store-B5f0S2FY.js} +0 -0
  783. /package/build/assets/{map-provider-COBVzZYo.js → map-provider-BJ_8KZKU.js} +0 -0
  784. /package/build/assets/{middleware-BC9EwbB9.js → middleware-CfatjPYZ.js} +0 -0
  785. /package/build/assets/{objectWithoutPropertiesLoose-Du6eBn-V.js → objectWithoutPropertiesLoose-DSQKyRhw.js} +0 -0
  786. /package/build/assets/{react-Do0CT17Y.js → react-Dy05vyj5.js} +0 -0
  787. /package/build/assets/{sdk-settings-field-metadata-CBPmeqYa.js → sdk-settings-field-metadata-DQiaIBie.js} +0 -0
  788. /package/build/assets/{settings-D_H-qsRm.js → settings-DGY6n4J2.js} +0 -0
  789. /package/build/assets/{settings-like-page-layout-classes-I0BDBEoq.js → settings-like-page-layout-classes-D7YjdTd0.js} +0 -0
  790. /package/build/assets/{use-breakpoint-DbJ6FkQ-.js → use-breakpoint-DF_RiQ6s.js} +0 -0
  791. /package/build/assets/{use-click-outside-element-DffgWWoZ.js → use-click-outside-element-DhxCUyWl.js} +0 -0
  792. /package/build/assets/{v4-CNn21NXa.js → v4-khGvL7i2.js} +0 -0
  793. /package/build/assets/{vendor~browser-DDiZgqD3.js → vendor~browser-DisFGEp9.js} +0 -0
  794. /package/build/assets/{vendor~browser-tab-BgwV1mxF.js → vendor~browser-tab-BxhTtM9_.js} +0 -0
  795. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DbvX3OcM.js → vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js} +0 -0
  796. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-iOsylxCS.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-BClAMeFe.js} +0 -0
  797. /package/build/assets/{vendor~files-tab-BGKayPiK.js → vendor~files-tab-BtkpAiMX.js} +0 -0
  798. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BW6261Sb.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CyZ-3lDQ.js} +0 -0
  799. /package/build/assets/{vendor~home~mcp~automations-list-DoPfwaXj.js → vendor~home~mcp~automations-list-BgV86Sti.js} +0 -0
  800. /package/build/assets/{vendor~launch-vdeRTWFu.js → vendor~launch-BXgl67Re.js} +0 -0
  801. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-D9P8e98a.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-CLlsvdNP.js} +0 -0
  802. /package/build/assets/{vendor~terminal-DUrOWGFE.js → vendor~terminal-DZaJIY8A.js} +0 -0
@@ -1,48 +1,53 @@
1
1
  import { isAuthRequired as e } from "./agent-server-config.js";
2
- import { getEffectiveLocalBackend as t } from "./backend-registry/active-store.js";
3
- import { ServerClient as n } from "../node_modules/@openhands/typescript-client/dist/client/server-client.js";
4
- import { SettingsClient as r } from "../node_modules/@openhands/typescript-client/dist/client/settings-client.js";
5
- import { getAgentServerClientOptions as i } from "./agent-server-client-options.js";
2
+ import { getActiveBackend as t, getEffectiveLocalBackend as n, isNoBackend as r } from "./backend-registry/active-store.js";
3
+ import { ServerClient as i } from "../node_modules/@openhands/typescript-client/dist/client/server-client.js";
4
+ import { SettingsClient as a } from "../node_modules/@openhands/typescript-client/dist/client/settings-client.js";
5
+ import { getAgentServerClientOptions as o } from "./agent-server-client-options.js";
6
6
  //#region src/api/agent-server-compatibility.ts
7
- var a = 5e3, o = null, s = (e) => Array.isArray(e?.usable_tools) ? e.usable_tools : null, c = class extends Error {
7
+ var s = 5e3, c = null, l = (e) => Array.isArray(e?.usable_tools) ? e.usable_tools : null, u = class extends Error {
8
8
  details;
9
9
  constructor(e) {
10
10
  super("Agent server not found. Could not connect to the configured agent server. Start a compatible agent server and reload the page."), this.name = "AgentServerUnavailableError", this.details = e ?? null;
11
11
  }
12
- }, l = (e) => e instanceof c || typeof e == "object" && !!e && "name" in e && e.name === "AgentServerUnavailableError", u = (t) => e() && m(t, 401);
13
- function d() {
14
- o = null;
12
+ }, d = (e) => e instanceof u || typeof e == "object" && !!e && "name" in e && e.name === "AgentServerUnavailableError", f = (t) => e() && g(t, 401);
13
+ function p() {
14
+ c = null;
15
15
  }
16
- function f(e) {
17
- let t = s(o);
16
+ function m(e) {
17
+ let t = l(c);
18
18
  return Array.isArray(t) ? t.includes(e) : !0;
19
19
  }
20
- function p(e) {
20
+ function h(e) {
21
21
  return e instanceof Error && e.name === "HttpError" && "status" in e && typeof e.status == "number";
22
22
  }
23
- function m(e, t) {
24
- return p(e) && e.status === t;
23
+ function g(e, t) {
24
+ return h(e) && e.status === t;
25
25
  }
26
- async function h() {
27
- let s = t(), l = i({
28
- host: s.host,
29
- sessionApiKey: s.apiKey || null,
30
- timeout: a
31
- }), u;
26
+ async function _() {
27
+ let l = n();
28
+ if (!l) {
29
+ if (p(), r(t().backend)) throw new u("No backend configured");
30
+ return null;
31
+ }
32
+ let d = o({
33
+ host: l.host,
34
+ sessionApiKey: l.apiKey || null,
35
+ timeout: s
36
+ }), f;
32
37
  try {
33
- u = await new n(l).getServerInfo();
38
+ f = await new i(d).getServerInfo();
34
39
  } catch (e) {
35
- throw d(), p(e) ? e : new c(e instanceof Error ? e.message : null);
40
+ throw p(), g(e, 401) ? e : new u(e instanceof Error ? e.message : null);
36
41
  }
37
42
  if (e()) try {
38
- await new r(l).getSettings();
43
+ await new a(d).getSettings();
39
44
  } catch (e) {
40
- if (m(e, 401)) throw e;
45
+ if (g(e, 401)) throw e;
41
46
  console.warn("[agent-server] getSettings() probe failed (non-401):", e);
42
47
  }
43
- return o = u, u;
48
+ return c = f, f;
44
49
  }
45
50
  //#endregion
46
- export { u as isAgentServerAuthError, f as isAgentServerToolAvailable, l as isAgentServerUnavailableError, h as loadAgentServerInfo };
51
+ export { f as isAgentServerAuthError, m as isAgentServerToolAvailable, d as isAgentServerUnavailableError, g as isSdkHttpStatusError, _ as loadAgentServerInfo };
47
52
 
48
53
  //# sourceMappingURL=agent-server-compatibility.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server-compatibility.js","names":[],"sources":["../../src/api/agent-server-compatibility.ts"],"sourcesContent":["import {\n ServerClient,\n SettingsClient,\n} from \"@openhands/typescript-client/clients\";\nimport type { ServerInfo as BaseServerInfo } from \"@openhands/typescript-client\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { isAuthRequired } from \"#/api/agent-server-config\";\nimport { getEffectiveLocalBackend } from \"#/api/backend-registry/active-store\";\n\nconst AGENT_SERVER_INFO_TIMEOUT_MS = 5000;\n\nexport interface AgentServerInfo extends BaseServerInfo {\n usable_tools?: string[] | null;\n}\n\nlet cachedAgentServerInfo: AgentServerInfo | null = null;\n\nconst getAdvertisedTools = (serverInfo: AgentServerInfo | null) => {\n if (Array.isArray(serverInfo?.usable_tools)) {\n return serverInfo.usable_tools;\n }\n return null;\n};\n\nexport class AgentServerUnavailableError extends Error {\n readonly details: string | null;\n\n constructor(details?: string | null) {\n super(\n \"Agent server not found. Could not connect to the configured agent server. Start a compatible agent server and reload the page.\",\n );\n this.name = \"AgentServerUnavailableError\";\n this.details = details ?? null;\n }\n}\n\nexport const isAgentServerUnavailableError = (\n error: unknown,\n): error is AgentServerUnavailableError =>\n error instanceof AgentServerUnavailableError ||\n (typeof error === \"object\" &&\n error !== null &&\n \"name\" in error &&\n error.name === \"AgentServerUnavailableError\");\n\n/**\n * Returns true when the agent-server probe failed with HTTP 401.\n * In public mode this means the stored key is stale (server restarted\n * with a different `LOCAL_BACKEND_API_KEY`). Only meaningful when\n * auth is required — a 401 in local mode is a misconfiguration, not a\n * key-rotation event. Uses {@link isAuthRequired} so both the build-time\n * `VITE_AUTH_REQUIRED` flag and the runtime `window.__AGENT_CANVAS_AUTH_REQUIRED__`\n * injection (used by pre-built static binaries) are honoured.\n */\nexport const isAgentServerAuthError = (error: unknown): boolean =>\n isAuthRequired() && isSdkHttpStatusError(error, 401);\n\nexport function clearCachedAgentServerInfo() {\n cachedAgentServerInfo = null;\n}\n\nexport function isAgentServerToolAvailable(toolName: string) {\n const availableTools = getAdvertisedTools(cachedAgentServerInfo);\n if (!Array.isArray(availableTools)) {\n return true;\n }\n return availableTools.includes(toolName);\n}\n\nexport function isSdkHttpError(error: unknown) {\n return (\n error instanceof Error &&\n error.name === \"HttpError\" &&\n \"status\" in error &&\n typeof error.status === \"number\"\n );\n}\n\n/**\n * Narrows an SDK HTTP error to a specific status code.\n * Use instead of manually casting `(err as { status: number }).status`.\n */\nexport function isSdkHttpStatusError(error: unknown, status: number): boolean {\n return (\n isSdkHttpError(error) && (error as { status: number }).status === status\n );\n}\n\nexport async function loadAgentServerInfo() {\n // The probe is a *local* agent-server concern — it verifies the runtime\n // hosting the GUI is reachable. It must NEVER run against the active\n // backend when that backend is cloud, because cloud hosts don't\n // expose /api/server_info and would fail with a CORS error besides.\n const local = getEffectiveLocalBackend();\n const clientOptions = getAgentServerClientOptions({\n host: local.host,\n sessionApiKey: local.apiKey || null,\n timeout: AGENT_SERVER_INFO_TIMEOUT_MS,\n });\n let serverInfo: AgentServerInfo;\n\n try {\n serverInfo = (await new ServerClient(\n clientOptions,\n ).getServerInfo()) as AgentServerInfo;\n } catch (error) {\n clearCachedAgentServerInfo();\n if (isSdkHttpError(error)) {\n throw error;\n }\n\n const details = error instanceof Error ? error.message : null;\n throw new AgentServerUnavailableError(details);\n }\n\n // /server_info is unprotected, so a stale session key still gets 200.\n // In public mode, validate the key against a protected endpoint so a\n // server restart with a new LOCAL_BACKEND_API_KEY surfaces immediately\n // instead of letting the app load and fail on every subsequent call.\n if (isAuthRequired()) {\n try {\n await new SettingsClient(clientOptions).getSettings();\n } catch (error) {\n // Only rethrow 401 — that means the stored key is invalid /\n // rotated. Other HTTP errors (403, 5xx) and non-HTTP errors\n // (network, timeout) are swallowed: the server *is* up (we just\n // reached /server_info), so let the app proceed with an\n // unvalidated key rather than blocking the UI.\n // NOTE: If the connection drops between the /server_info and\n // getSettings() probes, the app loads with an unvalidated key and\n // subsequent 401s won't trigger the auth screen (they come from\n // React Query hooks, not this bootstrap path). Acceptable for now\n // since the window is narrow and a page refresh recovers.\n if (isSdkHttpStatusError(error, 401)) {\n throw error;\n }\n\n console.warn(\n \"[agent-server] getSettings() probe failed (non-401):\",\n error,\n );\n }\n }\n\n cachedAgentServerInfo = serverInfo;\n return serverInfo;\n}\n"],"mappings":";;;;;;AASA,IAAM,IAA+B,KAMjC,IAAgD,MAE9C,KAAsB,MACtB,MAAM,QAAQ,GAAY,aAAa,GAClC,EAAW,eAEb,MAGI,IAAb,cAAiD,MAAM;CACrD;CAEA,YAAY,GAAyB;AAKnC,EAJA,MACE,iIACD,EACD,KAAK,OAAO,+BACZ,KAAK,UAAU,KAAW;;GAIjB,KACX,MAEA,aAAiB,KAChB,OAAO,KAAU,cAChB,KACA,UAAU,KACV,EAAM,SAAS,+BAWN,KAA0B,MACrC,GAAgB,IAAI,EAAqB,GAAO,IAAI;AAEtD,SAAgB,IAA6B;AAC3C,KAAwB;;AAG1B,SAAgB,EAA2B,GAAkB;CAC3D,IAAM,IAAiB,EAAmB,EAAsB;AAIhE,QAHK,MAAM,QAAQ,EAAe,GAG3B,EAAe,SAAS,EAAS,GAF/B;;AAKX,SAAgB,EAAe,GAAgB;AAC7C,QACE,aAAiB,SACjB,EAAM,SAAS,eACf,YAAY,KACZ,OAAO,EAAM,UAAW;;AAQ5B,SAAgB,EAAqB,GAAgB,GAAyB;AAC5E,QACE,EAAe,EAAM,IAAK,EAA6B,WAAW;;AAItE,eAAsB,IAAsB;CAK1C,IAAM,IAAQ,GAA0B,EAClC,IAAgB,EAA4B;EAChD,MAAM,EAAM;EACZ,eAAe,EAAM,UAAU;EAC/B,SAAS;EACV,CAAC,EACE;AAEJ,KAAI;AACF,MAAc,MAAM,IAAI,EACtB,EACD,CAAC,eAAe;UACV,GAAO;AAOd,QANA,GAA4B,EACxB,EAAe,EAAM,GACjB,IAIF,IAAI,EADM,aAAiB,QAAQ,EAAM,UAAU,KACX;;AAOhD,KAAI,GAAgB,CAClB,KAAI;AACF,QAAM,IAAI,EAAe,EAAc,CAAC,aAAa;UAC9C,GAAO;AAWd,MAAI,EAAqB,GAAO,IAAI,CAClC,OAAM;AAGR,UAAQ,KACN,wDACA,EACD;;AAKL,QADA,IAAwB,GACjB"}
1
+ {"version":3,"file":"agent-server-compatibility.js","names":[],"sources":["../../src/api/agent-server-compatibility.ts"],"sourcesContent":["import {\n ServerClient,\n SettingsClient,\n} from \"@openhands/typescript-client/clients\";\nimport type { ServerInfo as BaseServerInfo } from \"@openhands/typescript-client\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { isAuthRequired } from \"#/api/agent-server-config\";\nimport {\n getActiveBackend,\n getEffectiveLocalBackend,\n isNoBackend,\n} from \"#/api/backend-registry/active-store\";\n\nconst AGENT_SERVER_INFO_TIMEOUT_MS = 5000;\n\nexport interface AgentServerInfo extends BaseServerInfo {\n usable_tools?: string[] | null;\n}\n\nlet cachedAgentServerInfo: AgentServerInfo | null = null;\n\nconst getAdvertisedTools = (serverInfo: AgentServerInfo | null) => {\n if (Array.isArray(serverInfo?.usable_tools)) {\n return serverInfo.usable_tools;\n }\n return null;\n};\n\nexport class AgentServerUnavailableError extends Error {\n readonly details: string | null;\n\n constructor(details?: string | null) {\n super(\n \"Agent server not found. Could not connect to the configured agent server. Start a compatible agent server and reload the page.\",\n );\n this.name = \"AgentServerUnavailableError\";\n this.details = details ?? null;\n }\n}\n\nexport const isAgentServerUnavailableError = (\n error: unknown,\n): error is AgentServerUnavailableError =>\n error instanceof AgentServerUnavailableError ||\n (typeof error === \"object\" &&\n error !== null &&\n \"name\" in error &&\n error.name === \"AgentServerUnavailableError\");\n\n/**\n * Returns true when the agent-server probe failed with HTTP 401.\n * In public mode this means the stored key is stale (server restarted\n * with a different `LOCAL_BACKEND_API_KEY`). Only meaningful when\n * auth is required — a 401 in local mode is a misconfiguration, not a\n * key-rotation event. Uses {@link isAuthRequired} so both the build-time\n * `VITE_AUTH_REQUIRED` flag and the runtime `window.__AGENT_CANVAS_AUTH_REQUIRED__`\n * injection (used by pre-built static binaries) are honoured.\n */\nexport const isAgentServerAuthError = (error: unknown): boolean =>\n isAuthRequired() && isSdkHttpStatusError(error, 401);\n\nexport function clearCachedAgentServerInfo() {\n cachedAgentServerInfo = null;\n}\n\nexport function isAgentServerToolAvailable(toolName: string) {\n const availableTools = getAdvertisedTools(cachedAgentServerInfo);\n if (!Array.isArray(availableTools)) {\n return true;\n }\n return availableTools.includes(toolName);\n}\n\nexport function isSdkHttpError(error: unknown) {\n return (\n error instanceof Error &&\n error.name === \"HttpError\" &&\n \"status\" in error &&\n typeof error.status === \"number\"\n );\n}\n\n/**\n * Narrows an SDK HTTP error to a specific status code.\n * Use instead of manually casting `(err as { status: number }).status`.\n */\nexport function isSdkHttpStatusError(error: unknown, status: number): boolean {\n return (\n isSdkHttpError(error) && (error as { status: number }).status === status\n );\n}\n\nexport async function loadAgentServerInfo() {\n // The probe is a *local* agent-server concern — it verifies the runtime\n // hosting the GUI is reachable. It must NEVER run against the active\n // backend when that backend is cloud, because cloud hosts don't\n // expose /api/server_info and would fail with a CORS error besides.\n const local = getEffectiveLocalBackend();\n if (!local) {\n clearCachedAgentServerInfo();\n\n // Empty registry (NO_BACKEND sentinel) — the user has no backend\n // configured at all. Throw so root.tsx shows the manage-backends\n // modal instead of silently rendering a broken home page.\n if (isNoBackend(getActiveBackend().backend)) {\n throw new AgentServerUnavailableError(\"No backend configured\");\n }\n\n // Active backend is cloud — no local probe needed.\n return null;\n }\n\n const clientOptions = getAgentServerClientOptions({\n host: local.host,\n sessionApiKey: local.apiKey || null,\n timeout: AGENT_SERVER_INFO_TIMEOUT_MS,\n });\n let serverInfo: AgentServerInfo;\n\n try {\n serverInfo = (await new ServerClient(\n clientOptions,\n ).getServerInfo()) as AgentServerInfo;\n } catch (error) {\n clearCachedAgentServerInfo();\n // Preserve 401 so root.tsx can show the auth screen (public mode).\n // All other HTTP errors (502, 503, etc.) mean the server is unreachable\n // or misconfigured — treat them as unavailable.\n if (isSdkHttpStatusError(error, 401)) {\n throw error;\n }\n\n const details = error instanceof Error ? error.message : null;\n throw new AgentServerUnavailableError(details);\n }\n\n // /server_info is unprotected, so a stale session key still gets 200.\n // In public mode, validate the key against a protected endpoint so a\n // server restart with a new LOCAL_BACKEND_API_KEY surfaces immediately\n // instead of letting the app load and fail on every subsequent call.\n if (isAuthRequired()) {\n try {\n await new SettingsClient(clientOptions).getSettings();\n } catch (error) {\n // Only rethrow 401 — that means the stored key is invalid /\n // rotated. Other HTTP errors (403, 5xx) and non-HTTP errors\n // (network, timeout) are swallowed: the server *is* up (we just\n // reached /server_info), so let the app proceed with an\n // unvalidated key rather than blocking the UI.\n // NOTE: If the connection drops between the /server_info and\n // getSettings() probes, the app loads with an unvalidated key and\n // subsequent 401s won't trigger the auth screen (they come from\n // React Query hooks, not this bootstrap path). Acceptable for now\n // since the window is narrow and a page refresh recovers.\n if (isSdkHttpStatusError(error, 401)) {\n throw error;\n }\n\n console.warn(\n \"[agent-server] getSettings() probe failed (non-401):\",\n error,\n );\n }\n }\n\n cachedAgentServerInfo = serverInfo;\n return serverInfo;\n}\n"],"mappings":";;;;;;AAaA,IAAM,IAA+B,KAMjC,IAAgD,MAE9C,KAAsB,MACtB,MAAM,QAAQ,GAAY,aAAa,GAClC,EAAW,eAEb,MAGI,IAAb,cAAiD,MAAM;CACrD;CAEA,YAAY,GAAyB;AAKnC,EAJA,MACE,iIACD,EACD,KAAK,OAAO,+BACZ,KAAK,UAAU,KAAW;;GAIjB,KACX,MAEA,aAAiB,KAChB,OAAO,KAAU,cAChB,KACA,UAAU,KACV,EAAM,SAAS,+BAWN,KAA0B,MACrC,GAAgB,IAAI,EAAqB,GAAO,IAAI;AAEtD,SAAgB,IAA6B;AAC3C,KAAwB;;AAG1B,SAAgB,EAA2B,GAAkB;CAC3D,IAAM,IAAiB,EAAmB,EAAsB;AAIhE,QAHK,MAAM,QAAQ,EAAe,GAG3B,EAAe,SAAS,EAAS,GAF/B;;AAKX,SAAgB,EAAe,GAAgB;AAC7C,QACE,aAAiB,SACjB,EAAM,SAAS,eACf,YAAY,KACZ,OAAO,EAAM,UAAW;;AAQ5B,SAAgB,EAAqB,GAAgB,GAAyB;AAC5E,QACE,EAAe,EAAM,IAAK,EAA6B,WAAW;;AAItE,eAAsB,IAAsB;CAK1C,IAAM,IAAQ,GAA0B;AACxC,KAAI,CAAC,GAAO;AAMV,MALA,GAA4B,EAKxB,EAAY,GAAkB,CAAC,QAAQ,CACzC,OAAM,IAAI,EAA4B,wBAAwB;AAIhE,SAAO;;CAGT,IAAM,IAAgB,EAA4B;EAChD,MAAM,EAAM;EACZ,eAAe,EAAM,UAAU;EAC/B,SAAS;EACV,CAAC,EACE;AAEJ,KAAI;AACF,MAAc,MAAM,IAAI,EACtB,EACD,CAAC,eAAe;UACV,GAAO;AAUd,QATA,GAA4B,EAIxB,EAAqB,GAAO,IAAI,GAC5B,IAIF,IAAI,EADM,aAAiB,QAAQ,EAAM,UAAU,KACX;;AAOhD,KAAI,GAAgB,CAClB,KAAI;AACF,QAAM,IAAI,EAAe,EAAc,CAAC,aAAa;UAC9C,GAAO;AAWd,MAAI,EAAqB,GAAO,IAAI,CAClC,OAAM;AAGR,UAAQ,KACN,wDACA,EACD;;AAKL,QADA,IAAwB,GACjB"}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);var e=`openhands-agent-server-config`,t=`workspace/project`;function n(){if(typeof window>`u`)return{};try{let t=window.localStorage.getItem(e);return t?JSON.parse(t)??{}:{}}catch{return{}}}function r(t){if(typeof window>`u`)return;let n=Object.fromEntries(Object.entries(t).flatMap(([e,t])=>{if(typeof t!=`string`)return[];let n=t.trim();return n?[[e,n]]:[]}));if(Object.keys(n).length===0){window.localStorage.removeItem(e);return}window.localStorage.setItem(e,JSON.stringify(n))}function i(e){return e?.trim()||null}function a(e){if(!e)return null;let t=e.trim().replace(/\/$/,``);return t?/^https?:\/\//i.test(t)?t:typeof window<`u`?`${window.location.protocol}//${t}`:`http://${t}`:null}function o(){return a(n().baseUrl)||a(void 0)}function s(){return i(void 0)}function c(){return i(n().sessionApiKey)||s()}function l(){let e=s();if(!e)return;let t=n(),a=i(t.sessionApiKey);a&&a!==e&&r({...t,sessionApiKey:e})}function u(e){if(typeof window>`u`)return!1;try{let t=new URL(e),n=new Set([`127.0.0.1`,`localhost`,`0.0.0.0`]),r=window.location.hostname;return n.has(t.hostname)&&(!n.has(r)||t.hostname!==r)}catch{return!1}}function d(e){return e?u(e)?window.location.origin:e:null}function f(){return d(o())||(typeof window<`u`?window.location.origin:`http://127.0.0.1:8000`)}function p(){return c()}function m(){return(void 0)?.trim()||n().workingDir?.trim()||t}function h(e){return`${m().replace(/\/+$/,``)}/${e.replace(/-/g,``)}`}function g(){let e=p();return e?{"X-Session-API-Key":e}:{}}function _(){return!0}function v(){return typeof window<`u`&&window.__AGENT_CANVAS_AUTH_REQUIRED__===!0}exports.DEFAULT_WORKING_DIR=t,exports.buildConversationWorkingDir=h,exports.getAgentServerBaseUrl=f,exports.getAgentServerHeaders=g,exports.getAgentServerSessionApiKey=p,exports.getAgentServerWorkingDir=m,exports.isAuthRequired=v,exports.shouldLoadPublicSkills=_,exports.syncBakedSessionApiKey=l;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);var e=`workspace/project`;function t(e){return e?.trim()||null}function n(e){if(!e)return null;let t=e.trim().replace(/\/$/,``);return t?/^https?:\/\//i.test(t)?t:typeof window<`u`?`${window.location.protocol}//${t}`:`http://${t}`:null}function r(){return n(void 0)}function i(){let e=t(void 0);if(e)return e;if(typeof window<`u`){let e=window.__AGENT_CANVAS_SESSION_API_KEY__;if(typeof e==`string`)return t(e)}return null}function a(){return r()||(typeof window<`u`?window.location.origin:null)}function o(){return i()}function s(){return(void 0)?.trim()||e}function c(e){return`${s().replace(/\/+$/,``)}/${e.replace(/-/g,``)}`}function l(){let e=o();return e?{"X-Session-API-Key":e}:{}}function u(){return!0}function d(){return typeof window<`u`&&window.__AGENT_CANVAS_AUTH_REQUIRED__===!0}exports.DEFAULT_WORKING_DIR=e,exports.buildConversationWorkingDir=c,exports.getAgentServerBaseUrl=a,exports.getAgentServerHeaders=l,exports.getAgentServerSessionApiKey=o,exports.getAgentServerWorkingDir=s,exports.isAuthRequired=d,exports.shouldLoadPublicSkills=u;
2
2
  //# sourceMappingURL=agent-server-config.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server-config.cjs","names":[],"sources":["../../src/api/agent-server-config.ts"],"sourcesContent":["export const AGENT_SERVER_CONFIG_STORAGE_KEY = \"openhands-agent-server-config\";\nexport const DEFAULT_WORKING_DIR = \"workspace/project\";\n\ninterface StoredAgentServerConfig {\n baseUrl?: string | null;\n sessionApiKey?: string | null;\n workingDir?: string | null;\n}\n\nexport interface AgentServerFormDefaults {\n baseUrl: string;\n sessionApiKey: string;\n}\n\nfunction readStoredConfig(): StoredAgentServerConfig {\n if (typeof window === \"undefined\") return {};\n\n try {\n const raw = window.localStorage.getItem(AGENT_SERVER_CONFIG_STORAGE_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as StoredAgentServerConfig;\n return parsed ?? {};\n } catch {\n return {};\n }\n}\n\nfunction writeStoredConfig(config: StoredAgentServerConfig): void {\n if (typeof window === \"undefined\") return;\n\n const nextConfig = Object.fromEntries(\n Object.entries(config).flatMap(([key, value]) => {\n if (typeof value !== \"string\") return [];\n\n const trimmed = value.trim();\n if (!trimmed) return [];\n\n return [[key, trimmed]];\n }),\n ) as StoredAgentServerConfig;\n\n if (Object.keys(nextConfig).length === 0) {\n window.localStorage.removeItem(AGENT_SERVER_CONFIG_STORAGE_KEY);\n return;\n }\n\n window.localStorage.setItem(\n AGENT_SERVER_CONFIG_STORAGE_KEY,\n JSON.stringify(nextConfig),\n );\n}\n\nfunction trimToNull(value?: string | null): string | null {\n return value?.trim() || null;\n}\n\nfunction normalizeBaseUrl(value?: string | null): string | null {\n if (!value) return null;\n\n const trimmed = value.trim().replace(/\\/$/, \"\");\n if (!trimmed) return null;\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n if (typeof window !== \"undefined\") {\n return `${window.location.protocol}//${trimmed}`;\n }\n\n return `http://${trimmed}`;\n}\n\nfunction getConfiguredBaseUrl(): string | null {\n const storedUrl = normalizeBaseUrl(readStoredConfig().baseUrl);\n if (storedUrl) return storedUrl;\n\n return normalizeBaseUrl(import.meta.env.VITE_BACKEND_BASE_URL);\n}\n\n/**\n * Return the baked-in session API key from the Vite env or the runtime\n * injection by static-server.mjs. This represents the *server's* truth\n * and is only set in non-public (local) mode.\n */\nexport function getBakedSessionApiKey(): string | null {\n return trimToNull(import.meta.env.VITE_SESSION_API_KEY);\n}\n\nfunction getConfiguredSessionApiKey(): string | null {\n const storedKey = trimToNull(readStoredConfig().sessionApiKey);\n if (storedKey) return storedKey;\n\n return getBakedSessionApiKey();\n}\n\n/**\n * Sync the baked-in session API key into `openhands-agent-server-config`\n * localStorage when the stored value has drifted.\n *\n * In non-public (local) mode the dev scripts bake the session key into\n * `VITE_SESSION_API_KEY` (Vite dev) or inject it via `static-server.mjs`\n * (`--session-api-key`). That key represents the *server's* truth — the\n * agent-server was started with the same value as `OH_SESSION_API_KEYS_0`.\n *\n * If a user restarts the stack with a different `LOCAL_BACKEND_API_KEY`,\n * the baked-in key changes but the old value may still be persisted in\n * localStorage (written by the onboarding form, the Settings page, or a\n * previous key injection). Without this sync the stale stored key would\n * shadow the new baked key everywhere (`getConfiguredSessionApiKey()`\n * reads localStorage first), causing 401s.\n *\n * Must run **before** any call to `getConfiguredSessionApiKey()` or\n * `makeDefaultLocalBackend()` — called from `readStoredBackends()` in\n * `storage.ts` which is evaluated at module init time.\n */\nexport function syncBakedSessionApiKey(): void {\n const bakedKey = getBakedSessionApiKey();\n if (!bakedKey) return; // public mode or no key baked in\n\n const storedConfig = readStoredConfig();\n const storedKey = trimToNull(storedConfig.sessionApiKey);\n if (storedKey && storedKey !== bakedKey) {\n writeStoredConfig({ ...storedConfig, sessionApiKey: bakedKey });\n }\n}\n\nfunction shouldUseProxyOrigin(baseUrl: string): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n try {\n const configuredUrl = new URL(baseUrl);\n const localHosts = new Set([\"127.0.0.1\", \"localhost\", \"0.0.0.0\"]);\n const browserHostname = window.location.hostname;\n\n return (\n localHosts.has(configuredUrl.hostname) &&\n (!localHosts.has(browserHostname) ||\n configuredUrl.hostname !== browserHostname)\n );\n } catch {\n return false;\n }\n}\n\nfunction resolveAgentServerBaseUrl(baseUrl: string | null): string | null {\n if (!baseUrl) {\n return null;\n }\n\n if (shouldUseProxyOrigin(baseUrl)) {\n return window.location.origin;\n }\n\n return baseUrl;\n}\n\nexport function getAgentServerFormDefaults(): AgentServerFormDefaults {\n return {\n baseUrl: getConfiguredBaseUrl() ?? \"\",\n sessionApiKey: getConfiguredSessionApiKey() ?? \"\",\n };\n}\n\nexport function saveAgentServerConfig(config: AgentServerFormDefaults): void {\n const currentConfig = readStoredConfig();\n\n writeStoredConfig({\n ...currentConfig,\n baseUrl: normalizeBaseUrl(config.baseUrl),\n sessionApiKey: trimToNull(config.sessionApiKey),\n });\n}\n\nexport function getAgentServerBaseUrl(): string {\n const configuredUrl = resolveAgentServerBaseUrl(getConfiguredBaseUrl());\n if (configuredUrl) return configuredUrl;\n\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n\n return \"http://127.0.0.1:8000\";\n}\n\nexport function getAgentServerSessionApiKey(): string | null {\n return getConfiguredSessionApiKey();\n}\n\nexport function getAgentServerWorkingDir(): string {\n const envDir = import.meta.env.VITE_WORKING_DIR?.trim();\n if (envDir) return envDir;\n\n const storedDir = readStoredConfig().workingDir?.trim();\n if (storedDir) return storedDir;\n\n return DEFAULT_WORKING_DIR;\n}\n\nexport function buildConversationWorkingDir(conversationId: string): string {\n const base = getAgentServerWorkingDir().replace(/\\/+$/, \"\");\n const hex = conversationId.replace(/-/g, \"\");\n return `${base}/${hex}`;\n}\n\nexport function getConfiguredWorkerUrls(): string[] {\n const raw = import.meta.env.VITE_WORKER_URLS?.trim();\n if (!raw) return [];\n\n return raw\n .split(\",\")\n .map((url: string) => normalizeBaseUrl(url))\n .filter((url: string | null): url is string => Boolean(url));\n}\n\nexport function getAgentServerHeaders(): Record<string, string> {\n const sessionApiKey = getAgentServerSessionApiKey();\n return sessionApiKey ? { \"X-Session-API-Key\": sessionApiKey } : {};\n}\n\n/**\n * Returns whether public skills from the OpenHands extensions marketplace\n * (https://github.com/OpenHands/extensions) should be loaded.\n *\n * Defaults to true. Set VITE_LOAD_PUBLIC_SKILLS=false to disable.\n */\nexport function shouldLoadPublicSkills(): boolean {\n return import.meta.env.VITE_LOAD_PUBLIC_SKILLS !== \"false\";\n}\n\n/**\n * Whether the deployment requires an API key from the user (public mode).\n *\n * Checks both the Vite build-time env var (`VITE_AUTH_REQUIRED`) and the\n * runtime flag injected by static-server.mjs (`window.__AGENT_CANVAS_AUTH_REQUIRED__`).\n * The runtime flag is needed for pre-built static binaries where\n * `VITE_AUTH_REQUIRED` was not set at build time.\n */\nexport function isAuthRequired(): boolean {\n return (\n import.meta.env.VITE_AUTH_REQUIRED === \"true\" ||\n (typeof window !== \"undefined\" &&\n (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_AUTH_REQUIRED__ === true)\n );\n}\n\n/**\n * Returns true when the server was started in public mode and the user\n * has not yet pasted an API key (nothing in localStorage, nothing baked\n * in via `VITE_SESSION_API_KEY`).\n *\n * Used by `root.tsx` to gate the app behind {@link ApiKeyEntryScreen}\n * before any network request is attempted.\n */\nexport function isAuthRequiredAndMissing(): boolean {\n if (!isAuthRequired()) return false;\n return !getConfiguredSessionApiKey();\n}\n"],"mappings":"6CAAA,IAAa,EAAkC,gCAClC,EAAsB,oBAanC,SAAS,GAA4C,CACnD,GAAI,OAAO,OAAW,IAAa,MAAO,EAAE,CAE5C,GAAI,CACF,IAAM,EAAM,OAAO,aAAa,QAAQ,EAAgC,CAGxE,OAFK,EACU,KAAK,MAAM,EACnB,EAAU,EAAE,CAFF,EAAE,MAGb,CACN,MAAO,EAAE,EAIb,SAAS,EAAkB,EAAuC,CAChE,GAAI,OAAO,OAAW,IAAa,OAEnC,IAAM,EAAa,OAAO,YACxB,OAAO,QAAQ,EAAO,CAAC,SAAS,CAAC,EAAK,KAAW,CAC/C,GAAI,OAAO,GAAU,SAAU,MAAO,EAAE,CAExC,IAAM,EAAU,EAAM,MAAM,CAG5B,OAFK,EAEE,CAAC,CAAC,EAAK,EAAQ,CAAC,CAFF,EAAE,EAGvB,CACH,CAED,GAAI,OAAO,KAAK,EAAW,CAAC,SAAW,EAAG,CACxC,OAAO,aAAa,WAAW,EAAgC,CAC/D,OAGF,OAAO,aAAa,QAClB,EACA,KAAK,UAAU,EAAW,CAC3B,CAGH,SAAS,EAAW,EAAsC,CACxD,OAAO,GAAO,MAAM,EAAI,KAG1B,SAAS,EAAiB,EAAsC,CAC9D,GAAI,CAAC,EAAO,OAAO,KAEnB,IAAM,EAAU,EAAM,MAAM,CAAC,QAAQ,MAAO,GAAG,CAW/C,OAVK,EAED,gBAAgB,KAAK,EAAQ,CACxB,EAGL,OAAO,OAAW,IACb,GAAG,OAAO,SAAS,SAAS,IAAI,IAGlC,UAAU,IAVI,KAavB,SAAS,GAAsC,CAI7C,OAHkB,EAAiB,GAAkB,CAAC,QAClD,EAEG,EAAA,IAAA,GAAuD,CAQhE,SAAgB,GAAuC,CACrD,OAAO,EAAA,IAAA,GAAgD,CAGzD,SAAS,GAA4C,CAInD,OAHkB,EAAW,GAAkB,CAAC,cAC5C,EAEG,GAAuB,CAuBhC,SAAgB,GAA+B,CAC7C,IAAM,EAAW,GAAuB,CACxC,GAAI,CAAC,EAAU,OAEf,IAAM,EAAe,GAAkB,CACjC,EAAY,EAAW,EAAa,cAAc,CACpD,GAAa,IAAc,GAC7B,EAAkB,CAAE,GAAG,EAAc,cAAe,EAAU,CAAC,CAInE,SAAS,EAAqB,EAA0B,CACtD,GAAI,OAAO,OAAW,IACpB,MAAO,GAGT,GAAI,CACF,IAAM,EAAgB,IAAI,IAAI,EAAQ,CAChC,EAAa,IAAI,IAAI,CAAC,YAAa,YAAa,UAAU,CAAC,CAC3D,EAAkB,OAAO,SAAS,SAExC,OACE,EAAW,IAAI,EAAc,SAAS,GACrC,CAAC,EAAW,IAAI,EAAgB,EAC/B,EAAc,WAAa,QAEzB,CACN,MAAO,IAIX,SAAS,EAA0B,EAAuC,CASxE,OARK,EAID,EAAqB,EAAQ,CACxB,OAAO,SAAS,OAGlB,EAPE,KA2BX,SAAgB,GAAgC,CAQ9C,OAPsB,EAA0B,GAAsB,CAClE,GAEA,OAAO,OAAW,IACb,OAAO,SAAS,OAGlB,yBAGT,SAAgB,GAA6C,CAC3D,OAAO,GAA4B,CAGrC,SAAgB,GAAmC,CAOjD,OANM,IAAA,KAA2C,MAAM,EAGrC,GAAkB,CAAC,YAAY,MAAM,EAGhD,EAGT,SAAgB,EAA4B,EAAgC,CAG1E,MAAO,GAFM,GAA0B,CAAC,QAAQ,OAAQ,GAE9C,CAAK,GADH,EAAe,QAAQ,KAAM,GACvB,GAapB,SAAgB,GAAgD,CAC9D,IAAM,EAAgB,GAA6B,CACnD,OAAO,EAAgB,CAAE,oBAAqB,EAAe,CAAG,EAAE,CASpE,SAAgB,GAAkC,CAChD,MAAO,GAWT,SAAgB,GAA0B,CACxC,OAEG,OAAO,OAAW,KAChB,OACE,iCAAmC"}
1
+ {"version":3,"file":"agent-server-config.cjs","names":[],"sources":["../../src/api/agent-server-config.ts"],"sourcesContent":["export const DEFAULT_WORKING_DIR = \"workspace/project\";\n\nexport interface AgentServerFormDefaults {\n baseUrl: string;\n sessionApiKey: string;\n}\n\nfunction trimToNull(value?: string | null): string | null {\n return value?.trim() || null;\n}\n\nfunction normalizeBaseUrl(value?: string | null): string | null {\n if (!value) return null;\n\n const trimmed = value.trim().replace(/\\/$/, \"\");\n if (!trimmed) return null;\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n if (typeof window !== \"undefined\") {\n return `${window.location.protocol}//${trimmed}`;\n }\n\n return `http://${trimmed}`;\n}\n\nfunction getConfiguredBaseUrl(): string | null {\n return normalizeBaseUrl(import.meta.env.VITE_BACKEND_BASE_URL);\n}\n\n/**\n * Return the session API key supplied by the deployment host.\n *\n * Two sources are consulted, in order:\n * 1. `VITE_SESSION_API_KEY` — baked into the bundle at build time (used by\n * `npm run dev` so the dev server has the key without a round-trip).\n * 2. `window.__AGENT_CANVAS_SESSION_API_KEY__` — injected into `index.html`\n * at serve time by `scripts/static-server.mjs --session-api-key <key>`.\n * This is the path used by the published `agent-canvas` binary, where\n * `VITE_SESSION_API_KEY` is empty in the prebuilt bundle and the\n * runtime key is generated when the user launches the CLI.\n *\n * Without the window-global fallback, the published binary cannot construct a\n * default local backend (`makeDefaultLocalBackend()` returns null), the\n * registry is left empty, and the user sees the Manage Backends modal\n * instead of the onboarding flow.\n */\nexport function getBakedSessionApiKey(): string | null {\n const envKey = trimToNull(import.meta.env.VITE_SESSION_API_KEY);\n if (envKey) return envKey;\n\n if (typeof window !== \"undefined\") {\n const injected = (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_SESSION_API_KEY__;\n if (typeof injected === \"string\") {\n return trimToNull(injected);\n }\n }\n\n return null;\n}\n\nexport function getAgentServerFormDefaults(): AgentServerFormDefaults {\n return {\n baseUrl: getAgentServerBaseUrl() ?? \"\",\n sessionApiKey: getAgentServerSessionApiKey() ?? \"\",\n };\n}\n\nexport function getAgentServerBaseUrl(): string | null {\n const configuredUrl = getConfiguredBaseUrl();\n if (configuredUrl) return configuredUrl;\n\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n\n return null;\n}\n\nexport function getAgentServerSessionApiKey(): string | null {\n return getBakedSessionApiKey();\n}\n\nexport function getAgentServerWorkingDir(): string {\n const envDir = import.meta.env.VITE_WORKING_DIR?.trim();\n if (envDir) return envDir;\n\n return DEFAULT_WORKING_DIR;\n}\n\nexport function buildConversationWorkingDir(conversationId: string): string {\n const base = getAgentServerWorkingDir().replace(/\\/+$/, \"\");\n const hex = conversationId.replace(/-/g, \"\");\n return `${base}/${hex}`;\n}\n\nexport function getConfiguredWorkerUrls(): string[] {\n const raw = import.meta.env.VITE_WORKER_URLS?.trim();\n if (!raw) return [];\n\n return raw\n .split(\",\")\n .map((url: string) => normalizeBaseUrl(url))\n .filter((url: string | null): url is string => Boolean(url));\n}\n\nexport function getAgentServerHeaders(): Record<string, string> {\n const sessionApiKey = getAgentServerSessionApiKey();\n return sessionApiKey ? { \"X-Session-API-Key\": sessionApiKey } : {};\n}\n\nexport function shouldLoadPublicSkills(): boolean {\n return import.meta.env.VITE_LOAD_PUBLIC_SKILLS !== \"false\";\n}\n\nexport function isAuthRequired(): boolean {\n return (\n import.meta.env.VITE_AUTH_REQUIRED === \"true\" ||\n (typeof window !== \"undefined\" &&\n (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_AUTH_REQUIRED__ === true)\n );\n}\n\nexport function isAuthRequiredAndMissing(): boolean {\n if (!isAuthRequired()) return false;\n return !getAgentServerSessionApiKey();\n}\n"],"mappings":"6CAAA,IAAa,EAAsB,oBAOnC,SAAS,EAAW,EAAsC,CACxD,OAAO,GAAO,MAAM,EAAI,KAG1B,SAAS,EAAiB,EAAsC,CAC9D,GAAI,CAAC,EAAO,OAAO,KAEnB,IAAM,EAAU,EAAM,MAAM,CAAC,QAAQ,MAAO,GAAG,CAW/C,OAVK,EAED,gBAAgB,KAAK,EAAQ,CACxB,EAGL,OAAO,OAAW,IACb,GAAG,OAAO,SAAS,SAAS,IAAI,IAGlC,UAAU,IAVI,KAavB,SAAS,GAAsC,CAC7C,OAAO,EAAA,IAAA,GAAuD,CAoBhE,SAAgB,GAAuC,CACrD,IAAM,EAAS,EAAA,IAAA,GAAgD,CAC/D,GAAI,EAAQ,OAAO,EAEnB,GAAI,OAAO,OAAW,IAAa,CACjC,IAAM,EAAY,OACf,iCACH,GAAI,OAAO,GAAa,SACtB,OAAO,EAAW,EAAS,CAI/B,OAAO,KAUT,SAAgB,GAAuC,CAQrD,OAPsB,GAClB,GAEA,OAAO,OAAW,IACb,OAAO,SAAS,OAGlB,MAGT,SAAgB,GAA6C,CAC3D,OAAO,GAAuB,CAGhC,SAAgB,GAAmC,CAIjD,OAHM,IAAA,KAA2C,MAAM,EAGhD,EAGT,SAAgB,EAA4B,EAAgC,CAG1E,MAAO,GAFM,GAA0B,CAAC,QAAQ,OAAQ,GAE9C,CAAK,GADH,EAAe,QAAQ,KAAM,GACvB,GAapB,SAAgB,GAAgD,CAC9D,IAAM,EAAgB,GAA6B,CACnD,OAAO,EAAgB,CAAE,oBAAqB,EAAe,CAAG,EAAE,CAGpE,SAAgB,GAAkC,CAChD,MAAO,GAGT,SAAgB,GAA0B,CACxC,OAEG,OAAO,OAAW,KAChB,OACE,iCAAmC"}
@@ -1,66 +1,33 @@
1
- export declare const AGENT_SERVER_CONFIG_STORAGE_KEY = "openhands-agent-server-config";
2
1
  export declare const DEFAULT_WORKING_DIR = "workspace/project";
3
2
  export interface AgentServerFormDefaults {
4
3
  baseUrl: string;
5
4
  sessionApiKey: string;
6
5
  }
7
6
  /**
8
- * Return the baked-in session API key from the Vite env or the runtime
9
- * injection by static-server.mjs. This represents the *server's* truth
10
- * and is only set in non-public (local) mode.
11
- */
12
- export declare function getBakedSessionApiKey(): string | null;
13
- /**
14
- * Sync the baked-in session API key into `openhands-agent-server-config`
15
- * localStorage when the stored value has drifted.
16
- *
17
- * In non-public (local) mode the dev scripts bake the session key into
18
- * `VITE_SESSION_API_KEY` (Vite dev) or inject it via `static-server.mjs`
19
- * (`--session-api-key`). That key represents the *server's* truth — the
20
- * agent-server was started with the same value as `OH_SESSION_API_KEYS_0`.
7
+ * Return the session API key supplied by the deployment host.
21
8
  *
22
- * If a user restarts the stack with a different `LOCAL_BACKEND_API_KEY`,
23
- * the baked-in key changes but the old value may still be persisted in
24
- * localStorage (written by the onboarding form, the Settings page, or a
25
- * previous key injection). Without this sync the stale stored key would
26
- * shadow the new baked key everywhere (`getConfiguredSessionApiKey()`
27
- * reads localStorage first), causing 401s.
9
+ * Two sources are consulted, in order:
10
+ * 1. `VITE_SESSION_API_KEY` baked into the bundle at build time (used by
11
+ * `npm run dev` so the dev server has the key without a round-trip).
12
+ * 2. `window.__AGENT_CANVAS_SESSION_API_KEY__` injected into `index.html`
13
+ * at serve time by `scripts/static-server.mjs --session-api-key <key>`.
14
+ * This is the path used by the published `agent-canvas` binary, where
15
+ * `VITE_SESSION_API_KEY` is empty in the prebuilt bundle and the
16
+ * runtime key is generated when the user launches the CLI.
28
17
  *
29
- * Must run **before** any call to `getConfiguredSessionApiKey()` or
30
- * `makeDefaultLocalBackend()` called from `readStoredBackends()` in
31
- * `storage.ts` which is evaluated at module init time.
18
+ * Without the window-global fallback, the published binary cannot construct a
19
+ * default local backend (`makeDefaultLocalBackend()` returns null), the
20
+ * registry is left empty, and the user sees the Manage Backends modal
21
+ * instead of the onboarding flow.
32
22
  */
33
- export declare function syncBakedSessionApiKey(): void;
23
+ export declare function getBakedSessionApiKey(): string | null;
34
24
  export declare function getAgentServerFormDefaults(): AgentServerFormDefaults;
35
- export declare function saveAgentServerConfig(config: AgentServerFormDefaults): void;
36
- export declare function getAgentServerBaseUrl(): string;
25
+ export declare function getAgentServerBaseUrl(): string | null;
37
26
  export declare function getAgentServerSessionApiKey(): string | null;
38
27
  export declare function getAgentServerWorkingDir(): string;
39
28
  export declare function buildConversationWorkingDir(conversationId: string): string;
40
29
  export declare function getConfiguredWorkerUrls(): string[];
41
30
  export declare function getAgentServerHeaders(): Record<string, string>;
42
- /**
43
- * Returns whether public skills from the OpenHands extensions marketplace
44
- * (https://github.com/OpenHands/extensions) should be loaded.
45
- *
46
- * Defaults to true. Set VITE_LOAD_PUBLIC_SKILLS=false to disable.
47
- */
48
31
  export declare function shouldLoadPublicSkills(): boolean;
49
- /**
50
- * Whether the deployment requires an API key from the user (public mode).
51
- *
52
- * Checks both the Vite build-time env var (`VITE_AUTH_REQUIRED`) and the
53
- * runtime flag injected by static-server.mjs (`window.__AGENT_CANVAS_AUTH_REQUIRED__`).
54
- * The runtime flag is needed for pre-built static binaries where
55
- * `VITE_AUTH_REQUIRED` was not set at build time.
56
- */
57
32
  export declare function isAuthRequired(): boolean;
58
- /**
59
- * Returns true when the server was started in public mode and the user
60
- * has not yet pasted an API key (nothing in localStorage, nothing baked
61
- * in via `VITE_SESSION_API_KEY`).
62
- *
63
- * Used by `root.tsx` to gate the app behind {@link ApiKeyEntryScreen}
64
- * before any network request is attempted.
65
- */
66
33
  export declare function isAuthRequiredAndMissing(): boolean;
@@ -1,92 +1,48 @@
1
1
  //#region src/api/agent-server-config.ts
2
- var e = "openhands-agent-server-config", t = "workspace/project";
3
- function n() {
4
- if (typeof window > "u") return {};
5
- try {
6
- let t = window.localStorage.getItem(e);
7
- return t ? JSON.parse(t) ?? {} : {};
8
- } catch {
9
- return {};
10
- }
11
- }
12
- function r(t) {
13
- if (typeof window > "u") return;
14
- let n = Object.fromEntries(Object.entries(t).flatMap(([e, t]) => {
15
- if (typeof t != "string") return [];
16
- let n = t.trim();
17
- return n ? [[e, n]] : [];
18
- }));
19
- if (Object.keys(n).length === 0) {
20
- window.localStorage.removeItem(e);
21
- return;
22
- }
23
- window.localStorage.setItem(e, JSON.stringify(n));
24
- }
25
- function i(e) {
2
+ var e = "workspace/project";
3
+ function t(e) {
26
4
  return e?.trim() || null;
27
5
  }
28
- function a(e) {
6
+ function n(e) {
29
7
  if (!e) return null;
30
8
  let t = e.trim().replace(/\/$/, "");
31
9
  return t ? /^https?:\/\//i.test(t) ? t : typeof window < "u" ? `${window.location.protocol}//${t}` : `http://${t}` : null;
32
10
  }
33
- function o() {
34
- return a(n().baseUrl) || a(void 0);
35
- }
36
- function s() {
37
- return i(void 0);
38
- }
39
- function c() {
40
- return i(n().sessionApiKey) || s();
41
- }
42
- function l() {
43
- let e = s();
44
- if (!e) return;
45
- let t = n(), a = i(t.sessionApiKey);
46
- a && a !== e && r({
47
- ...t,
48
- sessionApiKey: e
49
- });
11
+ function r() {
12
+ return n(void 0);
50
13
  }
51
- function u(e) {
52
- if (typeof window > "u") return !1;
53
- try {
54
- let t = new URL(e), n = new Set([
55
- "127.0.0.1",
56
- "localhost",
57
- "0.0.0.0"
58
- ]), r = window.location.hostname;
59
- return n.has(t.hostname) && (!n.has(r) || t.hostname !== r);
60
- } catch {
61
- return !1;
14
+ function i() {
15
+ let e = t(void 0);
16
+ if (e) return e;
17
+ if (typeof window < "u") {
18
+ let e = window.__AGENT_CANVAS_SESSION_API_KEY__;
19
+ if (typeof e == "string") return t(e);
62
20
  }
21
+ return null;
63
22
  }
64
- function d(e) {
65
- return e ? u(e) ? window.location.origin : e : null;
66
- }
67
- function f() {
68
- return d(o()) || (typeof window < "u" ? window.location.origin : "http://127.0.0.1:8000");
23
+ function a() {
24
+ return r() || (typeof window < "u" ? window.location.origin : null);
69
25
  }
70
- function p() {
71
- return c();
26
+ function o() {
27
+ return i();
72
28
  }
73
- function m() {
74
- return (void 0)?.trim() || n().workingDir?.trim() || t;
29
+ function s() {
30
+ return (void 0)?.trim() || e;
75
31
  }
76
- function h(e) {
77
- return `${m().replace(/\/+$/, "")}/${e.replace(/-/g, "")}`;
32
+ function c(e) {
33
+ return `${s().replace(/\/+$/, "")}/${e.replace(/-/g, "")}`;
78
34
  }
79
- function g() {
80
- let e = p();
35
+ function l() {
36
+ let e = o();
81
37
  return e ? { "X-Session-API-Key": e } : {};
82
38
  }
83
- function _() {
39
+ function u() {
84
40
  return !0;
85
41
  }
86
- function v() {
42
+ function d() {
87
43
  return typeof window < "u" && window.__AGENT_CANVAS_AUTH_REQUIRED__ === !0;
88
44
  }
89
45
  //#endregion
90
- export { t as DEFAULT_WORKING_DIR, h as buildConversationWorkingDir, f as getAgentServerBaseUrl, g as getAgentServerHeaders, p as getAgentServerSessionApiKey, m as getAgentServerWorkingDir, v as isAuthRequired, _ as shouldLoadPublicSkills, l as syncBakedSessionApiKey };
46
+ export { e as DEFAULT_WORKING_DIR, c as buildConversationWorkingDir, a as getAgentServerBaseUrl, l as getAgentServerHeaders, o as getAgentServerSessionApiKey, s as getAgentServerWorkingDir, d as isAuthRequired, u as shouldLoadPublicSkills };
91
47
 
92
48
  //# sourceMappingURL=agent-server-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server-config.js","names":[],"sources":["../../src/api/agent-server-config.ts"],"sourcesContent":["export const AGENT_SERVER_CONFIG_STORAGE_KEY = \"openhands-agent-server-config\";\nexport const DEFAULT_WORKING_DIR = \"workspace/project\";\n\ninterface StoredAgentServerConfig {\n baseUrl?: string | null;\n sessionApiKey?: string | null;\n workingDir?: string | null;\n}\n\nexport interface AgentServerFormDefaults {\n baseUrl: string;\n sessionApiKey: string;\n}\n\nfunction readStoredConfig(): StoredAgentServerConfig {\n if (typeof window === \"undefined\") return {};\n\n try {\n const raw = window.localStorage.getItem(AGENT_SERVER_CONFIG_STORAGE_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as StoredAgentServerConfig;\n return parsed ?? {};\n } catch {\n return {};\n }\n}\n\nfunction writeStoredConfig(config: StoredAgentServerConfig): void {\n if (typeof window === \"undefined\") return;\n\n const nextConfig = Object.fromEntries(\n Object.entries(config).flatMap(([key, value]) => {\n if (typeof value !== \"string\") return [];\n\n const trimmed = value.trim();\n if (!trimmed) return [];\n\n return [[key, trimmed]];\n }),\n ) as StoredAgentServerConfig;\n\n if (Object.keys(nextConfig).length === 0) {\n window.localStorage.removeItem(AGENT_SERVER_CONFIG_STORAGE_KEY);\n return;\n }\n\n window.localStorage.setItem(\n AGENT_SERVER_CONFIG_STORAGE_KEY,\n JSON.stringify(nextConfig),\n );\n}\n\nfunction trimToNull(value?: string | null): string | null {\n return value?.trim() || null;\n}\n\nfunction normalizeBaseUrl(value?: string | null): string | null {\n if (!value) return null;\n\n const trimmed = value.trim().replace(/\\/$/, \"\");\n if (!trimmed) return null;\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n if (typeof window !== \"undefined\") {\n return `${window.location.protocol}//${trimmed}`;\n }\n\n return `http://${trimmed}`;\n}\n\nfunction getConfiguredBaseUrl(): string | null {\n const storedUrl = normalizeBaseUrl(readStoredConfig().baseUrl);\n if (storedUrl) return storedUrl;\n\n return normalizeBaseUrl(import.meta.env.VITE_BACKEND_BASE_URL);\n}\n\n/**\n * Return the baked-in session API key from the Vite env or the runtime\n * injection by static-server.mjs. This represents the *server's* truth\n * and is only set in non-public (local) mode.\n */\nexport function getBakedSessionApiKey(): string | null {\n return trimToNull(import.meta.env.VITE_SESSION_API_KEY);\n}\n\nfunction getConfiguredSessionApiKey(): string | null {\n const storedKey = trimToNull(readStoredConfig().sessionApiKey);\n if (storedKey) return storedKey;\n\n return getBakedSessionApiKey();\n}\n\n/**\n * Sync the baked-in session API key into `openhands-agent-server-config`\n * localStorage when the stored value has drifted.\n *\n * In non-public (local) mode the dev scripts bake the session key into\n * `VITE_SESSION_API_KEY` (Vite dev) or inject it via `static-server.mjs`\n * (`--session-api-key`). That key represents the *server's* truth — the\n * agent-server was started with the same value as `OH_SESSION_API_KEYS_0`.\n *\n * If a user restarts the stack with a different `LOCAL_BACKEND_API_KEY`,\n * the baked-in key changes but the old value may still be persisted in\n * localStorage (written by the onboarding form, the Settings page, or a\n * previous key injection). Without this sync the stale stored key would\n * shadow the new baked key everywhere (`getConfiguredSessionApiKey()`\n * reads localStorage first), causing 401s.\n *\n * Must run **before** any call to `getConfiguredSessionApiKey()` or\n * `makeDefaultLocalBackend()` — called from `readStoredBackends()` in\n * `storage.ts` which is evaluated at module init time.\n */\nexport function syncBakedSessionApiKey(): void {\n const bakedKey = getBakedSessionApiKey();\n if (!bakedKey) return; // public mode or no key baked in\n\n const storedConfig = readStoredConfig();\n const storedKey = trimToNull(storedConfig.sessionApiKey);\n if (storedKey && storedKey !== bakedKey) {\n writeStoredConfig({ ...storedConfig, sessionApiKey: bakedKey });\n }\n}\n\nfunction shouldUseProxyOrigin(baseUrl: string): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n try {\n const configuredUrl = new URL(baseUrl);\n const localHosts = new Set([\"127.0.0.1\", \"localhost\", \"0.0.0.0\"]);\n const browserHostname = window.location.hostname;\n\n return (\n localHosts.has(configuredUrl.hostname) &&\n (!localHosts.has(browserHostname) ||\n configuredUrl.hostname !== browserHostname)\n );\n } catch {\n return false;\n }\n}\n\nfunction resolveAgentServerBaseUrl(baseUrl: string | null): string | null {\n if (!baseUrl) {\n return null;\n }\n\n if (shouldUseProxyOrigin(baseUrl)) {\n return window.location.origin;\n }\n\n return baseUrl;\n}\n\nexport function getAgentServerFormDefaults(): AgentServerFormDefaults {\n return {\n baseUrl: getConfiguredBaseUrl() ?? \"\",\n sessionApiKey: getConfiguredSessionApiKey() ?? \"\",\n };\n}\n\nexport function saveAgentServerConfig(config: AgentServerFormDefaults): void {\n const currentConfig = readStoredConfig();\n\n writeStoredConfig({\n ...currentConfig,\n baseUrl: normalizeBaseUrl(config.baseUrl),\n sessionApiKey: trimToNull(config.sessionApiKey),\n });\n}\n\nexport function getAgentServerBaseUrl(): string {\n const configuredUrl = resolveAgentServerBaseUrl(getConfiguredBaseUrl());\n if (configuredUrl) return configuredUrl;\n\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n\n return \"http://127.0.0.1:8000\";\n}\n\nexport function getAgentServerSessionApiKey(): string | null {\n return getConfiguredSessionApiKey();\n}\n\nexport function getAgentServerWorkingDir(): string {\n const envDir = import.meta.env.VITE_WORKING_DIR?.trim();\n if (envDir) return envDir;\n\n const storedDir = readStoredConfig().workingDir?.trim();\n if (storedDir) return storedDir;\n\n return DEFAULT_WORKING_DIR;\n}\n\nexport function buildConversationWorkingDir(conversationId: string): string {\n const base = getAgentServerWorkingDir().replace(/\\/+$/, \"\");\n const hex = conversationId.replace(/-/g, \"\");\n return `${base}/${hex}`;\n}\n\nexport function getConfiguredWorkerUrls(): string[] {\n const raw = import.meta.env.VITE_WORKER_URLS?.trim();\n if (!raw) return [];\n\n return raw\n .split(\",\")\n .map((url: string) => normalizeBaseUrl(url))\n .filter((url: string | null): url is string => Boolean(url));\n}\n\nexport function getAgentServerHeaders(): Record<string, string> {\n const sessionApiKey = getAgentServerSessionApiKey();\n return sessionApiKey ? { \"X-Session-API-Key\": sessionApiKey } : {};\n}\n\n/**\n * Returns whether public skills from the OpenHands extensions marketplace\n * (https://github.com/OpenHands/extensions) should be loaded.\n *\n * Defaults to true. Set VITE_LOAD_PUBLIC_SKILLS=false to disable.\n */\nexport function shouldLoadPublicSkills(): boolean {\n return import.meta.env.VITE_LOAD_PUBLIC_SKILLS !== \"false\";\n}\n\n/**\n * Whether the deployment requires an API key from the user (public mode).\n *\n * Checks both the Vite build-time env var (`VITE_AUTH_REQUIRED`) and the\n * runtime flag injected by static-server.mjs (`window.__AGENT_CANVAS_AUTH_REQUIRED__`).\n * The runtime flag is needed for pre-built static binaries where\n * `VITE_AUTH_REQUIRED` was not set at build time.\n */\nexport function isAuthRequired(): boolean {\n return (\n import.meta.env.VITE_AUTH_REQUIRED === \"true\" ||\n (typeof window !== \"undefined\" &&\n (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_AUTH_REQUIRED__ === true)\n );\n}\n\n/**\n * Returns true when the server was started in public mode and the user\n * has not yet pasted an API key (nothing in localStorage, nothing baked\n * in via `VITE_SESSION_API_KEY`).\n *\n * Used by `root.tsx` to gate the app behind {@link ApiKeyEntryScreen}\n * before any network request is attempted.\n */\nexport function isAuthRequiredAndMissing(): boolean {\n if (!isAuthRequired()) return false;\n return !getConfiguredSessionApiKey();\n}\n"],"mappings":";AAAA,IAAa,IAAkC,iCAClC,IAAsB;AAanC,SAAS,IAA4C;AACnD,KAAI,OAAO,SAAW,IAAa,QAAO,EAAE;AAE5C,KAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,EAAgC;AAGxE,SAFK,IACU,KAAK,MAAM,EACnB,IAAU,EAAE,GAFF,EAAE;SAGb;AACN,SAAO,EAAE;;;AAIb,SAAS,EAAkB,GAAuC;AAChE,KAAI,OAAO,SAAW,IAAa;CAEnC,IAAM,IAAa,OAAO,YACxB,OAAO,QAAQ,EAAO,CAAC,SAAS,CAAC,GAAK,OAAW;AAC/C,MAAI,OAAO,KAAU,SAAU,QAAO,EAAE;EAExC,IAAM,IAAU,EAAM,MAAM;AAG5B,SAFK,IAEE,CAAC,CAAC,GAAK,EAAQ,CAAC,GAFF,EAAE;GAGvB,CACH;AAED,KAAI,OAAO,KAAK,EAAW,CAAC,WAAW,GAAG;AACxC,SAAO,aAAa,WAAW,EAAgC;AAC/D;;AAGF,QAAO,aAAa,QAClB,GACA,KAAK,UAAU,EAAW,CAC3B;;AAGH,SAAS,EAAW,GAAsC;AACxD,QAAO,GAAO,MAAM,IAAI;;AAG1B,SAAS,EAAiB,GAAsC;AAC9D,KAAI,CAAC,EAAO,QAAO;CAEnB,IAAM,IAAU,EAAM,MAAM,CAAC,QAAQ,OAAO,GAAG;AAW/C,QAVK,IAED,gBAAgB,KAAK,EAAQ,GACxB,IAGL,OAAO,SAAW,MACb,GAAG,OAAO,SAAS,SAAS,IAAI,MAGlC,UAAU,MAVI;;AAavB,SAAS,IAAsC;AAI7C,QAHkB,EAAiB,GAAkB,CAAC,QAClD,IAEG,EAAA,KAAA,EAAuD;;AAQhE,SAAgB,IAAuC;AACrD,QAAO,EAAA,KAAA,EAAgD;;AAGzD,SAAS,IAA4C;AAInD,QAHkB,EAAW,GAAkB,CAAC,cAC5C,IAEG,GAAuB;;AAuBhC,SAAgB,IAA+B;CAC7C,IAAM,IAAW,GAAuB;AACxC,KAAI,CAAC,EAAU;CAEf,IAAM,IAAe,GAAkB,EACjC,IAAY,EAAW,EAAa,cAAc;AACxD,CAAI,KAAa,MAAc,KAC7B,EAAkB;EAAE,GAAG;EAAc,eAAe;EAAU,CAAC;;AAInE,SAAS,EAAqB,GAA0B;AACtD,KAAI,OAAO,SAAW,IACpB,QAAO;AAGT,KAAI;EACF,IAAM,IAAgB,IAAI,IAAI,EAAQ,EAChC,IAAa,IAAI,IAAI;GAAC;GAAa;GAAa;GAAU,CAAC,EAC3D,IAAkB,OAAO,SAAS;AAExC,SACE,EAAW,IAAI,EAAc,SAAS,KACrC,CAAC,EAAW,IAAI,EAAgB,IAC/B,EAAc,aAAa;SAEzB;AACN,SAAO;;;AAIX,SAAS,EAA0B,GAAuC;AASxE,QARK,IAID,EAAqB,EAAQ,GACxB,OAAO,SAAS,SAGlB,IAPE;;AA2BX,SAAgB,IAAgC;AAQ9C,QAPsB,EAA0B,GAAsB,CAClE,KAEA,OAAO,SAAW,MACb,OAAO,SAAS,SAGlB;;AAGT,SAAgB,IAA6C;AAC3D,QAAO,GAA4B;;AAGrC,SAAgB,IAAmC;AAOjD,SANM,KAAA,IAA2C,MAAM,IAGrC,GAAkB,CAAC,YAAY,MAAM,IAGhD;;AAGT,SAAgB,EAA4B,GAAgC;AAG1E,QAAO,GAFM,GAA0B,CAAC,QAAQ,QAAQ,GAE9C,CAAK,GADH,EAAe,QAAQ,MAAM,GACvB;;AAapB,SAAgB,IAAgD;CAC9D,IAAM,IAAgB,GAA6B;AACnD,QAAO,IAAgB,EAAE,qBAAqB,GAAe,GAAG,EAAE;;AASpE,SAAgB,IAAkC;AAChD,QAAO;;AAWT,SAAgB,IAA0B;AACxC,QAEG,OAAO,SAAW,OAChB,OACE,mCAAmC"}
1
+ {"version":3,"file":"agent-server-config.js","names":[],"sources":["../../src/api/agent-server-config.ts"],"sourcesContent":["export const DEFAULT_WORKING_DIR = \"workspace/project\";\n\nexport interface AgentServerFormDefaults {\n baseUrl: string;\n sessionApiKey: string;\n}\n\nfunction trimToNull(value?: string | null): string | null {\n return value?.trim() || null;\n}\n\nfunction normalizeBaseUrl(value?: string | null): string | null {\n if (!value) return null;\n\n const trimmed = value.trim().replace(/\\/$/, \"\");\n if (!trimmed) return null;\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n if (typeof window !== \"undefined\") {\n return `${window.location.protocol}//${trimmed}`;\n }\n\n return `http://${trimmed}`;\n}\n\nfunction getConfiguredBaseUrl(): string | null {\n return normalizeBaseUrl(import.meta.env.VITE_BACKEND_BASE_URL);\n}\n\n/**\n * Return the session API key supplied by the deployment host.\n *\n * Two sources are consulted, in order:\n * 1. `VITE_SESSION_API_KEY` — baked into the bundle at build time (used by\n * `npm run dev` so the dev server has the key without a round-trip).\n * 2. `window.__AGENT_CANVAS_SESSION_API_KEY__` — injected into `index.html`\n * at serve time by `scripts/static-server.mjs --session-api-key <key>`.\n * This is the path used by the published `agent-canvas` binary, where\n * `VITE_SESSION_API_KEY` is empty in the prebuilt bundle and the\n * runtime key is generated when the user launches the CLI.\n *\n * Without the window-global fallback, the published binary cannot construct a\n * default local backend (`makeDefaultLocalBackend()` returns null), the\n * registry is left empty, and the user sees the Manage Backends modal\n * instead of the onboarding flow.\n */\nexport function getBakedSessionApiKey(): string | null {\n const envKey = trimToNull(import.meta.env.VITE_SESSION_API_KEY);\n if (envKey) return envKey;\n\n if (typeof window !== \"undefined\") {\n const injected = (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_SESSION_API_KEY__;\n if (typeof injected === \"string\") {\n return trimToNull(injected);\n }\n }\n\n return null;\n}\n\nexport function getAgentServerFormDefaults(): AgentServerFormDefaults {\n return {\n baseUrl: getAgentServerBaseUrl() ?? \"\",\n sessionApiKey: getAgentServerSessionApiKey() ?? \"\",\n };\n}\n\nexport function getAgentServerBaseUrl(): string | null {\n const configuredUrl = getConfiguredBaseUrl();\n if (configuredUrl) return configuredUrl;\n\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n\n return null;\n}\n\nexport function getAgentServerSessionApiKey(): string | null {\n return getBakedSessionApiKey();\n}\n\nexport function getAgentServerWorkingDir(): string {\n const envDir = import.meta.env.VITE_WORKING_DIR?.trim();\n if (envDir) return envDir;\n\n return DEFAULT_WORKING_DIR;\n}\n\nexport function buildConversationWorkingDir(conversationId: string): string {\n const base = getAgentServerWorkingDir().replace(/\\/+$/, \"\");\n const hex = conversationId.replace(/-/g, \"\");\n return `${base}/${hex}`;\n}\n\nexport function getConfiguredWorkerUrls(): string[] {\n const raw = import.meta.env.VITE_WORKER_URLS?.trim();\n if (!raw) return [];\n\n return raw\n .split(\",\")\n .map((url: string) => normalizeBaseUrl(url))\n .filter((url: string | null): url is string => Boolean(url));\n}\n\nexport function getAgentServerHeaders(): Record<string, string> {\n const sessionApiKey = getAgentServerSessionApiKey();\n return sessionApiKey ? { \"X-Session-API-Key\": sessionApiKey } : {};\n}\n\nexport function shouldLoadPublicSkills(): boolean {\n return import.meta.env.VITE_LOAD_PUBLIC_SKILLS !== \"false\";\n}\n\nexport function isAuthRequired(): boolean {\n return (\n import.meta.env.VITE_AUTH_REQUIRED === \"true\" ||\n (typeof window !== \"undefined\" &&\n (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_AUTH_REQUIRED__ === true)\n );\n}\n\nexport function isAuthRequiredAndMissing(): boolean {\n if (!isAuthRequired()) return false;\n return !getAgentServerSessionApiKey();\n}\n"],"mappings":";AAAA,IAAa,IAAsB;AAOnC,SAAS,EAAW,GAAsC;AACxD,QAAO,GAAO,MAAM,IAAI;;AAG1B,SAAS,EAAiB,GAAsC;AAC9D,KAAI,CAAC,EAAO,QAAO;CAEnB,IAAM,IAAU,EAAM,MAAM,CAAC,QAAQ,OAAO,GAAG;AAW/C,QAVK,IAED,gBAAgB,KAAK,EAAQ,GACxB,IAGL,OAAO,SAAW,MACb,GAAG,OAAO,SAAS,SAAS,IAAI,MAGlC,UAAU,MAVI;;AAavB,SAAS,IAAsC;AAC7C,QAAO,EAAA,KAAA,EAAuD;;AAoBhE,SAAgB,IAAuC;CACrD,IAAM,IAAS,EAAA,KAAA,EAAgD;AAC/D,KAAI,EAAQ,QAAO;AAEnB,KAAI,OAAO,SAAW,KAAa;EACjC,IAAM,IAAY,OACf;AACH,MAAI,OAAO,KAAa,SACtB,QAAO,EAAW,EAAS;;AAI/B,QAAO;;AAUT,SAAgB,IAAuC;AAQrD,QAPsB,GAClB,KAEA,OAAO,SAAW,MACb,OAAO,SAAS,SAGlB;;AAGT,SAAgB,IAA6C;AAC3D,QAAO,GAAuB;;AAGhC,SAAgB,IAAmC;AAIjD,SAHM,KAAA,IAA2C,MAAM,IAGhD;;AAGT,SAAgB,EAA4B,GAAgC;AAG1E,QAAO,GAFM,GAA0B,CAAC,QAAQ,QAAQ,GAE9C,CAAK,GADH,EAAe,QAAQ,MAAM,GACvB;;AAapB,SAAgB,IAAgD;CAC9D,IAAM,IAAgB,GAA6B;AACnD,QAAO,IAAgB,EAAE,qBAAqB,GAAe,GAAG,EAAE;;AAGpE,SAAgB,IAAkC;AAChD,QAAO;;AAGT,SAAgB,IAA0B;AACxC,QAEG,OAAO,SAAW,OAChB,OACE,mCAAmC"}
@@ -1,2 +1,2 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`./default-backend.cjs`),t=require(`./storage.cjs`);function n(t){return t.find(e=>e.kind===`local`)??e.makeDefaultLocalBackend()}function r(e,t){let r=null,i=null;if(t){let n=e.find(e=>e.id===t.backendId);n&&(r=n,i=t.orgId??null)}return r||(r=n(e),i=null),{backends:e,selection:t,active:{backend:r,orgId:i}}}var i=r(t.readStoredBackends(),t.readStoredActiveBackend()),a=new Set;function o(){a.forEach(e=>e())}function s(){return i.active}function c(){let e=i.active.backend;return e.kind===`local`?e:n(i.backends)}function l(){return i.backends}function u(){return i.selection}function d(){return i}function f(e){t.writeStoredActiveBackend(e),i=r(i.backends,e),o()}function p(e){t.writeStoredBackends(e);let n=i.selection;n&&!e.some(e=>e.id===n.backendId)&&(n=null,t.writeStoredActiveBackend(null)),i=r(e,n),o()}function m(e){return a.add(e),()=>{a.delete(e)}}exports.getActiveBackend=s,exports.getActiveSelection=u,exports.getEffectiveLocalBackend=c,exports.getRegisteredBackends=l,exports.getSnapshot=d,exports.setActiveSelection=f,exports.setRegisteredBackends=p,exports.subscribeActiveBackend=m;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`./storage.cjs`);var t=`no-backend`,n={id:t,name:`No Backend Available`,host:``,apiKey:``,kind:`local`};function r(e){return e.id===t}function i(e){return e[0]??n}function a(e,t){let n=null,r=null;if(t){let i=e.find(e=>e.id===t.backendId);i&&(n=i,r=t.orgId??null)}return n||(n=i(e),r=null),{backends:e,selection:t,active:{backend:n,orgId:r}}}var o=a(e.readStoredBackends(),e.readStoredActiveBackend()),s=new Set;function c(){s.forEach(e=>e())}function l(){return o.active}function u(){let e=o.active.backend;return e.kind===`local`&&!r(e)?e:null}function d(){return o.backends}function f(){return o.selection}function p(){return o}function m(t){e.writeStoredActiveBackend(t),o=a(o.backends,t),c()}function h(t){e.writeStoredBackends(t);let n=o.selection;n&&!t.some(e=>e.id===n.backendId)&&(n=null,e.writeStoredActiveBackend(null)),o=a(t,n),c()}function g(e){return s.add(e),()=>{s.delete(e)}}exports.NO_BACKEND=n,exports.getActiveBackend=l,exports.getActiveSelection=f,exports.getEffectiveLocalBackend=u,exports.getRegisteredBackends=d,exports.getSnapshot=p,exports.isNoBackend=r,exports.setActiveSelection=m,exports.setRegisteredBackends=h,exports.subscribeActiveBackend=g;
2
2
  //# sourceMappingURL=active-store.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"active-store.cjs","names":[],"sources":["../../../src/api/backend-registry/active-store.ts"],"sourcesContent":["import { makeDefaultLocalBackend } from \"./default-backend\";\nimport {\n readStoredActiveBackend,\n readStoredBackends,\n writeStoredActiveBackend,\n writeStoredBackends,\n} from \"./storage\";\nimport type { Backend, BackendSelection, ResolvedActiveBackend } from \"./types\";\n\ntype Listener = () => void;\n\ninterface Snapshot {\n backends: Backend[];\n selection: BackendSelection | null;\n active: ResolvedActiveBackend;\n}\n\n/**\n * Pick the local backend the GUI should talk to for local-protocol calls\n * (settings, conversations, secrets, …). Prefers the user's first\n * registered local backend. As a last resort — when the registry has no\n * local entry at all synthesize one from env/agent-server-config so\n * synchronous call sites never have to handle a `null` backend; the\n * synthesized entry is never persisted.\n */\nfunction pickLocalBackend(backends: Backend[]): Backend {\n const firstLocal = backends.find((b) => b.kind === \"local\");\n return firstLocal ?? makeDefaultLocalBackend();\n}\n\nfunction computeSnapshot(\n backends: Backend[],\n selection: BackendSelection | null,\n): Snapshot {\n let activeBackend: Backend | null = null;\n let activeOrgId: string | null = null;\n\n if (selection) {\n const found = backends.find((b) => b.id === selection.backendId);\n if (found) {\n activeBackend = found;\n activeOrgId = selection.orgId ?? null;\n }\n // If the selection points at a removed backend, fall through to\n // the unselected case below; we also drop the orgId since it only\n // makes sense in the context of a specific cloud backend.\n }\n\n // @spec BM-003 — Fallback on active backend removal\n if (!activeBackend) {\n activeBackend = pickLocalBackend(backends);\n activeOrgId = null;\n }\n\n return {\n backends,\n selection,\n active: { backend: activeBackend, orgId: activeOrgId },\n };\n}\n\nlet snapshot: Snapshot = computeSnapshot(\n readStoredBackends(),\n readStoredActiveBackend(),\n);\n\nconst listeners = new Set<Listener>();\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nexport function getActiveBackend(): ResolvedActiveBackend {\n return snapshot.active;\n}\n\n/**\n * Pick the backend to use for *local agent-server protocol* calls.\n *\n * Most of the GUI's services (settings reads/writes, conversation CRUD,\n * skills/MCP/secrets, etc.) speak the local agent-server's protocol —\n * they would fail against a cloud host. When the user has chosen a\n * cloud backend as active, those calls fall back to the first registered\n * local backend (or the env-derived default if none exists). Cloud-only\n * call sites import `getActiveBackend` directly.\n */\nexport function getEffectiveLocalBackend(): Backend {\n const active = snapshot.active.backend;\n if (active.kind === \"local\") return active;\n return pickLocalBackend(snapshot.backends);\n}\n\nexport function getRegisteredBackends(): Backend[] {\n return snapshot.backends;\n}\n\nexport function getActiveSelection(): BackendSelection | null {\n return snapshot.selection;\n}\n\nexport function getSnapshot(): Snapshot {\n return snapshot;\n}\n\nexport function setActiveSelection(selection: BackendSelection | null): void {\n writeStoredActiveBackend(selection);\n snapshot = computeSnapshot(snapshot.backends, selection);\n notify();\n}\n\nexport function setRegisteredBackends(backends: Backend[]): void {\n writeStoredBackends(backends);\n\n let nextSelection = snapshot.selection;\n if (\n nextSelection &&\n !backends.some((b) => b.id === nextSelection!.backendId)\n ) {\n nextSelection = null;\n writeStoredActiveBackend(null);\n }\n\n snapshot = computeSnapshot(backends, nextSelection);\n notify();\n}\n\nexport function subscribeActiveBackend(listener: Listener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n/** Test-only: re-read storage and clear listeners. */\n\nexport function __resetActiveStoreForTests(): void {\n snapshot = computeSnapshot(readStoredBackends(), readStoredActiveBackend());\n listeners.clear();\n}\n"],"mappings":"oHAyBA,SAAS,EAAiB,EAA8B,CAEtD,OADmB,EAAS,KAAM,GAAM,EAAE,OAAS,QAC5C,EAAc,EAAA,yBAAyB,CAGhD,SAAS,EACP,EACA,EACU,CACV,IAAI,EAAgC,KAChC,EAA6B,KAEjC,GAAI,EAAW,CACb,IAAM,EAAQ,EAAS,KAAM,GAAM,EAAE,KAAO,EAAU,UAAU,CAC5D,IACF,EAAgB,EAChB,EAAc,EAAU,OAAS,MAarC,OALK,IACH,EAAgB,EAAiB,EAAS,CAC1C,EAAc,MAGT,CACL,WACA,YACA,OAAQ,CAAE,QAAS,EAAe,MAAO,EAAa,CACvD,CAGH,IAAI,EAAqB,EACvB,EAAA,oBAAoB,CACpB,EAAA,yBAAyB,CAC1B,CAEK,EAAY,IAAI,IAEtB,SAAS,GAAe,CACtB,EAAU,QAAS,GAAa,GAAU,CAAC,CAG7C,SAAgB,GAA0C,CACxD,OAAO,EAAS,OAalB,SAAgB,GAAoC,CAClD,IAAM,EAAS,EAAS,OAAO,QAE/B,OADI,EAAO,OAAS,QAAgB,EAC7B,EAAiB,EAAS,SAAS,CAG5C,SAAgB,GAAmC,CACjD,OAAO,EAAS,SAGlB,SAAgB,GAA8C,CAC5D,OAAO,EAAS,UAGlB,SAAgB,GAAwB,CACtC,OAAO,EAGT,SAAgB,EAAmB,EAA0C,CAC3E,EAAA,yBAAyB,EAAU,CACnC,EAAW,EAAgB,EAAS,SAAU,EAAU,CACxD,GAAQ,CAGV,SAAgB,EAAsB,EAA2B,CAC/D,EAAA,oBAAoB,EAAS,CAE7B,IAAI,EAAgB,EAAS,UAE3B,GACA,CAAC,EAAS,KAAM,GAAM,EAAE,KAAO,EAAe,UAAU,GAExD,EAAgB,KAChB,EAAA,yBAAyB,KAAK,EAGhC,EAAW,EAAgB,EAAU,EAAc,CACnD,GAAQ,CAGV,SAAgB,EAAuB,EAAgC,CAErE,OADA,EAAU,IAAI,EAAS,KACV,CACX,EAAU,OAAO,EAAS"}
1
+ {"version":3,"file":"active-store.cjs","names":[],"sources":["../../../src/api/backend-registry/active-store.ts"],"sourcesContent":["import {\n readStoredActiveBackend,\n readStoredBackends,\n writeStoredActiveBackend,\n writeStoredBackends,\n} from \"./storage\";\nimport type { Backend, BackendSelection, ResolvedActiveBackend } from \"./types\";\n\ntype Listener = () => void;\n\ninterface Snapshot {\n backends: Backend[];\n selection: BackendSelection | null;\n active: ResolvedActiveBackend;\n}\n\nexport const NO_BACKEND_ID = \"no-backend\";\n\n/**\n * Sentinel returned when the registry has no usable backend. It must never be\n * persisted, and callers must check `isNoBackend()` before interpreting fields\n * like `kind`, `host`, or `apiKey`.\n */\nexport const NO_BACKEND: Backend = {\n id: NO_BACKEND_ID,\n name: \"No Backend Available\",\n host: \"\",\n apiKey: \"\",\n kind: \"local\",\n};\n\nexport function isNoBackend(backend: Backend): boolean {\n return backend.id === NO_BACKEND_ID;\n}\n\nfunction pickFallbackBackend(backends: Backend[]): Backend {\n return backends[0] ?? NO_BACKEND;\n}\n\nfunction computeSnapshot(\n backends: Backend[],\n selection: BackendSelection | null,\n): Snapshot {\n let activeBackend: Backend | null = null;\n let activeOrgId: string | null = null;\n\n if (selection) {\n const found = backends.find((b) => b.id === selection.backendId);\n if (found) {\n activeBackend = found;\n activeOrgId = selection.orgId ?? null;\n }\n // If the selection points at a removed backend, fall through to\n // the unselected case below; we also drop the orgId since it only\n // makes sense in the context of a specific cloud backend.\n }\n\n // @spec BM-003 — Fallback on active backend removal\n if (!activeBackend) {\n activeBackend = pickFallbackBackend(backends);\n activeOrgId = null;\n }\n\n return {\n backends,\n selection,\n active: { backend: activeBackend, orgId: activeOrgId },\n };\n}\n\nlet snapshot: Snapshot = computeSnapshot(\n readStoredBackends(),\n readStoredActiveBackend(),\n);\n\nconst listeners = new Set<Listener>();\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nexport function getActiveBackend(): ResolvedActiveBackend {\n return snapshot.active;\n}\n\n/**\n * Pick the backend to use for *local agent-server protocol* calls.\n *\n * Most of the GUI's services (settings reads/writes, conversation CRUD,\n * skills/MCP/secrets, etc.) speak the local agent-server's protocol —\n * they would fail against a cloud host. Only the active backend is eligible:\n * a cloud selection must not borrow another registered local backend.\n */\nexport function getEffectiveLocalBackend(): Backend | null {\n const active = snapshot.active.backend;\n if (active.kind === \"local\" && !isNoBackend(active)) return active;\n return null;\n}\n\nexport function getRegisteredBackends(): Backend[] {\n return snapshot.backends;\n}\n\nexport function getActiveSelection(): BackendSelection | null {\n return snapshot.selection;\n}\n\nexport function getSnapshot(): Snapshot {\n return snapshot;\n}\n\nexport function setActiveSelection(selection: BackendSelection | null): void {\n writeStoredActiveBackend(selection);\n snapshot = computeSnapshot(snapshot.backends, selection);\n notify();\n}\n\nexport function setRegisteredBackends(backends: Backend[]): void {\n writeStoredBackends(backends);\n\n let nextSelection = snapshot.selection;\n if (\n nextSelection &&\n !backends.some((b) => b.id === nextSelection!.backendId)\n ) {\n nextSelection = null;\n writeStoredActiveBackend(null);\n }\n\n snapshot = computeSnapshot(backends, nextSelection);\n notify();\n}\n\nexport function subscribeActiveBackend(listener: Listener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n/** Test-only: re-read storage and clear listeners. */\n\nexport function __resetActiveStoreForTests(): void {\n snapshot = computeSnapshot(readStoredBackends(), readStoredActiveBackend());\n listeners.clear();\n}\n"],"mappings":"iFAgBA,IAAa,EAAgB,aAOhB,EAAsB,CACjC,GAAI,EACJ,KAAM,uBACN,KAAM,GACN,OAAQ,GACR,KAAM,QACP,CAED,SAAgB,EAAY,EAA2B,CACrD,OAAO,EAAQ,KAAO,EAGxB,SAAS,EAAoB,EAA8B,CACzD,OAAO,EAAS,IAAM,EAGxB,SAAS,EACP,EACA,EACU,CACV,IAAI,EAAgC,KAChC,EAA6B,KAEjC,GAAI,EAAW,CACb,IAAM,EAAQ,EAAS,KAAM,GAAM,EAAE,KAAO,EAAU,UAAU,CAC5D,IACF,EAAgB,EAChB,EAAc,EAAU,OAAS,MAarC,OALK,IACH,EAAgB,EAAoB,EAAS,CAC7C,EAAc,MAGT,CACL,WACA,YACA,OAAQ,CAAE,QAAS,EAAe,MAAO,EAAa,CACvD,CAGH,IAAI,EAAqB,EACvB,EAAA,oBAAoB,CACpB,EAAA,yBAAyB,CAC1B,CAEK,EAAY,IAAI,IAEtB,SAAS,GAAe,CACtB,EAAU,QAAS,GAAa,GAAU,CAAC,CAG7C,SAAgB,GAA0C,CACxD,OAAO,EAAS,OAWlB,SAAgB,GAA2C,CACzD,IAAM,EAAS,EAAS,OAAO,QAE/B,OADI,EAAO,OAAS,SAAW,CAAC,EAAY,EAAO,CAAS,EACrD,KAGT,SAAgB,GAAmC,CACjD,OAAO,EAAS,SAGlB,SAAgB,GAA8C,CAC5D,OAAO,EAAS,UAGlB,SAAgB,GAAwB,CACtC,OAAO,EAGT,SAAgB,EAAmB,EAA0C,CAC3E,EAAA,yBAAyB,EAAU,CACnC,EAAW,EAAgB,EAAS,SAAU,EAAU,CACxD,GAAQ,CAGV,SAAgB,EAAsB,EAA2B,CAC/D,EAAA,oBAAoB,EAAS,CAE7B,IAAI,EAAgB,EAAS,UAE3B,GACA,CAAC,EAAS,KAAM,GAAM,EAAE,KAAO,EAAe,UAAU,GAExD,EAAgB,KAChB,EAAA,yBAAyB,KAAK,EAGhC,EAAW,EAAgB,EAAU,EAAc,CACnD,GAAQ,CAGV,SAAgB,EAAuB,EAAgC,CAErE,OADA,EAAU,IAAI,EAAS,KACV,CACX,EAAU,OAAO,EAAS"}
@@ -5,18 +5,24 @@ interface Snapshot {
5
5
  selection: BackendSelection | null;
6
6
  active: ResolvedActiveBackend;
7
7
  }
8
+ export declare const NO_BACKEND_ID = "no-backend";
9
+ /**
10
+ * Sentinel returned when the registry has no usable backend. It must never be
11
+ * persisted, and callers must check `isNoBackend()` before interpreting fields
12
+ * like `kind`, `host`, or `apiKey`.
13
+ */
14
+ export declare const NO_BACKEND: Backend;
15
+ export declare function isNoBackend(backend: Backend): boolean;
8
16
  export declare function getActiveBackend(): ResolvedActiveBackend;
9
17
  /**
10
18
  * Pick the backend to use for *local agent-server protocol* calls.
11
19
  *
12
20
  * Most of the GUI's services (settings reads/writes, conversation CRUD,
13
21
  * skills/MCP/secrets, etc.) speak the local agent-server's protocol —
14
- * they would fail against a cloud host. When the user has chosen a
15
- * cloud backend as active, those calls fall back to the first registered
16
- * local backend (or the env-derived default if none exists). Cloud-only
17
- * call sites import `getActiveBackend` directly.
22
+ * they would fail against a cloud host. Only the active backend is eligible:
23
+ * a cloud selection must not borrow another registered local backend.
18
24
  */
19
- export declare function getEffectiveLocalBackend(): Backend;
25
+ export declare function getEffectiveLocalBackend(): Backend | null;
20
26
  export declare function getRegisteredBackends(): Backend[];
21
27
  export declare function getActiveSelection(): BackendSelection | null;
22
28
  export declare function getSnapshot(): Snapshot;
@@ -1,16 +1,25 @@
1
- import { makeDefaultLocalBackend as e } from "./default-backend.js";
2
- import { readStoredActiveBackend as t, readStoredBackends as n, writeStoredActiveBackend as r, writeStoredBackends as i } from "./storage.js";
1
+ import { readStoredActiveBackend as e, readStoredBackends as t, writeStoredActiveBackend as n, writeStoredBackends as r } from "./storage.js";
3
2
  //#region src/api/backend-registry/active-store.ts
4
- function a(t) {
5
- return t.find((e) => e.kind === "local") ?? e();
3
+ var i = "no-backend", a = {
4
+ id: i,
5
+ name: "No Backend Available",
6
+ host: "",
7
+ apiKey: "",
8
+ kind: "local"
9
+ };
10
+ function o(e) {
11
+ return e.id === i;
6
12
  }
7
- function o(e, t) {
13
+ function s(e) {
14
+ return e[0] ?? a;
15
+ }
16
+ function c(e, t) {
8
17
  let n = null, r = null;
9
18
  if (t) {
10
19
  let i = e.find((e) => e.id === t.backendId);
11
20
  i && (n = i, r = t.orgId ?? null);
12
21
  }
13
- return n || (n = a(e), r = null), {
22
+ return n || (n = s(e), r = null), {
14
23
  backends: e,
15
24
  selection: t,
16
25
  active: {
@@ -19,40 +28,40 @@ function o(e, t) {
19
28
  }
20
29
  };
21
30
  }
22
- var s = o(n(), t()), c = /* @__PURE__ */ new Set();
23
- function l() {
24
- c.forEach((e) => e());
25
- }
26
- function u() {
27
- return s.active;
28
- }
31
+ var l = c(t(), e()), u = /* @__PURE__ */ new Set();
29
32
  function d() {
30
- let e = s.active.backend;
31
- return e.kind === "local" ? e : a(s.backends);
33
+ u.forEach((e) => e());
32
34
  }
33
35
  function f() {
34
- return s.backends;
36
+ return l.active;
35
37
  }
36
38
  function p() {
37
- return s.selection;
39
+ let e = l.active.backend;
40
+ return e.kind === "local" && !o(e) ? e : null;
38
41
  }
39
42
  function m() {
40
- return s;
43
+ return l.backends;
41
44
  }
42
- function h(e) {
43
- r(e), s = o(s.backends, e), l();
45
+ function h() {
46
+ return l.selection;
44
47
  }
45
- function g(e) {
46
- i(e);
47
- let t = s.selection;
48
- t && !e.some((e) => e.id === t.backendId) && (t = null, r(null)), s = o(e, t), l();
48
+ function g() {
49
+ return l;
49
50
  }
50
51
  function _(e) {
51
- return c.add(e), () => {
52
- c.delete(e);
52
+ n(e), l = c(l.backends, e), d();
53
+ }
54
+ function v(e) {
55
+ r(e);
56
+ let t = l.selection;
57
+ t && !e.some((e) => e.id === t.backendId) && (t = null, n(null)), l = c(e, t), d();
58
+ }
59
+ function y(e) {
60
+ return u.add(e), () => {
61
+ u.delete(e);
53
62
  };
54
63
  }
55
64
  //#endregion
56
- export { u as getActiveBackend, p as getActiveSelection, d as getEffectiveLocalBackend, f as getRegisteredBackends, m as getSnapshot, h as setActiveSelection, g as setRegisteredBackends, _ as subscribeActiveBackend };
65
+ export { a as NO_BACKEND, f as getActiveBackend, h as getActiveSelection, p as getEffectiveLocalBackend, m as getRegisteredBackends, g as getSnapshot, o as isNoBackend, _ as setActiveSelection, v as setRegisteredBackends, y as subscribeActiveBackend };
57
66
 
58
67
  //# sourceMappingURL=active-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"active-store.js","names":[],"sources":["../../../src/api/backend-registry/active-store.ts"],"sourcesContent":["import { makeDefaultLocalBackend } from \"./default-backend\";\nimport {\n readStoredActiveBackend,\n readStoredBackends,\n writeStoredActiveBackend,\n writeStoredBackends,\n} from \"./storage\";\nimport type { Backend, BackendSelection, ResolvedActiveBackend } from \"./types\";\n\ntype Listener = () => void;\n\ninterface Snapshot {\n backends: Backend[];\n selection: BackendSelection | null;\n active: ResolvedActiveBackend;\n}\n\n/**\n * Pick the local backend the GUI should talk to for local-protocol calls\n * (settings, conversations, secrets, …). Prefers the user's first\n * registered local backend. As a last resort — when the registry has no\n * local entry at all synthesize one from env/agent-server-config so\n * synchronous call sites never have to handle a `null` backend; the\n * synthesized entry is never persisted.\n */\nfunction pickLocalBackend(backends: Backend[]): Backend {\n const firstLocal = backends.find((b) => b.kind === \"local\");\n return firstLocal ?? makeDefaultLocalBackend();\n}\n\nfunction computeSnapshot(\n backends: Backend[],\n selection: BackendSelection | null,\n): Snapshot {\n let activeBackend: Backend | null = null;\n let activeOrgId: string | null = null;\n\n if (selection) {\n const found = backends.find((b) => b.id === selection.backendId);\n if (found) {\n activeBackend = found;\n activeOrgId = selection.orgId ?? null;\n }\n // If the selection points at a removed backend, fall through to\n // the unselected case below; we also drop the orgId since it only\n // makes sense in the context of a specific cloud backend.\n }\n\n // @spec BM-003 — Fallback on active backend removal\n if (!activeBackend) {\n activeBackend = pickLocalBackend(backends);\n activeOrgId = null;\n }\n\n return {\n backends,\n selection,\n active: { backend: activeBackend, orgId: activeOrgId },\n };\n}\n\nlet snapshot: Snapshot = computeSnapshot(\n readStoredBackends(),\n readStoredActiveBackend(),\n);\n\nconst listeners = new Set<Listener>();\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nexport function getActiveBackend(): ResolvedActiveBackend {\n return snapshot.active;\n}\n\n/**\n * Pick the backend to use for *local agent-server protocol* calls.\n *\n * Most of the GUI's services (settings reads/writes, conversation CRUD,\n * skills/MCP/secrets, etc.) speak the local agent-server's protocol —\n * they would fail against a cloud host. When the user has chosen a\n * cloud backend as active, those calls fall back to the first registered\n * local backend (or the env-derived default if none exists). Cloud-only\n * call sites import `getActiveBackend` directly.\n */\nexport function getEffectiveLocalBackend(): Backend {\n const active = snapshot.active.backend;\n if (active.kind === \"local\") return active;\n return pickLocalBackend(snapshot.backends);\n}\n\nexport function getRegisteredBackends(): Backend[] {\n return snapshot.backends;\n}\n\nexport function getActiveSelection(): BackendSelection | null {\n return snapshot.selection;\n}\n\nexport function getSnapshot(): Snapshot {\n return snapshot;\n}\n\nexport function setActiveSelection(selection: BackendSelection | null): void {\n writeStoredActiveBackend(selection);\n snapshot = computeSnapshot(snapshot.backends, selection);\n notify();\n}\n\nexport function setRegisteredBackends(backends: Backend[]): void {\n writeStoredBackends(backends);\n\n let nextSelection = snapshot.selection;\n if (\n nextSelection &&\n !backends.some((b) => b.id === nextSelection!.backendId)\n ) {\n nextSelection = null;\n writeStoredActiveBackend(null);\n }\n\n snapshot = computeSnapshot(backends, nextSelection);\n notify();\n}\n\nexport function subscribeActiveBackend(listener: Listener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n/** Test-only: re-read storage and clear listeners. */\n\nexport function __resetActiveStoreForTests(): void {\n snapshot = computeSnapshot(readStoredBackends(), readStoredActiveBackend());\n listeners.clear();\n}\n"],"mappings":";;;AAyBA,SAAS,EAAiB,GAA8B;AAEtD,QADmB,EAAS,MAAM,MAAM,EAAE,SAAS,QAC5C,IAAc,GAAyB;;AAGhD,SAAS,EACP,GACA,GACU;CACV,IAAI,IAAgC,MAChC,IAA6B;AAEjC,KAAI,GAAW;EACb,IAAM,IAAQ,EAAS,MAAM,MAAM,EAAE,OAAO,EAAU,UAAU;AAChE,EAAI,MACF,IAAgB,GAChB,IAAc,EAAU,SAAS;;AAarC,QALK,MACH,IAAgB,EAAiB,EAAS,EAC1C,IAAc,OAGT;EACL;EACA;EACA,QAAQ;GAAE,SAAS;GAAe,OAAO;GAAa;EACvD;;AAGH,IAAI,IAAqB,EACvB,GAAoB,EACpB,GAAyB,CAC1B,EAEK,oBAAY,IAAI,KAAe;AAErC,SAAS,IAAe;AACtB,GAAU,SAAS,MAAa,GAAU,CAAC;;AAG7C,SAAgB,IAA0C;AACxD,QAAO,EAAS;;AAalB,SAAgB,IAAoC;CAClD,IAAM,IAAS,EAAS,OAAO;AAE/B,QADI,EAAO,SAAS,UAAgB,IAC7B,EAAiB,EAAS,SAAS;;AAG5C,SAAgB,IAAmC;AACjD,QAAO,EAAS;;AAGlB,SAAgB,IAA8C;AAC5D,QAAO,EAAS;;AAGlB,SAAgB,IAAwB;AACtC,QAAO;;AAGT,SAAgB,EAAmB,GAA0C;AAG3E,CAFA,EAAyB,EAAU,EACnC,IAAW,EAAgB,EAAS,UAAU,EAAU,EACxD,GAAQ;;AAGV,SAAgB,EAAsB,GAA2B;AAC/D,GAAoB,EAAS;CAE7B,IAAI,IAAgB,EAAS;AAU7B,CARE,KACA,CAAC,EAAS,MAAM,MAAM,EAAE,OAAO,EAAe,UAAU,KAExD,IAAgB,MAChB,EAAyB,KAAK,GAGhC,IAAW,EAAgB,GAAU,EAAc,EACnD,GAAQ;;AAGV,SAAgB,EAAuB,GAAgC;AAErE,QADA,EAAU,IAAI,EAAS,QACV;AACX,IAAU,OAAO,EAAS"}
1
+ {"version":3,"file":"active-store.js","names":[],"sources":["../../../src/api/backend-registry/active-store.ts"],"sourcesContent":["import {\n readStoredActiveBackend,\n readStoredBackends,\n writeStoredActiveBackend,\n writeStoredBackends,\n} from \"./storage\";\nimport type { Backend, BackendSelection, ResolvedActiveBackend } from \"./types\";\n\ntype Listener = () => void;\n\ninterface Snapshot {\n backends: Backend[];\n selection: BackendSelection | null;\n active: ResolvedActiveBackend;\n}\n\nexport const NO_BACKEND_ID = \"no-backend\";\n\n/**\n * Sentinel returned when the registry has no usable backend. It must never be\n * persisted, and callers must check `isNoBackend()` before interpreting fields\n * like `kind`, `host`, or `apiKey`.\n */\nexport const NO_BACKEND: Backend = {\n id: NO_BACKEND_ID,\n name: \"No Backend Available\",\n host: \"\",\n apiKey: \"\",\n kind: \"local\",\n};\n\nexport function isNoBackend(backend: Backend): boolean {\n return backend.id === NO_BACKEND_ID;\n}\n\nfunction pickFallbackBackend(backends: Backend[]): Backend {\n return backends[0] ?? NO_BACKEND;\n}\n\nfunction computeSnapshot(\n backends: Backend[],\n selection: BackendSelection | null,\n): Snapshot {\n let activeBackend: Backend | null = null;\n let activeOrgId: string | null = null;\n\n if (selection) {\n const found = backends.find((b) => b.id === selection.backendId);\n if (found) {\n activeBackend = found;\n activeOrgId = selection.orgId ?? null;\n }\n // If the selection points at a removed backend, fall through to\n // the unselected case below; we also drop the orgId since it only\n // makes sense in the context of a specific cloud backend.\n }\n\n // @spec BM-003 — Fallback on active backend removal\n if (!activeBackend) {\n activeBackend = pickFallbackBackend(backends);\n activeOrgId = null;\n }\n\n return {\n backends,\n selection,\n active: { backend: activeBackend, orgId: activeOrgId },\n };\n}\n\nlet snapshot: Snapshot = computeSnapshot(\n readStoredBackends(),\n readStoredActiveBackend(),\n);\n\nconst listeners = new Set<Listener>();\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nexport function getActiveBackend(): ResolvedActiveBackend {\n return snapshot.active;\n}\n\n/**\n * Pick the backend to use for *local agent-server protocol* calls.\n *\n * Most of the GUI's services (settings reads/writes, conversation CRUD,\n * skills/MCP/secrets, etc.) speak the local agent-server's protocol —\n * they would fail against a cloud host. Only the active backend is eligible:\n * a cloud selection must not borrow another registered local backend.\n */\nexport function getEffectiveLocalBackend(): Backend | null {\n const active = snapshot.active.backend;\n if (active.kind === \"local\" && !isNoBackend(active)) return active;\n return null;\n}\n\nexport function getRegisteredBackends(): Backend[] {\n return snapshot.backends;\n}\n\nexport function getActiveSelection(): BackendSelection | null {\n return snapshot.selection;\n}\n\nexport function getSnapshot(): Snapshot {\n return snapshot;\n}\n\nexport function setActiveSelection(selection: BackendSelection | null): void {\n writeStoredActiveBackend(selection);\n snapshot = computeSnapshot(snapshot.backends, selection);\n notify();\n}\n\nexport function setRegisteredBackends(backends: Backend[]): void {\n writeStoredBackends(backends);\n\n let nextSelection = snapshot.selection;\n if (\n nextSelection &&\n !backends.some((b) => b.id === nextSelection!.backendId)\n ) {\n nextSelection = null;\n writeStoredActiveBackend(null);\n }\n\n snapshot = computeSnapshot(backends, nextSelection);\n notify();\n}\n\nexport function subscribeActiveBackend(listener: Listener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n/** Test-only: re-read storage and clear listeners. */\n\nexport function __resetActiveStoreForTests(): void {\n snapshot = computeSnapshot(readStoredBackends(), readStoredActiveBackend());\n listeners.clear();\n}\n"],"mappings":";;AAgBA,IAAa,IAAgB,cAOhB,IAAsB;CACjC,IAAI;CACJ,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACP;AAED,SAAgB,EAAY,GAA2B;AACrD,QAAO,EAAQ,OAAO;;AAGxB,SAAS,EAAoB,GAA8B;AACzD,QAAO,EAAS,MAAM;;AAGxB,SAAS,EACP,GACA,GACU;CACV,IAAI,IAAgC,MAChC,IAA6B;AAEjC,KAAI,GAAW;EACb,IAAM,IAAQ,EAAS,MAAM,MAAM,EAAE,OAAO,EAAU,UAAU;AAChE,EAAI,MACF,IAAgB,GAChB,IAAc,EAAU,SAAS;;AAarC,QALK,MACH,IAAgB,EAAoB,EAAS,EAC7C,IAAc,OAGT;EACL;EACA;EACA,QAAQ;GAAE,SAAS;GAAe,OAAO;GAAa;EACvD;;AAGH,IAAI,IAAqB,EACvB,GAAoB,EACpB,GAAyB,CAC1B,EAEK,oBAAY,IAAI,KAAe;AAErC,SAAS,IAAe;AACtB,GAAU,SAAS,MAAa,GAAU,CAAC;;AAG7C,SAAgB,IAA0C;AACxD,QAAO,EAAS;;AAWlB,SAAgB,IAA2C;CACzD,IAAM,IAAS,EAAS,OAAO;AAE/B,QADI,EAAO,SAAS,WAAW,CAAC,EAAY,EAAO,GAAS,IACrD;;AAGT,SAAgB,IAAmC;AACjD,QAAO,EAAS;;AAGlB,SAAgB,IAA8C;AAC5D,QAAO,EAAS;;AAGlB,SAAgB,IAAwB;AACtC,QAAO;;AAGT,SAAgB,EAAmB,GAA0C;AAG3E,CAFA,EAAyB,EAAU,EACnC,IAAW,EAAgB,EAAS,UAAU,EAAU,EACxD,GAAQ;;AAGV,SAAgB,EAAsB,GAA2B;AAC/D,GAAoB,EAAS;CAE7B,IAAI,IAAgB,EAAS;AAU7B,CARE,KACA,CAAC,EAAS,MAAM,MAAM,EAAE,OAAO,EAAe,UAAU,KAExD,IAAgB,MAChB,EAAyB,KAAK,GAGhC,IAAW,EAAgB,GAAU,EAAc,EACnD,GAAQ;;AAGV,SAAgB,EAAuB,GAAgC;AAErE,QADA,EAAU,IAAI,EAAS,QACV;AACX,IAAU,OAAO,EAAS"}