@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
@@ -2,24 +2,24 @@ import { useTranslation as e } from "../../../../node_modules/react-i18next/dist
2
2
  import { I18nKey as t } from "../../../../i18n/declaration.js";
3
3
  import { AxiosError as n } from "../../../../node_modules/axios/index.js";
4
4
  import { retrieveAxiosErrorMessage as r } from "../../../../utils/retrieve-axios-error-message.js";
5
- import { displayErrorToast as i, displaySuccessToast as ee } from "../../../../utils/custom-toast-handlers.js";
6
- import { useSettings as te } from "../../../../hooks/query/use-settings.js";
7
- import { useSaveSettings as ne } from "../../../../hooks/mutation/use-save-settings.js";
8
- import { BrandButton as re } from "../brand-button.js";
9
- import { extensionModuleEmptyStateClassName as a } from "../../../../utils/extension-module-card-classes.js";
10
- import { useAgentSettingsSchema as o, useConversationSettingsSchema as s } from "../../../../hooks/query/use-agent-settings-schema.js";
11
- import { LlmSettingsInputsSkeleton as c } from "../llm-settings/llm-settings-inputs-skeleton.js";
12
- import { buildInitialSettingsFormValues as ie, buildSdkSettingsPayload as ae, buildSdkSettingsPayloadForView as oe, getVisibleSettingsSections as se, hasAdvancedSettings as ce, hasCriticalSettings as le, hasMinorSettings as ue, inferInitialView as de, isValidSettingsSchema as fe } from "../../../../utils/sdk-settings-schema.js";
13
- import { FIELD_FULL_WIDTH_KEYS as pe, SchemaField as me } from "./schema-field.js";
14
- import { ViewToggle as he } from "./view-toggle.js";
15
- import l from "react";
16
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
+ import { displayErrorToast as i, displaySuccessToast as a } from "../../../../utils/custom-toast-handlers.js";
6
+ import { useSettings as o } from "../../../../hooks/query/use-settings.js";
7
+ import { useSaveSettings as ee } from "../../../../hooks/mutation/use-save-settings.js";
8
+ import { BrandButton as te } from "../brand-button.js";
9
+ import { extensionModuleEmptyStateClassName as ne } from "../../../../utils/extension-module-card-classes.js";
10
+ import { useAgentSettingsSchema as re, useConversationSettingsSchema as ie } from "../../../../hooks/query/use-agent-settings-schema.js";
11
+ import { LlmSettingsInputsSkeleton as s } from "../llm-settings/llm-settings-inputs-skeleton.js";
12
+ import { buildInitialSettingsFormValues as ae, buildSdkSettingsPayload as oe, buildSdkSettingsPayloadForView as se, getVisibleSettingsSections as ce, hasAdvancedSettings as le, hasCriticalSettings as ue, hasMinorSettings as de, inferInitialView as fe, isValidSettingsSchema as pe, normalizeComparableValue as me } from "../../../../utils/sdk-settings-schema.js";
13
+ import { FIELD_FULL_WIDTH_KEYS as he, SchemaField as ge } from "./schema-field.js";
14
+ import { ViewToggle as _e } from "./view-toggle.js";
15
+ import c from "react";
16
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
17
17
  //#region src/components/features/settings/sdk-settings/sdk-section-page.tsx
