@openhands/agent-canvas 1.16.0 → 1.17.0

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 (956) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-CX3Lh9gj.js → acp-providers-DrjNsPOH.js} +1 -1
  4. package/build/assets/active-backend-context-rZiLJRUc.js +2 -0
  5. package/build/assets/{agent-context-settings-DSZlXrLj.js → agent-context-settings-CJUrcBut.js} +1 -1
  6. package/build/assets/agent-profiles-service.api-Biieml2L.js +1 -0
  7. package/build/assets/agent-profiles-settings-x6RvPsq7.js +1 -0
  8. package/build/assets/agent-server-client-options-BikiNwTa.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +88 -0
  10. package/build/assets/agent-settings-BJyovpJ_.js +1 -0
  11. package/build/assets/agent-settings-CpY3zObk.js +2 -0
  12. package/build/assets/{alert-banner-HP6mX-Vr.js → alert-banner-vARz1idS.js} +1 -1
  13. package/build/assets/{api-error-message-B-XdSk3b.js → api-error-message-Ve79qDcN.js} +1 -1
  14. package/build/assets/api-key-entry-screen-CsMuBhoP.js +1 -0
  15. package/build/assets/{app-settings-dbnneVaV.js → app-settings-BaJ7nfHt.js} +1 -1
  16. package/build/assets/automation-detail-CVoGDrKq.js +3 -0
  17. package/build/assets/{automation-export-D3a3of4G.js → automation-export-DxY47m3T.js} +1 -1
  18. package/build/assets/automation-git-sync-CRMP9Bbm.js +1 -0
  19. package/build/assets/automation-setup-route-072beLz1.js +3 -0
  20. package/build/assets/{automation-templates-BRppNh99.js → automation-templates-4C4PM8K7.js} +1 -1
  21. package/build/assets/automations-list-xuqTSQL4.js +1 -0
  22. package/build/assets/{back-nav-button-Cjl_hoxq.js → back-nav-button-B8tH0BEp.js} +1 -1
  23. package/build/assets/backend-form-modal-0aJmWdsa.js +1 -0
  24. package/build/assets/{backend-synced-settings-badge-DPkz30BE.js → backend-synced-settings-badge-B7rKWBir.js} +1 -1
  25. package/build/assets/{badge-BU3S0VtE.js → badge-CcGx2TaV.js} +1 -1
  26. package/build/assets/{base-modal-D_L0oEbG.js → base-modal-DTULovNc.js} +1 -1
  27. package/build/assets/bot-CLMxGFaq.js +1 -0
  28. package/build/assets/{brand-button-BAfk4wGP.js → brand-button-DxPO4Lf8.js} +1 -1
  29. package/build/assets/{browser-DSAo0tz1.js → browser-C-_qBasq.js} +2 -2
  30. package/build/assets/{browser-tab-C9vy56R5.js → browser-tab-DZanIw5m.js} +1 -1
  31. package/build/assets/{canvas-extension-page-dx1gFrfW.js → canvas-extension-page-o_cWgE9B.js} +1 -1
  32. package/build/assets/canvas-extensions-DSgNlCha.js +1 -0
  33. package/build/assets/{canvas-extensions-runtime-2_x5Ezmi.js → canvas-extensions-runtime-DdnkgJXV.js} +1 -1
  34. package/build/assets/{chat-send-button-MUQqCZCS.js → chat-send-button-B3SFSIg5.js} +1 -1
  35. package/build/assets/check-fDEfgSzj.js +1 -0
  36. package/build/assets/chevron-down-CFrWHqu8.js +1 -0
  37. package/build/assets/chevron-right-C5roOrJu.js +1 -0
  38. package/build/assets/circle-check-ClTzJTdb.js +1 -0
  39. package/build/assets/{circle-plus-check-toggle-BO_kFZt3.js → circle-plus-check-toggle-Fr-h-mbL.js} +1 -1
  40. package/build/assets/{cloud-funnel-analytics-CztBCCPp.js → cloud-funnel-analytics-BQanUEEC.js} +1 -1
  41. package/build/assets/{cog-D-MPQW6G.js → cog-VBlRo6iw.js} +1 -1
  42. package/build/assets/command-menu-BT3Ia5Ru.js +1 -0
  43. package/build/assets/commits-tab-2jhtaohl.js +1 -0
  44. package/build/assets/{condenser-settings-DmEOje-7.js → condenser-settings-eVKFMvap.js} +1 -1
  45. package/build/assets/confirmation-modal-gIFHeZt6.js +1 -0
  46. package/build/assets/{context-menu-list-item-I86vKcmM.js → context-menu-list-item-DDROe12Z.js} +1 -1
  47. package/build/assets/conversation-BnjJSFf5.js +93 -0
  48. package/build/assets/conversation-DZ578rOX.js +1 -0
  49. package/build/assets/conversation-panel-DZ578rOX.js +1 -0
  50. package/build/assets/{conversation-state-store-B0ImPLHO.js → conversation-state-store-D1_G_9I-.js} +1 -1
  51. package/build/assets/{conversation-store-Ca3ghXap.js → conversation-store-DVVfkCsk.js} +1 -1
  52. package/build/assets/{conversation-tab-empty-state-FIbh_lc8.js → conversation-tab-empty-state-DKlzAz5c.js} +1 -1
  53. package/build/assets/{copy-to-clipboard-button-Ca8iSkkA.js → copy-to-clipboard-button-B3w0X7WH.js} +1 -1
  54. package/build/assets/{device-verify-Bhn2e_Ye.js → device-verify-BfkCzyFB.js} +1 -1
  55. package/build/assets/{dropdown-classes-Bc1djN0-.js → dropdown-classes-B9kJVDIk.js} +1 -1
  56. package/build/assets/edit-automation-modal-BwhJ39JT.js +1 -0
  57. package/build/assets/empty-state-RZz0OfnY.js +1 -0
  58. package/build/assets/{entry.client-CqyPPjOq.js → entry.client-Ds8LVp-E.js} +2 -2
  59. package/build/assets/enum-filter-dropdown-C4pW0ORd.js +1 -0
  60. package/build/assets/{environment-switch-overlay-BmBRT7gv.js → environment-switch-overlay-P2ZAuzov.js} +1 -1
  61. package/build/assets/{error-state-Body8Ngd.js → error-state-B_5cgNPJ.js} +1 -1
  62. package/build/assets/extensions-hub-DsaUr4ca.js +1 -0
  63. package/build/assets/extensions-navigation-CRMZd-FE.js +1 -0
  64. package/build/assets/external-link-DQtv7eTh.js +1 -0
  65. package/build/assets/files-tab-CCgAcVdc.js +1 -0
  66. package/build/assets/{form-control-classes-Bkh5FGrD.js → form-control-classes-B-z85REi.js} +1 -1
  67. package/build/assets/get-git-path-EHrSDxTM.js +1 -0
  68. package/build/assets/git-repo-dropdown-D2WEQ97X.js +1 -0
  69. package/build/assets/{git-repo-dropdown-4ROKl2cB.js → git-repo-dropdown-DVeCUUXG.js} +1 -1
  70. package/build/assets/{highlighted-source-view-BFRxGT_Q.js → highlighted-source-view-DjHO3SdW.js} +1 -1
  71. package/build/assets/home-BorS_vdS.js +1 -0
  72. package/build/assets/home-aIMbHw5M.js +1 -0
  73. package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +1 -0
  74. package/build/assets/home-store-DyXz0w6d.js +1 -0
  75. package/build/assets/hooks-service-C6dpRtZM.js +1 -0
  76. package/build/assets/index-home-zKFuKK2B.js +1 -0
  77. package/build/assets/info-CTIdjttz.js +1 -0
  78. package/build/assets/install-server-modal-DUiZMc8u.js +1 -0
  79. package/build/assets/kebab-menu-item-content-mm04SBD3.js +1 -0
  80. package/build/assets/{key-BmVyxs-2.js → key-CfXbJa8w.js} +1 -1
  81. package/build/assets/{launch-IrTDEFCs.js → launch-BSIf9KEg.js} +1 -1
  82. package/build/assets/list-filter-CNpqTWVY.js +1 -0
  83. package/build/assets/{list-todo-apgLVjMw.js → list-todo-ByXMdY4W.js} +1 -1
  84. package/build/assets/llm-not-configured-banner-z_QRSeV0.js +27 -0
  85. package/build/assets/llm-settings-B-5AHMiX.js +1 -0
  86. package/build/assets/llm-settings-B3SjHDmA.js +1 -0
  87. package/build/assets/llm-subscription-service-aDNBQ7Gq.js +1 -0
  88. package/build/assets/loader-circle-Dex47vVW.js +1 -0
  89. package/build/assets/{loading-spinner-BY9N3pOe.js → loading-spinner-DfHI77BA.js} +1 -1
  90. package/build/assets/manage-backends-modal-q1NdFisr.js +1 -0
  91. package/build/assets/manifest-8920b615.js +1 -0
  92. package/build/assets/{manifest-subpage-layout-CAOYzrYp.js → manifest-subpage-layout-BQQy5ipR.js} +1 -1
  93. package/build/assets/{map-provider-Cu3Zgumb.js → map-provider-DXvssjw9.js} +1 -1
  94. package/build/assets/markdown-renderer-rivLvYh-.js +8 -0
  95. package/build/assets/{mcp-BTs_SXfZ.js → mcp-CEXDhQWn.js} +1 -1
  96. package/build/assets/{mcp-marketplace-utils-AIBzzHTO.js → mcp-marketplace-utils-Cn_NIMWM.js} +1 -1
  97. package/build/assets/mcp-page-LGYIICMG.js +9 -0
  98. package/build/assets/messages-DUSeANAh.js +41 -0
  99. package/build/assets/{modal-body-BxZjsju9.js → modal-body-DJw4xBki.js} +1 -1
  100. package/build/assets/{modal-classes-C8eycCwG.js → modal-classes-Dg0ngBPO.js} +1 -1
  101. package/build/assets/{modal-close-button-DDzdRvCs.js → modal-close-button-B9j4nasm.js} +1 -1
  102. package/build/assets/{mouse-pointer-click-Co2uyaPA.js → mouse-pointer-click-DEhsSUpu.js} +1 -1
  103. package/build/assets/onboarding-BjFebfs5.js +1 -0
  104. package/build/assets/onboarding-modal-DDTjOpyd.js +1 -0
  105. package/build/assets/organization-service.api-Cyg1Tn03.js +1 -0
  106. package/build/assets/pencil-D5c47kyN.js +1 -0
  107. package/build/assets/pin-C7vMagvf.js +1 -0
  108. package/build/assets/planner-tab-D8f2Y3rn.js +1 -0
  109. package/build/assets/plug-CeaqeF6u.js +1 -0
  110. package/build/assets/plugins-management-service-Bh_pBuf-.js +1 -0
  111. package/build/assets/plus-B3wvU06-.js +1 -0
  112. package/build/assets/profiles-service.api-BbOK0EkF.js +1 -0
  113. package/build/assets/{providers-BhMcY5nv.js → providers-2gIIkz2N.js} +1 -1
  114. package/build/assets/proxy-CBgMd2zf.js +1 -0
  115. package/build/assets/{puzzle-JM_QaRm0.js → puzzle-DdAqbUrb.js} +1 -1
  116. package/build/assets/recommended-automations-launcher-YLAQTp4s.js +1 -0
  117. package/build/assets/refresh-cw-DEQdPCpH.js +1 -0
  118. package/build/assets/root-Bye_XmEL.js +2 -0
  119. package/build/assets/root-Cnwwzgo0.css +1 -0
  120. package/build/assets/root-layout-CSAwxBGM.js +2 -0
  121. package/build/assets/schema-field-CK0xYNbO.js +1 -0
  122. package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
  123. package/build/assets/sdk-section-page-Da73Rs_o.js +1 -0
  124. package/build/assets/secret-form-CB2VwYYg.js +1 -0
  125. package/build/assets/secrets-service-Cr8g8xuv.js +1 -0
  126. package/build/assets/{secrets-settings-B_GpxKW2.js → secrets-settings-Bh0udeKv.js} +1 -1
  127. package/build/assets/settings-DmyIgRxO.js +1 -0
  128. package/build/assets/{settings-dropdown-input-BcwylHs2.js → settings-dropdown-input-DVpyD87C.js} +1 -1
  129. package/build/assets/settings-index-BSJUFmjE.js +1 -0
  130. package/build/assets/{settings-input-Db-1g8Ql.js → settings-input-C0dd8Utu.js} +1 -1
  131. package/build/assets/{settings-list-classes-BzeSZbF2.js → settings-list-classes-Ds4jPBHK.js} +1 -1
  132. package/build/assets/{settings-modal-DfJ3tcJQ.js → settings-modal-yStgEh2o.js} +1 -1
  133. package/build/assets/settings-service.api-9_xdv_mh.js +1 -0
  134. package/build/assets/{settings-switch-CS-dJDmA.js → settings-switch-B78Khmyz.js} +1 -1
  135. package/build/assets/{settings-utils-UYpEdPuD.js → settings-utils-8GIIgOQL.js} +1 -1
  136. package/build/assets/shared-conversation-DM96X4KV.js +1 -0
  137. package/build/assets/shield-check-DO7wa_eu.js +1 -0
  138. package/build/assets/{sidebar-layout-D6fS8-Gl.js → sidebar-layout-EPfWxk11.js} +1 -1
  139. package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +1 -0
  140. package/build/assets/{sidebar-nav-link-DQQcMf1A.js → sidebar-nav-link-_t4_Ef-9.js} +1 -1
  141. package/build/assets/{sidebar-onboarding-checklist-storage-BBkeI6Bp.js → sidebar-onboarding-checklist-storage-DbDX-Wvj.js} +1 -1
  142. package/build/assets/{sidebar-store-DGqHkVLw.js → sidebar-store-CSDFK0W5.js} +1 -1
  143. package/build/assets/{skill-card-pill-row-B27-xyig.js → skill-card-pill-row-989y15jV.js} +1 -1
  144. package/build/assets/{skill-filter-w__3UCEE.js → skill-filter-BBeZ4JEP.js} +1 -1
  145. package/build/assets/{skill-icon-badge-RQkq8wvl.js → skill-icon-badge-BDhQ-tQ0.js} +1 -1
  146. package/build/assets/skill-scope-Dz3kPH3P.js +1 -0
  147. package/build/assets/skills-plugins-e3CYGdUJ.js +1 -0
  148. package/build/assets/skills-settings-3e-FuHw_.js +1 -0
  149. package/build/assets/styled-tooltip-Pd22BIvr.js +1 -0
  150. package/build/assets/{task-list-tab-C5zcaktH.js → task-list-tab-3Jg8ywch.js} +1 -1
  151. package/build/assets/{terminal-CNElN42a.js → terminal-onXx0_Qz.js} +2 -2
  152. package/build/assets/toggle-switch-lwQtxDcm.js +1 -0
  153. package/build/assets/trash-2-ZhKuTLiz.js +1 -0
  154. package/build/assets/trash-B6OIe4yX.js +1 -0
  155. package/build/assets/triangle-alert-BajLPpQg.js +1 -0
  156. package/build/assets/{typography-v1KN0tzi.js → typography-HLLg_FAn.js} +1 -1
  157. package/build/assets/usage-tab-Cm-9j3UK.js +1 -0
  158. package/build/assets/use-acp-credential-form-BARcvjYE.js +1 -0
  159. package/build/assets/use-activate-agent-profile-BLKML6vQ.js +1 -0
  160. package/build/assets/use-agent-profiles-1P91KSXz.js +1 -0
  161. package/build/assets/{use-automation-health-E6NZi9rb.js → use-automation-health-BZkQNEA8.js} +1 -1
  162. package/build/assets/use-automation-permissions-B_RpvL-s.js +1 -0
  163. package/build/assets/{use-automations-xijQKIl9.js → use-automations-Cg0PDIZr.js} +1 -1
  164. package/build/assets/{use-can-manage-org-profiles-CrJP5262.js → use-can-manage-org-profiles-BbN6KfDr.js} +1 -1
  165. package/build/assets/use-canvas-extensions-CFUpHat6.js +1 -0
  166. package/build/assets/{use-cloud-current-user-id-CDfAHpPX.js → use-cloud-current-user-id-Dk0rjr63.js} +1 -1
  167. package/build/assets/use-config-DpafU_QP.js +1 -0
  168. package/build/assets/use-create-conversation-1YgmAHt-.js +1 -0
  169. package/build/assets/use-create-secret-D8p9ybQj.js +1 -0
  170. package/build/assets/{use-get-secrets-K3jmk-LH.js → use-get-secrets-CQ4b0qK8.js} +1 -1
  171. package/build/assets/use-is-authed-BRPjCRKM.js +1 -0
  172. package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-DeYa1tFM.js} +1 -1
  173. package/build/assets/use-llm-configured-DGm8FiRR.js +1 -0
  174. package/build/assets/use-llm-profiles-BTTtpW4z.js +1 -0
  175. package/build/assets/use-manifest-capabilities-AOWGcu0j.js +1 -0
  176. package/build/assets/use-onboarding-completion-CoINurkm.js +1 -0
  177. package/build/assets/use-pinned-home-route-D6krwXjy.js +1 -0
  178. package/build/assets/use-plugins-marketplace-mLsIDhBv.js +1 -0
  179. package/build/assets/use-save-agent-profile-CxyO9YG-.js +1 -0
  180. package/build/assets/{use-save-settings-DYqkKv7T.js → use-save-settings-3U5K9-8x.js} +1 -1
  181. package/build/assets/use-settings-Dn00UISA.js +1 -0
  182. package/build/assets/use-settings-nav-items-vrjxTqcu.js +16 -0
  183. package/build/assets/use-tracking-B9prBsrq.js +3 -0
  184. package/build/assets/{use-user-conversation-B9Gebw_g.js → use-user-conversation-ZWlXtbZb.js} +1 -1
  185. package/build/assets/{useInfiniteQuery-C926xzY4.js → useInfiniteQuery-BzrRqjLg.js} +1 -1
  186. package/build/assets/{useMutation-B-qc391N.js → useMutation-CJuK90oc.js} +1 -1
  187. package/build/assets/{useQueries-DlbhlH9I.js → useQueries-CykmpT-a.js} +1 -1
  188. package/build/assets/{useQuery-BSTgq1rl.js → useQuery-S6j94er1.js} +1 -1
  189. package/build/assets/utils-BOco8mxR.js +1 -0
  190. package/build/assets/{vendor~conversation-panel~conversation-C8Fn4XOf.js → vendor~conversation-panel~conversation-4eJ0tml3.js} +1 -1
  191. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
  192. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +185 -0
  193. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js} +1 -1
  194. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js → vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js} +1 -1
  195. package/build/assets/vendor~root-layout-n8XCEXG8.js +1 -0
  196. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js → vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js} +1 -1
  197. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js} +1 -1
  198. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js → vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js} +1 -1
  199. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
  200. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~nj1hli3r-DP9wmsjo.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +1 -1
  201. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +1 -0
  202. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js} +12 -6
  203. package/build/assets/{verification-settings-gw_q6vkL.js → verification-settings-u2POabjH.js} +1 -1
  204. package/build/assets/{wrench-CUEI1krB.js → wrench-CkgI4rxA.js} +1 -1
  205. package/build/assets/x-By6qCmtY.js +1 -0
  206. package/build/index.html +4 -4
  207. package/build/locales/ar/openhands.json +73 -20
  208. package/build/locales/ca/openhands.json +73 -20
  209. package/build/locales/de/openhands.json +73 -20
  210. package/build/locales/en/openhands.json +73 -20
  211. package/build/locales/es/openhands.json +73 -20
  212. package/build/locales/fr/openhands.json +73 -20
  213. package/build/locales/it/openhands.json +73 -20
  214. package/build/locales/ja/openhands.json +73 -20
  215. package/build/locales/ko-KR/openhands.json +73 -20
  216. package/build/locales/no/openhands.json +73 -20
  217. package/build/locales/pt/openhands.json +73 -20
  218. package/build/locales/tr/openhands.json +73 -20
  219. package/build/locales/uk/openhands.json +73 -20
  220. package/build/locales/zh-CN/openhands.json +73 -20
  221. package/build/locales/zh-TW/openhands.json +73 -20
  222. package/config/defaults.json +3 -3
  223. package/dist/api/agent-server-adapter.cjs +3 -3
  224. package/dist/api/agent-server-adapter.cjs.map +1 -1
  225. package/dist/api/agent-server-adapter.d.ts +72 -12
  226. package/dist/api/agent-server-adapter.js +234 -132
  227. package/dist/api/agent-server-adapter.js.map +1 -1
  228. package/dist/api/agent-server-config.cjs +1 -1
  229. package/dist/api/agent-server-config.cjs.map +1 -1
  230. package/dist/api/agent-server-config.d.ts +6 -0
  231. package/dist/api/agent-server-config.js +6 -3
  232. package/dist/api/agent-server-config.js.map +1 -1
  233. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  234. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  235. package/dist/api/automation-service/automation-service.api.d.ts +2 -2
  236. package/dist/api/automation-service/automation-service.api.js +7 -7
  237. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  238. package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
  239. package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
  240. package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
  241. package/dist/api/cloud/provider-connections-service.api.js +50 -0
  242. package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
  243. package/dist/api/cloud/skills-service.api.cjs +1 -1
  244. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  245. package/dist/api/cloud/skills-service.api.d.ts +10 -0
  246. package/dist/api/cloud/skills-service.api.js +11 -1
  247. package/dist/api/cloud/skills-service.api.js.map +1 -1
  248. package/dist/api/conversation-metadata-store.cjs +1 -1
  249. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  250. package/dist/api/conversation-metadata-store.d.ts +24 -0
  251. package/dist/api/conversation-metadata-store.js +10 -2
  252. package/dist/api/conversation-metadata-store.js.map +1 -1
  253. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  254. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  255. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +20 -0
  256. package/dist/api/conversation-service/agent-server-conversation-service.api.js +126 -77
  257. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  258. package/dist/api/hooks-service.cjs +2 -0
  259. package/dist/api/hooks-service.cjs.map +1 -0
  260. package/dist/api/hooks-service.d.ts +13 -0
  261. package/dist/api/hooks-service.js +20 -0
  262. package/dist/api/hooks-service.js.map +1 -0
  263. package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
  264. package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
  265. package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
  266. package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -1
  267. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  268. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  269. package/dist/api/settings-service/settings-service.api.d.ts +2 -0
  270. package/dist/api/settings-service/settings-service.api.js +18 -10
  271. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  272. package/dist/api/skills-service.cjs +1 -1
  273. package/dist/api/skills-service.cjs.map +1 -1
  274. package/dist/api/skills-service.d.ts +7 -0
  275. package/dist/api/skills-service.js +11 -8
  276. package/dist/api/skills-service.js.map +1 -1
  277. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
  278. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
  279. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
  280. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
  281. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
  282. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
  283. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  284. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  285. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  286. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
  287. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  288. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
  289. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
  290. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
  291. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js.map +1 -1
  292. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  293. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  294. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +1 -1
  295. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
  296. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  297. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  298. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  299. package/dist/components/conversation-events/chat/event-message.js +79 -70
  300. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  301. package/dist/components/conversation-events/chat/messages.cjs +1 -1
  302. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  303. package/dist/components/conversation-events/chat/messages.js +28 -27
  304. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  305. package/dist/components/features/automations/automation-card.cjs +1 -1
  306. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  307. package/dist/components/features/automations/automation-card.js +100 -94
  308. package/dist/components/features/automations/automation-card.js.map +1 -1
  309. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  310. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  311. package/dist/components/features/automations/automation-list-row.js +88 -77
  312. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  313. package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
  314. package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
  315. package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
  316. package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
  317. package/dist/components/features/automations/detail/run-status-badge.js +82 -53
  318. package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
  319. package/dist/components/features/automations/kebab-menu.cjs +1 -1
  320. package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
  321. package/dist/components/features/automations/kebab-menu.js +9 -5
  322. package/dist/components/features/automations/kebab-menu.js.map +1 -1
  323. package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
  324. package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
  325. package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
  326. package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
  327. package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
  328. package/dist/components/features/automations/recommended-automations-section.js +9 -9
  329. package/dist/components/features/backends/backend-selector.cjs +1 -1
  330. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  331. package/dist/components/features/backends/backend-selector.js +133 -122
  332. package/dist/components/features/backends/backend-selector.js.map +1 -1
  333. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  334. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  335. package/dist/components/features/backends/manage-backends-modal.js +29 -29
  336. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  337. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  338. package/dist/components/features/chat/change-agent-button.js +4 -4
  339. package/dist/components/features/chat/chat-interface.cjs +2 -2
  340. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  341. package/dist/components/features/chat/chat-interface.js +137 -137
  342. package/dist/components/features/chat/chat-interface.js.map +1 -1
  343. package/dist/components/features/chat/chat-message.cjs +1 -1
  344. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  345. package/dist/components/features/chat/chat-message.d.ts +2 -1
  346. package/dist/components/features/chat/chat-message.js +88 -79
  347. package/dist/components/features/chat/chat-message.js.map +1 -1
  348. package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
  349. package/dist/components/features/chat/components/context-window-meter.js +4 -4
  350. package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
  351. package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
  352. package/dist/components/features/chat/generic-event-message.cjs +1 -1
  353. package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
  354. package/dist/components/features/chat/generic-event-message.d.ts +2 -1
  355. package/dist/components/features/chat/generic-event-message.js +41 -22
  356. package/dist/components/features/chat/generic-event-message.js.map +1 -1
  357. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  358. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  359. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  360. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  361. package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
  362. package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
  363. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
  364. package/dist/components/features/conversation/conversation-overview-skills-panel.js +4 -4
  365. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  366. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  367. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +77 -78
  368. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  369. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  370. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  371. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +88 -88
  372. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  373. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
  374. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
  375. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
  376. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
  377. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
  378. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
  379. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
  380. package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
  381. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
  382. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
  383. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  384. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  385. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
  386. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
  387. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  388. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  389. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  390. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +2 -1
  391. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
  392. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  393. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  394. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  395. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
  396. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  397. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  398. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  399. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
  400. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
  401. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  402. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
  403. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
  404. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
  405. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
  406. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
  407. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
  408. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
  409. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
  410. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
  411. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
  412. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
  413. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
  414. package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
  415. package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
  416. package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
  417. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  418. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  419. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +37 -0
  420. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
  421. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  422. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  423. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  424. package/dist/components/features/conversation-panel/conversation-panel.js +296 -290
  425. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  426. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
  427. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
  428. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
  429. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
  430. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
  431. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
  432. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
  433. package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
  434. package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
  435. package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
  436. package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
  437. package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
  438. package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
  439. package/dist/components/features/conversation-panel/menu-row.js +27 -16
  440. package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
  441. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
  442. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
  443. package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
  444. package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
  445. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
  446. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
  447. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
  448. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
  449. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
  450. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
  451. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
  452. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
  453. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
  454. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
  455. package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
  456. package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
  457. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
  458. package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
  459. package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
  460. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
  461. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  462. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  463. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
  464. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +42 -42
  465. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  466. package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
  467. package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
  468. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  469. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  470. package/dist/components/features/settings/cloud-settings-link.js +5 -3
  471. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  472. package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
  473. package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
  474. package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
  475. package/dist/components/features/settings/integrations-settings-link.js +20 -17
  476. package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
  477. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  478. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
  479. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
  480. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  481. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
  482. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
  483. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
  484. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  485. package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
  486. package/dist/components/features/settings/secrets-settings/secret-form.cjs.map +1 -1
  487. package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
  488. package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
  489. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  490. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  491. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  492. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  493. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +3 -1
  494. package/dist/components/features/sidebar/sidebar-rail-body.js +156 -139
  495. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  496. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  497. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  498. package/dist/components/features/sidebar/sidebar.js +44 -43
  499. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  500. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
  501. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
  502. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  503. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  504. package/dist/components/features/skills/extensions-navigation.js +3 -3
  505. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  506. package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
  507. package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
  508. package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
  509. package/dist/components/shared/buttons/styled-tooltip.js +2 -1
  510. package/dist/components/shared/buttons/styled-tooltip.js.map +1 -1
  511. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  512. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  513. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +5 -1
  514. package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
  515. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  516. package/dist/components/shared/modals/confirmation-modal.cjs +1 -1
  517. package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
  518. package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
  519. package/dist/components/shared/modals/confirmation-modal.js +8 -8
  520. package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
  521. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  522. package/dist/components/shared/modals/settings/model-selector.js +27 -27
  523. package/dist/config/defaults.cjs +1 -1
  524. package/dist/config/defaults.cjs.map +1 -1
  525. package/dist/config/defaults.js +3 -3
  526. package/dist/config/defaults.js.map +1 -1
  527. package/dist/constants/settings-nav.d.ts +8 -0
  528. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  529. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  530. package/dist/contexts/conversation-websocket-context.d.ts +5 -0
  531. package/dist/contexts/conversation-websocket-context.js +194 -198
  532. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  533. package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
  534. package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
  535. package/dist/contexts/websocket-provider-wrapper.js +31 -15
  536. package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
  537. package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
  538. package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
  539. package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
  540. package/dist/hooks/chat/record-model-switch-message.js +25 -12
  541. package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
  542. package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
  543. package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
  544. package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
  545. package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
  546. package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -0
  547. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  548. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  549. package/dist/hooks/mutation/use-create-conversation.js +5 -1
  550. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  551. package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
  552. package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
  553. package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
  554. package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
  555. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  556. package/dist/hooks/mutation/use-save-settings.js +3 -3
  557. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  558. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  559. package/dist/hooks/mutation/use-switch-llm-profile.js +13 -25
  560. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  561. package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
  562. package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
  563. package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
  564. package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
  565. package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
  566. package/dist/hooks/query/query-keys.cjs +1 -1
  567. package/dist/hooks/query/query-keys.cjs.map +1 -1
  568. package/dist/hooks/query/query-keys.d.ts +6 -0
  569. package/dist/hooks/query/query-keys.js +2 -2
  570. package/dist/hooks/query/query-keys.js.map +1 -1
  571. package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
  572. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
  573. package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
  574. package/dist/hooks/query/use-automation-sdk-version.js +30 -55
  575. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
  576. package/dist/hooks/query/use-conversation-skills.cjs +1 -1
  577. package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
  578. package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
  579. package/dist/hooks/query/use-conversation-skills.js +20 -4
  580. package/dist/hooks/query/use-conversation-skills.js.map +1 -1
  581. package/dist/hooks/query/use-provider-connections.cjs +1 -1
  582. package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
  583. package/dist/hooks/query/use-provider-connections.d.ts +6 -3
  584. package/dist/hooks/query/use-provider-connections.js +7 -3
  585. package/dist/hooks/query/use-provider-connections.js.map +1 -1
  586. package/dist/hooks/query/use-sub-conversations.cjs +1 -1
  587. package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
  588. package/dist/hooks/query/use-sub-conversations.js +16 -16
  589. package/dist/hooks/query/use-sub-conversations.js.map +1 -1
  590. package/dist/hooks/use-acp-model-context.cjs +1 -1
  591. package/dist/hooks/use-acp-model-context.js +3 -3
  592. package/dist/hooks/use-agent-state.cjs +1 -1
  593. package/dist/hooks/use-agent-state.cjs.map +1 -1
  594. package/dist/hooks/use-agent-state.d.ts +17 -1
  595. package/dist/hooks/use-agent-state.js +19 -9
  596. package/dist/hooks/use-agent-state.js.map +1 -1
  597. package/dist/hooks/use-automation-permissions.cjs +2 -0
  598. package/dist/hooks/use-automation-permissions.cjs.map +1 -0
  599. package/dist/hooks/use-automation-permissions.d.ts +43 -0
  600. package/dist/hooks/use-automation-permissions.js +52 -0
  601. package/dist/hooks/use-automation-permissions.js.map +1 -0
  602. package/dist/hooks/use-chat-input-model-state.cjs +1 -1
  603. package/dist/hooks/use-chat-input-model-state.js +3 -3
  604. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  605. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  606. package/dist/hooks/use-handle-plan-click.d.ts +3 -1
  607. package/dist/hooks/use-handle-plan-click.js +85 -26
  608. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  609. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  610. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  611. package/dist/hooks/use-home-automation-actions.js +1 -0
  612. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  613. package/dist/hooks/use-llm-configured.cjs +1 -1
  614. package/dist/hooks/use-llm-configured.js +3 -3
  615. package/dist/hooks/use-manifest-preflight.d.ts +1 -1
  616. package/dist/hooks/use-unified-websocket-status.cjs +1 -1
  617. package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
  618. package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
  619. package/dist/hooks/use-unified-websocket-status.js +5 -1
  620. package/dist/hooks/use-unified-websocket-status.js.map +1 -1
  621. package/dist/i18n/declaration.cjs +1 -1
  622. package/dist/i18n/declaration.cjs.map +1 -1
  623. package/dist/i18n/declaration.d.ts +65 -12
  624. package/dist/i18n/declaration.js +1 -1
  625. package/dist/i18n/declaration.js.map +1 -1
  626. package/dist/i18n/translation.cjs +2 -2
  627. package/dist/i18n/translation.cjs.map +1 -1
  628. package/dist/i18n/translation.js +1196 -295
  629. package/dist/i18n/translation.js.map +1 -1
  630. package/dist/locales/ar/openhands.json +73 -20
  631. package/dist/locales/ca/openhands.json +73 -20
  632. package/dist/locales/de/openhands.json +73 -20
  633. package/dist/locales/en/openhands.json +73 -20
  634. package/dist/locales/es/openhands.json +73 -20
  635. package/dist/locales/fr/openhands.json +73 -20
  636. package/dist/locales/it/openhands.json +73 -20
  637. package/dist/locales/ja/openhands.json +73 -20
  638. package/dist/locales/ko-KR/openhands.json +73 -20
  639. package/dist/locales/no/openhands.json +73 -20
  640. package/dist/locales/pt/openhands.json +73 -20
  641. package/dist/locales/tr/openhands.json +73 -20
  642. package/dist/locales/uk/openhands.json +73 -20
  643. package/dist/locales/zh-CN/openhands.json +73 -20
  644. package/dist/locales/zh-TW/openhands.json +73 -20
  645. package/dist/manifests/automation-insights.cjs.map +1 -1
  646. package/dist/manifests/automation-insights.d.ts +10 -2
  647. package/dist/manifests/automation-insights.js.map +1 -1
  648. package/dist/manifests/automation-setup.cjs +1 -1
  649. package/dist/manifests/automation-setup.cjs.map +1 -1
  650. package/dist/manifests/automation-setup.d.ts +9 -16
  651. package/dist/manifests/automation-setup.js +17 -7
  652. package/dist/manifests/automation-setup.js.map +1 -1
  653. package/dist/manifests/manifest-actions.d.ts +1 -1
  654. package/dist/manifests/manifest-capabilities.d.ts +3 -1
  655. package/dist/manifests/manifest-local-validation.cjs +2 -0
  656. package/dist/manifests/manifest-local-validation.cjs.map +1 -0
  657. package/dist/manifests/manifest-local-validation.d.ts +15 -11
  658. package/dist/manifests/manifest-local-validation.js +8 -0
  659. package/dist/manifests/manifest-local-validation.js.map +1 -0
  660. package/dist/manifests/manifest-template.cjs +2 -0
  661. package/dist/manifests/manifest-template.cjs.map +1 -0
  662. package/dist/manifests/manifest-template.d.ts +4 -4
  663. package/dist/manifests/manifest-template.js +12 -0
  664. package/dist/manifests/manifest-template.js.map +1 -0
  665. package/dist/manifests/manifest-validation.cjs +1 -1
  666. package/dist/manifests/manifest-validation.cjs.map +1 -1
  667. package/dist/manifests/manifest-validation.js +106 -28
  668. package/dist/manifests/manifest-validation.js.map +1 -1
  669. package/dist/manifests/types.cjs.map +1 -1
  670. package/dist/manifests/types.d.ts +39 -4
  671. package/dist/manifests/types.js.map +1 -1
  672. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
  673. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
  674. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
  675. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
  676. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -1
  677. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
  678. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +1 -1
  679. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
  680. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -1
  681. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  682. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +1 -1
  683. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  684. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +1 -1
  685. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -1
  686. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +1 -1
  687. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -1
  688. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  689. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  690. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +22 -20
  691. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  692. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  693. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  694. package/dist/node_modules/@openhands/extensions/automations/interface.js +2 -1
  695. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  696. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +1 -1
  697. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -1
  698. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +24 -5
  699. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -1
  700. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
  701. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
  702. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
  703. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
  704. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
  705. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
  706. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
  707. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
  708. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
  709. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
  710. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
  711. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
  712. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
  713. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
  714. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
  715. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
  716. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
  717. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
  718. package/dist/package.cjs +1 -1
  719. package/dist/package.cjs.map +1 -1
  720. package/dist/package.js +4 -4
  721. package/dist/package.js.map +1 -1
  722. package/dist/routes/agent-settings.d.ts +2 -0
  723. package/dist/routes/app-settings.cjs +1 -1
  724. package/dist/routes/app-settings.js +5 -5
  725. package/dist/routes/llm-settings.cjs +1 -1
  726. package/dist/routes/llm-settings.cjs.map +1 -1
  727. package/dist/routes/llm-settings.d.ts +3 -1
  728. package/dist/routes/llm-settings.js +88 -87
  729. package/dist/routes/llm-settings.js.map +1 -1
  730. package/dist/routes/planner-tab.cjs +1 -1
  731. package/dist/routes/planner-tab.cjs.map +1 -1
  732. package/dist/routes/planner-tab.js +44 -28
  733. package/dist/routes/planner-tab.js.map +1 -1
  734. package/dist/services/telemetry.cjs +1 -1
  735. package/dist/services/telemetry.cjs.map +1 -1
  736. package/dist/services/telemetry.d.ts +5 -0
  737. package/dist/services/telemetry.js +122 -115
  738. package/dist/services/telemetry.js.map +1 -1
  739. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  740. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  741. package/dist/stores/conversation-panel-preferences-store.d.ts +32 -5
  742. package/dist/stores/conversation-panel-preferences-store.js +29 -12
  743. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  744. package/dist/stores/conversation-state-store.cjs +1 -1
  745. package/dist/stores/conversation-state-store.cjs.map +1 -1
  746. package/dist/stores/conversation-state-store.d.ts +9 -3
  747. package/dist/stores/conversation-state-store.js +6 -3
  748. package/dist/stores/conversation-state-store.js.map +1 -1
  749. package/dist/stores/conversation-store.cjs +1 -1
  750. package/dist/stores/conversation-store.cjs.map +1 -1
  751. package/dist/stores/conversation-store.d.ts +2 -0
  752. package/dist/stores/conversation-store.js +3 -0
  753. package/dist/stores/conversation-store.js.map +1 -1
  754. package/dist/stores/model-store.cjs +1 -1
  755. package/dist/stores/model-store.cjs.map +1 -1
  756. package/dist/stores/model-store.d.ts +7 -0
  757. package/dist/stores/model-store.js +4 -0
  758. package/dist/stores/model-store.js.map +1 -1
  759. package/dist/types/automation.cjs.map +1 -1
  760. package/dist/types/automation.d.ts +46 -1
  761. package/dist/types/automation.js.map +1 -1
  762. package/dist/ui/context-menu.d.ts +1 -1
  763. package/dist/ui/toggle-switch.cjs +1 -1
  764. package/dist/ui/toggle-switch.cjs.map +1 -1
  765. package/dist/ui/toggle-switch.d.ts +4 -1
  766. package/dist/ui/toggle-switch.js +4 -3
  767. package/dist/ui/toggle-switch.js.map +1 -1
  768. package/dist/utils/automation-catalog.cjs +1 -1
  769. package/dist/utils/automation-catalog.cjs.map +1 -1
  770. package/dist/utils/automation-catalog.d.ts +12 -1
  771. package/dist/utils/automation-catalog.js +42 -12
  772. package/dist/utils/automation-catalog.js.map +1 -1
  773. package/dist/utils/automation-run-display.cjs +2 -0
  774. package/dist/utils/automation-run-display.cjs.map +1 -0
  775. package/dist/utils/automation-run-display.d.ts +20 -0
  776. package/dist/utils/automation-run-display.js +85 -0
  777. package/dist/utils/automation-run-display.js.map +1 -0
  778. package/dist/utils/automation-schedule.cjs +1 -1
  779. package/dist/utils/automation-schedule.cjs.map +1 -1
  780. package/dist/utils/automation-schedule.d.ts +16 -0
  781. package/dist/utils/automation-schedule.js +2 -0
  782. package/dist/utils/automation-schedule.js.map +1 -1
  783. package/dist/utils/constants.cjs +1 -1
  784. package/dist/utils/constants.cjs.map +1 -1
  785. package/dist/utils/constants.d.ts +4 -0
  786. package/dist/utils/constants.js +23 -3
  787. package/dist/utils/constants.js.map +1 -1
  788. package/dist/utils/format-event-timestamp.cjs +2 -0
  789. package/dist/utils/format-event-timestamp.cjs.map +1 -0
  790. package/dist/utils/format-event-timestamp.d.ts +1 -0
  791. package/dist/utils/format-event-timestamp.js +13 -0
  792. package/dist/utils/format-event-timestamp.js.map +1 -0
  793. package/dist/utils/git-diff-stats.cjs +2 -2
  794. package/dist/utils/git-diff-stats.cjs.map +1 -1
  795. package/dist/utils/git-diff-stats.d.ts +4 -0
  796. package/dist/utils/git-diff-stats.js +12 -2
  797. package/dist/utils/git-diff-stats.js.map +1 -1
  798. package/dist/utils/plan-file.cjs +4 -0
  799. package/dist/utils/plan-file.cjs.map +1 -0
  800. package/dist/utils/plan-file.d.ts +18 -0
  801. package/dist/utils/plan-file.js +58 -0
  802. package/dist/utils/plan-file.js.map +1 -0
  803. package/dist/utils/recommended-automation-rail.cjs +1 -1
  804. package/dist/utils/recommended-automation-rail.cjs.map +1 -1
  805. package/dist/utils/recommended-automation-rail.js +1 -0
  806. package/dist/utils/recommended-automation-rail.js.map +1 -1
  807. package/dist/utils/scroll-fade-state.cjs +1 -1
  808. package/dist/utils/scroll-fade-state.cjs.map +1 -1
  809. package/dist/utils/scroll-fade-state.d.ts +6 -0
  810. package/dist/utils/scroll-fade-state.js +8 -1
  811. package/dist/utils/scroll-fade-state.js.map +1 -1
  812. package/dist/utils/sdk-settings-schema.cjs +1 -1
  813. package/dist/utils/sdk-settings-schema.cjs.map +1 -1
  814. package/dist/utils/sdk-settings-schema.d.ts +1 -0
  815. package/dist/utils/sdk-settings-schema.js +25 -22
  816. package/dist/utils/sdk-settings-schema.js.map +1 -1
  817. package/dist/utils/utils.cjs +1 -1
  818. package/dist/utils/utils.cjs.map +1 -1
  819. package/dist/utils/utils.js +11 -11
  820. package/dist/utils/utils.js.map +1 -1
  821. package/package.json +4 -4
  822. package/scripts/check-sdk-version-sync.mjs +6 -6
  823. package/scripts/dev-safe.mjs +1 -1
  824. package/scripts/dev-with-automation.mjs +1 -1
  825. package/scripts/static-server.mjs +33 -1
  826. package/build/assets/active-backend-context-CrHTlgvN.js +0 -2
  827. package/build/assets/agent-profiles-settings-Dzgb7G9z.js +0 -1
  828. package/build/assets/agent-server-conversation-service.api-tnqNjbpE.js +0 -86
  829. package/build/assets/agent-settings-DLtsqaOs.js +0 -2
  830. package/build/assets/agent-settings-fFvR-XC2.js +0 -1
  831. package/build/assets/api-key-entry-screen-qTzrmJcr.js +0 -1
  832. package/build/assets/automation-detail-BmwlCUAB.js +0 -3
  833. package/build/assets/automation-git-sync-CprN5DcU.js +0 -1
  834. package/build/assets/automation-setup-route-C40kXjMY.js +0 -1
  835. package/build/assets/automations-list-DuNcRawl.js +0 -1
  836. package/build/assets/backend-form-modal-lhGwzXFI.js +0 -1
  837. package/build/assets/bot-dMYHVfYM.js +0 -1
  838. package/build/assets/canvas-extensions-8A-XhpgP.js +0 -1
  839. package/build/assets/check-CS0vmpQQ.js +0 -1
  840. package/build/assets/chevron-down-e1QBpjVy.js +0 -1
  841. package/build/assets/chevron-right-ZG4R5G4Q.js +0 -1
  842. package/build/assets/circle-check-DzWLNsbE.js +0 -1
  843. package/build/assets/command-menu--UIlGL72.js +0 -1
  844. package/build/assets/commits-tab-AnZwLvh-.js +0 -1
  845. package/build/assets/confirmation-modal-Dv1ktp8K.js +0 -1
  846. package/build/assets/conversation-BbGrAO4Z.js +0 -93
  847. package/build/assets/conversation-mYT6NAoj.js +0 -1
  848. package/build/assets/conversation-panel-mYT6NAoj.js +0 -1
  849. package/build/assets/edit-automation-modal-DadGbJ2u.js +0 -1
  850. package/build/assets/empty-state-BoGVDecT.js +0 -1
  851. package/build/assets/enum-filter-dropdown-Bgca129f.js +0 -1
  852. package/build/assets/extensions-hub-CcDqq_vR.js +0 -1
  853. package/build/assets/extensions-navigation-Cr4yzYk4.js +0 -1
  854. package/build/assets/external-link-DKUlnCQV.js +0 -1
  855. package/build/assets/files-tab-D4o2VyE_.js +0 -1
  856. package/build/assets/get-git-path-ChKDVHZp.js +0 -1
  857. package/build/assets/git-repo-dropdown-BkqzkMmM.js +0 -1
  858. package/build/assets/home-ChpSuepX.js +0 -1
  859. package/build/assets/home-DIsB440S.js +0 -1
  860. package/build/assets/home-automation-run-tooltip-BVNDWjAH.js +0 -1
  861. package/build/assets/home-store-CY9Ej0ux.js +0 -1
  862. package/build/assets/index-home-BdlrFIif.js +0 -1
  863. package/build/assets/info-B6RQawoW.js +0 -1
  864. package/build/assets/install-server-modal-Dpy89p4g.js +0 -1
  865. package/build/assets/kebab-menu-item-content-D8hSNGmm.js +0 -1
  866. package/build/assets/list-filter-DsEK7NFC.js +0 -1
  867. package/build/assets/llm-not-configured-banner-CIFABh3K.js +0 -27
  868. package/build/assets/llm-settings-B9juXhIa.js +0 -1
  869. package/build/assets/llm-settings-De1d5dfr.js +0 -1
  870. package/build/assets/llm-subscription-service-BpJ0ouQo.js +0 -1
  871. package/build/assets/loader-circle-CC1au6hc.js +0 -1
  872. package/build/assets/manage-backends-modal-BrPV3oB-.js +0 -1
  873. package/build/assets/manifest-80fb1c29.js +0 -1
  874. package/build/assets/markdown-renderer-BzTlxI8x.js +0 -8
  875. package/build/assets/mcp-page-BEBYqH_K.js +0 -9
  876. package/build/assets/messages-DKV9cRc2.js +0 -41
  877. package/build/assets/onboarding-DV_OXoeP.js +0 -1
  878. package/build/assets/onboarding-modal-rkyBYkeQ.js +0 -1
  879. package/build/assets/organization-service.api-DrYNkEN_.js +0 -1
  880. package/build/assets/pencil-47jAZH_V.js +0 -1
  881. package/build/assets/pin-By41Vl5J.js +0 -1
  882. package/build/assets/planner-tab-C9uZmhme.js +0 -1
  883. package/build/assets/plug-CG5HFcNG.js +0 -1
  884. package/build/assets/plugins-management-service-BMJgC3Ga.js +0 -1
  885. package/build/assets/plus-C7Slq-0I.js +0 -1
  886. package/build/assets/profiles-service.api-ChoKrL0l.js +0 -1
  887. package/build/assets/proxy-9Fe1v5na.js +0 -1
  888. package/build/assets/recommended-automations-launcher-6ABrI9Cy.js +0 -1
  889. package/build/assets/refresh-cw-3q3Frrii.js +0 -1
  890. package/build/assets/root-Dc8YmC9F.js +0 -2
  891. package/build/assets/root-VDaypvK4.css +0 -1
  892. package/build/assets/root-layout-CXkhSPYh.js +0 -2
  893. package/build/assets/schema-field-D-y9-LDb.js +0 -1
  894. package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
  895. package/build/assets/sdk-section-page-BlFiizlG.js +0 -1
  896. package/build/assets/secret-form-BB7the8W.js +0 -1
  897. package/build/assets/secrets-service-ByZVENbp.js +0 -1
  898. package/build/assets/settings-C0EWuBtA.js +0 -1
  899. package/build/assets/settings-index-5w5UW2K3.js +0 -1
  900. package/build/assets/settings-service.api-DJ1r62Zr.js +0 -1
  901. package/build/assets/shared-conversation-CA5ISEDy.js +0 -1
  902. package/build/assets/shield-check-D2aCRd16.js +0 -1
  903. package/build/assets/sidebar-mobile-menu-toggle-C_fb0Jki.js +0 -1
  904. package/build/assets/skill-scope-B42H-XOc.js +0 -1
  905. package/build/assets/skills-plugins-tgF8EiXC.js +0 -1
  906. package/build/assets/skills-settings-BgJ9PaOe.js +0 -1
  907. package/build/assets/styled-tooltip-C4jf5Fv9.js +0 -1
  908. package/build/assets/toggle-switch-ChOLXv2n.js +0 -1
  909. package/build/assets/trash-2-D7K26eDO.js +0 -1
  910. package/build/assets/trash-D-HYiVYM.js +0 -1
  911. package/build/assets/triangle-alert-CtdXWHUI.js +0 -1
  912. package/build/assets/usage-tab-CVDffLPt.js +0 -1
  913. package/build/assets/use-acp-credential-form-XIQmpX6M.js +0 -1
  914. package/build/assets/use-activate-agent-profile-BLfmvDiG.js +0 -1
  915. package/build/assets/use-agent-profiles-Bd9Bvvp1.js +0 -1
  916. package/build/assets/use-canvas-extensions-Bi693ujJ.js +0 -1
  917. package/build/assets/use-config-A9QovgXO.js +0 -1
  918. package/build/assets/use-create-conversation-Dx3l7mFZ.js +0 -1
  919. package/build/assets/use-create-secret-B9cUFWRG.js +0 -1
  920. package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
  921. package/build/assets/use-is-authed-nTBcM7dE.js +0 -1
  922. package/build/assets/use-llm-configured-BV9nZ1_j.js +0 -1
  923. package/build/assets/use-llm-profiles-BO-P4Oyo.js +0 -1
  924. package/build/assets/use-manifest-capabilities-Cw_flwEz.js +0 -1
  925. package/build/assets/use-onboarding-completion-D8U7k4Qb.js +0 -1
  926. package/build/assets/use-pinned-home-route-CckOZrmb.js +0 -1
  927. package/build/assets/use-plugins-marketplace-7i94Zu3Z.js +0 -1
  928. package/build/assets/use-save-agent-profile-BUjSsDXK.js +0 -1
  929. package/build/assets/use-settings-DSXLbvBl.js +0 -1
  930. package/build/assets/use-settings-nav-items-CwRw-CmX.js +0 -16
  931. package/build/assets/use-tracking-D53y3TH9.js +0 -3
  932. package/build/assets/utils-CN5ZfZy1.js +0 -1
  933. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js +0 -186
  934. package/build/assets/vendor~root-layout-C9Ju9DQg.js +0 -1
  935. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-cDuKr-WD.js +0 -1
  936. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js +0 -1
  937. package/build/assets/x-DJdhbdmt.js +0 -1
  938. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
  939. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
  940. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
  941. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
  942. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
  943. package/dist/hooks/query/use-skills.cjs +0 -2
  944. package/dist/hooks/query/use-skills.cjs.map +0 -1
  945. package/dist/hooks/query/use-skills.d.ts +0 -7
  946. package/dist/hooks/query/use-skills.js +0 -13
  947. package/dist/hooks/query/use-skills.js.map +0 -1
  948. package/dist/hooks/use-has-permission.cjs +0 -2
  949. package/dist/hooks/use-has-permission.cjs.map +0 -1
  950. package/dist/hooks/use-has-permission.d.ts +0 -1
  951. package/dist/hooks/use-has-permission.js +0 -8
  952. package/dist/hooks/use-has-permission.js.map +0 -1
  953. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
  954. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
  955. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
  956. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
@@ -9,10 +9,12 @@ import { SIDEBAR_ICON_SLOT_CLASS as s, SIDEBAR_ROW_INTERACTIVE_CLASS as c, sideb
9
9
  import { jsx as d, jsxs as f } from "react/jsx-runtime";
10
10
  //#region src/components/features/settings/cloud-settings-link.tsx
11
11
  function p() {
12
- let { t: p } = e("openhands"), { active: m } = o(), { backend: h } = m;
13
- return a(h) || h.kind !== "cloud" ? null : /* @__PURE__ */ f("a", {
12
+ let { t: p } = e("openhands"), { active: m } = o(), { backend: h, orgId: g } = m;
13
+ if (a(h) || h.kind !== "cloud") return null;
14
+ let _ = g ? `?org=${encodeURIComponent(g)}` : "";
15
+ return /* @__PURE__ */ f("a", {
14
16
  "data-testid": "settings-cloud-link",
15
- href: `${h.host.replace(/\/+$/, "")}/settings`,
17
+ href: `${h.host.replace(/\/+$/, "")}/settings${_}`,
16
18
  target: "_blank",
17
19
  rel: "noopener noreferrer",
18
20
  className: i(u({ collapsed: !1 }), c.idle),
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-settings-link.js","names":[],"sources":["../../../../src/components/features/settings/cloud-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { Cloud, ExternalLink } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted settings page.\n */\nexport function CloudSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n const cloudSettingsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings`;\n\n return (\n <a\n data-testid=\"settings-cloud-link\"\n href={cloudSettingsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Cloud className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,IAAoB;CAClC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,cAAW,EAAwB,GACrC,EAAE,eAAY;CAMpB,OAJI,EAAY,CAAO,KAAK,EAAQ,SAAS,UAAgB,OAK3D,kBAAC,KAAD;EACE,eAAY;EACZ,MAAM,GALkB,EAAQ,KAAK,QAAQ,QAAQ,EAAE,EAAE;EAMzD,QAAO;EACP,KAAI;EACJ,WAAW,EACT,EAAuB,EAAE,WAAW,GAAM,CAAC,GAC3C,EAA8B,IAChC;YARF;GAUE,kBAAC,QAAD;IAAM,WAAW;cACf,kBAAC,GAAD;KAAO,WAAU;KAAkB,eAAA;IAAa,CAAA;GAC5C,CAAA;GACN,kBAAC,QAAD;IAAM,WAAW,EAAG,EAAyB,EAAK,GAAG,QAAQ;cAC1D,EAAE,EAAQ,4BAA4B;GACnC,CAAA;GACN,kBAAC,GAAD;IACE,WAAU;IACV,eAAA;GACD,CAAA;EACA;;AAEP"}
1
+ {"version":3,"file":"cloud-settings-link.js","names":[],"sources":["../../../../src/components/features/settings/cloud-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { Cloud, ExternalLink } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted settings page.\n */\nexport function CloudSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend, orgId } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n // `org` is consumed by the cloud settings loader so the page opens on the\n // org that is active here instead of the cloud's last-used org.\n const orgQuery = orgId ? `?org=${encodeURIComponent(orgId)}` : \"\";\n const cloudSettingsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings${orgQuery}`;\n\n return (\n <a\n data-testid=\"settings-cloud-link\"\n href={cloudSettingsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Cloud className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,IAAoB;CAClC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,cAAW,EAAwB,GACrC,EAAE,YAAS,aAAU;CAE3B,IAAI,EAAY,CAAO,KAAK,EAAQ,SAAS,SAAS,OAAO;CAI7D,IAAM,IAAW,IAAQ,QAAQ,mBAAmB,CAAK,MAAM;CAG/D,OACE,kBAAC,KAAD;EACE,eAAY;EACZ,MAAM,GALkB,EAAQ,KAAK,QAAQ,QAAQ,EAAE,EAAE,WAAW;EAMpE,QAAO;EACP,KAAI;EACJ,WAAW,EACT,EAAuB,EAAE,WAAW,GAAM,CAAC,GAC3C,EAA8B,IAChC;YARF;GAUE,kBAAC,QAAD;IAAM,WAAW;cACf,kBAAC,GAAD;KAAO,WAAU;KAAkB,eAAA;IAAa,CAAA;GAC5C,CAAA;GACN,kBAAC,QAAD;IAAM,WAAW,EAAG,EAAyB,EAAK,GAAG,QAAQ;cAC1D,EAAE,EAAQ,4BAA4B;GACnC,CAAA;GACN,kBAAC,GAAD;IACE,WAAU;IACV,eAAA;GACD,CAAA;EACA;;AAEP"}
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/puzzle.cjs"),i=require("../../../utils/utils.cjs"),a=require("../../../api/backend-registry/active-store.cjs"),o=require("../../../contexts/active-backend-context.cjs"),s=require("../sidebar/sidebar-layout.cjs");let c=require("react/jsx-runtime");function l(){let{t:l}=e.useTranslation(`openhands`),{active:u}=o.useActiveBackendContext(),{backend:d}=u;return a.isNoBackend(d)||d.kind!==`cloud`?null:(0,c.jsxs)(`a`,{"data-testid":`settings-integrations-link`,href:`${d.host.replace(/\/+$/,``)}/settings/integrations`,target:`_blank`,rel:`noopener noreferrer`,className:i.cn(s.sidebarNavRowClassName({collapsed:!1}),s.SIDEBAR_ROW_INTERACTIVE_CLASS.idle),children:[(0,c.jsx)(`span`,{className:s.SIDEBAR_ICON_SLOT_CLASS,children:(0,c.jsx)(r.Puzzle,{className:`size-4 shrink-0`,"aria-hidden":!0})}),(0,c.jsx)(`span`,{className:i.cn(s.sidebarNavLabelClassName(!1),`flex-1`),children:l(t.I18nKey.SETTINGS$INTEGRATIONS_SETTINGS_LINK)}),(0,c.jsx)(n.ExternalLink,{className:`size-4 shrink-0 text-[var(--oh-muted)]`,"aria-hidden":!0})]})}exports.IntegrationsSettingsLink=l;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/puzzle.cjs"),i=require("../../../utils/utils.cjs"),a=require("../../../api/agent-server-config.cjs"),o=require("../../../api/backend-registry/active-store.cjs"),s=require("../../../contexts/active-backend-context.cjs"),c=require("../sidebar/sidebar-layout.cjs");let l=require("react/jsx-runtime");function u(){let{t:u}=e.useTranslation(`openhands`),{active:d}=s.useActiveBackendContext(),{backend:f,orgId:p}=d;if(o.isNoBackend(f)||f.kind!==`cloud`||a.getLockedCloudHost()!==null)return null;let m=p?`?org=${encodeURIComponent(p)}`:``;return(0,l.jsxs)(`a`,{"data-testid":`settings-integrations-link`,href:`${f.host.replace(/\/+$/,``)}/settings/integrations${m}`,target:`_blank`,rel:`noopener noreferrer`,className:i.cn(c.sidebarNavRowClassName({collapsed:!1}),c.SIDEBAR_ROW_INTERACTIVE_CLASS.idle),children:[(0,l.jsx)(`span`,{className:c.SIDEBAR_ICON_SLOT_CLASS,children:(0,l.jsx)(r.Puzzle,{className:`size-4 shrink-0`,"aria-hidden":!0})}),(0,l.jsx)(`span`,{className:i.cn(c.sidebarNavLabelClassName(!1),`flex-1`),children:u(t.I18nKey.SETTINGS$INTEGRATIONS_SETTINGS_LINK)}),(0,l.jsx)(n.ExternalLink,{className:`size-4 shrink-0 text-[var(--oh-muted)]`,"aria-hidden":!0})]})}exports.IntegrationsSettingsLink=u;
2
2
  //# sourceMappingURL=integrations-settings-link.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"integrations-settings-link.cjs","names":[],"sources":["../../../../src/components/features/settings/integrations-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { ExternalLink, Puzzle } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted integrations settings page.\n */\nexport function IntegrationsSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n const integrationsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings/integrations`;\n\n return (\n <a\n data-testid=\"settings-integrations-link\"\n href={integrationsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Puzzle className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$INTEGRATIONS_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":"qjBAiBA,SAAgB,GAA2B,CACzC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAE,UAAW,EAAA,wBAAwB,EACrC,CAAE,WAAY,EAMpB,OAJI,EAAA,YAAY,CAAO,GAAK,EAAQ,OAAS,QAAgB,MAK3D,EAAA,EAAA,MAAC,IAAD,CACE,cAAY,6BACZ,KAAM,GALiB,EAAQ,KAAK,QAAQ,OAAQ,EAAE,EAAE,wBAMxD,OAAO,SACP,IAAI,sBACJ,UAAW,EAAA,GACT,EAAA,uBAAuB,CAAE,UAAW,EAAM,CAAC,EAC3C,EAAA,8BAA8B,IAChC,WARF,EAUE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,kCACf,EAAA,EAAA,KAAC,EAAA,OAAD,CAAQ,UAAU,kBAAkB,cAAA,EAAa,CAAA,CAC7C,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,yBAAyB,EAAK,EAAG,QAAQ,WAC1D,EAAE,EAAA,QAAQ,mCAAmC,CAC1C,CAAA,GACN,EAAA,EAAA,KAAC,EAAA,aAAD,CACE,UAAU,yCACV,cAAA,EACD,CAAA,CACA,GAEP"}
1
+ {"version":3,"file":"integrations-settings-link.cjs","names":[],"sources":["../../../../src/components/features/settings/integrations-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { ExternalLink, Puzzle } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { getLockedCloudHost } from \"#/api/agent-server-config\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted integrations settings page. Also hidden when the canvas is locked to\n * a Cloud host (SaaS / self-hosted OHE): the OHE settings shell behind\n * \"All Cloud Settings\" already exposes Integrations (OHE-3168).\n */\nexport function IntegrationsSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend, orgId } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n if (getLockedCloudHost() !== null) return null;\n\n // `org` is consumed by the cloud settings loader so the page opens on the\n // org that is active here instead of the cloud's last-used org.\n const orgQuery = orgId ? `?org=${encodeURIComponent(orgId)}` : \"\";\n const integrationsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings/integrations${orgQuery}`;\n\n return (\n <a\n data-testid=\"settings-integrations-link\"\n href={integrationsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Puzzle className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$INTEGRATIONS_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":"umBAoBA,SAAgB,GAA2B,CACzC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAE,UAAW,EAAA,wBAAwB,EACrC,CAAE,UAAS,SAAU,EAG3B,GADI,EAAA,YAAY,CAAO,GAAK,EAAQ,OAAS,SACzC,EAAA,mBAAmB,IAAM,KAAM,OAAO,KAI1C,IAAM,EAAW,EAAQ,QAAQ,mBAAmB,CAAK,IAAM,GAG/D,OACE,EAAA,EAAA,MAAC,IAAD,CACE,cAAY,6BACZ,KAAM,GALiB,EAAQ,KAAK,QAAQ,OAAQ,EAAE,EAAE,wBAAwB,IAMhF,OAAO,SACP,IAAI,sBACJ,UAAW,EAAA,GACT,EAAA,uBAAuB,CAAE,UAAW,EAAM,CAAC,EAC3C,EAAA,8BAA8B,IAChC,WARF,EAUE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,kCACf,EAAA,EAAA,KAAC,EAAA,OAAD,CAAQ,UAAU,kBAAkB,cAAA,EAAa,CAAA,CAC7C,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,yBAAyB,EAAK,EAAG,QAAQ,WAC1D,EAAE,EAAA,QAAQ,mCAAmC,CAC1C,CAAA,GACN,EAAA,EAAA,KAAC,EAAA,aAAD,CACE,UAAU,yCACV,cAAA,EACD,CAAA,CACA,GAEP"}
@@ -1,5 +1,7 @@
1
1
  /**
2
2
  * Renders only for cloud backends — local backends have no equivalent
3
- * hosted integrations settings page.
3
+ * hosted integrations settings page. Also hidden when the canvas is locked to
4
+ * a Cloud host (SaaS / self-hosted OHE): the OHE settings shell behind
5
+ * "All Cloud Settings" already exposes Integrations (OHE-3168).
4
6
  */
5
7
  export declare function IntegrationsSettingsLink(): import("react").JSX.Element | null;
@@ -3,32 +3,35 @@ import { I18nKey as t } from "../../../i18n/declaration.js";
3
3
  import { ExternalLink as n } from "../../../node_modules/lucide-react/dist/esm/icons/external-link.js";
4
4
  import { Puzzle as r } from "../../../node_modules/lucide-react/dist/esm/icons/puzzle.js";
5
5
  import { cn as i } from "../../../utils/utils.js";
6
- import { isNoBackend as a } from "../../../api/backend-registry/active-store.js";
7
- import { useActiveBackendContext as o } from "../../../contexts/active-backend-context.js";
8
- import { SIDEBAR_ICON_SLOT_CLASS as s, SIDEBAR_ROW_INTERACTIVE_CLASS as c, sidebarNavLabelClassName as l, sidebarNavRowClassName as u } from "../sidebar/sidebar-layout.js";
9
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
6
+ import { getLockedCloudHost as a } from "../../../api/agent-server-config.js";
7
+ import { isNoBackend as o } from "../../../api/backend-registry/active-store.js";
8
+ import { useActiveBackendContext as s } from "../../../contexts/active-backend-context.js";
9
+ import { SIDEBAR_ICON_SLOT_CLASS as c, SIDEBAR_ROW_INTERACTIVE_CLASS as l, sidebarNavLabelClassName as u, sidebarNavRowClassName as d } from "../sidebar/sidebar-layout.js";
10
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
10
11
  //#region src/components/features/settings/integrations-settings-link.tsx
11
- function p() {
12
- let { t: p } = e("openhands"), { active: m } = o(), { backend: h } = m;
13
- return a(h) || h.kind !== "cloud" ? null : /* @__PURE__ */ f("a", {
12
+ function m() {
13
+ let { t: m } = e("openhands"), { active: h } = s(), { backend: g, orgId: _ } = h;
14
+ if (o(g) || g.kind !== "cloud" || a() !== null) return null;
15
+ let v = _ ? `?org=${encodeURIComponent(_)}` : "";
16
+ return /* @__PURE__ */ p("a", {
14
17
  "data-testid": "settings-integrations-link",
15
- href: `${h.host.replace(/\/+$/, "")}/settings/integrations`,
18
+ href: `${g.host.replace(/\/+$/, "")}/settings/integrations${v}`,
16
19
  target: "_blank",
17
20
  rel: "noopener noreferrer",
18
- className: i(u({ collapsed: !1 }), c.idle),
21
+ className: i(d({ collapsed: !1 }), l.idle),
19
22
  children: [
20
- /* @__PURE__ */ d("span", {
21
- className: s,
22
- children: /* @__PURE__ */ d(r, {
23
+ /* @__PURE__ */ f("span", {
24
+ className: c,
25
+ children: /* @__PURE__ */ f(r, {
23
26
  className: "size-4 shrink-0",
24
27
  "aria-hidden": !0
25
28
  })
26
29
  }),
27
- /* @__PURE__ */ d("span", {
28
- className: i(l(!1), "flex-1"),
29
- children: p(t.SETTINGS$INTEGRATIONS_SETTINGS_LINK)
30
+ /* @__PURE__ */ f("span", {
31
+ className: i(u(!1), "flex-1"),
32
+ children: m(t.SETTINGS$INTEGRATIONS_SETTINGS_LINK)
30
33
  }),
31
- /* @__PURE__ */ d(n, {
34
+ /* @__PURE__ */ f(n, {
32
35
  className: "size-4 shrink-0 text-[var(--oh-muted)]",
33
36
  "aria-hidden": !0
34
37
  })
@@ -36,6 +39,6 @@ function p() {
36
39
  });
37
40
  }
38
41
  //#endregion
39
- export { p as IntegrationsSettingsLink };
42
+ export { m as IntegrationsSettingsLink };
40
43
 
41
44
  //# sourceMappingURL=integrations-settings-link.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"integrations-settings-link.js","names":[],"sources":["../../../../src/components/features/settings/integrations-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { ExternalLink, Puzzle } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted integrations settings page.\n */\nexport function IntegrationsSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n const integrationsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings/integrations`;\n\n return (\n <a\n data-testid=\"settings-integrations-link\"\n href={integrationsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Puzzle className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$INTEGRATIONS_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,IAA2B;CACzC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,cAAW,EAAwB,GACrC,EAAE,eAAY;CAMpB,OAJI,EAAY,CAAO,KAAK,EAAQ,SAAS,UAAgB,OAK3D,kBAAC,KAAD;EACE,eAAY;EACZ,MAAM,GALiB,EAAQ,KAAK,QAAQ,QAAQ,EAAE,EAAE;EAMxD,QAAO;EACP,KAAI;EACJ,WAAW,EACT,EAAuB,EAAE,WAAW,GAAM,CAAC,GAC3C,EAA8B,IAChC;YARF;GAUE,kBAAC,QAAD;IAAM,WAAW;cACf,kBAAC,GAAD;KAAQ,WAAU;KAAkB,eAAA;IAAa,CAAA;GAC7C,CAAA;GACN,kBAAC,QAAD;IAAM,WAAW,EAAG,EAAyB,EAAK,GAAG,QAAQ;cAC1D,EAAE,EAAQ,mCAAmC;GAC1C,CAAA;GACN,kBAAC,GAAD;IACE,WAAU;IACV,eAAA;GACD,CAAA;EACA;;AAEP"}
1
+ {"version":3,"file":"integrations-settings-link.js","names":[],"sources":["../../../../src/components/features/settings/integrations-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { ExternalLink, Puzzle } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { getLockedCloudHost } from \"#/api/agent-server-config\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted integrations settings page. Also hidden when the canvas is locked to\n * a Cloud host (SaaS / self-hosted OHE): the OHE settings shell behind\n * \"All Cloud Settings\" already exposes Integrations (OHE-3168).\n */\nexport function IntegrationsSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend, orgId } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n if (getLockedCloudHost() !== null) return null;\n\n // `org` is consumed by the cloud settings loader so the page opens on the\n // org that is active here instead of the cloud's last-used org.\n const orgQuery = orgId ? `?org=${encodeURIComponent(orgId)}` : \"\";\n const integrationsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings/integrations${orgQuery}`;\n\n return (\n <a\n data-testid=\"settings-integrations-link\"\n href={integrationsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Puzzle className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$INTEGRATIONS_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;;AAoBA,SAAgB,IAA2B;CACzC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,cAAW,EAAwB,GACrC,EAAE,YAAS,aAAU;CAG3B,IADI,EAAY,CAAO,KAAK,EAAQ,SAAS,WACzC,EAAmB,MAAM,MAAM,OAAO;CAI1C,IAAM,IAAW,IAAQ,QAAQ,mBAAmB,CAAK,MAAM;CAG/D,OACE,kBAAC,KAAD;EACE,eAAY;EACZ,MAAM,GALiB,EAAQ,KAAK,QAAQ,QAAQ,EAAE,EAAE,wBAAwB;EAMhF,QAAO;EACP,KAAI;EACJ,WAAW,EACT,EAAuB,EAAE,WAAW,GAAM,CAAC,GAC3C,EAA8B,IAChC;YARF;GAUE,kBAAC,QAAD;IAAM,WAAW;cACf,kBAAC,GAAD;KAAQ,WAAU;KAAkB,eAAA;IAAa,CAAA;GAC7C,CAAA;GACN,kBAAC,QAAD;IAAM,WAAW,EAAG,EAAyB,EAAK,GAAG,QAAQ;cAC1D,EAAE,EAAQ,mCAAmC;GAC1C,CAAA;GACN,kBAAC,GAAD;IACE,WAAU;IACV,eAAA;GACD,CAAA;EACA;;AAEP"}
@@ -1 +1 @@
1
- const e=require("../../../../_virtual/_rolldown/runtime.cjs");require("../../../../utils/custom-toast-handlers.cjs"),require("../../../../contexts/active-backend-context.cjs"),require("../../../../api/profiles-service/profiles-service.api.cjs"),require("../../../../utils/format-model-name.cjs"),require("../../../../hooks/query/use-llm-profiles.cjs"),require("../../../../hooks/query/use-settings.cjs"),require("../../../../ui/typography.cjs"),require("../brand-button.cjs"),require("../../../../hooks/query/use-agent-settings-schema.cjs"),require("./profile-name-input.cjs"),require("../../../../hooks/mutation/use-activate-llm-profile.cjs"),require("../../../../hooks/mutation/use-save-llm-profile.cjs"),require("./llm-profiles-manager.cjs"),require("../../../shared/buttons/back-nav-button.cjs"),require("../../../../contexts/settings-section-header-context.cjs"),require("../../../../routes/llm-settings.cjs");let t=require("react");t=e.__toESM(t,1),require("react/jsx-runtime");
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs");require("../../../../utils/custom-toast-handlers.cjs"),require("../../../../contexts/active-backend-context.cjs"),require("../../../../api/profiles-service/profiles-service.api.cjs"),require("../../../../hooks/query/use-settings.cjs"),require("../../../../utils/format-model-name.cjs"),require("../../../../hooks/query/use-llm-profiles.cjs"),require("../../../../ui/typography.cjs"),require("../brand-button.cjs"),require("../../../../hooks/query/use-agent-settings-schema.cjs"),require("./profile-name-input.cjs"),require("../../../../hooks/mutation/use-activate-llm-profile.cjs"),require("../../../../hooks/mutation/use-save-llm-profile.cjs"),require("./llm-profiles-manager.cjs"),require("../../../shared/buttons/back-nav-button.cjs"),require("../../../../contexts/settings-section-header-context.cjs"),require("../../../../routes/llm-settings.cjs");let t=require("react");t=e.__toESM(t,1),require("react/jsx-runtime");
@@ -1,9 +1,9 @@
1
1
  import "../../../../utils/custom-toast-handlers.js";
2
2
  import "../../../../contexts/active-backend-context.js";
3
3
  import "../../../../api/profiles-service/profiles-service.api.js";
4
+ import "../../../../hooks/query/use-settings.js";
4
5
  import "../../../../utils/format-model-name.js";
5
6
  import "../../../../hooks/query/use-llm-profiles.js";
6
- import "../../../../hooks/query/use-settings.js";
7
7
  import "../../../../ui/typography.js";
8
8
  import "../brand-button.js";
9
9
  import "../../../../hooks/query/use-agent-settings-schema.js";
@@ -9,8 +9,8 @@ interface ProfilesBodyProps {
9
9
  /**
10
10
  * Display name per provider-connection id. When non-empty, profiles are
11
11
  * grouped under their connection's name so models sharing a provider are
12
- * visually clustered. Empty (the default, and always on cloud) renders a flat
13
- * list identical to before.
12
+ * visually clustered. Empty (the default, e.g. a cloud backend with no org
13
+ * bound) renders a flat list identical to before.
14
14
  */
15
15
  connectionNamesById?: Record<string, string>;
16
16
  onActivate: (name: string) => void;
@@ -1,2 +1,2 @@
1
- const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../node_modules/axios/index.cjs"),i=require("../../../../utils/retrieve-axios-error-message.cjs"),a=require("../../../../utils/custom-toast-handlers.cjs"),ee=require("../../../../hooks/query/use-settings.cjs"),te=require("../../../../hooks/mutation/use-save-settings.cjs"),ne=require("../brand-button.cjs"),re=require("../../../../utils/extension-module-card-classes.cjs"),o=require("../../../../hooks/query/use-agent-settings-schema.cjs"),s=require("../llm-settings/llm-settings-inputs-skeleton.cjs"),c=require("../../../../utils/sdk-settings-schema.cjs"),l=require("./schema-field.cjs"),ie=require("./view-toggle.cjs");let u=require("react");u=e.__toESM(u,1);let d=require("react/jsx-runtime");var ae=new Set,f={basic:0,advanced:1,all:2},oe=(e,t)=>f[t]<f[e]?t:e,se=(e,t)=>f[t]>f[e]?t:e,p=(e,{showBasic:t,showAdvanced:n,showAll:r})=>{if(e===`all`)return r?`all`:n?`advanced`:`basic`;if(e===`advanced`)return n?`advanced`:r?`all`:`basic`;if(!t){if(n)return`advanced`;if(r)return`all`}return`basic`},m={agent_settings:`agent_settings_diff`,conversation_settings:`conversation_settings_diff`},ce=(e,t)=>e instanceof r.AxiosError?e.response?.status===401?`${t} This agent server requires X-Session-API-Key. Set VITE_SESSION_API_KEY in the frontend to the same value used by the backend SESSION_API_KEY or OH_SESSION_API_KEYS_0.`:e.response?.status===404?`${t} This backend does not expose /api/settings/* schema endpoints. Upgrade to a recent openhands-agent-server release.`:t:t;function h({settingsSources:e,scope:r=`personal`,header:f,extraDirty:h=!1,buildPayload:g,onSaveSuccess:le,getInitialView:_,forceShowAdvancedView:ue=!1,allowAllView:de=!0,initialValueOverrides:v,embedded:fe=!1,hideSaveButton:pe=!1,suppressSuccessToast:me=!1,onSaveControlChange:y,testId:b=`sdk-section-settings-screen`}){let{t:x}=t.useTranslation(`openhands`),{mutate:he,isPending:S}=te.useSaveSettings(r),{data:C,isLoading:ge,isFetching:_e}=ee.useSettings(r),w=o.useAgentSettingsSchema(C?.agent_settings_schema),T=o.useConversationSettingsSchema(C?.conversation_settings_schema),E=u.default.useMemo(()=>JSON.stringify(e.map(e=>({source:e.settingsSource,sectionKeys:e.sectionKeys,excludeKeys:e.excludeKeys?Array.from(e.excludeKeys).sort():null}))),[e]),D=u.default.useMemo(()=>JSON.parse(E).map(e=>({settingsSource:e.source,sectionKeys:e.sectionKeys,excludeKeys:e.excludeKeys?new Set(e.excludeKeys):void 0})),[E]),O=u.default.useCallback(e=>e===`conversation_settings`?T.data:w.data,[w.data,T.data]),ve=D.some(e=>e.settingsSource===`conversation_settings`?T.isLoading:w.isLoading),k=u.default.useMemo(()=>D.map(e=>{let t=O(e.settingsSource);if(!c.isValidSettingsSchema(t))return{...e,filteredSchema:null};let n=new Set(e.sectionKeys),r=new Set,i={...t,sections:t.sections.filter(e=>!n.has(e.key)||r.has(e.key)?!1:(r.add(e.key),!0))};return{...e,filteredSchema:i}}),[D,O]),A=k.some(e=>c.hasCriticalSettings(e.filteredSchema)),j=ue||k.some(e=>c.hasAdvancedSettings(e.filteredSchema)),M=de&&k.some(e=>c.hasMinorSettings(e.filteredSchema)),N=u.default.useMemo(()=>ce(D.reduce((e,t)=>e??(t.settingsSource===`conversation_settings`?T.error:w.error),null),x(n.I18nKey.SETTINGS$SDK_SCHEMA_UNAVAILABLE)),[D,w.error,T.error,x]),P=u.default.useMemo(()=>v?JSON.stringify(v):``,[v]),[F,I]=u.default.useState(`basic`),[L,R]=u.default.useState({}),[z,B]=u.default.useState({}),V=u.default.useRef(!1),H=u.default.useMemo(()=>{if(!C)return null;let e={};for(let t of k){if(!t.filteredSchema)return null;e[t.settingsSource]={...e[t.settingsSource]??{},...c.buildInitialSettingsFormValues(C,t.filteredSchema,t.settingsSource)}}if(v){let t=k[0]?.settingsSource;t&&e[t]&&(e[t]={...e[t],...v})}return e},[C,k,P]),U=u.default.useMemo(()=>{if(!C)return null;let e=null;for(let t of k){if(!t.filteredSchema)return null;let n=_?_(C,t.filteredSchema):c.inferInitialView(C,t.filteredSchema,t.settingsSource);e=e?se(e,n):n}return e?p(e,{showBasic:A,showAdvanced:j,showAll:M}):null},[C,k,_,A,j,M]);u.default.useEffect(()=>{V.current=!1,I(`basic`),R({}),B({})},[r,E]),u.default.useEffect(()=>{if(!(!H||!U)){if(R(H),v){let e=k[0]?.settingsSource;if(e){let t=Object.fromEntries(Object.keys(v).map(e=>[e,!0]));B({[e]:t})}else B({})}else B({});V.current?I(e=>oe(e,U)):(V.current=!0,I(U))}},[H,U]);let W=u.default.useMemo(()=>{let e=new Map;for(let t of k)if(t.filteredSchema)for(let n of t.filteredSchema.sections)for(let r of n.fields)e.has(r.key)||e.set(r.key,t.settingsSource);return e},[k]),G=u.default.useMemo(()=>{let e={};for(let t of k)Object.assign(e,L[t.settingsSource]??{});return e},[k,L]),K=u.default.useMemo(()=>{let e={};for(let t of k)Object.assign(e,z[t.settingsSource]??{});return e},[k,z]),q=u.default.useCallback((e,t)=>{let n=W.get(e);n&&(R(r=>({...r,[n]:{...r[n]??{},[e]:t}})),B(t=>({...t,[n]:{...t[n]??{},[e]:!0}})))},[W]),ye=u.default.useCallback(e=>{a.displayErrorToast(i.retrieveAxiosErrorMessage(e)||x(n.I18nKey.ERROR$GENERIC))},[x]),J=u.default.useRef(()=>{}),Y=u.default.useCallback(()=>{J.current()},[]),X=u.default.useRef(()=>({})),be=u.default.useCallback(()=>X.current(),[]),Z=()=>{if(k.some(e=>!e.filteredSchema))return;let e;try{let t={};for(let e of k){let n=e.filteredSchema,r=c.buildSdkSettingsPayloadForView(n,L[e.settingsSource]??{},z[e.settingsSource]??{},F);if(Object.keys(r).length>0){let n=m[e.settingsSource];t[n]={...t[n]??{},...r}}}e=g?g(t,{values:G,dirty:K,view:F}):t}catch(e){a.displayErrorToast(e instanceof Error?e.message:x(n.I18nKey.ERROR$GENERIC));return}Object.keys(e).length!==0&&he(e,{onError:ye,onSuccess:()=>{me||a.displaySuccessToast(x(n.I18nKey.SETTINGS$SAVED_WARNING)),B({}),le?.()}})};J.current=Z,X.current=()=>{let e={};for(let t of k){if(!t.filteredSchema)continue;let n=L[t.settingsSource]??{},r=z[t.settingsSource]??{};Object.assign(e,c.buildSdkSettingsPayload(t.filteredSchema,n,r))}return e};let Q=Object.keys(K).length>0,$=Q||h;return u.default.useEffect(()=>{y&&y({save:Y,isSaving:S,isDirty:$,values:G,view:F,getDirtyPayload:be})},[S,$,G,F]),(ge||_e)&&!C||ve?(0,d.jsx)(s.LlmSettingsInputsSkeleton,{}):k.some(e=>e.filteredSchema&&e.filteredSchema.sections.length>0)?Object.keys(G).length===0?(0,d.jsx)(s.LlmSettingsInputsSkeleton,{}):(0,d.jsxs)(`div`,{"data-testid":b,className:fe?`relative flex min-h-0 w-full flex-1 flex-col`:`relative w-full min-h-0`,children:[(0,d.jsx)(ie.ViewToggle,{view:F,setView:I,showBasic:A,showAdvanced:j,showAll:M,isDisabled:!1}),(0,d.jsxs)(`div`,{className:`flex flex-col gap-8`,children:[f?.({values:G,isDisabled:!1,view:F,onChange:q}),k.map(e=>{if(!e.filteredSchema)return null;let t=L[e.settingsSource]??{};return c.getVisibleSettingsSections(e.filteredSchema,{...G,...t},F,e.excludeKeys??ae).map(n=>(0,d.jsx)(`section`,{className:`flex flex-col gap-4`,children:(0,d.jsx)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:n.fields.map(e=>(0,d.jsx)(`div`,{className:l.FIELD_FULL_WIDTH_KEYS.has(e.key)?`xl:col-span-2`:void 0,children:(0,d.jsx)(l.SchemaField,{field:e,value:t[e.key],isDisabled:!1,onChange:t=>q(e.key,t)})},e.key))})},`${e.settingsSource}:${n.key}`))}),pe?null:(0,d.jsx)(`div`,{className:`flex justify-start pt-2`,children:(0,d.jsx)(ne.BrandButton,{testId:`save-button`,type:`button`,variant:`primary`,isDisabled:S||!Q&&!h,onClick:Z,children:x(S?n.I18nKey.SETTINGS$SAVING:n.I18nKey.SETTINGS$SAVE_CHANGES)})})]})]}):(0,d.jsx)(`div`,{"data-testid":`sdk-schema-unavailable`,className:re.extensionModuleEmptyStateClassName,children:(0,d.jsx)(`p`,{className:`text-sm text-[var(--oh-muted)]`,children:N})})}exports.SdkSectionPage=h;
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../node_modules/axios/index.cjs"),i=require("../../../../utils/retrieve-axios-error-message.cjs"),a=require("../../../../utils/custom-toast-handlers.cjs"),o=require("../../../../hooks/query/use-settings.cjs"),ee=require("../../../../hooks/mutation/use-save-settings.cjs"),te=require("../brand-button.cjs"),ne=require("../../../../utils/extension-module-card-classes.cjs"),s=require("../../../../hooks/query/use-agent-settings-schema.cjs"),c=require("../llm-settings/llm-settings-inputs-skeleton.cjs"),l=require("../../../../utils/sdk-settings-schema.cjs"),u=require("./schema-field.cjs"),re=require("./view-toggle.cjs");let d=require("react");d=e.__toESM(d,1);let f=require("react/jsx-runtime");var ie=new Set,p={basic:0,advanced:1,all:2},ae=(e,t)=>p[t]<p[e]?t:e,oe=(e,t)=>p[t]>p[e]?t:e,se=(e,{showBasic:t,showAdvanced:n,showAll:r})=>{if(e===`all`)return r?`all`:n?`advanced`:`basic`;if(e===`advanced`)return n?`advanced`:r?`all`:`basic`;if(!t){if(n)return`advanced`;if(r)return`all`}return`basic`},ce={agent_settings:`agent_settings_diff`,conversation_settings:`conversation_settings_diff`},le=(e,t)=>e instanceof r.AxiosError?e.response?.status===401?`${t} This agent server requires X-Session-API-Key. Set VITE_SESSION_API_KEY in the frontend to the same value used by the backend SESSION_API_KEY or OH_SESSION_API_KEYS_0.`:e.response?.status===404?`${t} This backend does not expose /api/settings/* schema endpoints. Upgrade to a recent openhands-agent-server release.`:t:t;function m({settingsSources:e,scope:r=`personal`,header:p,extraDirty:m=!1,buildPayload:h,onSaveSuccess:ue,getInitialView:g,forceShowAdvancedView:de=!1,allowAllView:fe=!0,initialValueOverrides:_,markInitialOverridesDirty:v=!0,embedded:pe=!1,hideSaveButton:y=!1,suppressSuccessToast:me=!1,onSaveControlChange:b,testId:he=`sdk-section-settings-screen`}){let{t:x}=t.useTranslation(`openhands`),{mutate:ge,isPending:S}=ee.useSaveSettings(r),{data:C,isLoading:_e,isFetching:ve}=o.useSettings(r),w=s.useAgentSettingsSchema(C?.agent_settings_schema),T=s.useConversationSettingsSchema(C?.conversation_settings_schema),E=d.default.useMemo(()=>JSON.stringify(e.map(e=>({source:e.settingsSource,sectionKeys:e.sectionKeys,excludeKeys:e.excludeKeys?Array.from(e.excludeKeys).sort():null}))),[e]),D=d.default.useMemo(()=>JSON.parse(E).map(e=>({settingsSource:e.source,sectionKeys:e.sectionKeys,excludeKeys:e.excludeKeys?new Set(e.excludeKeys):void 0})),[E]),O=d.default.useCallback(e=>e===`conversation_settings`?T.data:w.data,[w.data,T.data]),ye=D.some(e=>e.settingsSource===`conversation_settings`?T.isLoading:w.isLoading),k=d.default.useMemo(()=>D.map(e=>{let t=O(e.settingsSource);if(!l.isValidSettingsSchema(t))return{...e,filteredSchema:null};let n=new Set(e.sectionKeys),r=new Set,i={...t,sections:t.sections.filter(e=>!n.has(e.key)||r.has(e.key)?!1:(r.add(e.key),!0))};return{...e,filteredSchema:i}}),[D,O]),A=k.some(e=>l.hasCriticalSettings(e.filteredSchema)),j=de||k.some(e=>l.hasAdvancedSettings(e.filteredSchema)),M=fe&&k.some(e=>l.hasMinorSettings(e.filteredSchema)),be=d.default.useMemo(()=>le(D.reduce((e,t)=>e??(t.settingsSource===`conversation_settings`?T.error:w.error),null),x(n.I18nKey.SETTINGS$SDK_SCHEMA_UNAVAILABLE)),[D,w.error,T.error,x]),N=d.default.useMemo(()=>_?JSON.stringify(_):``,[_]),P=k[0]?.settingsSource,[F,I]=d.default.useState(`basic`),[L,R]=d.default.useState({}),[z,B]=d.default.useState({}),V=d.default.useRef(!1),H=d.default.useMemo(()=>{if(!C)return null;let e={};for(let t of k){if(!t.filteredSchema)return null;e[t.settingsSource]={...e[t.settingsSource]??{},...l.buildInitialSettingsFormValues(C,t.filteredSchema,t.settingsSource)}}if(_){let t=k[0]?.settingsSource;t&&e[t]&&(e[t]={...e[t],..._})}return e},[C,k,N]),U=d.default.useMemo(()=>{if(!C)return null;let e=null;for(let t of k){if(!t.filteredSchema)return null;let n=g?g(C,t.filteredSchema):l.inferInitialView(C,t.filteredSchema,t.settingsSource);e=e?oe(e,n):n}return e?se(e,{showBasic:A,showAdvanced:j,showAll:M}):null},[C,k,g,A,j,M]);d.default.useEffect(()=>{V.current=!1,I(`basic`),R({}),B({})},[r,E]),d.default.useEffect(()=>{if(!(!H||!U)&&!(y&&V.current)){if(R(H),_&&v){let e=P;if(e){let t=Object.fromEntries(Object.keys(_).map(e=>[e,!0]));B({[e]:t})}else B({})}else B({});V.current?I(e=>ae(e,U)):(V.current=!0,I(U))}},[H,U,N,v,P,y]);let W=d.default.useMemo(()=>{let e=new Map;for(let t of k)if(t.filteredSchema)for(let n of t.filteredSchema.sections)for(let r of n.fields)e.has(r.key)||e.set(r.key,t.settingsSource);return e},[k]),G=d.default.useMemo(()=>{let e={};for(let t of k)Object.assign(e,L[t.settingsSource]??{});return e},[k,L]),K=d.default.useMemo(()=>{let e={};for(let t of k)Object.assign(e,z[t.settingsSource]??{});return e},[k,z]),q=d.default.useMemo(()=>{let e=new Map;for(let t of k)if(t.filteredSchema)for(let n of t.filteredSchema.sections)for(let t of n.fields)e.has(t.key)||e.set(t.key,t);return e},[k]),J=d.default.useRef(H);J.current=H;let Y=d.default.useRef(_);Y.current=_;let X=d.default.useRef(v);X.current=v;let Z=d.default.useRef(q);Z.current=q;let Q=d.default.useCallback((e,t)=>{let n=W.get(e)??k[0]?.settingsSource;n&&(R(r=>({...r,[n]:{...r[n]??{},[e]:t}})),B(r=>{let i=J.current?.[n]?.[e],a=X.current&&!!Y.current&&e in Y.current,o=Z.current.get(e);if((o?l.normalizeComparableValue(o,t)===l.normalizeComparableValue(o,i):t===i)&&!a){if(!r[n]?.[e])return r;let t={...r[n]??{}};return delete t[e],{...r,[n]:t}}return r[n]?.[e]?r:{...r,[n]:{...r[n]??{},[e]:!0}}}))},[W,k]),xe=d.default.useCallback(e=>{a.displayErrorToast(i.retrieveAxiosErrorMessage(e)||x(n.I18nKey.ERROR$GENERIC))},[x]),$=d.default.useRef(()=>{}),Se=d.default.useCallback(()=>{$.current()},[]),Ce=d.default.useRef(()=>({})),we=d.default.useCallback(()=>Ce.current(),[]),Te=()=>{if(k.some(e=>!e.filteredSchema))return;let e;try{let t={};for(let e of k){let n=e.filteredSchema,r=l.buildSdkSettingsPayloadForView(n,L[e.settingsSource]??{},z[e.settingsSource]??{},F);if(Object.keys(r).length>0){let n=ce[e.settingsSource];t[n]={...t[n]??{},...r}}}e=h?h(t,{values:G,dirty:K,view:F}):t}catch(e){a.displayErrorToast(e instanceof Error?e.message:x(n.I18nKey.ERROR$GENERIC));return}Object.keys(e).length!==0&&ge(e,{onError:xe,onSuccess:()=>{me||a.displaySuccessToast(x(n.I18nKey.SETTINGS$SAVED_WARNING)),B({}),ue?.()}})};$.current=Te,Ce.current=()=>{let e={};for(let t of k){if(!t.filteredSchema)continue;let n=L[t.settingsSource]??{},r=z[t.settingsSource]??{};Object.assign(e,l.buildSdkSettingsPayload(t.filteredSchema,n,r))}return e};let Ee=Object.keys(K).length>0,De=Ee||m;return d.default.useEffect(()=>{b&&b({save:Se,isSaving:S,isDirty:De,values:G,view:F,getDirtyPayload:we})},[S,De,G,F]),(_e||ve)&&!C||ye?(0,f.jsx)(c.LlmSettingsInputsSkeleton,{}):k.some(e=>e.filteredSchema&&e.filteredSchema.sections.length>0)?Object.keys(G).length===0?(0,f.jsx)(c.LlmSettingsInputsSkeleton,{}):(0,f.jsxs)(`div`,{"data-testid":he,className:pe?`relative flex min-h-0 w-full flex-1 flex-col`:`relative w-full min-h-0`,children:[(0,f.jsx)(re.ViewToggle,{view:F,setView:I,showBasic:A,showAdvanced:j,showAll:M,isDisabled:!1}),(0,f.jsxs)(`div`,{className:`flex flex-col gap-8`,children:[p?.({values:G,isDisabled:!1,view:F,onChange:Q}),k.map(e=>{if(!e.filteredSchema)return null;let t=L[e.settingsSource]??{};return l.getVisibleSettingsSections(e.filteredSchema,{...G,...t},F,e.excludeKeys??ie).map(n=>(0,f.jsx)(`section`,{className:`flex flex-col gap-4`,children:(0,f.jsx)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:n.fields.map(e=>(0,f.jsx)(`div`,{className:u.FIELD_FULL_WIDTH_KEYS.has(e.key)?`xl:col-span-2`:void 0,children:(0,f.jsx)(u.SchemaField,{field:e,value:t[e.key],isDisabled:!1,onChange:t=>Q(e.key,t)})},e.key))})},`${e.settingsSource}:${n.key}`))}),y?null:(0,f.jsx)(`div`,{className:`flex justify-start pt-2`,children:(0,f.jsx)(te.BrandButton,{testId:`save-button`,type:`button`,variant:`primary`,isDisabled:S||!Ee&&!m,onClick:Te,children:x(S?n.I18nKey.SETTINGS$SAVING:n.I18nKey.SETTINGS$SAVE_CHANGES)})})]})]}):(0,f.jsx)(`div`,{"data-testid":`sdk-schema-unavailable`,className:ne.extensionModuleEmptyStateClassName,children:(0,f.jsx)(`p`,{className:`text-sm text-[var(--oh-muted)]`,children:be})})}exports.SdkSectionPage=m;
2
2
  //# sourceMappingURL=sdk-section-page.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-section-page.cjs","names":[],"sources":["../../../../../src/components/features/settings/sdk-settings/sdk-section-page.tsx"],"sourcesContent":["import React from \"react\";\nimport { AxiosError } from \"axios\";\nimport { useTranslation } from \"react-i18next\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { LlmSettingsInputsSkeleton } from \"#/components/features/settings/llm-settings/llm-settings-inputs-skeleton\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport {\n useAgentSettingsSchema,\n useConversationSettingsSchema,\n} from \"#/hooks/query/use-agent-settings-schema\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { Settings, SettingsSchema, SettingsScope } from \"#/types/settings\";\nimport { extensionModuleEmptyStateClassName } from \"#/utils/extension-module-card-classes\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\nimport {\n buildInitialSettingsFormValues,\n buildSdkSettingsPayload,\n buildSdkSettingsPayloadForView,\n getVisibleSettingsSections,\n hasAdvancedSettings,\n hasCriticalSettings,\n hasMinorSettings,\n inferInitialView,\n isValidSettingsSchema,\n SettingsDirtyState,\n SettingsFormValues,\n type SettingsValueSource,\n type SettingsView,\n} from \"#/utils/sdk-settings-schema\";\nimport { FIELD_FULL_WIDTH_KEYS, SchemaField } from \"./schema-field\";\nimport { ViewToggle } from \"./view-toggle\";\n\nconst EMPTY_EXCLUDE_KEYS = new Set<string>();\n\nconst VIEW_ORDER: Record<SettingsView, number> = {\n basic: 0,\n advanced: 1,\n all: 2,\n};\n\nconst getLessDetailedView = (\n currentView: SettingsView,\n nextView: SettingsView,\n): SettingsView =>\n VIEW_ORDER[nextView] < VIEW_ORDER[currentView] ? nextView : currentView;\n\nconst getMoreDetailedView = (\n currentView: SettingsView,\n nextView: SettingsView,\n): SettingsView =>\n VIEW_ORDER[nextView] > VIEW_ORDER[currentView] ? nextView : currentView;\n\nconst normalizeView = (\n view: SettingsView,\n {\n showBasic,\n showAdvanced,\n showAll,\n }: {\n showBasic: boolean;\n showAdvanced: boolean;\n showAll: boolean;\n },\n): SettingsView => {\n if (view === \"all\") {\n if (showAll) {\n return \"all\";\n }\n\n return showAdvanced ? \"advanced\" : \"basic\";\n }\n\n if (view === \"advanced\") {\n if (showAdvanced) {\n return \"advanced\";\n }\n\n return showAll ? \"all\" : \"basic\";\n }\n\n // A critical-less page has nothing to render in the basic tier; bump up.\n if (!showBasic) {\n if (showAdvanced) return \"advanced\";\n if (showAll) return \"all\";\n }\n return \"basic\";\n};\n\nconst PAYLOAD_DIFF_KEY: Record<SettingsValueSource, string> = {\n agent_settings: \"agent_settings_diff\",\n conversation_settings: \"conversation_settings_diff\",\n};\n\nconst getSchemaUnavailableMessage = (\n error: unknown,\n fallbackMessage: string,\n): string => {\n if (!(error instanceof AxiosError)) {\n return fallbackMessage;\n }\n\n if (error.response?.status === 401) {\n return `${fallbackMessage} This agent server requires X-Session-API-Key. Set VITE_SESSION_API_KEY in the frontend to the same value used by the backend SESSION_API_KEY or OH_SESSION_API_KEYS_0.`;\n }\n\n if (error.response?.status === 404) {\n return `${fallbackMessage} This backend does not expose /api/settings/* schema endpoints. Upgrade to a recent openhands-agent-server release.`;\n }\n\n return fallbackMessage;\n};\n\nexport interface SettingsSourceConfig {\n /** Which schema/values bucket on `settings` this source pulls from. */\n settingsSource: SettingsValueSource;\n /** Section keys (e.g. [\"llm\"]) within that schema to render. */\n sectionKeys: string[];\n /** Field keys to skip (rendered elsewhere by the caller). */\n excludeKeys?: Set<string>;\n}\n\nexport interface SdkSectionHeaderProps {\n values: SettingsFormValues;\n isDisabled: boolean;\n view: SettingsView;\n onChange: (key: string, value: string | boolean) => void;\n}\n\ninterface ResolvedSource extends SettingsSourceConfig {\n filteredSchema: SettingsSchema | null;\n}\n\n/**\n * Snapshot of the page's save state, surfaced to the parent so it can\n * render its own Save/Next button (e.g. in onboarding) when\n * {@link SdkSectionPage}'s built-in button is hidden via\n * `hideSaveButton`.\n */\nexport interface SdkSectionSaveControl {\n /** Trigger a save of the currently-dirty fields. No-op while `isSaving` or `!isDirty`. */\n save: () => void;\n /** A save mutation is in flight. */\n isSaving: boolean;\n /** At least one field is dirty (or `extraDirty` was passed in). */\n isDirty: boolean;\n /** Current form values (for custom save flows). */\n values: SettingsFormValues;\n /** The active view tier (basic/advanced/all) the form is rendering. */\n view: SettingsView;\n /**\n * Returns the coerced, dirty-only payload as a nested object\n * (e.g. `{ llm: { temperature: 0.7 } }`). Lets a custom save flow persist\n * exactly the fields the user changed, with proper types, without\n * re-implementing schema-driven coercion. Throws if a field fails coercion.\n */\n getDirtyPayload: () => Record<string, unknown>;\n}\n\n/**\n * A generic SDK-schema-driven settings page that renders fields from one or\n * more schema sections.\n *\n * The `settingsSources` array specifies which schema(s)/section(s) the page\n * owns. The page tracks values/dirty state per source, renders sections from\n * each source in order (filtered by the schema's `prominence` field for the\n * selected view), and emits a combined save payload like\n * `{ conversation_settings_diff: {...}, agent_settings_diff: {...} }` ---\n * including only the keys for sources that actually have dirty changes.\n *\n * @param settingsSources one or more schemas to render fields from\n * @param header render prop above the fields (receives unified state)\n * @param buildPayload customize the save payload before submission\n * @param testId data-testid on the page wrapper\n */\nexport function SdkSectionPage({\n settingsSources,\n scope = \"personal\",\n header,\n extraDirty = false,\n buildPayload,\n onSaveSuccess,\n getInitialView,\n forceShowAdvancedView = false,\n allowAllView = true,\n initialValueOverrides,\n embedded = false,\n hideSaveButton = false,\n suppressSuccessToast = false,\n onSaveControlChange,\n testId = \"sdk-section-settings-screen\",\n}: {\n settingsSources: SettingsSourceConfig[];\n scope?: SettingsScope;\n\n header?: (props: SdkSectionHeaderProps) => React.ReactNode;\n extraDirty?: boolean;\n /**\n * Customize the save payload. Receives the wrapped default payload (e.g.\n * `{ agent_settings_diff: { llm: { model: \"gpt-4\" } } }`) plus the unified\n * form context. Return the payload to actually send.\n */\n buildPayload?: (\n defaultPayload: Record<string, unknown>,\n context: {\n values: SettingsFormValues;\n dirty: SettingsDirtyState;\n view: SettingsView;\n },\n ) => Record<string, unknown>;\n onSaveSuccess?: () => void;\n getInitialView?: (\n settings: Settings,\n filteredSchema: SettingsSchema,\n ) => SettingsView;\n forceShowAdvancedView?: boolean;\n allowAllView?: boolean;\n /**\n * Per-field initial value overrides that win over the values\n * derived from `useSettings`. The keys of each override are also\n * marked dirty on hydration so the user can save the form without\n * having to touch the prefilled fields. Useful when the page is\n * embedded in a flow that wants to nudge brand-new users toward a\n * particular default (e.g. onboarding pre-filling OpenHands/Opus).\n */\n initialValueOverrides?: SettingsFormValues;\n embedded?: boolean;\n hideSaveButton?: boolean;\n /** Suppress the default success toast after save completes. */\n suppressSuccessToast?: boolean;\n /**\n * Fires whenever the save state changes (a mutation starts/finishes,\n * dirty status flips). Provides a stable `save()` callback the\n * parent can wire to its own button. Useful when the form is\n * embedded in a custom flow and the built-in Save button is hidden.\n */\n onSaveControlChange?: (control: SdkSectionSaveControl) => void;\n testId?: string;\n}) {\n const { t } = useTranslation(\"openhands\");\n const { mutate: saveSettings, isPending } = useSaveSettings(scope);\n const { data: settings, isLoading, isFetching } = useSettings(scope);\n const agentSchemaQuery = useAgentSettingsSchema(\n settings?.agent_settings_schema,\n );\n const conversationSchemaQuery = useConversationSettingsSchema(\n settings?.conversation_settings_schema,\n );\n const isReadOnly = false;\n\n const sourcesSignature = React.useMemo(\n () =>\n JSON.stringify(\n settingsSources.map((s) => ({\n source: s.settingsSource,\n sectionKeys: s.sectionKeys,\n excludeKeys: s.excludeKeys ? Array.from(s.excludeKeys).sort() : null,\n })),\n ),\n [settingsSources],\n );\n\n const resolvedSourceConfigs = React.useMemo<SettingsSourceConfig[]>(() => {\n const parsed = JSON.parse(sourcesSignature) as Array<{\n source: SettingsValueSource;\n sectionKeys: string[];\n excludeKeys: string[] | null;\n }>;\n return parsed.map((p) => ({\n settingsSource: p.source,\n sectionKeys: p.sectionKeys,\n excludeKeys: p.excludeKeys ? new Set(p.excludeKeys) : undefined,\n }));\n }, [sourcesSignature]);\n\n const getSchemaForSource = React.useCallback(\n (source: SettingsValueSource) =>\n source === \"conversation_settings\"\n ? conversationSchemaQuery.data\n : agentSchemaQuery.data,\n [agentSchemaQuery.data, conversationSchemaQuery.data],\n );\n\n const isSchemaLoading = resolvedSourceConfigs.some((src) =>\n src.settingsSource === \"conversation_settings\"\n ? conversationSchemaQuery.isLoading\n : agentSchemaQuery.isLoading,\n );\n\n const resolvedSources = React.useMemo<ResolvedSource[]>(\n () =>\n resolvedSourceConfigs.map((src) => {\n const schema = getSchemaForSource(src.settingsSource);\n if (!isValidSettingsSchema(schema)) {\n return { ...src, filteredSchema: null };\n }\n const sectionSet = new Set(src.sectionKeys);\n // The agent schema can carry more than one section per key — e.g. the\n // combined AgentSettings schema emits an \"llm\" section for both the\n // \"openhands\" and \"acp\" variants. Only the first (openhands) is used,\n // so keep the first section per key; otherwise every field renders\n // twice and React sees duplicate section keys.\n const seenKeys = new Set<string>();\n const filteredSchema: SettingsSchema = {\n ...schema,\n sections: schema.sections.filter((s) => {\n if (!sectionSet.has(s.key) || seenKeys.has(s.key)) return false;\n seenKeys.add(s.key);\n return true;\n }),\n };\n return { ...src, filteredSchema };\n }),\n [resolvedSourceConfigs, getSchemaForSource],\n );\n\n // The basic tier only exists when some field renders in it; a critical-less\n // page (e.g. Memory, whose only field is major) hides the Basic tab and\n // floors its view at \"advanced\".\n const showBasic = resolvedSources.some((src) =>\n hasCriticalSettings(src.filteredSchema),\n );\n const showAdvanced =\n forceShowAdvancedView ||\n resolvedSources.some((src) => hasAdvancedSettings(src.filteredSchema));\n const showAll =\n allowAllView &&\n resolvedSources.some((src) => hasMinorSettings(src.filteredSchema));\n\n const schemaUnavailableMessage = React.useMemo(() => {\n const firstError = resolvedSourceConfigs.reduce<unknown>(\n (err, src) =>\n err ??\n (src.settingsSource === \"conversation_settings\"\n ? conversationSchemaQuery.error\n : agentSchemaQuery.error),\n null,\n );\n return getSchemaUnavailableMessage(\n firstError,\n t(I18nKey.SETTINGS$SDK_SCHEMA_UNAVAILABLE),\n );\n }, [\n resolvedSourceConfigs,\n agentSchemaQuery.error,\n conversationSchemaQuery.error,\n t,\n ]);\n\n const overridesSignature = React.useMemo(\n () => (initialValueOverrides ? JSON.stringify(initialValueOverrides) : \"\"),\n [initialValueOverrides],\n );\n\n const [view, setView] = React.useState<SettingsView>(\"basic\");\n const [valuesBySource, setValuesBySource] = React.useState<\n Partial<Record<SettingsValueSource, SettingsFormValues>>\n >({});\n const [dirtyBySource, setDirtyBySource] = React.useState<\n Partial<Record<SettingsValueSource, SettingsDirtyState>>\n >({});\n const hasHydratedViewRef = React.useRef(false);\n\n const initialValuesBySource = React.useMemo<Partial<\n Record<SettingsValueSource, SettingsFormValues>\n > | null>(() => {\n if (!settings) return null;\n const result: Partial<Record<SettingsValueSource, SettingsFormValues>> = {};\n for (const src of resolvedSources) {\n if (!src.filteredSchema) return null;\n result[src.settingsSource] = {\n ...(result[src.settingsSource] ?? {}),\n ...buildInitialSettingsFormValues(\n settings,\n src.filteredSchema,\n src.settingsSource,\n ),\n };\n }\n if (initialValueOverrides) {\n const firstSource = resolvedSources[0]?.settingsSource;\n if (firstSource && result[firstSource]) {\n result[firstSource] = {\n ...result[firstSource],\n ...initialValueOverrides,\n };\n }\n }\n return result;\n }, [settings, resolvedSources, overridesSignature]);\n\n const initialView = React.useMemo(() => {\n if (!settings) return null;\n let result: SettingsView | null = null;\n for (const src of resolvedSources) {\n if (!src.filteredSchema) return null;\n const perSource = getInitialView\n ? getInitialView(settings, src.filteredSchema)\n : inferInitialView(settings, src.filteredSchema, src.settingsSource);\n result = result ? getMoreDetailedView(result, perSource) : perSource;\n }\n if (!result) return null;\n return normalizeView(result, { showBasic, showAdvanced, showAll });\n }, [\n settings,\n resolvedSources,\n getInitialView,\n showBasic,\n showAdvanced,\n showAll,\n ]);\n\n React.useEffect(() => {\n hasHydratedViewRef.current = false;\n setView(\"basic\");\n setValuesBySource({});\n setDirtyBySource({});\n }, [scope, sourcesSignature]);\n\n React.useEffect(() => {\n if (!initialValuesBySource || !initialView) return;\n\n setValuesBySource(initialValuesBySource);\n if (initialValueOverrides) {\n const firstSource = resolvedSources[0]?.settingsSource;\n if (firstSource) {\n const overrideDirty: SettingsDirtyState = Object.fromEntries(\n Object.keys(initialValueOverrides).map((key) => [key, true]),\n );\n setDirtyBySource({ [firstSource]: overrideDirty });\n } else {\n setDirtyBySource({});\n }\n } else {\n setDirtyBySource({});\n }\n // The ref flip stays outside the updater: React double-invokes state\n // updaters in StrictMode, so mutating it in there makes the second\n // (kept) call take the already-hydrated branch and pin the view.\n if (!hasHydratedViewRef.current) {\n hasHydratedViewRef.current = true;\n setView(initialView);\n } else {\n setView((currentView) => getLessDetailedView(currentView, initialView));\n }\n }, [initialValuesBySource, initialView]);\n\n const fieldKeyToSource = React.useMemo(() => {\n const map = new Map<string, SettingsValueSource>();\n for (const src of resolvedSources) {\n if (src.filteredSchema) {\n for (const section of src.filteredSchema.sections) {\n for (const field of section.fields) {\n if (!map.has(field.key)) {\n map.set(field.key, src.settingsSource);\n }\n }\n }\n }\n }\n return map;\n }, [resolvedSources]);\n\n const flatValues = React.useMemo<SettingsFormValues>(() => {\n const merged: SettingsFormValues = {};\n for (const src of resolvedSources) {\n Object.assign(merged, valuesBySource[src.settingsSource] ?? {});\n }\n return merged;\n }, [resolvedSources, valuesBySource]);\n\n const flatDirty = React.useMemo<SettingsDirtyState>(() => {\n const merged: SettingsDirtyState = {};\n for (const src of resolvedSources) {\n Object.assign(merged, dirtyBySource[src.settingsSource] ?? {});\n }\n return merged;\n }, [resolvedSources, dirtyBySource]);\n\n const handleFieldChange = React.useCallback(\n (fieldKey: string, nextValue: string | boolean) => {\n const sourceKey = fieldKeyToSource.get(fieldKey);\n if (!sourceKey) return;\n setValuesBySource((prev) => ({\n ...prev,\n [sourceKey]: {\n ...(prev[sourceKey] ?? {}),\n [fieldKey]: nextValue,\n },\n }));\n setDirtyBySource((prev) => ({\n ...prev,\n [sourceKey]: {\n ...(prev[sourceKey] ?? {}),\n [fieldKey]: true,\n },\n }));\n },\n [fieldKeyToSource],\n );\n\n const handleError = React.useCallback(\n (error: AxiosError) => {\n const msg = retrieveAxiosErrorMessage(error);\n displayErrorToast(msg || t(I18nKey.ERROR$GENERIC));\n },\n [t],\n );\n\n const handleSaveRef = React.useRef<() => void>(() => {});\n const stableSave = React.useCallback(() => {\n handleSaveRef.current();\n }, []);\n\n // Stable accessor for the coerced, dirty-only payload. Mirrors the\n // `handleSaveRef` pattern so the exposed function reference stays stable\n // across renders while always reading the latest closure at call time.\n const buildDirtyPayloadRef = React.useRef<() => Record<string, unknown>>(\n () => ({}),\n );\n const stableGetDirtyPayload = React.useCallback(\n () => buildDirtyPayloadRef.current(),\n [],\n );\n\n const handleSave = () => {\n if (isReadOnly) return;\n if (resolvedSources.some((src) => !src.filteredSchema)) return;\n\n let payload: Record<string, unknown>;\n try {\n const defaultPayload: Record<string, unknown> = {};\n for (const src of resolvedSources) {\n const schema = src.filteredSchema!;\n const sourceValues = valuesBySource[src.settingsSource] ?? {};\n const sourceDirty = dirtyBySource[src.settingsSource] ?? {};\n const diff = buildSdkSettingsPayloadForView(\n schema,\n sourceValues,\n sourceDirty,\n view,\n );\n if (Object.keys(diff).length > 0) {\n const diffKey = PAYLOAD_DIFF_KEY[src.settingsSource];\n defaultPayload[diffKey] = {\n ...((defaultPayload[diffKey] as\n | Record<string, unknown>\n | undefined) ?? {}),\n ...diff,\n };\n }\n }\n\n payload = buildPayload\n ? buildPayload(defaultPayload, {\n values: flatValues,\n dirty: flatDirty,\n view,\n })\n : defaultPayload;\n } catch (error) {\n displayErrorToast(\n error instanceof Error ? error.message : t(I18nKey.ERROR$GENERIC),\n );\n return;\n }\n\n if (Object.keys(payload).length === 0) return;\n\n saveSettings(payload, {\n onError: handleError,\n onSuccess: () => {\n if (!suppressSuccessToast) {\n displaySuccessToast(t(I18nKey.SETTINGS$SAVED_WARNING));\n }\n setDirtyBySource({});\n onSaveSuccess?.();\n },\n });\n };\n\n handleSaveRef.current = handleSave;\n // Dirty-only (NOT view-filtered): we must never inject defaults for\n // non-visible fields here, or a custom save flow would reset fields the\n // user never touched. `buildSdkSettingsPayloadForView` is reserved for the\n // built-in full-replace save above. With multiple sources, we merge each\n // source's nested payload at the top level so single-source consumers\n // (e.g. `LlmSettingsLocalView`) keep reading `.llm` etc. unchanged.\n buildDirtyPayloadRef.current = () => {\n const merged: Record<string, unknown> = {};\n for (const src of resolvedSources) {\n if (!src.filteredSchema) continue;\n const sourceValues = valuesBySource[src.settingsSource] ?? {};\n const sourceDirty = dirtyBySource[src.settingsSource] ?? {};\n Object.assign(\n merged,\n buildSdkSettingsPayload(src.filteredSchema, sourceValues, sourceDirty),\n );\n }\n return merged;\n };\n\n const isDirty = Object.keys(flatDirty).length > 0;\n const saveControlIsDirty = isDirty || extraDirty;\n React.useEffect(() => {\n if (!onSaveControlChange) return;\n onSaveControlChange({\n save: stableSave,\n isSaving: isPending,\n isDirty: saveControlIsDirty,\n values: flatValues,\n view,\n getDirtyPayload: stableGetDirtyPayload,\n });\n }, [isPending, saveControlIsDirty, flatValues, view]);\n\n // Keep existing form content visible during background refetches to avoid\n // flashing the full skeleton (notably during onboarding Next transitions).\n const isInitialSettingsLoad = (isLoading || isFetching) && !settings;\n if (isInitialSettingsLoad || isSchemaLoading) {\n return <LlmSettingsInputsSkeleton />;\n }\n\n const hasAnyVisibleSection = resolvedSources.some(\n (src) => src.filteredSchema && src.filteredSchema.sections.length > 0,\n );\n\n if (!hasAnyVisibleSection) {\n return (\n <div\n data-testid=\"sdk-schema-unavailable\"\n className={extensionModuleEmptyStateClassName}\n >\n <p className=\"text-sm text-[var(--oh-muted)]\">\n {schemaUnavailableMessage}\n </p>\n </div>\n );\n }\n\n if (Object.keys(flatValues).length === 0) {\n return <LlmSettingsInputsSkeleton />;\n }\n\n // Scrolling is owned by the settings shell (or onboarding wrapper), not a\n // nested scroll region. Save actions are inline after the last field.\n const bodyClassName = \"flex flex-col gap-8\";\n\n return (\n <div\n data-testid={testId}\n className={\n embedded\n ? \"relative flex min-h-0 w-full flex-1 flex-col\"\n : \"relative w-full min-h-0\"\n }\n >\n <ViewToggle\n view={view}\n setView={setView}\n showBasic={showBasic}\n showAdvanced={showAdvanced}\n showAll={showAll}\n isDisabled={isReadOnly}\n />\n\n <div className={bodyClassName}>\n {header?.({\n values: flatValues,\n isDisabled: isReadOnly,\n view,\n onChange: handleFieldChange,\n })}\n\n {resolvedSources.map((src) => {\n if (!src.filteredSchema) return null;\n const sourceValues = valuesBySource[src.settingsSource] ?? {};\n const visibleSections = getVisibleSettingsSections(\n src.filteredSchema,\n { ...flatValues, ...sourceValues },\n view,\n src.excludeKeys ?? EMPTY_EXCLUDE_KEYS,\n );\n return visibleSections.map((section) => (\n <section\n key={`${src.settingsSource}:${section.key}`}\n className=\"flex flex-col gap-4\"\n >\n <div className=\"grid gap-4 xl:grid-cols-2\">\n {section.fields.map((field) => (\n <div\n key={field.key}\n className={\n FIELD_FULL_WIDTH_KEYS.has(field.key)\n ? \"xl:col-span-2\"\n : undefined\n }\n >\n <SchemaField\n field={field}\n value={sourceValues[field.key]}\n isDisabled={isReadOnly}\n onChange={(nextValue) =>\n handleFieldChange(field.key, nextValue)\n }\n />\n </div>\n ))}\n </div>\n </section>\n ));\n })}\n\n {!isReadOnly && !hideSaveButton ? (\n <div className=\"flex justify-start pt-2\">\n <BrandButton\n testId=\"save-button\"\n type=\"button\"\n variant=\"primary\"\n isDisabled={isPending || (!isDirty && !extraDirty)}\n onClick={handleSave}\n >\n {isPending\n ? t(I18nKey.SETTINGS$SAVING)\n : t(I18nKey.SETTINGS$SAVE_CHANGES)}\n </BrandButton>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sdk-section-page.cjs","names":[],"sources":["../../../../../src/components/features/settings/sdk-settings/sdk-section-page.tsx"],"sourcesContent":["import React from \"react\";\nimport { AxiosError } from \"axios\";\nimport { useTranslation } from \"react-i18next\";\nimport { BrandButton } from \"#/components/features/settings/brand-button\";\nimport { LlmSettingsInputsSkeleton } from \"#/components/features/settings/llm-settings/llm-settings-inputs-skeleton\";\nimport { useSaveSettings } from \"#/hooks/mutation/use-save-settings\";\nimport {\n useAgentSettingsSchema,\n useConversationSettingsSchema,\n} from \"#/hooks/query/use-agent-settings-schema\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n Settings,\n SettingsFieldSchema,\n SettingsSchema,\n SettingsScope,\n} from \"#/types/settings\";\nimport { extensionModuleEmptyStateClassName } from \"#/utils/extension-module-card-classes\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport { retrieveAxiosErrorMessage } from \"#/utils/retrieve-axios-error-message\";\nimport {\n buildInitialSettingsFormValues,\n buildSdkSettingsPayload,\n buildSdkSettingsPayloadForView,\n getVisibleSettingsSections,\n hasAdvancedSettings,\n hasCriticalSettings,\n hasMinorSettings,\n inferInitialView,\n isValidSettingsSchema,\n normalizeComparableValue,\n SettingsDirtyState,\n SettingsFormValues,\n type SettingsValueSource,\n type SettingsView,\n} from \"#/utils/sdk-settings-schema\";\nimport { FIELD_FULL_WIDTH_KEYS, SchemaField } from \"./schema-field\";\nimport { ViewToggle } from \"./view-toggle\";\n\nconst EMPTY_EXCLUDE_KEYS = new Set<string>();\n\nconst VIEW_ORDER: Record<SettingsView, number> = {\n basic: 0,\n advanced: 1,\n all: 2,\n};\n\nconst getLessDetailedView = (\n currentView: SettingsView,\n nextView: SettingsView,\n): SettingsView =>\n VIEW_ORDER[nextView] < VIEW_ORDER[currentView] ? nextView : currentView;\n\nconst getMoreDetailedView = (\n currentView: SettingsView,\n nextView: SettingsView,\n): SettingsView =>\n VIEW_ORDER[nextView] > VIEW_ORDER[currentView] ? nextView : currentView;\n\nconst normalizeView = (\n view: SettingsView,\n {\n showBasic,\n showAdvanced,\n showAll,\n }: {\n showBasic: boolean;\n showAdvanced: boolean;\n showAll: boolean;\n },\n): SettingsView => {\n if (view === \"all\") {\n if (showAll) {\n return \"all\";\n }\n\n return showAdvanced ? \"advanced\" : \"basic\";\n }\n\n if (view === \"advanced\") {\n if (showAdvanced) {\n return \"advanced\";\n }\n\n return showAll ? \"all\" : \"basic\";\n }\n\n // A critical-less page has nothing to render in the basic tier; bump up.\n if (!showBasic) {\n if (showAdvanced) return \"advanced\";\n if (showAll) return \"all\";\n }\n return \"basic\";\n};\n\nconst PAYLOAD_DIFF_KEY: Record<SettingsValueSource, string> = {\n agent_settings: \"agent_settings_diff\",\n conversation_settings: \"conversation_settings_diff\",\n};\n\nconst getSchemaUnavailableMessage = (\n error: unknown,\n fallbackMessage: string,\n): string => {\n if (!(error instanceof AxiosError)) {\n return fallbackMessage;\n }\n\n if (error.response?.status === 401) {\n return `${fallbackMessage} This agent server requires X-Session-API-Key. Set VITE_SESSION_API_KEY in the frontend to the same value used by the backend SESSION_API_KEY or OH_SESSION_API_KEYS_0.`;\n }\n\n if (error.response?.status === 404) {\n return `${fallbackMessage} This backend does not expose /api/settings/* schema endpoints. Upgrade to a recent openhands-agent-server release.`;\n }\n\n return fallbackMessage;\n};\n\nexport interface SettingsSourceConfig {\n /** Which schema/values bucket on `settings` this source pulls from. */\n settingsSource: SettingsValueSource;\n /** Section keys (e.g. [\"llm\"]) within that schema to render. */\n sectionKeys: string[];\n /** Field keys to skip (rendered elsewhere by the caller). */\n excludeKeys?: Set<string>;\n}\n\nexport interface SdkSectionHeaderProps {\n values: SettingsFormValues;\n isDisabled: boolean;\n view: SettingsView;\n onChange: (key: string, value: string | boolean) => void;\n}\n\ninterface ResolvedSource extends SettingsSourceConfig {\n filteredSchema: SettingsSchema | null;\n}\n\n/**\n * Snapshot of the page's save state, surfaced to the parent so it can\n * render its own Save/Next button (e.g. in onboarding) when\n * {@link SdkSectionPage}'s built-in button is hidden via\n * `hideSaveButton`.\n */\nexport interface SdkSectionSaveControl {\n /** Trigger a save of the currently-dirty fields. No-op while `isSaving` or `!isDirty`. */\n save: () => void;\n /** A save mutation is in flight. */\n isSaving: boolean;\n /** At least one field is dirty (or `extraDirty` was passed in). */\n isDirty: boolean;\n /** Current form values (for custom save flows). */\n values: SettingsFormValues;\n /** The active view tier (basic/advanced/all) the form is rendering. */\n view: SettingsView;\n /**\n * Returns the coerced, dirty-only payload as a nested object\n * (e.g. `{ llm: { temperature: 0.7 } }`). Lets a custom save flow persist\n * exactly the fields the user changed, with proper types, without\n * re-implementing schema-driven coercion. Throws if a field fails coercion.\n */\n getDirtyPayload: () => Record<string, unknown>;\n}\n\n/**\n * A generic SDK-schema-driven settings page that renders fields from one or\n * more schema sections.\n *\n * The `settingsSources` array specifies which schema(s)/section(s) the page\n * owns. The page tracks values/dirty state per source, renders sections from\n * each source in order (filtered by the schema's `prominence` field for the\n * selected view), and emits a combined save payload like\n * `{ conversation_settings_diff: {...}, agent_settings_diff: {...} }` ---\n * including only the keys for sources that actually have dirty changes.\n *\n * @param settingsSources one or more schemas to render fields from\n * @param header render prop above the fields (receives unified state)\n * @param buildPayload customize the save payload before submission\n * @param testId data-testid on the page wrapper\n */\nexport function SdkSectionPage({\n settingsSources,\n scope = \"personal\",\n header,\n extraDirty = false,\n buildPayload,\n onSaveSuccess,\n getInitialView,\n forceShowAdvancedView = false,\n allowAllView = true,\n initialValueOverrides,\n markInitialOverridesDirty = true,\n embedded = false,\n hideSaveButton = false,\n suppressSuccessToast = false,\n onSaveControlChange,\n testId = \"sdk-section-settings-screen\",\n}: {\n settingsSources: SettingsSourceConfig[];\n scope?: SettingsScope;\n\n header?: (props: SdkSectionHeaderProps) => React.ReactNode;\n extraDirty?: boolean;\n /**\n * Customize the save payload. Receives the wrapped default payload (e.g.\n * `{ agent_settings_diff: { llm: { model: \"gpt-4\" } } }`) plus the unified\n * form context. Return the payload to actually send.\n */\n buildPayload?: (\n defaultPayload: Record<string, unknown>,\n context: {\n values: SettingsFormValues;\n dirty: SettingsDirtyState;\n view: SettingsView;\n },\n ) => Record<string, unknown>;\n onSaveSuccess?: () => void;\n getInitialView?: (\n settings: Settings,\n filteredSchema: SettingsSchema,\n ) => SettingsView;\n forceShowAdvancedView?: boolean;\n allowAllView?: boolean;\n /**\n * Per-field initial value overrides that win over the values derived from\n * `useSettings`. When {@link markInitialOverridesDirty} is true (default),\n * override keys also start dirty so onboarding can save a prefill without\n * a touch. Profile editors should pass `false` so Save stays off until the\n * user changes something.\n */\n initialValueOverrides?: SettingsFormValues;\n /** @default true */\n markInitialOverridesDirty?: boolean;\n embedded?: boolean;\n hideSaveButton?: boolean;\n /** Suppress the default success toast after save completes. */\n suppressSuccessToast?: boolean;\n /**\n * Fires whenever the save state changes (a mutation starts/finishes,\n * dirty status flips). Provides a stable `save()` callback the\n * parent can wire to its own button. Useful when the form is\n * embedded in a custom flow and the built-in Save button is hidden.\n */\n onSaveControlChange?: (control: SdkSectionSaveControl) => void;\n testId?: string;\n}) {\n const { t } = useTranslation(\"openhands\");\n const { mutate: saveSettings, isPending } = useSaveSettings(scope);\n const { data: settings, isLoading, isFetching } = useSettings(scope);\n const agentSchemaQuery = useAgentSettingsSchema(\n settings?.agent_settings_schema,\n );\n const conversationSchemaQuery = useConversationSettingsSchema(\n settings?.conversation_settings_schema,\n );\n const isReadOnly = false;\n\n const sourcesSignature = React.useMemo(\n () =>\n JSON.stringify(\n settingsSources.map((s) => ({\n source: s.settingsSource,\n sectionKeys: s.sectionKeys,\n excludeKeys: s.excludeKeys ? Array.from(s.excludeKeys).sort() : null,\n })),\n ),\n [settingsSources],\n );\n\n const resolvedSourceConfigs = React.useMemo<SettingsSourceConfig[]>(() => {\n const parsed = JSON.parse(sourcesSignature) as Array<{\n source: SettingsValueSource;\n sectionKeys: string[];\n excludeKeys: string[] | null;\n }>;\n return parsed.map((p) => ({\n settingsSource: p.source,\n sectionKeys: p.sectionKeys,\n excludeKeys: p.excludeKeys ? new Set(p.excludeKeys) : undefined,\n }));\n }, [sourcesSignature]);\n\n const getSchemaForSource = React.useCallback(\n (source: SettingsValueSource) =>\n source === \"conversation_settings\"\n ? conversationSchemaQuery.data\n : agentSchemaQuery.data,\n [agentSchemaQuery.data, conversationSchemaQuery.data],\n );\n\n const isSchemaLoading = resolvedSourceConfigs.some((src) =>\n src.settingsSource === \"conversation_settings\"\n ? conversationSchemaQuery.isLoading\n : agentSchemaQuery.isLoading,\n );\n\n const resolvedSources = React.useMemo<ResolvedSource[]>(\n () =>\n resolvedSourceConfigs.map((src) => {\n const schema = getSchemaForSource(src.settingsSource);\n if (!isValidSettingsSchema(schema)) {\n return { ...src, filteredSchema: null };\n }\n const sectionSet = new Set(src.sectionKeys);\n // The agent schema can carry more than one section per key — e.g. the\n // combined AgentSettings schema emits an \"llm\" section for both the\n // \"openhands\" and \"acp\" variants. Only the first (openhands) is used,\n // so keep the first section per key; otherwise every field renders\n // twice and React sees duplicate section keys.\n const seenKeys = new Set<string>();\n const filteredSchema: SettingsSchema = {\n ...schema,\n sections: schema.sections.filter((s) => {\n if (!sectionSet.has(s.key) || seenKeys.has(s.key)) return false;\n seenKeys.add(s.key);\n return true;\n }),\n };\n return { ...src, filteredSchema };\n }),\n [resolvedSourceConfigs, getSchemaForSource],\n );\n\n // The basic tier only exists when some field renders in it; a critical-less\n // page (e.g. Memory, whose only field is major) hides the Basic tab and\n // floors its view at \"advanced\".\n const showBasic = resolvedSources.some((src) =>\n hasCriticalSettings(src.filteredSchema),\n );\n const showAdvanced =\n forceShowAdvancedView ||\n resolvedSources.some((src) => hasAdvancedSettings(src.filteredSchema));\n const showAll =\n allowAllView &&\n resolvedSources.some((src) => hasMinorSettings(src.filteredSchema));\n\n const schemaUnavailableMessage = React.useMemo(() => {\n const firstError = resolvedSourceConfigs.reduce<unknown>(\n (err, src) =>\n err ??\n (src.settingsSource === \"conversation_settings\"\n ? conversationSchemaQuery.error\n : agentSchemaQuery.error),\n null,\n );\n return getSchemaUnavailableMessage(\n firstError,\n t(I18nKey.SETTINGS$SDK_SCHEMA_UNAVAILABLE),\n );\n }, [\n resolvedSourceConfigs,\n agentSchemaQuery.error,\n conversationSchemaQuery.error,\n t,\n ]);\n\n const overridesSignature = React.useMemo(\n () => (initialValueOverrides ? JSON.stringify(initialValueOverrides) : \"\"),\n [initialValueOverrides],\n );\n const firstSettingsSource = resolvedSources[0]?.settingsSource;\n\n const [view, setView] = React.useState<SettingsView>(\"basic\");\n const [valuesBySource, setValuesBySource] = React.useState<\n Partial<Record<SettingsValueSource, SettingsFormValues>>\n >({});\n const [dirtyBySource, setDirtyBySource] = React.useState<\n Partial<Record<SettingsValueSource, SettingsDirtyState>>\n >({});\n const hasHydratedViewRef = React.useRef(false);\n\n const initialValuesBySource = React.useMemo<Partial<\n Record<SettingsValueSource, SettingsFormValues>\n > | null>(() => {\n if (!settings) return null;\n const result: Partial<Record<SettingsValueSource, SettingsFormValues>> = {};\n for (const src of resolvedSources) {\n if (!src.filteredSchema) return null;\n result[src.settingsSource] = {\n ...(result[src.settingsSource] ?? {}),\n ...buildInitialSettingsFormValues(\n settings,\n src.filteredSchema,\n src.settingsSource,\n ),\n };\n }\n if (initialValueOverrides) {\n const firstSource = resolvedSources[0]?.settingsSource;\n if (firstSource && result[firstSource]) {\n result[firstSource] = {\n ...result[firstSource],\n ...initialValueOverrides,\n };\n }\n }\n return result;\n }, [settings, resolvedSources, overridesSignature]);\n\n const initialView = React.useMemo(() => {\n if (!settings) return null;\n let result: SettingsView | null = null;\n for (const src of resolvedSources) {\n if (!src.filteredSchema) return null;\n const perSource = getInitialView\n ? getInitialView(settings, src.filteredSchema)\n : inferInitialView(settings, src.filteredSchema, src.settingsSource);\n result = result ? getMoreDetailedView(result, perSource) : perSource;\n }\n if (!result) return null;\n return normalizeView(result, { showBasic, showAdvanced, showAll });\n }, [\n settings,\n resolvedSources,\n getInitialView,\n showBasic,\n showAdvanced,\n showAll,\n ]);\n\n React.useEffect(() => {\n hasHydratedViewRef.current = false;\n setView(\"basic\");\n setValuesBySource({});\n setDirtyBySource({});\n }, [scope, sourcesSignature]);\n\n React.useEffect(() => {\n if (!initialValuesBySource || !initialView) return;\n if (hideSaveButton && hasHydratedViewRef.current) {\n return;\n }\n\n setValuesBySource(initialValuesBySource);\n if (initialValueOverrides && markInitialOverridesDirty) {\n const firstSource = firstSettingsSource;\n if (firstSource) {\n const overrideDirty: SettingsDirtyState = Object.fromEntries(\n Object.keys(initialValueOverrides).map((key) => [key, true]),\n );\n setDirtyBySource({ [firstSource]: overrideDirty });\n } else {\n setDirtyBySource({});\n }\n } else {\n setDirtyBySource({});\n }\n // The ref flip stays outside the updater: React double-invokes state\n // updaters in StrictMode, so mutating it in there makes the second\n // (kept) call take the already-hydrated branch and pin the view.\n if (!hasHydratedViewRef.current) {\n hasHydratedViewRef.current = true;\n setView(initialView);\n } else {\n setView((currentView) => getLessDetailedView(currentView, initialView));\n }\n }, [\n initialValuesBySource,\n initialView,\n overridesSignature,\n markInitialOverridesDirty,\n firstSettingsSource,\n hideSaveButton,\n ]);\n\n const fieldKeyToSource = React.useMemo(() => {\n const map = new Map<string, SettingsValueSource>();\n for (const src of resolvedSources) {\n if (src.filteredSchema) {\n for (const section of src.filteredSchema.sections) {\n for (const field of section.fields) {\n if (!map.has(field.key)) {\n map.set(field.key, src.settingsSource);\n }\n }\n }\n }\n }\n return map;\n }, [resolvedSources]);\n\n const flatValues = React.useMemo<SettingsFormValues>(() => {\n const merged: SettingsFormValues = {};\n for (const src of resolvedSources) {\n Object.assign(merged, valuesBySource[src.settingsSource] ?? {});\n }\n return merged;\n }, [resolvedSources, valuesBySource]);\n\n const flatDirty = React.useMemo<SettingsDirtyState>(() => {\n const merged: SettingsDirtyState = {};\n for (const src of resolvedSources) {\n Object.assign(merged, dirtyBySource[src.settingsSource] ?? {});\n }\n return merged;\n }, [resolvedSources, dirtyBySource]);\n\n const fieldsByKey = React.useMemo(() => {\n const map = new Map<string, SettingsFieldSchema>();\n for (const src of resolvedSources) {\n if (!src.filteredSchema) continue;\n for (const section of src.filteredSchema.sections) {\n for (const field of section.fields) {\n if (!map.has(field.key)) {\n map.set(field.key, field);\n }\n }\n }\n }\n return map;\n }, [resolvedSources]);\n\n const initialValuesBySourceRef = React.useRef(initialValuesBySource);\n initialValuesBySourceRef.current = initialValuesBySource;\n const initialValueOverridesRef = React.useRef(initialValueOverrides);\n initialValueOverridesRef.current = initialValueOverrides;\n const markInitialOverridesDirtyRef = React.useRef(markInitialOverridesDirty);\n markInitialOverridesDirtyRef.current = markInitialOverridesDirty;\n const fieldsByKeyRef = React.useRef(fieldsByKey);\n fieldsByKeyRef.current = fieldsByKey;\n\n const handleFieldChange = React.useCallback(\n (fieldKey: string, nextValue: string | boolean) => {\n const sourceKey =\n fieldKeyToSource.get(fieldKey) ?? resolvedSources[0]?.settingsSource;\n if (!sourceKey) return;\n setValuesBySource((prev) => ({\n ...prev,\n [sourceKey]: {\n ...(prev[sourceKey] ?? {}),\n [fieldKey]: nextValue,\n },\n }));\n setDirtyBySource((prev) => {\n const initialVal =\n initialValuesBySourceRef.current?.[sourceKey]?.[fieldKey];\n const stickyOverride =\n markInitialOverridesDirtyRef.current &&\n !!initialValueOverridesRef.current &&\n fieldKey in initialValueOverridesRef.current;\n const field = fieldsByKeyRef.current.get(fieldKey);\n const valuesMatch = field\n ? normalizeComparableValue(field, nextValue) ===\n normalizeComparableValue(field, initialVal)\n : nextValue === initialVal;\n\n if (valuesMatch && !stickyOverride) {\n if (!prev[sourceKey]?.[fieldKey]) return prev;\n const sourceDirty = { ...(prev[sourceKey] ?? {}) };\n delete sourceDirty[fieldKey];\n return { ...prev, [sourceKey]: sourceDirty };\n }\n\n if (prev[sourceKey]?.[fieldKey]) return prev;\n return {\n ...prev,\n [sourceKey]: { ...(prev[sourceKey] ?? {}), [fieldKey]: true },\n };\n });\n },\n [fieldKeyToSource, resolvedSources],\n );\n\n const handleError = React.useCallback(\n (error: AxiosError) => {\n const msg = retrieveAxiosErrorMessage(error);\n displayErrorToast(msg || t(I18nKey.ERROR$GENERIC));\n },\n [t],\n );\n\n const handleSaveRef = React.useRef<() => void>(() => {});\n const stableSave = React.useCallback(() => {\n handleSaveRef.current();\n }, []);\n\n // Stable accessor for the coerced, dirty-only payload. Mirrors the\n // `handleSaveRef` pattern so the exposed function reference stays stable\n // across renders while always reading the latest closure at call time.\n const buildDirtyPayloadRef = React.useRef<() => Record<string, unknown>>(\n () => ({}),\n );\n const stableGetDirtyPayload = React.useCallback(\n () => buildDirtyPayloadRef.current(),\n [],\n );\n\n const handleSave = () => {\n if (isReadOnly) return;\n if (resolvedSources.some((src) => !src.filteredSchema)) return;\n\n let payload: Record<string, unknown>;\n try {\n const defaultPayload: Record<string, unknown> = {};\n for (const src of resolvedSources) {\n const schema = src.filteredSchema!;\n const sourceValues = valuesBySource[src.settingsSource] ?? {};\n const sourceDirty = dirtyBySource[src.settingsSource] ?? {};\n const diff = buildSdkSettingsPayloadForView(\n schema,\n sourceValues,\n sourceDirty,\n view,\n );\n if (Object.keys(diff).length > 0) {\n const diffKey = PAYLOAD_DIFF_KEY[src.settingsSource];\n defaultPayload[diffKey] = {\n ...((defaultPayload[diffKey] as\n | Record<string, unknown>\n | undefined) ?? {}),\n ...diff,\n };\n }\n }\n\n payload = buildPayload\n ? buildPayload(defaultPayload, {\n values: flatValues,\n dirty: flatDirty,\n view,\n })\n : defaultPayload;\n } catch (error) {\n displayErrorToast(\n error instanceof Error ? error.message : t(I18nKey.ERROR$GENERIC),\n );\n return;\n }\n\n if (Object.keys(payload).length === 0) return;\n\n saveSettings(payload, {\n onError: handleError,\n onSuccess: () => {\n if (!suppressSuccessToast) {\n displaySuccessToast(t(I18nKey.SETTINGS$SAVED_WARNING));\n }\n setDirtyBySource({});\n onSaveSuccess?.();\n },\n });\n };\n\n handleSaveRef.current = handleSave;\n // Dirty-only (NOT view-filtered): we must never inject defaults for\n // non-visible fields here, or a custom save flow would reset fields the\n // user never touched. `buildSdkSettingsPayloadForView` is reserved for the\n // built-in full-replace save above. With multiple sources, we merge each\n // source's nested payload at the top level so single-source consumers\n // (e.g. `LlmSettingsLocalView`) keep reading `.llm` etc. unchanged.\n buildDirtyPayloadRef.current = () => {\n const merged: Record<string, unknown> = {};\n for (const src of resolvedSources) {\n if (!src.filteredSchema) continue;\n const sourceValues = valuesBySource[src.settingsSource] ?? {};\n const sourceDirty = dirtyBySource[src.settingsSource] ?? {};\n Object.assign(\n merged,\n buildSdkSettingsPayload(src.filteredSchema, sourceValues, sourceDirty),\n );\n }\n return merged;\n };\n\n const isDirty = Object.keys(flatDirty).length > 0;\n const saveControlIsDirty = isDirty || extraDirty;\n React.useEffect(() => {\n if (!onSaveControlChange) return;\n onSaveControlChange({\n save: stableSave,\n isSaving: isPending,\n isDirty: saveControlIsDirty,\n values: flatValues,\n view,\n getDirtyPayload: stableGetDirtyPayload,\n });\n }, [isPending, saveControlIsDirty, flatValues, view]);\n\n // Keep existing form content visible during background refetches to avoid\n // flashing the full skeleton (notably during onboarding Next transitions).\n const isInitialSettingsLoad = (isLoading || isFetching) && !settings;\n if (isInitialSettingsLoad || isSchemaLoading) {\n return <LlmSettingsInputsSkeleton />;\n }\n\n const hasAnyVisibleSection = resolvedSources.some(\n (src) => src.filteredSchema && src.filteredSchema.sections.length > 0,\n );\n\n if (!hasAnyVisibleSection) {\n return (\n <div\n data-testid=\"sdk-schema-unavailable\"\n className={extensionModuleEmptyStateClassName}\n >\n <p className=\"text-sm text-[var(--oh-muted)]\">\n {schemaUnavailableMessage}\n </p>\n </div>\n );\n }\n\n if (Object.keys(flatValues).length === 0) {\n return <LlmSettingsInputsSkeleton />;\n }\n\n // Scrolling is owned by the settings shell (or onboarding wrapper), not a\n // nested scroll region. Save actions are inline after the last field.\n const bodyClassName = \"flex flex-col gap-8\";\n\n return (\n <div\n data-testid={testId}\n className={\n embedded\n ? \"relative flex min-h-0 w-full flex-1 flex-col\"\n : \"relative w-full min-h-0\"\n }\n >\n <ViewToggle\n view={view}\n setView={setView}\n showBasic={showBasic}\n showAdvanced={showAdvanced}\n showAll={showAll}\n isDisabled={isReadOnly}\n />\n\n <div className={bodyClassName}>\n {header?.({\n values: flatValues,\n isDisabled: isReadOnly,\n view,\n onChange: handleFieldChange,\n })}\n\n {resolvedSources.map((src) => {\n if (!src.filteredSchema) return null;\n const sourceValues = valuesBySource[src.settingsSource] ?? {};\n const visibleSections = getVisibleSettingsSections(\n src.filteredSchema,\n { ...flatValues, ...sourceValues },\n view,\n src.excludeKeys ?? EMPTY_EXCLUDE_KEYS,\n );\n return visibleSections.map((section) => (\n <section\n key={`${src.settingsSource}:${section.key}`}\n className=\"flex flex-col gap-4\"\n >\n <div className=\"grid gap-4 xl:grid-cols-2\">\n {section.fields.map((field) => (\n <div\n key={field.key}\n className={\n FIELD_FULL_WIDTH_KEYS.has(field.key)\n ? \"xl:col-span-2\"\n : undefined\n }\n >\n <SchemaField\n field={field}\n value={sourceValues[field.key]}\n isDisabled={isReadOnly}\n onChange={(nextValue) =>\n handleFieldChange(field.key, nextValue)\n }\n />\n </div>\n ))}\n </div>\n </section>\n ));\n })}\n\n {!isReadOnly && !hideSaveButton ? (\n <div className=\"flex justify-start pt-2\">\n <BrandButton\n testId=\"save-button\"\n type=\"button\"\n variant=\"primary\"\n isDisabled={isPending || (!isDirty && !extraDirty)}\n onClick={handleSave}\n >\n {isPending\n ? t(I18nKey.SETTINGS$SAVING)\n : t(I18nKey.SETTINGS$SAVE_CHANGES)}\n </BrandButton>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":"s4BA2CA,IAAM,GAAqB,IAAI,IAEzB,EAA2C,CAC/C,MAAO,EACP,SAAU,EACV,IAAK,CACP,EAEM,IACJ,EACA,IAEA,EAAW,GAAY,EAAW,GAAe,EAAW,EAExD,IACJ,EACA,IAEA,EAAW,GAAY,EAAW,GAAe,EAAW,EAExD,IACJ,EACA,CACE,YACA,eACA,aAMe,CACjB,GAAI,IAAS,MAKX,OAJI,EACK,MAGF,EAAe,WAAa,QAGrC,GAAI,IAAS,WAKX,OAJI,EACK,WAGF,EAAU,MAAQ,QAI3B,GAAI,CAAC,EAAW,CACd,GAAI,EAAc,MAAO,WACzB,GAAI,EAAS,MAAO,KACtB,CACA,MAAO,OACT,EAEM,GAAwD,CAC5D,eAAgB,sBAChB,sBAAuB,4BACzB,EAEM,IACJ,EACA,IAEM,aAAiB,EAAA,WAInB,EAAM,UAAU,SAAW,IACtB,GAAG,EAAgB,yKAGxB,EAAM,UAAU,SAAW,IACtB,GAAG,EAAgB,qHAGrB,EAXE,EA4EX,SAAgB,EAAe,CAC7B,kBACA,QAAQ,WACR,SACA,aAAa,GACb,eACA,iBACA,iBACA,yBAAwB,GACxB,gBAAe,GACf,wBACA,4BAA4B,GAC5B,YAAW,GACX,iBAAiB,GACjB,wBAAuB,GACvB,sBACA,UAAS,+BAiDR,CACD,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAE,OAAQ,GAAc,aAAc,GAAA,gBAAgB,CAAK,EAC3D,CAAE,KAAM,EAAU,aAAW,eAAe,EAAA,YAAY,CAAK,EAC7D,EAAmB,EAAA,uBACvB,GAAU,qBACZ,EACM,EAA0B,EAAA,8BAC9B,GAAU,4BACZ,EAGM,EAAmB,EAAA,QAAM,YAE3B,KAAK,UACH,EAAgB,IAAK,IAAO,CAC1B,OAAQ,EAAE,eACV,YAAa,EAAE,YACf,YAAa,EAAE,YAAc,MAAM,KAAK,EAAE,WAAW,EAAE,KAAK,EAAI,IAClE,EAAE,CACJ,EACF,CAAC,CAAe,CAClB,EAEM,EAAwB,EAAA,QAAM,YACnB,KAAK,MAAM,CAKnB,EAAO,IAAK,IAAO,CACxB,eAAgB,EAAE,OAClB,YAAa,EAAE,YACf,YAAa,EAAE,YAAc,IAAI,IAAI,EAAE,WAAW,EAAI,IAAA,EACxD,EAAE,EACD,CAAC,CAAgB,CAAC,EAEf,EAAqB,EAAA,QAAM,YAC9B,GACC,IAAW,wBACP,EAAwB,KACxB,EAAiB,KACvB,CAAC,EAAiB,KAAM,EAAwB,IAAI,CACtD,EAEM,GAAkB,EAAsB,KAAM,GAClD,EAAI,iBAAmB,wBACnB,EAAwB,UACxB,EAAiB,SACvB,EAEM,EAAkB,EAAA,QAAM,YAE1B,EAAsB,IAAK,GAAQ,CACjC,IAAM,EAAS,EAAmB,EAAI,cAAc,EACpD,GAAI,CAAC,EAAA,sBAAsB,CAAM,EAC/B,MAAO,CAAE,GAAG,EAAK,eAAgB,IAAK,EAExC,IAAM,EAAa,IAAI,IAAI,EAAI,WAAW,EAMpC,EAAW,IAAI,IACf,EAAiC,CACrC,GAAG,EACH,SAAU,EAAO,SAAS,OAAQ,GAC5B,CAAC,EAAW,IAAI,EAAE,GAAG,GAAK,EAAS,IAAI,EAAE,GAAG,EAAU,IAC1D,EAAS,IAAI,EAAE,GAAG,EACX,GACR,CACH,EACA,MAAO,CAAE,GAAG,EAAK,gBAAe,CAClC,CAAC,EACH,CAAC,EAAuB,CAAkB,CAC5C,EAKM,EAAY,EAAgB,KAAM,GACtC,EAAA,oBAAoB,EAAI,cAAc,CACxC,EACM,EACJ,IACA,EAAgB,KAAM,GAAQ,EAAA,oBAAoB,EAAI,cAAc,CAAC,EACjE,EACJ,IACA,EAAgB,KAAM,GAAQ,EAAA,iBAAiB,EAAI,cAAc,CAAC,EAE9D,GAA2B,EAAA,QAAM,YAS9B,GARY,EAAsB,QACtC,EAAK,IACJ,IACC,EAAI,iBAAmB,wBACpB,EAAwB,MACxB,EAAiB,OACvB,IAGA,EACA,EAAE,EAAA,QAAQ,+BAA+B,CAC3C,EACC,CACD,EACA,EAAiB,MACjB,EAAwB,MACxB,CACF,CAAC,EAEK,EAAqB,EAAA,QAAM,YACxB,EAAwB,KAAK,UAAU,CAAqB,EAAI,GACvE,CAAC,CAAqB,CACxB,EACM,EAAsB,EAAgB,IAAI,eAE1C,CAAC,EAAM,GAAW,EAAA,QAAM,SAAuB,OAAO,EACtD,CAAC,EAAgB,GAAqB,EAAA,QAAM,SAEhD,CAAC,CAAC,EACE,CAAC,EAAe,GAAoB,EAAA,QAAM,SAE9C,CAAC,CAAC,EACE,EAAqB,EAAA,QAAM,OAAO,EAAK,EAEvC,EAAwB,EAAA,QAAM,YAEpB,CACd,GAAI,CAAC,EAAU,OAAO,KACtB,IAAM,EAAmE,CAAC,EAC1E,IAAK,IAAM,KAAO,EAAiB,CACjC,GAAI,CAAC,EAAI,eAAgB,OAAO,KAChC,EAAO,EAAI,gBAAkB,CAC3B,GAAI,EAAO,EAAI,iBAAmB,CAAC,EACnC,GAAG,EAAA,+BACD,EACA,EAAI,eACJ,EAAI,cACN,CACF,CACF,CACA,GAAI,EAAuB,CACzB,IAAM,EAAc,EAAgB,IAAI,eACpC,GAAe,EAAO,KACxB,EAAO,GAAe,CACpB,GAAG,EAAO,GACV,GAAG,CACL,EAEJ,CACA,OAAO,CACT,EAAG,CAAC,EAAU,EAAiB,CAAkB,CAAC,EAE5C,EAAc,EAAA,QAAM,YAAc,CACtC,GAAI,CAAC,EAAU,OAAO,KACtB,IAAI,EAA8B,KAClC,IAAK,IAAM,KAAO,EAAiB,CACjC,GAAI,CAAC,EAAI,eAAgB,OAAO,KAChC,IAAM,EAAY,EACd,EAAe,EAAU,EAAI,cAAc,EAC3C,EAAA,iBAAiB,EAAU,EAAI,eAAgB,EAAI,cAAc,EACrE,EAAS,EAAS,GAAoB,EAAQ,CAAS,EAAI,CAC7D,CAEA,OADK,EACE,GAAc,EAAQ,CAAE,YAAW,eAAc,SAAQ,CAAC,EAD7C,IAEtB,EAAG,CACD,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,EAED,EAAA,QAAM,cAAgB,CACpB,EAAmB,QAAU,GAC7B,EAAQ,OAAO,EACf,EAAkB,CAAC,CAAC,EACpB,EAAiB,CAAC,CAAC,CACrB,EAAG,CAAC,EAAO,CAAgB,CAAC,EAE5B,EAAA,QAAM,cAAgB,CAChB,MAAC,GAAyB,CAAC,IAC3B,KAAkB,EAAmB,SAKzC,IADA,EAAkB,CAAqB,EACnC,GAAyB,EAA2B,CACtD,IAAM,EAAc,EACpB,GAAI,EAAa,CACf,IAAM,EAAoC,OAAO,YAC/C,OAAO,KAAK,CAAqB,EAAE,IAAK,GAAQ,CAAC,EAAK,EAAI,CAAC,CAC7D,EACA,EAAiB,EAAG,GAAc,CAAc,CAAC,CACnD,MACE,EAAiB,CAAC,CAAC,CAEvB,MACE,EAAiB,CAAC,CAAC,EAKhB,EAAmB,QAItB,EAAS,GAAgB,GAAoB,EAAa,CAAW,CAAC,GAHtE,EAAmB,QAAU,GAC7B,EAAQ,CAAW,EAPA,CAWvB,EAAG,CACD,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,EAED,IAAM,EAAmB,EAAA,QAAM,YAAc,CAC3C,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAO,EAChB,GAAI,EAAI,mBACD,IAAM,KAAW,EAAI,eAAe,SACvC,IAAK,IAAM,KAAS,EAAQ,OACrB,EAAI,IAAI,EAAM,GAAG,GACpB,EAAI,IAAI,EAAM,IAAK,EAAI,cAAc,EAM/C,OAAO,CACT,EAAG,CAAC,CAAe,CAAC,EAEd,EAAa,EAAA,QAAM,YAAkC,CACzD,IAAM,EAA6B,CAAC,EACpC,IAAK,IAAM,KAAO,EAChB,OAAO,OAAO,EAAQ,EAAe,EAAI,iBAAmB,CAAC,CAAC,EAEhE,OAAO,CACT,EAAG,CAAC,EAAiB,CAAc,CAAC,EAE9B,EAAY,EAAA,QAAM,YAAkC,CACxD,IAAM,EAA6B,CAAC,EACpC,IAAK,IAAM,KAAO,EAChB,OAAO,OAAO,EAAQ,EAAc,EAAI,iBAAmB,CAAC,CAAC,EAE/D,OAAO,CACT,EAAG,CAAC,EAAiB,CAAa,CAAC,EAE7B,EAAc,EAAA,QAAM,YAAc,CACtC,IAAM,EAAM,IAAI,IAChB,IAAK,IAAM,KAAO,EACX,KAAI,eACT,IAAK,IAAM,KAAW,EAAI,eAAe,SACvC,IAAK,IAAM,KAAS,EAAQ,OACrB,EAAI,IAAI,EAAM,GAAG,GACpB,EAAI,IAAI,EAAM,IAAK,CAAK,EAKhC,OAAO,CACT,EAAG,CAAC,CAAe,CAAC,EAEd,EAA2B,EAAA,QAAM,OAAO,CAAqB,EACnE,EAAyB,QAAU,EACnC,IAAM,EAA2B,EAAA,QAAM,OAAO,CAAqB,EACnE,EAAyB,QAAU,EACnC,IAAM,EAA+B,EAAA,QAAM,OAAO,CAAyB,EAC3E,EAA6B,QAAU,EACvC,IAAM,EAAiB,EAAA,QAAM,OAAO,CAAW,EAC/C,EAAe,QAAU,EAEzB,IAAM,EAAoB,EAAA,QAAM,aAC7B,EAAkB,IAAgC,CACjD,IAAM,EACJ,EAAiB,IAAI,CAAQ,GAAK,EAAgB,IAAI,eACnD,IACL,EAAmB,IAAU,CAC3B,GAAG,GACF,GAAY,CACX,GAAI,EAAK,IAAc,CAAC,GACvB,GAAW,CACd,CACF,EAAE,EACF,EAAkB,GAAS,CACzB,IAAM,EACJ,EAAyB,UAAU,KAAa,GAC5C,EACJ,EAA6B,SAC7B,CAAC,CAAC,EAAyB,SAC3B,KAAY,EAAyB,QACjC,EAAQ,EAAe,QAAQ,IAAI,CAAQ,EAMjD,IALoB,EAChB,EAAA,yBAAyB,EAAO,CAAS,IACzC,EAAA,yBAAyB,EAAO,CAAU,EAC1C,IAAc,IAEC,CAAC,EAAgB,CAClC,GAAI,CAAC,EAAK,KAAa,GAAW,OAAO,EACzC,IAAM,EAAc,CAAE,GAAI,EAAK,IAAc,CAAC,CAAG,EAEjD,OADA,OAAO,EAAY,GACZ,CAAE,GAAG,GAAO,GAAY,CAAY,CAC7C,CAGA,OADI,EAAK,KAAa,GAAkB,EACjC,CACL,GAAG,GACF,GAAY,CAAE,GAAI,EAAK,IAAc,CAAC,GAAK,GAAW,EAAK,CAC9D,CACF,CAAC,EACH,EACA,CAAC,EAAkB,CAAe,CACpC,EAEM,GAAc,EAAA,QAAM,YACvB,GAAsB,CAErB,EAAA,kBADY,EAAA,0BAA0B,CACpB,GAAO,EAAE,EAAA,QAAQ,aAAa,CAAC,CACnD,EACA,CAAC,CAAC,CACJ,EAEM,EAAgB,EAAA,QAAM,WAAyB,CAAC,CAAC,EACjD,GAAa,EAAA,QAAM,gBAAkB,CACzC,EAAc,QAAQ,CACxB,EAAG,CAAC,CAAC,EAKC,GAAuB,EAAA,QAAM,YAC1B,CAAC,EACV,EACM,GAAwB,EAAA,QAAM,gBAC5B,GAAqB,QAAQ,EACnC,CAAC,CACH,EAEM,OAAmB,CAEvB,GAAI,EAAgB,KAAM,GAAQ,CAAC,EAAI,cAAc,EAAG,OAExD,IAAI,EACJ,GAAI,CACF,IAAM,EAA0C,CAAC,EACjD,IAAK,IAAM,KAAO,EAAiB,CACjC,IAAM,EAAS,EAAI,eAGb,EAAO,EAAA,+BACX,EAHmB,EAAe,EAAI,iBAAmB,CAAC,EACxC,EAAc,EAAI,iBAAmB,CAAC,EAKxD,CACF,EACA,GAAI,OAAO,KAAK,CAAI,EAAE,OAAS,EAAG,CAChC,IAAM,EAAU,GAAiB,EAAI,gBACrC,EAAe,GAAW,CACxB,GAAK,EAAe,IAEF,CAAC,EACnB,GAAG,CACL,CACF,CACF,CAEA,EAAU,EACN,EAAa,EAAgB,CAC3B,OAAQ,EACR,MAAO,EACP,MACF,CAAC,EACD,CACN,OAAS,EAAO,CACd,EAAA,kBACE,aAAiB,MAAQ,EAAM,QAAU,EAAE,EAAA,QAAQ,aAAa,CAClE,EACA,MACF,CAEI,OAAO,KAAK,CAAO,EAAE,SAAW,GAEpC,GAAa,EAAS,CACpB,QAAS,GACT,cAAiB,CACV,IACH,EAAA,oBAAoB,EAAE,EAAA,QAAQ,sBAAsB,CAAC,EAEvD,EAAiB,CAAC,CAAC,EACnB,KAAgB,CAClB,CACF,CAAC,CACH,EAEA,EAAc,QAAU,GAOxB,GAAqB,YAAgB,CACnC,IAAM,EAAkC,CAAC,EACzC,IAAK,IAAM,KAAO,EAAiB,CACjC,GAAI,CAAC,EAAI,eAAgB,SACzB,IAAM,EAAe,EAAe,EAAI,iBAAmB,CAAC,EACtD,EAAc,EAAc,EAAI,iBAAmB,CAAC,EAC1D,OAAO,OACL,EACA,EAAA,wBAAwB,EAAI,eAAgB,EAAc,CAAW,CACvE,CACF,CACA,OAAO,CACT,EAEA,IAAM,GAAU,OAAO,KAAK,CAAS,EAAE,OAAS,EAC1C,GAAqB,IAAW,EA6CtC,OA5CA,EAAA,QAAM,cAAgB,CACf,GACL,EAAoB,CAClB,KAAM,GACN,SAAU,EACV,QAAS,GACT,OAAQ,EACR,OACA,gBAAiB,EACnB,CAAC,CACH,EAAG,CAAC,EAAW,GAAoB,EAAY,CAAI,CAAC,GAIrB,IAAa,KAAe,CAAC,GAC/B,IACpB,EAAA,EAAA,KAAC,EAAA,0BAAD,CAA4B,CAAA,EAGR,EAAgB,KAC1C,GAAQ,EAAI,gBAAkB,EAAI,eAAe,SAAS,OAAS,CAGjE,EAaD,OAAO,KAAK,CAAU,EAAE,SAAW,GAC9B,EAAA,EAAA,KAAC,EAAA,0BAAD,CAA4B,CAAA,GAQnC,EAAA,EAAA,MAAC,MAAD,CACE,cAAa,GACb,UACE,GACI,+CACA,mCALR,EAQE,EAAA,EAAA,KAAC,GAAA,WAAD,CACQ,OACG,UACE,YACG,eACL,UACT,WAAY,EACb,CAAA,GAED,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,+BAAhB,CACG,IAAS,CACR,OAAQ,EACR,WAAY,GACZ,OACA,SAAU,CACZ,CAAC,EAEA,EAAgB,IAAK,GAAQ,CAC5B,GAAI,CAAC,EAAI,eAAgB,OAAO,KAChC,IAAM,EAAe,EAAe,EAAI,iBAAmB,CAAC,EAO5D,OANwB,EAAA,2BACtB,EAAI,eACJ,CAAE,GAAG,EAAY,GAAG,CAAa,EACjC,EACA,EAAI,aAAe,EAEd,EAAgB,IAAK,IAC1B,EAAA,EAAA,KAAC,UAAD,CAEE,UAAU,gCAEV,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qCACZ,EAAQ,OAAO,IAAK,IACnB,EAAA,EAAA,KAAC,MAAD,CAEE,UACE,EAAA,sBAAsB,IAAI,EAAM,GAAG,EAC/B,gBACA,IAAA,aAGN,EAAA,EAAA,KAAC,EAAA,YAAD,CACS,QACP,MAAO,EAAa,EAAM,KAC1B,WAAY,GACZ,SAAW,GACT,EAAkB,EAAM,IAAK,CAAS,CAEzC,CAAA,CACE,EAfE,EAAM,GAeR,CACN,CACE,CAAA,CACE,EAxBF,GAAG,EAAI,eAAe,GAAG,EAAQ,KAwB/B,CACV,CACH,CAAC,EAEgB,EAcb,MAbF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,oCACb,EAAA,EAAA,KAAC,GAAA,YAAD,CACE,OAAO,cACP,KAAK,SACL,QAAQ,UACR,WAAY,GAAc,CAAC,IAAW,CAAC,EACvC,QAAS,YAGL,EADH,EACK,EAAA,QAAQ,gBACR,EAAA,QAAQ,qBAAqB,CACxB,CAAA,CACV,CAAA,CAEJ,GACF,KApGH,EAAA,EAAA,KAAC,MAAD,CACE,cAAY,yBACZ,UAAW,GAAA,6CAEX,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,0CACV,EACA,CAAA,CACA,CAAA,CA+FX"}
@@ -56,7 +56,7 @@ export interface SdkSectionSaveControl {
56
56
  * @param buildPayload customize the save payload before submission
57
57
  * @param testId data-testid on the page wrapper
58
58
  */
59
- export declare function SdkSectionPage({ settingsSources, scope, header, extraDirty, buildPayload, onSaveSuccess, getInitialView, forceShowAdvancedView, allowAllView, initialValueOverrides, embedded, hideSaveButton, suppressSuccessToast, onSaveControlChange, testId, }: {
59
+ export declare function SdkSectionPage({ settingsSources, scope, header, extraDirty, buildPayload, onSaveSuccess, getInitialView, forceShowAdvancedView, allowAllView, initialValueOverrides, markInitialOverridesDirty, embedded, hideSaveButton, suppressSuccessToast, onSaveControlChange, testId, }: {
60
60
  settingsSources: SettingsSourceConfig[];
61
61
  scope?: SettingsScope;
62
62
  header?: (props: SdkSectionHeaderProps) => React.ReactNode;
@@ -76,14 +76,15 @@ export declare function SdkSectionPage({ settingsSources, scope, header, extraDi
76
76
  forceShowAdvancedView?: boolean;
77
77
  allowAllView?: boolean;
78
78
  /**
79
- * Per-field initial value overrides that win over the values
80
- * derived from `useSettings`. The keys of each override are also
81
- * marked dirty on hydration so the user can save the form without
82
- * having to touch the prefilled fields. Useful when the page is
83
- * embedded in a flow that wants to nudge brand-new users toward a
84
- * particular default (e.g. onboarding pre-filling OpenHands/Opus).
79
+ * Per-field initial value overrides that win over the values derived from
80
+ * `useSettings`. When {@link markInitialOverridesDirty} is true (default),
81
+ * override keys also start dirty so onboarding can save a prefill without
82
+ * a touch. Profile editors should pass `false` so Save stays off until the
83
+ * user changes something.
85
84
  */
86
85
  initialValueOverrides?: SettingsFormValues;
86
+ /** @default true */
87
+ markInitialOverridesDirty?: boolean;
87
88
  embedded?: boolean;
88
89
  hideSaveButton?: boolean;
89
90
  /** Suppress the default success toast after save completes. */