18
- var ge = /* @__PURE__ */ new Set(), f = {
18
+ var ve = /* @__PURE__ */ new Set(), d = {
19
19
  basic: 0,
20
20
  advanced: 1,
21
21
  all: 2
22
- }, _e = (e, t) => f[t] < f[e] ? t : e, p = (e, t) => f[t] > f[e] ? t : e, ve = (e, { showBasic: t, showAdvanced: n, showAll: r }) => {
22
+ }, ye = (e, t) => d[t] < d[e] ? t : e, be = (e, t) => d[t] > d[e] ? t : e, xe = (e, { showBasic: t, showAdvanced: n, showAll: r }) => {
23
23
  if (e === "all") return r ? "all" : n ? "advanced" : "basic";
24
24
  if (e === "advanced") return n ? "advanced" : r ? "all" : "basic";
25
25
  if (!t) {
@@ -27,22 +27,22 @@ var ge = /* @__PURE__ */ new Set(), f = {
27
27
  if (r) return "all";
28
28
  }
29
29
  return "basic";
30
- }, ye = {
30
+ }, Se = {
31
31
  agent_settings: "agent_settings_diff",
32
32
  conversation_settings: "conversation_settings_diff"
33
- }, be = (e, t) => e instanceof n ? 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;
34
- function m({ settingsSources: n, scope: f = "personal", header: m, extraDirty: h = !1, buildPayload: g, onSaveSuccess: xe, getInitialView: _, forceShowAdvancedView: Se = !1, allowAllView: Ce = !0, initialValueOverrides: v, embedded: we = !1, hideSaveButton: Te = !1, suppressSuccessToast: Ee = !1, onSaveControlChange: y, testId: De = "sdk-section-settings-screen" }) {
35
- let { t: b } = e("openhands"), { mutate: x, isPending: S } = ne(f), { data: C, isLoading: w, isFetching: T } = te(f), E = o(C?.agent_settings_schema), D = s(C?.conversation_settings_schema), O = l.useMemo(() => JSON.stringify(n.map((e) => ({
33
+ }, Ce = (e, t) => e instanceof n ? 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;
34
+ function f({ settingsSources: n, scope: d = "personal", header: f, extraDirty: p = !1, buildPayload: m, onSaveSuccess: we, getInitialView: h, forceShowAdvancedView: Te = !1, allowAllView: Ee = !0, initialValueOverrides: g, markInitialOverridesDirty: _ = !0, embedded: De = !1, hideSaveButton: v = !1, suppressSuccessToast: Oe = !1, onSaveControlChange: y, testId: ke = "sdk-section-settings-screen" }) {
35
+ let { t: b } = e("openhands"), { mutate: Ae, isPending: x } = ee(d), { data: S, isLoading: je, isFetching: Me } = o(d), C = re(S?.agent_settings_schema), w = ie(S?.conversation_settings_schema), T = c.useMemo(() => JSON.stringify(n.map((e) => ({
36
36
  source: e.settingsSource,
37
37
  sectionKeys: e.sectionKeys,
38
38
  excludeKeys: e.excludeKeys ? Array.from(e.excludeKeys).sort() : null
39
- }))), [n]), k = l.useMemo(() => JSON.parse(O).map((e) => ({
39
+ }))), [n]), E = c.useMemo(() => JSON.parse(T).map((e) => ({
40
40
  settingsSource: e.source,
41
41
  sectionKeys: e.sectionKeys,
42
42
  excludeKeys: e.excludeKeys ? new Set(e.excludeKeys) : void 0
43
- })), [O]), A = l.useCallback((e) => e === "conversation_settings" ? D.data : E.data, [E.data, D.data]), j = k.some((e) => e.settingsSource === "conversation_settings" ? D.isLoading : E.isLoading), M = l.useMemo(() => k.map((e) => {
44
- let t = A(e.settingsSource);
45
- if (!fe(t)) return {
43
+ })), [T]), D = c.useCallback((e) => e === "conversation_settings" ? w.data : C.data, [C.data, w.data]), Ne = E.some((e) => e.settingsSource === "conversation_settings" ? w.isLoading : C.isLoading), O = c.useMemo(() => E.map((e) => {
44
+ let t = D(e.settingsSource);
45
+ if (!pe(t)) return {
46
46
  ...e,
47
47
  filteredSchema: null
48
48
  };
@@ -54,218 +54,248 @@ function m({ settingsSources: n, scope: f = "personal", header: m, extraDirty: h
54
54
  ...e,
55
55
  filteredSchema: i
56
56
  };
57
- }), [k, A]), N = M.some((e) => le(e.filteredSchema)), P = Se || M.some((e) => ce(e.filteredSchema)), F = Ce && M.some((e) => ue(e.filteredSchema)), Oe = l.useMemo(() => be(k.reduce((e, t) => e ?? (t.settingsSource === "conversation_settings" ? D.error : E.error), null), b(t.SETTINGS$SDK_SCHEMA_UNAVAILABLE)), [
58
- k,
59
- E.error,
60
- D.error,
57
+ }), [E, D]), k = O.some((e) => ue(e.filteredSchema)), A = Te || O.some((e) => le(e.filteredSchema)), j = Ee && O.some((e) => de(e.filteredSchema)), Pe = c.useMemo(() => Ce(E.reduce((e, t) => e ?? (t.settingsSource === "conversation_settings" ? w.error : C.error), null), b(t.SETTINGS$SDK_SCHEMA_UNAVAILABLE)), [
58
+ E,
59
+ C.error,
60
+ w.error,
61
61
  b
62
- ]), ke = l.useMemo(() => v ? JSON.stringify(v) : "", [v]), [I, L] = l.useState("basic"), [R, z] = l.useState({}), [B, V] = l.useState({}), H = l.useRef(!1), U = l.useMemo(() => {
63
- if (!C) return null;
62
+ ]), M = c.useMemo(() => g ? JSON.stringify(g) : "", [g]), N = O[0]?.settingsSource, [P, F] = c.useState("basic"), [I, L] = c.useState({}), [R, z] = c.useState({}), B = c.useRef(!1), V = c.useMemo(() => {
63
+ if (!S) return null;
64
64
  let e = {};
65
- for (let t of M) {
65
+ for (let t of O) {
66
66
  if (!t.filteredSchema) return null;
67
67
  e[t.settingsSource] = {
68
68
  ...e[t.settingsSource] ?? {},
69
- ...ie(C, t.filteredSchema, t.settingsSource)
69
+ ...ae(S, t.filteredSchema, t.settingsSource)
70
70
  };
71
71
  }
72
- if (v) {
73
- let t = M[0]?.settingsSource;
72
+ if (g) {
73
+ let t = O[0]?.settingsSource;
74
74
  t && e[t] && (e[t] = {
75
75
  ...e[t],
76
- ...v
76
+ ...g
77
77
  });
78
78
  }
79
79
  return e;
80
80
  }, [
81
- C,
82
- M,
83
- ke
84
- ]), W = l.useMemo(() => {
85
- if (!C) return null;
81
+ S,
82
+ O,
83
+ M
84
+ ]), H = c.useMemo(() => {
85
+ if (!S) return null;
86
86
  let e = null;
87
- for (let t of M) {
87
+ for (let t of O) {
88
88
  if (!t.filteredSchema) return null;
89
- let n = _ ? _(C, t.filteredSchema) : de(C, t.filteredSchema, t.settingsSource);
90
- e = e ? p(e, n) : n;
89
+ let n = h ? h(S, t.filteredSchema) : fe(S, t.filteredSchema, t.settingsSource);
90
+ e = e ? be(e, n) : n;
91
91
  }
92
- return e ? ve(e, {
93
- showBasic: N,
94
- showAdvanced: P,
95
- showAll: F
92
+ return e ? xe(e, {
93
+ showBasic: k,
94
+ showAdvanced: A,
95
+ showAll: j
96
96
  }) : null;
97
97
  }, [
98
- C,
98
+ S,
99
+ O,
100
+ h,
101
+ k,
102
+ A,
103
+ j
104
+ ]);
105
+ c.useEffect(() => {
106
+ B.current = !1, F("basic"), L({}), z({});
107
+ }, [d, T]), c.useEffect(() => {
108
+ if (!(!V || !H) && !(v && B.current)) {
109
+ if (L(V), g && _) {
110
+ let e = N;
111
+ if (e) {
112
+ let t = Object.fromEntries(Object.keys(g).map((e) => [e, !0]));
113
+ z({ [e]: t });
114
+ } else z({});
115
+ } else z({});
116
+ B.current ? F((e) => ye(e, H)) : (B.current = !0, F(H));
117
+ }
118
+ }, [
119
+ V,
120
+ H,
99
121
  M,
100
122
  _,
101
123
  N,
102
- P,
103
- F
124
+ v
104
125
  ]);
105
- l.useEffect(() => {
106
- H.current = !1, L("basic"), z({}), V({});
107
- }, [f, O]), l.useEffect(() => {
108
- if (!(!U || !W)) {
109
- if (z(U), v) {
110
- let e = M[0]?.settingsSource;
111
- if (e) {
112
- let t = Object.fromEntries(Object.keys(v).map((e) => [e, !0]));
113
- V({ [e]: t });
114
- } else V({});
115
- } else V({});
116
- H.current ? L((e) => _e(e, W)) : (H.current = !0, L(W));
117
- }
118
- }, [U, W]);
119
- let G = l.useMemo(() => {
126
+ let U = c.useMemo(() => {
120
127
  let e = /* @__PURE__ */ new Map();
121
- for (let t of M) 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);
128
+ for (let t of O) 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);
122
129
  return e;
123
- }, [M]), K = l.useMemo(() => {
130
+ }, [O]), W = c.useMemo(() => {
124
131
  let e = {};
125
- for (let t of M) Object.assign(e, R[t.settingsSource] ?? {});
132
+ for (let t of O) Object.assign(e, I[t.settingsSource] ?? {});
126
133
  return e;
127
- }, [M, R]), q = l.useMemo(() => {
134
+ }, [O, I]), G = c.useMemo(() => {
128
135
  let e = {};
129
- for (let t of M) Object.assign(e, B[t.settingsSource] ?? {});
136
+ for (let t of O) Object.assign(e, R[t.settingsSource] ?? {});
130
137
  return e;
131
- }, [M, B]), J = l.useCallback((e, t) => {
132
- let n = G.get(e);
133
- n && (z((r) => ({
138
+ }, [O, R]), K = c.useMemo(() => {
139
+ let e = /* @__PURE__ */ new Map();
140
+ for (let t of O) 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);
141
+ return e;
142
+ }, [O]), q = c.useRef(V);
143
+ q.current = V;
144
+ let J = c.useRef(g);
145
+ J.current = g;
146
+ let Y = c.useRef(_);
147
+ Y.current = _;
148
+ let X = c.useRef(K);
149
+ X.current = K;
150
+ let Z = c.useCallback((e, t) => {
151
+ let n = U.get(e) ?? O[0]?.settingsSource;
152
+ n && (L((r) => ({
134
153
  ...r,
135
154
  [n]: {
136
155
  ...r[n] ?? {},
137
156
  [e]: t
138
157
  }
139
- })), V((t) => ({
140
- ...t,
141
- [n]: {
142
- ...t[n] ?? {},
143
- [e]: !0
158
+ })), z((r) => {
159
+ let i = q.current?.[n]?.[e], a = Y.current && !!J.current && e in J.current, o = X.current.get(e);
160
+ if ((o ? me(o, t) === me(o, i) : t === i) && !a) {
161
+ if (!r[n]?.[e]) return r;
162
+ let t = { ...r[n] ?? {} };
163
+ return delete t[e], {
164
+ ...r,
165
+ [n]: t
166
+ };
144
167
  }
145
- })));
146
- }, [G]), Ae = l.useCallback((e) => {
168
+ return r[n]?.[e] ? r : {
169
+ ...r,
170
+ [n]: {
171
+ ...r[n] ?? {},
172
+ [e]: !0
173
+ }
174
+ };
175
+ }));
176
+ }, [U, O]), Fe = c.useCallback((e) => {
147
177
  i(r(e) || b(t.ERROR$GENERIC));
148
- }, [b]), Y = l.useRef(() => {}), je = l.useCallback(() => {
149
- Y.current();
150
- }, []), X = l.useRef(() => ({})), Me = l.useCallback(() => X.current(), []), Z = () => {
151
- if (M.some((e) => !e.filteredSchema)) return;
178
+ }, [b]), Q = c.useRef(() => {}), Ie = c.useCallback(() => {
179
+ Q.current();
180
+ }, []), $ = c.useRef(() => ({})), Le = c.useCallback(() => $.current(), []), Re = () => {
181
+ if (O.some((e) => !e.filteredSchema)) return;
152
182
  let e;
153
183
  try {
154
184
  let t = {};
155
- for (let e of M) {
156
- let n = e.filteredSchema, r = oe(n, R[e.settingsSource] ?? {}, B[e.settingsSource] ?? {}, I);
185
+ for (let e of O) {
186
+ let n = e.filteredSchema, r = se(n, I[e.settingsSource] ?? {}, R[e.settingsSource] ?? {}, P);
157
187
  if (Object.keys(r).length > 0) {
158
- let n = ye[e.settingsSource];
188
+ let n = Se[e.settingsSource];
159
189
  t[n] = {
160
190
  ...t[n] ?? {},
161
191
  ...r
162
192
  };
163
193
  }
164
194
  }
165
- e = g ? g(t, {
166
- values: K,
167
- dirty: q,
168
- view: I
195
+ e = m ? m(t, {
196
+ values: W,
197
+ dirty: G,
198
+ view: P
169
199
  }) : t;
170
200
  } catch (e) {
171
201
  i(e instanceof Error ? e.message : b(t.ERROR$GENERIC));
172
202
  return;
173
203
  }
174
- Object.keys(e).length !== 0 && x(e, {
175
- onError: Ae,
204
+ Object.keys(e).length !== 0 && Ae(e, {
205
+ onError: Fe,
176
206
  onSuccess: () => {
177
- Ee || ee(b(t.SETTINGS$SAVED_WARNING)), V({}), xe?.();
207
+ Oe || a(b(t.SETTINGS$SAVED_WARNING)), z({}), we?.();
178
208
  }
179
209
  });
180
210
  };
181
- Y.current = Z, X.current = () => {
211
+ Q.current = Re, $.current = () => {
182
212
  let e = {};
183
- for (let t of M) {
213
+ for (let t of O) {
184
214
  if (!t.filteredSchema) continue;
185
- let n = R[t.settingsSource] ?? {}, r = B[t.settingsSource] ?? {};
186
- Object.assign(e, ae(t.filteredSchema, n, r));
215
+ let n = I[t.settingsSource] ?? {}, r = R[t.settingsSource] ?? {};
216
+ Object.assign(e, oe(t.filteredSchema, n, r));
187
217
  }
188
218
  return e;
189
219
  };
190
- let Q = Object.keys(q).length > 0, $ = Q || h;
191
- return l.useEffect(() => {
220
+ let ze = Object.keys(G).length > 0, Be = ze || p;
221
+ return c.useEffect(() => {
192
222
  y && y({
193
- save: je,
194
- isSaving: S,
195
- isDirty: $,
196
- values: K,
197
- view: I,
198
- getDirtyPayload: Me
223
+ save: Ie,
224
+ isSaving: x,
225
+ isDirty: Be,
226
+ values: W,
227
+ view: P,
228
+ getDirtyPayload: Le
199
229
  });
200
230
  }, [
201
- S,
202
- $,
203
- K,
204
- I
205
- ]), (w || T) && !C || j ? /* @__PURE__ */ u(c, {}) : M.some((e) => e.filteredSchema && e.filteredSchema.sections.length > 0) ? Object.keys(K).length === 0 ? /* @__PURE__ */ u(c, {}) : /* @__PURE__ */ d("div", {
206
- "data-testid": De,
207
- className: we ? "relative flex min-h-0 w-full flex-1 flex-col" : "relative w-full min-h-0",
208
- children: [/* @__PURE__ */ u(he, {
209
- view: I,
210
- setView: L,
211
- showBasic: N,
212
- showAdvanced: P,
213
- showAll: F,
231
+ x,
232
+ Be,
233
+ W,
234
+ P
235
+ ]), (je || Me) && !S || Ne ? /* @__PURE__ */ l(s, {}) : O.some((e) => e.filteredSchema && e.filteredSchema.sections.length > 0) ? Object.keys(W).length === 0 ? /* @__PURE__ */ l(s, {}) : /* @__PURE__ */ u("div", {
236
+ "data-testid": ke,
237
+ className: De ? "relative flex min-h-0 w-full flex-1 flex-col" : "relative w-full min-h-0",
238
+ children: [/* @__PURE__ */ l(_e, {
239
+ view: P,
240
+ setView: F,
241
+ showBasic: k,
242
+ showAdvanced: A,
243
+ showAll: j,
214
244
  isDisabled: !1
215
- }), /* @__PURE__ */ d("div", {
245
+ }), /* @__PURE__ */ u("div", {
216
246
  className: "flex flex-col gap-8",
217
247
  children: [
218
- m?.({
219
- values: K,
248
+ f?.({
249
+ values: W,
220
250
  isDisabled: !1,
221
- view: I,
222
- onChange: J
251
+ view: P,
252
+ onChange: Z
223
253
  }),
224
- M.map((e) => {
254
+ O.map((e) => {
225
255
  if (!e.filteredSchema) return null;
226
- let t = R[e.settingsSource] ?? {};
227
- return se(e.filteredSchema, {
228
- ...K,
256
+ let t = I[e.settingsSource] ?? {};
257
+ return ce(e.filteredSchema, {
258
+ ...W,
229
259
  ...t
230
- }, I, e.excludeKeys ?? ge).map((n) => /* @__PURE__ */ u("section", {
260
+ }, P, e.excludeKeys ?? ve).map((n) => /* @__PURE__ */ l("section", {
231
261
  className: "flex flex-col gap-4",
232
- children: /* @__PURE__ */ u("div", {
262
+ children: /* @__PURE__ */ l("div", {
233
263
  className: "grid gap-4 xl:grid-cols-2",
234
- children: n.fields.map((e) => /* @__PURE__ */ u("div", {
235
- className: pe.has(e.key) ? "xl:col-span-2" : void 0,
236
- children: /* @__PURE__ */ u(me, {
264
+ children: n.fields.map((e) => /* @__PURE__ */ l("div", {
265
+ className: he.has(e.key) ? "xl:col-span-2" : void 0,
266
+ children: /* @__PURE__ */ l(ge, {
237
267
  field: e,
238
268
  value: t[e.key],
239
269
  isDisabled: !1,
240
- onChange: (t) => J(e.key, t)
270
+ onChange: (t) => Z(e.key, t)
241
271
  })
242
272
  }, e.key))
243
273
  })
244
274
  }, `${e.settingsSource}:${n.key}`));
245
275
  }),
246
- Te ? null : /* @__PURE__ */ u("div", {
276
+ v ? null : /* @__PURE__ */ l("div", {
247
277
  className: "flex justify-start pt-2",
248
- children: /* @__PURE__ */ u(re, {
278
+ children: /* @__PURE__ */ l(te, {
249
279
  testId: "save-button",
250
280
  type: "button",
251
281
  variant: "primary",
252
- isDisabled: S || !Q && !h,
253
- onClick: Z,
254
- children: b(S ? t.SETTINGS$SAVING : t.SETTINGS$SAVE_CHANGES)
282
+ isDisabled: x || !ze && !p,
283
+ onClick: Re,
284
+ children: b(x ? t.SETTINGS$SAVING : t.SETTINGS$SAVE_CHANGES)
255
285
  })
256
286
  })
257
287
  ]
258
288
  })]
259
- }) : /* @__PURE__ */ u("div", {
289
+ }) : /* @__PURE__ */ l("div", {
260
290
  "data-testid": "sdk-schema-unavailable",
261
- className: a,
262
- children: /* @__PURE__ */ u("p", {
291
+ className: ne,
292
+ children: /* @__PURE__ */ l("p", {
263
293
  className: "text-sm text-[var(--oh-muted)]",
264
- children: Oe
294
+ children: Pe
265
295
  })
266
296
  });
267
297
  }
268
298
  //#endregion
269
- export { m as SdkSectionPage };
299
+ export { f as SdkSectionPage };
270
300
 
271
301
  //# sourceMappingURL=sdk-section-page.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-section-page.js","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.js","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":"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"}