@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
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../types/agent-state.cjs"),t=require("../types/agent-server/core/base/common.cjs"),n=require("../stores/conversation-state-store.cjs"),r=require("./query/use-active-conversation.cjs");let i=require("react");function a(n){if(!n)return e.AgentState.LOADING;switch(n){case t.ExecutionStatus.IDLE:return e.AgentState.AWAITING_USER_INPUT;case t.ExecutionStatus.RUNNING:return e.AgentState.RUNNING;case t.ExecutionStatus.PAUSED:return e.AgentState.PAUSED;case t.ExecutionStatus.WAITING_FOR_CONFIRMATION:return e.AgentState.AWAITING_USER_CONFIRMATION;case t.ExecutionStatus.FINISHED:return e.AgentState.FINISHED;case t.ExecutionStatus.ERROR:return e.AgentState.ERROR;case t.ExecutionStatus.STUCK:return e.AgentState.ERROR;default:return e.AgentState.LOADING}}function o(){let e=n.useConversationStateStore(e=>e.execution_status),t=r.useActiveConversation().data?.execution_status??null,o=e??t;return{curAgentState:(0,i.useMemo)(()=>a(o),[o]),executionStatus:o}}exports.useAgentState=o;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../types/agent-state.cjs"),t=require("../types/agent-server/core/base/common.cjs"),n=require("./use-conversation-id.cjs"),r=require("../stores/conversation-store.cjs"),i=require("../stores/conversation-state-store.cjs"),a=require("./query/use-active-conversation.cjs");let o=require("react");function s(n){if(!n)return e.AgentState.LOADING;switch(n){case t.ExecutionStatus.IDLE:return e.AgentState.AWAITING_USER_INPUT;case t.ExecutionStatus.RUNNING:return e.AgentState.RUNNING;case t.ExecutionStatus.PAUSED:return e.AgentState.PAUSED;case t.ExecutionStatus.WAITING_FOR_CONFIRMATION:return e.AgentState.AWAITING_USER_CONFIRMATION;case t.ExecutionStatus.FINISHED:return e.AgentState.FINISHED;case t.ExecutionStatus.ERROR:return e.AgentState.ERROR;case t.ExecutionStatus.STUCK:return e.AgentState.ERROR;default:return e.AgentState.LOADING}}function c(e){let{conversationId:t}=n.useOptionalConversationId(),r=e??t,c=!e||e===t,l=i.useConversationStateStore(e=>r?e.executionStatusByConversation[r]??null:null),u=a.useActiveConversation().data?.execution_status??null,d=l??(c?u:null);return{curAgentState:(0,o.useMemo)(()=>s(d),[d]),executionStatus:d}}function l(){let t=r.useConversationStore(e=>e.localPlanningConversationId),{curAgentState:n}=c(t??void 0);return{localPlanningConversationId:t,curPlanningAgentState:n,isPlanningAgentRunning:!!t&&(n===e.AgentState.RUNNING||n===e.AgentState.LOADING)}}exports.useAgentState=c,exports.usePlanningAgentState=l;
2
2
  //# sourceMappingURL=use-agent-state.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-agent-state.cjs","names":[],"sources":["../../src/hooks/use-agent-state.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useConversationStateStore } from \"#/stores/conversation-state-store\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Maps agent execution status to AgentState\n */\nfunction mapExecutionStatusToAgentState(\n status: ExecutionStatus | null,\n): AgentState {\n if (!status) {\n return AgentState.LOADING;\n }\n\n switch (status) {\n case ExecutionStatus.IDLE:\n return AgentState.AWAITING_USER_INPUT;\n case ExecutionStatus.RUNNING:\n return AgentState.RUNNING;\n case ExecutionStatus.PAUSED:\n return AgentState.PAUSED;\n case ExecutionStatus.WAITING_FOR_CONFIRMATION:\n return AgentState.AWAITING_USER_CONFIRMATION;\n case ExecutionStatus.FINISHED:\n return AgentState.FINISHED;\n case ExecutionStatus.ERROR:\n return AgentState.ERROR;\n case ExecutionStatus.STUCK:\n return AgentState.ERROR; // Map STUCK to ERROR for now\n default:\n return AgentState.LOADING;\n }\n}\n\nexport interface UseAgentStateResult {\n curAgentState: AgentState;\n executionStatus?: ExecutionStatus | null;\n}\n\n/**\n * Returns the current agent state from conversation execution status.\n */\nexport function useAgentState(): UseAgentStateResult {\n const liveExecutionStatus = useConversationStateStore(\n (state) => state.execution_status,\n );\n const fallbackExecutionStatus =\n useActiveConversation().data?.execution_status ?? null;\n\n const executionStatus = liveExecutionStatus ?? fallbackExecutionStatus;\n const curAgentState = useMemo(\n () => mapExecutionStatusToAgentState(executionStatus),\n [executionStatus],\n );\n\n return { curAgentState, executionStatus };\n}\n"],"mappings":"6QASA,SAAS,EACP,EACY,CACZ,GAAI,CAAC,EACH,OAAO,EAAA,WAAW,QAGpB,OAAQ,EAAR,CACE,KAAK,EAAA,gBAAgB,KACnB,OAAO,EAAA,WAAW,oBACpB,KAAK,EAAA,gBAAgB,QACnB,OAAO,EAAA,WAAW,QACpB,KAAK,EAAA,gBAAgB,OACnB,OAAO,EAAA,WAAW,OACpB,KAAK,EAAA,gBAAgB,yBACnB,OAAO,EAAA,WAAW,2BACpB,KAAK,EAAA,gBAAgB,SACnB,OAAO,EAAA,WAAW,SACpB,KAAK,EAAA,gBAAgB,MACnB,OAAO,EAAA,WAAW,MACpB,KAAK,EAAA,gBAAgB,MACnB,OAAO,EAAA,WAAW,MACpB,QACE,OAAO,EAAA,WAAW,OACtB,CACF,CAUA,SAAgB,GAAqC,CACnD,IAAM,EAAsB,EAAA,0BACzB,GAAU,EAAM,gBACnB,EACM,EACJ,EAAA,sBAAsB,EAAE,MAAM,kBAAoB,KAE9C,EAAkB,GAAuB,EAM/C,MAAO,CAAE,eAAA,EAAA,EAAA,aAJD,EAA+B,CAAe,EACpD,CAAC,CAAe,CAGT,EAAe,iBAAgB,CAC1C"}
1
+ {"version":3,"file":"use-agent-state.cjs","names":[],"sources":["../../src/hooks/use-agent-state.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { useConversationStateStore } from \"#/stores/conversation-state-store\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Maps agent execution status to AgentState\n */\nfunction mapExecutionStatusToAgentState(\n status: ExecutionStatus | null,\n): AgentState {\n if (!status) {\n return AgentState.LOADING;\n }\n\n switch (status) {\n case ExecutionStatus.IDLE:\n return AgentState.AWAITING_USER_INPUT;\n case ExecutionStatus.RUNNING:\n return AgentState.RUNNING;\n case ExecutionStatus.PAUSED:\n return AgentState.PAUSED;\n case ExecutionStatus.WAITING_FOR_CONFIRMATION:\n return AgentState.AWAITING_USER_CONFIRMATION;\n case ExecutionStatus.FINISHED:\n return AgentState.FINISHED;\n case ExecutionStatus.ERROR:\n return AgentState.ERROR;\n case ExecutionStatus.STUCK:\n return AgentState.ERROR; // Map STUCK to ERROR for now\n default:\n return AgentState.LOADING;\n }\n}\n\nexport interface UseAgentStateResult {\n curAgentState: AgentState;\n executionStatus?: ExecutionStatus | null;\n}\n\n/**\n * Returns the current agent state from conversation execution status.\n *\n * Defaults to the conversation in the current route. Pass `conversationId`\n * to read another conversation's status instead — e.g. a local planner\n * helper conversation, whose run/idle transitions are tracked separately\n * from the main conversation's (see conversation-state-store.ts).\n */\nexport function useAgentState(conversationId?: string): UseAgentStateResult {\n const { conversationId: routeConversationId } = useOptionalConversationId();\n const targetConversationId = conversationId ?? routeConversationId;\n const isRouteConversation =\n !conversationId || conversationId === routeConversationId;\n\n const liveExecutionStatus = useConversationStateStore((state) =>\n targetConversationId\n ? (state.executionStatusByConversation[targetConversationId] ?? null)\n : null,\n );\n // The REST fallback only ever describes the route's own conversation, so it\n // only applies when no other conversation was explicitly requested.\n const routeConversationExecutionStatus =\n useActiveConversation().data?.execution_status ?? null;\n const fallbackExecutionStatus = isRouteConversation\n ? routeConversationExecutionStatus\n : null;\n\n const executionStatus = liveExecutionStatus ?? fallbackExecutionStatus;\n const curAgentState = useMemo(\n () => mapExecutionStatusToAgentState(executionStatus),\n [executionStatus],\n );\n\n return { curAgentState, executionStatus };\n}\n\nexport interface UsePlanningAgentStateResult {\n localPlanningConversationId: string | null;\n curPlanningAgentState: AgentState;\n /** Running or loading. `false` (not \"unknown\") when there's no planner yet. */\n isPlanningAgentRunning: boolean;\n}\n\n/**\n * The local planner helper's own state — read separately from the main\n * conversation's via `useAgentState` since the two run independently.\n */\nexport function usePlanningAgentState(): UsePlanningAgentStateResult {\n const localPlanningConversationId = useConversationStore(\n (state) => state.localPlanningConversationId,\n );\n const { curAgentState: curPlanningAgentState } = useAgentState(\n localPlanningConversationId ?? undefined,\n );\n const isPlanningAgentRunning =\n !!localPlanningConversationId &&\n (curPlanningAgentState === AgentState.RUNNING ||\n curPlanningAgentState === AgentState.LOADING);\n return {\n localPlanningConversationId,\n curPlanningAgentState,\n isPlanningAgentRunning,\n };\n}\n"],"mappings":"kWAWA,SAAS,EACP,EACY,CACZ,GAAI,CAAC,EACH,OAAO,EAAA,WAAW,QAGpB,OAAQ,EAAR,CACE,KAAK,EAAA,gBAAgB,KACnB,OAAO,EAAA,WAAW,oBACpB,KAAK,EAAA,gBAAgB,QACnB,OAAO,EAAA,WAAW,QACpB,KAAK,EAAA,gBAAgB,OACnB,OAAO,EAAA,WAAW,OACpB,KAAK,EAAA,gBAAgB,yBACnB,OAAO,EAAA,WAAW,2BACpB,KAAK,EAAA,gBAAgB,SACnB,OAAO,EAAA,WAAW,SACpB,KAAK,EAAA,gBAAgB,MACnB,OAAO,EAAA,WAAW,MACpB,KAAK,EAAA,gBAAgB,MACnB,OAAO,EAAA,WAAW,MACpB,QACE,OAAO,EAAA,WAAW,OACtB,CACF,CAeA,SAAgB,EAAc,EAA8C,CAC1E,GAAM,CAAE,eAAgB,GAAwB,EAAA,0BAA0B,EACpE,EAAuB,GAAkB,EACzC,EACJ,CAAC,GAAkB,IAAmB,EAElC,EAAsB,EAAA,0BAA2B,GACrD,EACK,EAAM,8BAA8B,IAAyB,KAC9D,IACN,EAGM,EACJ,EAAA,sBAAsB,EAAE,MAAM,kBAAoB,KAK9C,EAAkB,IAJQ,EAC5B,EACA,MAQJ,MAAO,CAAE,eAAA,EAAA,EAAA,aAJD,EAA+B,CAAe,EACpD,CAAC,CAAe,CAGT,EAAe,iBAAgB,CAC1C,CAaA,SAAgB,GAAqD,CACnE,IAAM,EAA8B,EAAA,qBACjC,GAAU,EAAM,2BACnB,EACM,CAAE,cAAe,GAA0B,EAC/C,GAA+B,IAAA,EACjC,EAKA,MAAO,CACL,8BACA,wBACA,uBANA,CAAC,CAAC,IACD,IAA0B,EAAA,WAAW,SACpC,IAA0B,EAAA,WAAW,QAKzC,CACF"}
@@ -6,5 +6,21 @@ export interface UseAgentStateResult {
6
6
  }
7
7
  /**
8
8
  * Returns the current agent state from conversation execution status.
9
+ *
10
+ * Defaults to the conversation in the current route. Pass `conversationId`
11
+ * to read another conversation's status instead — e.g. a local planner
12
+ * helper conversation, whose run/idle transitions are tracked separately
13
+ * from the main conversation's (see conversation-state-store.ts).
9
14
  */
10
- export declare function useAgentState(): UseAgentStateResult;
15
+ export declare function useAgentState(conversationId?: string): UseAgentStateResult;
16
+ export interface UsePlanningAgentStateResult {
17
+ localPlanningConversationId: string | null;
18
+ curPlanningAgentState: AgentState;
19
+ /** Running or loading. `false` (not "unknown") when there's no planner yet. */
20
+ isPlanningAgentRunning: boolean;
21
+ }
22
+ /**
23
+ * The local planner helper's own state — read separately from the main
24
+ * conversation's via `useAgentState` since the two run independently.
25
+ */
26
+ export declare function usePlanningAgentState(): UsePlanningAgentStateResult;
@@ -1,10 +1,12 @@
1
1
  import { AgentState as e } from "../types/agent-state.js";
2
2
  import { ExecutionStatus as t } from "../types/agent-server/core/base/common.js";
3
- import { useConversationStateStore as n } from "../stores/conversation-state-store.js";
4
- import { useActiveConversation as r } from "./query/use-active-conversation.js";
5
- import { useMemo as i } from "react";
3
+ import { useOptionalConversationId as n } from "./use-conversation-id.js";
4
+ import { useConversationStore as r } from "../stores/conversation-store.js";
5
+ import { useConversationStateStore as i } from "../stores/conversation-state-store.js";
6
+ import { useActiveConversation as a } from "./query/use-active-conversation.js";
7
+ import { useMemo as o } from "react";
6
8
  //#region src/hooks/use-agent-state.ts
7
- function a(n) {
9
+ function s(n) {
8
10
  if (!n) return e.LOADING;
9
11
  switch (n) {
10
12
  case t.IDLE: return e.AWAITING_USER_INPUT;
@@ -17,14 +19,22 @@ function a(n) {
17
19
  default: return e.LOADING;
18
20
  }
19
21
  }
20
- function o() {
21
- let e = n((e) => e.execution_status), t = r().data?.execution_status ?? null, o = e ?? t;
22
+ function c(e) {
23
+ let { conversationId: t } = n(), r = e ?? t, c = !e || e === t, l = i((e) => r ? e.executionStatusByConversation[r] ?? null : null), u = a().data?.execution_status ?? null, d = l ?? (c ? u : null);
22
24
  return {
23
- curAgentState: i(() => a(o), [o]),
24
- executionStatus: o
25
+ curAgentState: o(() => s(d), [d]),
26
+ executionStatus: d
27
+ };
28
+ }
29
+ function l() {
30
+ let t = r((e) => e.localPlanningConversationId), { curAgentState: n } = c(t ?? void 0);
31
+ return {
32
+ localPlanningConversationId: t,
33
+ curPlanningAgentState: n,
34
+ isPlanningAgentRunning: !!t && (n === e.RUNNING || n === e.LOADING)
25
35
  };
26
36
  }
27
37
  //#endregion
28
- export { o as useAgentState };
38
+ export { c as useAgentState, l as usePlanningAgentState };
29
39
 
30
40
  //# sourceMappingURL=use-agent-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-agent-state.js","names":[],"sources":["../../src/hooks/use-agent-state.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useConversationStateStore } from \"#/stores/conversation-state-store\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Maps agent execution status to AgentState\n */\nfunction mapExecutionStatusToAgentState(\n status: ExecutionStatus | null,\n): AgentState {\n if (!status) {\n return AgentState.LOADING;\n }\n\n switch (status) {\n case ExecutionStatus.IDLE:\n return AgentState.AWAITING_USER_INPUT;\n case ExecutionStatus.RUNNING:\n return AgentState.RUNNING;\n case ExecutionStatus.PAUSED:\n return AgentState.PAUSED;\n case ExecutionStatus.WAITING_FOR_CONFIRMATION:\n return AgentState.AWAITING_USER_CONFIRMATION;\n case ExecutionStatus.FINISHED:\n return AgentState.FINISHED;\n case ExecutionStatus.ERROR:\n return AgentState.ERROR;\n case ExecutionStatus.STUCK:\n return AgentState.ERROR; // Map STUCK to ERROR for now\n default:\n return AgentState.LOADING;\n }\n}\n\nexport interface UseAgentStateResult {\n curAgentState: AgentState;\n executionStatus?: ExecutionStatus | null;\n}\n\n/**\n * Returns the current agent state from conversation execution status.\n */\nexport function useAgentState(): UseAgentStateResult {\n const liveExecutionStatus = useConversationStateStore(\n (state) => state.execution_status,\n );\n const fallbackExecutionStatus =\n useActiveConversation().data?.execution_status ?? null;\n\n const executionStatus = liveExecutionStatus ?? fallbackExecutionStatus;\n const curAgentState = useMemo(\n () => mapExecutionStatusToAgentState(executionStatus),\n [executionStatus],\n );\n\n return { curAgentState, executionStatus };\n}\n"],"mappings":";;;;;;AASA,SAAS,EACP,GACY;CACZ,IAAI,CAAC,GACH,OAAO,EAAW;CAGpB,QAAQ,GAAR;EACE,KAAK,EAAgB,MACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,SACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,QACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,0BACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,UACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,OACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,OACnB,OAAO,EAAW;EACpB,SACE,OAAO,EAAW;CACtB;AACF;AAUA,SAAgB,IAAqC;CACnD,IAAM,IAAsB,GACzB,MAAU,EAAM,gBACnB,GACM,IACJ,EAAsB,EAAE,MAAM,oBAAoB,MAE9C,IAAkB,KAAuB;CAM/C,OAAO;EAAE,eALa,QACd,EAA+B,CAAe,GACpD,CAAC,CAAe,CAGT;EAAe;CAAgB;AAC1C"}
1
+ {"version":3,"file":"use-agent-state.js","names":[],"sources":["../../src/hooks/use-agent-state.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { useConversationStateStore } from \"#/stores/conversation-state-store\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { AgentState } from \"#/types/agent-state\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Maps agent execution status to AgentState\n */\nfunction mapExecutionStatusToAgentState(\n status: ExecutionStatus | null,\n): AgentState {\n if (!status) {\n return AgentState.LOADING;\n }\n\n switch (status) {\n case ExecutionStatus.IDLE:\n return AgentState.AWAITING_USER_INPUT;\n case ExecutionStatus.RUNNING:\n return AgentState.RUNNING;\n case ExecutionStatus.PAUSED:\n return AgentState.PAUSED;\n case ExecutionStatus.WAITING_FOR_CONFIRMATION:\n return AgentState.AWAITING_USER_CONFIRMATION;\n case ExecutionStatus.FINISHED:\n return AgentState.FINISHED;\n case ExecutionStatus.ERROR:\n return AgentState.ERROR;\n case ExecutionStatus.STUCK:\n return AgentState.ERROR; // Map STUCK to ERROR for now\n default:\n return AgentState.LOADING;\n }\n}\n\nexport interface UseAgentStateResult {\n curAgentState: AgentState;\n executionStatus?: ExecutionStatus | null;\n}\n\n/**\n * Returns the current agent state from conversation execution status.\n *\n * Defaults to the conversation in the current route. Pass `conversationId`\n * to read another conversation's status instead — e.g. a local planner\n * helper conversation, whose run/idle transitions are tracked separately\n * from the main conversation's (see conversation-state-store.ts).\n */\nexport function useAgentState(conversationId?: string): UseAgentStateResult {\n const { conversationId: routeConversationId } = useOptionalConversationId();\n const targetConversationId = conversationId ?? routeConversationId;\n const isRouteConversation =\n !conversationId || conversationId === routeConversationId;\n\n const liveExecutionStatus = useConversationStateStore((state) =>\n targetConversationId\n ? (state.executionStatusByConversation[targetConversationId] ?? null)\n : null,\n );\n // The REST fallback only ever describes the route's own conversation, so it\n // only applies when no other conversation was explicitly requested.\n const routeConversationExecutionStatus =\n useActiveConversation().data?.execution_status ?? null;\n const fallbackExecutionStatus = isRouteConversation\n ? routeConversationExecutionStatus\n : null;\n\n const executionStatus = liveExecutionStatus ?? fallbackExecutionStatus;\n const curAgentState = useMemo(\n () => mapExecutionStatusToAgentState(executionStatus),\n [executionStatus],\n );\n\n return { curAgentState, executionStatus };\n}\n\nexport interface UsePlanningAgentStateResult {\n localPlanningConversationId: string | null;\n curPlanningAgentState: AgentState;\n /** Running or loading. `false` (not \"unknown\") when there's no planner yet. */\n isPlanningAgentRunning: boolean;\n}\n\n/**\n * The local planner helper's own state — read separately from the main\n * conversation's via `useAgentState` since the two run independently.\n */\nexport function usePlanningAgentState(): UsePlanningAgentStateResult {\n const localPlanningConversationId = useConversationStore(\n (state) => state.localPlanningConversationId,\n );\n const { curAgentState: curPlanningAgentState } = useAgentState(\n localPlanningConversationId ?? undefined,\n );\n const isPlanningAgentRunning =\n !!localPlanningConversationId &&\n (curPlanningAgentState === AgentState.RUNNING ||\n curPlanningAgentState === AgentState.LOADING);\n return {\n localPlanningConversationId,\n curPlanningAgentState,\n isPlanningAgentRunning,\n };\n}\n"],"mappings":";;;;;;;;AAWA,SAAS,EACP,GACY;CACZ,IAAI,CAAC,GACH,OAAO,EAAW;CAGpB,QAAQ,GAAR;EACE,KAAK,EAAgB,MACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,SACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,QACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,0BACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,UACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,OACnB,OAAO,EAAW;EACpB,KAAK,EAAgB,OACnB,OAAO,EAAW;EACpB,SACE,OAAO,EAAW;CACtB;AACF;AAeA,SAAgB,EAAc,GAA8C;CAC1E,IAAM,EAAE,gBAAgB,MAAwB,EAA0B,GACpE,IAAuB,KAAkB,GACzC,IACJ,CAAC,KAAkB,MAAmB,GAElC,IAAsB,GAA2B,MACrD,IACK,EAAM,8BAA8B,MAAyB,OAC9D,IACN,GAGM,IACJ,EAAsB,EAAE,MAAM,oBAAoB,MAK9C,IAAkB,MAJQ,IAC5B,IACA;CAQJ,OAAO;EAAE,eALa,QACd,EAA+B,CAAe,GACpD,CAAC,CAAe,CAGT;EAAe;CAAgB;AAC1C;AAaA,SAAgB,IAAqD;CACnE,IAAM,IAA8B,GACjC,MAAU,EAAM,2BACnB,GACM,EAAE,eAAe,MAA0B,EAC/C,KAA+B,KAAA,CACjC;CAKA,OAAO;EACL;EACA;EACA,wBANA,CAAC,CAAC,MACD,MAA0B,EAAW,WACpC,MAA0B,EAAW;CAKzC;AACF"}
@@ -0,0 +1,2 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),t=require("../contexts/active-backend-context.cjs"),n=require("../api/cloud/organization-service.api.cjs"),r=require("./query/use-cloud-current-user-id.cjs");var i=`view_automations`,a=`manage_automations`;function o(){let{backend:r,orgId:o}=t.useActiveBackend(),s=r.kind===`cloud`,{data:c,isLoading:l}=e.useQuery({queryKey:[`cloud-current-user`,r.id,o,r.connectionRevision??0],queryFn:()=>n.getCloudOrganizationMe(o,r),enabled:s&&!!o,staleTime:1e3*60*5,retry:!1,meta:{disableToast:!0}});if(!s)return{canView:!0,canManage:!0,isLoading:!1};if(l||!c)return{canView:!1,canManage:!1,isLoading:l};if(c.permissions)return{canView:c.permissions.includes(i),canManage:c.permissions.includes(a),isLoading:!1};let u=c.role===`owner`||c.role===`admin`;return{canView:u||c.role===`member`,canManage:u,isLoading:!1}}function s(e){let{backend:n}=t.useActiveBackend(),i=r.useCloudCurrentUserId();if(n.kind!==`cloud`)return!0;let a=i[n.id];return!a||a.isLoading||!a.userId?!1:e.user_id===a.userId}exports.useAutomationPermissions=o,exports.useIsAutomationOwner=s;
2
+ //# sourceMappingURL=use-automation-permissions.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-automation-permissions.cjs","names":[],"sources":["../../src/hooks/use-automation-permissions.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { getCloudOrganizationMe } from \"#/api/cloud/organization-service.api\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useCloudCurrentUserId } from \"./query/use-cloud-current-user-id\";\nimport type { Automation } from \"#/types/automation\";\n\n/**\n * Server-defined permission strings (mirror the automation service's\n * `view_automations` / `manage_automations` and the enterprise\n * `authorization.Permission` enum). The `/me` endpoint returns whichever\n * subset the caller's role grants.\n */\nexport const VIEW_AUTOMATIONS = \"view_automations\";\nexport const MANAGE_AUTOMATIONS = \"manage_automations\";\n\nexport interface AutomationPermissionsResult {\n /** Read-only access (list, get, list runs, capabilities, git-sync status). */\n canView: boolean;\n /** Full write access (create, update, delete, dispatch, git-sync config). */\n canManage: boolean;\n /**\n * `true` when permissions are still being resolved on cloud. Local always\n * resolves synchronously. Mutating controls should stay hidden while this is\n * `true` so a member never sees a flash of write controls before the\n * server-defined permission set arrives.\n */\n isLoading: boolean;\n}\n\n/**\n * Resolve the caller's automation-level permissions on the active backend.\n *\n * - Local agent-server (OSS): always `{ canView: true, canManage: true }`.\n * - Cloud: reads the server-defined `permissions` array from\n * `GET /api/organizations/{orgId}/me` (same query `useCloudCurrentUserId`\n * and `useCanManageOrgProfiles` use, so no extra request is issued) and\n * falls back to a role check (`owner`/`admin` ⇒ both, `member` ⇒ view\n * only) when an older app-server doesn't return `permissions`.\n */\nexport function useAutomationPermissions(): AutomationPermissionsResult {\n const { backend, orgId } = useActiveBackend();\n const isCloud = backend.kind === \"cloud\";\n\n // eslint-disable-next-line @tanstack/query/exhaustive-deps\n const { data, isLoading } = useQuery({\n queryKey: [\n \"cloud-current-user\",\n backend.id,\n orgId,\n backend.connectionRevision ?? 0,\n ],\n queryFn: () => getCloudOrganizationMe(orgId!, backend),\n enabled: isCloud && !!orgId,\n staleTime: 1000 * 60 * 5,\n retry: false,\n meta: { disableToast: true },\n });\n\n if (!isCloud) {\n return { canView: true, canManage: true, isLoading: false };\n }\n\n if (isLoading || !data) {\n return { canView: false, canManage: false, isLoading };\n }\n\n if (data.permissions) {\n const canView = data.permissions.includes(VIEW_AUTOMATIONS);\n const canManage = data.permissions.includes(MANAGE_AUTOMATIONS);\n return { canView, canManage, isLoading: false };\n }\n\n // Fall back to role check for older app-servers without `permissions`.\n const isOwnerOrAdmin = data.role === \"owner\" || data.role === \"admin\";\n return {\n canView: isOwnerOrAdmin || data.role === \"member\",\n canManage: isOwnerOrAdmin,\n isLoading: false,\n };\n}\n\n/**\n * Resolve whether the current user is the creator of the given automation.\n *\n * - Local: always `true` (the local user owns every automation; and since\n * local always has `manage_automations`, the distinction is moot).\n * - Cloud: compares `automation.user_id` with the caller's `user_id` from\n * `GET /api/organizations/{orgId}/me`. Returns `false` while the id is\n * still loading so the creator escape hatch never flashes open prematurely.\n */\nexport function useIsAutomationOwner(automation: Automation): boolean {\n const { backend } = useActiveBackend();\n // Always call the hook so rules-of-hooks is satisfied; it's a no-op for\n // local backends since the early return below short-circuits before use.\n const userIds = useCloudCurrentUserId();\n\n if (backend.kind !== \"cloud\") return true;\n\n const entry = userIds[backend.id];\n if (!entry || entry.isLoading || !entry.userId) return false;\n return automation.user_id === entry.userId;\n}\n"],"mappings":"8RAYA,IAAa,EAAmB,mBACnB,EAAqB,qBA0BlC,SAAgB,GAAwD,CACtE,GAAM,CAAE,UAAS,SAAU,EAAA,iBAAiB,EACtC,EAAU,EAAQ,OAAS,QAG3B,CAAE,OAAM,aAAc,EAAA,SAAS,CACnC,SAAU,CACR,qBACA,EAAQ,GACR,EACA,EAAQ,oBAAsB,CAChC,EACA,YAAe,EAAA,uBAAuB,EAAQ,CAAO,EACrD,QAAS,GAAW,CAAC,CAAC,EACtB,UAAW,IAAO,GAAK,EACvB,MAAO,GACP,KAAM,CAAE,aAAc,EAAK,CAC7B,CAAC,EAED,GAAI,CAAC,EACH,MAAO,CAAE,QAAS,GAAM,UAAW,GAAM,UAAW,EAAM,EAG5D,GAAI,GAAa,CAAC,EAChB,MAAO,CAAE,QAAS,GAAO,UAAW,GAAO,WAAU,EAGvD,GAAI,EAAK,YAGP,MAAO,CAAE,QAFO,EAAK,YAAY,SAAS,CAEjC,EAAS,UADA,EAAK,YAAY,SAAS,CAC1B,EAAW,UAAW,EAAM,EAIhD,IAAM,EAAiB,EAAK,OAAS,SAAW,EAAK,OAAS,QAC9D,MAAO,CACL,QAAS,GAAkB,EAAK,OAAS,SACzC,UAAW,EACX,UAAW,EACb,CACF,CAWA,SAAgB,EAAqB,EAAiC,CACpE,GAAM,CAAE,WAAY,EAAA,iBAAiB,EAG/B,EAAU,EAAA,sBAAsB,EAEtC,GAAI,EAAQ,OAAS,QAAS,MAAO,GAErC,IAAM,EAAQ,EAAQ,EAAQ,IAE9B,MADI,CAAC,GAAS,EAAM,WAAa,CAAC,EAAM,OAAe,GAChD,EAAW,UAAY,EAAM,MACtC"}
@@ -0,0 +1,43 @@
1
+ import type { Automation } from "#/types/automation";
2
+ /**
3
+ * Server-defined permission strings (mirror the automation service's
4
+ * `view_automations` / `manage_automations` and the enterprise
5
+ * `authorization.Permission` enum). The `/me` endpoint returns whichever
6
+ * subset the caller's role grants.
7
+ */
8
+ export declare const VIEW_AUTOMATIONS = "view_automations";
9
+ export declare const MANAGE_AUTOMATIONS = "manage_automations";
10
+ export interface AutomationPermissionsResult {
11
+ /** Read-only access (list, get, list runs, capabilities, git-sync status). */
12
+ canView: boolean;
13
+ /** Full write access (create, update, delete, dispatch, git-sync config). */
14
+ canManage: boolean;
15
+ /**
16
+ * `true` when permissions are still being resolved on cloud. Local always
17
+ * resolves synchronously. Mutating controls should stay hidden while this is
18
+ * `true` so a member never sees a flash of write controls before the
19
+ * server-defined permission set arrives.
20
+ */
21
+ isLoading: boolean;
22
+ }
23
+ /**
24
+ * Resolve the caller's automation-level permissions on the active backend.
25
+ *
26
+ * - Local agent-server (OSS): always `{ canView: true, canManage: true }`.
27
+ * - Cloud: reads the server-defined `permissions` array from
28
+ * `GET /api/organizations/{orgId}/me` (same query `useCloudCurrentUserId`
29
+ * and `useCanManageOrgProfiles` use, so no extra request is issued) and
30
+ * falls back to a role check (`owner`/`admin` ⇒ both, `member` ⇒ view
31
+ * only) when an older app-server doesn't return `permissions`.
32
+ */
33
+ export declare function useAutomationPermissions(): AutomationPermissionsResult;
34
+ /**
35
+ * Resolve whether the current user is the creator of the given automation.
36
+ *
37
+ * - Local: always `true` (the local user owns every automation; and since
38
+ * local always has `manage_automations`, the distinction is moot).
39
+ * - Cloud: compares `automation.user_id` with the caller's `user_id` from
40
+ * `GET /api/organizations/{orgId}/me`. Returns `false` while the id is
41
+ * still loading so the creator escape hatch never flashes open prematurely.
42
+ */
43
+ export declare function useIsAutomationOwner(automation: Automation): boolean;
@@ -0,0 +1,52 @@
1
+ import { useQuery as e } from "../node_modules/@tanstack/react-query/build/modern/useQuery.js";
2
+ import { useActiveBackend as t } from "../contexts/active-backend-context.js";
3
+ import { getCloudOrganizationMe as n } from "../api/cloud/organization-service.api.js";
4
+ import { useCloudCurrentUserId as r } from "./query/use-cloud-current-user-id.js";
5
+ //#region src/hooks/use-automation-permissions.ts
6
+ var i = "view_automations", a = "manage_automations";
7
+ function o() {
8
+ let { backend: r, orgId: o } = t(), s = r.kind === "cloud", { data: c, isLoading: l } = e({
9
+ queryKey: [
10
+ "cloud-current-user",
11
+ r.id,
12
+ o,
13
+ r.connectionRevision ?? 0
14
+ ],
15
+ queryFn: () => n(o, r),
16
+ enabled: s && !!o,
17
+ staleTime: 1e3 * 60 * 5,
18
+ retry: !1,
19
+ meta: { disableToast: !0 }
20
+ });
21
+ if (!s) return {
22
+ canView: !0,
23
+ canManage: !0,
24
+ isLoading: !1
25
+ };
26
+ if (l || !c) return {
27
+ canView: !1,
28
+ canManage: !1,
29
+ isLoading: l
30
+ };
31
+ if (c.permissions) return {
32
+ canView: c.permissions.includes(i),
33
+ canManage: c.permissions.includes(a),
34
+ isLoading: !1
35
+ };
36
+ let u = c.role === "owner" || c.role === "admin";
37
+ return {
38
+ canView: u || c.role === "member",
39
+ canManage: u,
40
+ isLoading: !1
41
+ };
42
+ }
43
+ function s(e) {
44
+ let { backend: n } = t(), i = r();
45
+ if (n.kind !== "cloud") return !0;
46
+ let a = i[n.id];
47
+ return !a || a.isLoading || !a.userId ? !1 : e.user_id === a.userId;
48
+ }
49
+ //#endregion
50
+ export { o as useAutomationPermissions, s as useIsAutomationOwner };
51
+
52
+ //# sourceMappingURL=use-automation-permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-automation-permissions.js","names":[],"sources":["../../src/hooks/use-automation-permissions.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { getCloudOrganizationMe } from \"#/api/cloud/organization-service.api\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useCloudCurrentUserId } from \"./query/use-cloud-current-user-id\";\nimport type { Automation } from \"#/types/automation\";\n\n/**\n * Server-defined permission strings (mirror the automation service's\n * `view_automations` / `manage_automations` and the enterprise\n * `authorization.Permission` enum). The `/me` endpoint returns whichever\n * subset the caller's role grants.\n */\nexport const VIEW_AUTOMATIONS = \"view_automations\";\nexport const MANAGE_AUTOMATIONS = \"manage_automations\";\n\nexport interface AutomationPermissionsResult {\n /** Read-only access (list, get, list runs, capabilities, git-sync status). */\n canView: boolean;\n /** Full write access (create, update, delete, dispatch, git-sync config). */\n canManage: boolean;\n /**\n * `true` when permissions are still being resolved on cloud. Local always\n * resolves synchronously. Mutating controls should stay hidden while this is\n * `true` so a member never sees a flash of write controls before the\n * server-defined permission set arrives.\n */\n isLoading: boolean;\n}\n\n/**\n * Resolve the caller's automation-level permissions on the active backend.\n *\n * - Local agent-server (OSS): always `{ canView: true, canManage: true }`.\n * - Cloud: reads the server-defined `permissions` array from\n * `GET /api/organizations/{orgId}/me` (same query `useCloudCurrentUserId`\n * and `useCanManageOrgProfiles` use, so no extra request is issued) and\n * falls back to a role check (`owner`/`admin` ⇒ both, `member` ⇒ view\n * only) when an older app-server doesn't return `permissions`.\n */\nexport function useAutomationPermissions(): AutomationPermissionsResult {\n const { backend, orgId } = useActiveBackend();\n const isCloud = backend.kind === \"cloud\";\n\n // eslint-disable-next-line @tanstack/query/exhaustive-deps\n const { data, isLoading } = useQuery({\n queryKey: [\n \"cloud-current-user\",\n backend.id,\n orgId,\n backend.connectionRevision ?? 0,\n ],\n queryFn: () => getCloudOrganizationMe(orgId!, backend),\n enabled: isCloud && !!orgId,\n staleTime: 1000 * 60 * 5,\n retry: false,\n meta: { disableToast: true },\n });\n\n if (!isCloud) {\n return { canView: true, canManage: true, isLoading: false };\n }\n\n if (isLoading || !data) {\n return { canView: false, canManage: false, isLoading };\n }\n\n if (data.permissions) {\n const canView = data.permissions.includes(VIEW_AUTOMATIONS);\n const canManage = data.permissions.includes(MANAGE_AUTOMATIONS);\n return { canView, canManage, isLoading: false };\n }\n\n // Fall back to role check for older app-servers without `permissions`.\n const isOwnerOrAdmin = data.role === \"owner\" || data.role === \"admin\";\n return {\n canView: isOwnerOrAdmin || data.role === \"member\",\n canManage: isOwnerOrAdmin,\n isLoading: false,\n };\n}\n\n/**\n * Resolve whether the current user is the creator of the given automation.\n *\n * - Local: always `true` (the local user owns every automation; and since\n * local always has `manage_automations`, the distinction is moot).\n * - Cloud: compares `automation.user_id` with the caller's `user_id` from\n * `GET /api/organizations/{orgId}/me`. Returns `false` while the id is\n * still loading so the creator escape hatch never flashes open prematurely.\n */\nexport function useIsAutomationOwner(automation: Automation): boolean {\n const { backend } = useActiveBackend();\n // Always call the hook so rules-of-hooks is satisfied; it's a no-op for\n // local backends since the early return below short-circuits before use.\n const userIds = useCloudCurrentUserId();\n\n if (backend.kind !== \"cloud\") return true;\n\n const entry = userIds[backend.id];\n if (!entry || entry.isLoading || !entry.userId) return false;\n return automation.user_id === entry.userId;\n}\n"],"mappings":";;;;;AAYA,IAAa,IAAmB,oBACnB,IAAqB;AA0BlC,SAAgB,IAAwD;CACtE,IAAM,EAAE,YAAS,aAAU,EAAiB,GACtC,IAAU,EAAQ,SAAS,SAG3B,EAAE,SAAM,iBAAc,EAAS;EACnC,UAAU;GACR;GACA,EAAQ;GACR;GACA,EAAQ,sBAAsB;EAChC;EACA,eAAe,EAAuB,GAAQ,CAAO;EACrD,SAAS,KAAW,CAAC,CAAC;EACtB,WAAW,MAAO,KAAK;EACvB,OAAO;EACP,MAAM,EAAE,cAAc,GAAK;CAC7B,CAAC;CAED,IAAI,CAAC,GACH,OAAO;EAAE,SAAS;EAAM,WAAW;EAAM,WAAW;CAAM;CAG5D,IAAI,KAAa,CAAC,GAChB,OAAO;EAAE,SAAS;EAAO,WAAW;EAAO;CAAU;CAGvD,IAAI,EAAK,aAGP,OAAO;EAAE,SAFO,EAAK,YAAY,SAAS,CAEjC;EAAS,WADA,EAAK,YAAY,SAAS,CAC1B;EAAW,WAAW;CAAM;CAIhD,IAAM,IAAiB,EAAK,SAAS,WAAW,EAAK,SAAS;CAC9D,OAAO;EACL,SAAS,KAAkB,EAAK,SAAS;EACzC,WAAW;EACX,WAAW;CACb;AACF;AAWA,SAAgB,EAAqB,GAAiC;CACpE,IAAM,EAAE,eAAY,EAAiB,GAG/B,IAAU,EAAsB;CAEtC,IAAI,EAAQ,SAAS,SAAS,OAAO;CAErC,IAAM,IAAQ,EAAQ,EAAQ;CAE9B,OADI,CAAC,KAAS,EAAM,aAAa,CAAC,EAAM,SAAe,KAChD,EAAW,YAAY,EAAM;AACtC"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("./use-conversation-id.cjs"),t=require("../contexts/active-backend-context.cjs"),n=require("../constants/acp-providers.cjs"),r=require("./query/use-active-conversation.cjs"),i=require("./query/use-settings.cjs"),a=require("./use-acp-model-context.cjs"),o=require("./use-can-manage-org-profiles.cjs"),s=require("./query/use-active-acp-profile-detail.cjs");function c(){let{data:c}=r.useActiveConversation(),{data:l}=i.useSettings(),{conversationId:u}=e.useOptionalConversationId(),{backend:d}=t.useActiveBackend(),f=o.useCanManageOrgProfiles(),p=s.useActiveAcpProfileDetail(),{isActiveAcpConversation:m,isHomeAcp:h,isAcpContext:g,destinationPath:_,destinationLabel:v}=a.useAcpModelContext(),y=typeof l?.agent_settings?.acp_server==`string`?l.agent_settings.acp_server:null,b=m?c?.acp_server:h?p?.acp_server??y:null,x=g?n.getAcpProvider(b):void 0,S=typeof l?.agent_settings?.acp_model==`string`?l.agent_settings.acp_model:null,C=h&&p?p.acp_model:S,w=null;w=m?c?.llm_model??n.resolveEffectiveAcpModel({configured:C,providerDefault:n.getAcpPreferredDefaultModel(b)}):h?n.resolveEffectiveAcpModel({configured:C,providerDefault:n.getAcpPreferredDefaultModel(b)}):c?.llm_model??l?.llm_model??null;let T=w&&g?n.labelForAcpModel(b,w)??w:w,E=x?.available_models??[],D=!h||d.kind!==`cloud`||f,O=g&&E.length>0&&D;return{isAcpContext:g,displayModel:T,currentModelId:w,availableAcpModels:E,showAcpPicker:O,switchConversationId:m?u??null:null,destinationPath:_,destinationLabel:v}}exports.useChatInputModelState=c;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("./use-conversation-id.cjs"),t=require("../contexts/active-backend-context.cjs"),n=require("../constants/acp-providers.cjs"),r=require("./query/use-settings.cjs"),i=require("./query/use-active-conversation.cjs"),a=require("./use-acp-model-context.cjs"),o=require("./use-can-manage-org-profiles.cjs"),s=require("./query/use-active-acp-profile-detail.cjs");function c(){let{data:c}=i.useActiveConversation(),{data:l}=r.useSettings(),{conversationId:u}=e.useOptionalConversationId(),{backend:d}=t.useActiveBackend(),f=o.useCanManageOrgProfiles(),p=s.useActiveAcpProfileDetail(),{isActiveAcpConversation:m,isHomeAcp:h,isAcpContext:g,destinationPath:_,destinationLabel:v}=a.useAcpModelContext(),y=typeof l?.agent_settings?.acp_server==`string`?l.agent_settings.acp_server:null,b=m?c?.acp_server:h?p?.acp_server??y:null,x=g?n.getAcpProvider(b):void 0,S=typeof l?.agent_settings?.acp_model==`string`?l.agent_settings.acp_model:null,C=h&&p?p.acp_model:S,w=null;w=m?c?.llm_model??n.resolveEffectiveAcpModel({configured:C,providerDefault:n.getAcpPreferredDefaultModel(b)}):h?n.resolveEffectiveAcpModel({configured:C,providerDefault:n.getAcpPreferredDefaultModel(b)}):c?.llm_model??l?.llm_model??null;let T=w&&g?n.labelForAcpModel(b,w)??w:w,E=x?.available_models??[],D=!h||d.kind!==`cloud`||f,O=g&&E.length>0&&D;return{isAcpContext:g,displayModel:T,currentModelId:w,availableAcpModels:E,showAcpPicker:O,switchConversationId:m?u??null:null,destinationPath:_,destinationLabel:v}}exports.useChatInputModelState=c;
2
2
  //# sourceMappingURL=use-chat-input-model-state.cjs.map
@@ -1,14 +1,14 @@
1
1
  import { useOptionalConversationId as e } from "./use-conversation-id.js";
2
2
  import { useActiveBackend as t } from "../contexts/active-backend-context.js";
3
3
  import { getAcpPreferredDefaultModel as n, getAcpProvider as r, labelForAcpModel as i, resolveEffectiveAcpModel as a } from "../constants/acp-providers.js";
4
- import { useActiveConversation as o } from "./query/use-active-conversation.js";
5
- import { useSettings as s } from "./query/use-settings.js";
4
+ import { useSettings as o } from "./query/use-settings.js";
5
+ import { useActiveConversation as s } from "./query/use-active-conversation.js";
6
6
  import { useAcpModelContext as c } from "./use-acp-model-context.js";
7
7
  import { useCanManageOrgProfiles as l } from "./use-can-manage-org-profiles.js";
8
8
  import { useActiveAcpProfileDetail as u } from "./query/use-active-acp-profile-detail.js";
9
9
  //#region src/hooks/use-chat-input-model-state.ts
10
10
  function d() {
11
- let { data: d } = o(), { data: f } = s(), { conversationId: p } = e(), { backend: m } = t(), h = l(), g = u(), { isActiveAcpConversation: _, isHomeAcp: v, isAcpContext: y, destinationPath: b, destinationLabel: x } = c(), S = typeof f?.agent_settings?.acp_server == "string" ? f.agent_settings.acp_server : null, C = _ ? d?.acp_server : v ? g?.acp_server ?? S : null, w = y ? r(C) : void 0, T = typeof f?.agent_settings?.acp_model == "string" ? f.agent_settings.acp_model : null, E = v && g ? g.acp_model : T, D = null;
11
+ let { data: d } = s(), { data: f } = o(), { conversationId: p } = e(), { backend: m } = t(), h = l(), g = u(), { isActiveAcpConversation: _, isHomeAcp: v, isAcpContext: y, destinationPath: b, destinationLabel: x } = c(), S = typeof f?.agent_settings?.acp_server == "string" ? f.agent_settings.acp_server : null, C = _ ? d?.acp_server : v ? g?.acp_server ?? S : null, w = y ? r(C) : void 0, T = typeof f?.agent_settings?.acp_model == "string" ? f.agent_settings.acp_model : null, E = v && g ? g.acp_model : T, D = null;
12
12
  D = _ ? d?.llm_model ?? a({
13
13
  configured: E,
14
14
  providerDefault: n(C)
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../i18n/declaration.cjs"),n=require("../utils/conversation-local-storage.cjs"),r=require("../stores/conversation-store.cjs"),i=require("../utils/custom-toast-handlers.cjs"),a=require("./query/use-active-conversation.cjs"),o=require("./mutation/use-create-conversation.cjs");let s=require("react");var c=()=>{let{t:c}=e.useTranslation(`openhands`),{setConversationMode:l,setSubConversationTaskId:u,subConversationTaskId:d}=r.useConversationStore(),{data:f}=a.useActiveConversation(),{mutate:p,isPending:m}=o.useCreateConversation();return(0,s.useEffect)(()=>{if(!f?.id)return;let e=n.getConversationState(f.id);e.subConversationTaskId&&!d&&u(e.subConversationTaskId)},[f?.id,d,u]),{handlePlanClick:(0,s.useCallback)(e=>{e?.preventDefault(),e?.stopPropagation(),l(`plan`),!(f?.sub_conversation_ids&&f.sub_conversation_ids.length>0||!f?.id||d)&&p({parentConversationId:f.id,agentType:`plan`,entryPoint:`plan_sub_conversation`},{onSuccess:e=>{i.displaySuccessToast(c(t.I18nKey.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED)),e.task_id&&(u(e.task_id),n.setConversationState(f.id,{subConversationTaskId:e.task_id}))}})},[f,p,l,u,d,c]),isCreatingConversation:m}};exports.useHandlePlanClick=c;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../i18n/declaration.cjs"),n=require("../utils/conversation-local-storage.cjs"),r=require("../stores/conversation-store.cjs"),i=require("./query/query-keys.cjs"),a=require("../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs"),o=require("../node_modules/@tanstack/react-query/build/modern/useMutation.cjs"),s=require("../utils/custom-toast-handlers.cjs"),c=require("../contexts/active-backend-context.cjs"),l=require("../api/conversation-metadata-store.cjs"),u=require("../utils/plan-file.cjs"),d=require("../api/conversation-service/agent-server-conversation-service.api.cjs"),f=require("./mutation/conversation-mutation-utils.cjs"),p=require("./query/use-active-conversation.cjs"),m=require("./mutation/use-create-conversation.cjs"),h=require("./query/use-sub-conversations.cjs");let g=require("react");function _(e){let t=a.useQueryClient();return o.useMutation({mutationKey:i.LOCAL_PLANNER_MUTATION_KEYS.create,mutationFn:e=>d.default.createLocalPlanningConversation(e.parentConversationId,e.initialMessage),onSuccess:(n,r)=>{e.onCreated(n.id),f.invalidateConversationQueries(t,r.parentConversationId),t.invalidateQueries({queryKey:i.CONVERSATION_QUERY_KEYS.subConversations}),e.onInitialized()},onError:e.onFailed})}function v(e){let t=n.getConversationState(e.conversationId);t.subConversationTaskId&&!e.subConversationTaskId&&e.setSubConversationTaskId(t.subConversationTaskId);let r=e.serverPlanningConversationId??l.getStoredConversationMetadata(e.conversationId)?.local_planning_conversation_id??null;r&&r!==e.localPlanningConversationId&&e.setLocalPlanningConversationId(r)}var y=()=>{let{t:i}=e.useTranslation(`openhands`),{backend:a}=c.useActiveBackend(),{setConversationMode:o,setSubConversationTaskId:l,subConversationTaskId:d,setLocalPlanningConversationId:f,localPlanningConversationId:y}=r.useConversationStore(),{data:b}=p.useActiveConversation(),{mutate:x,isPending:S}=m.useCreateConversation(),{mutate:C,isPending:w}=_({onCreated:f,onInitialized:()=>{s.displaySuccessToast(i(t.I18nKey.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED))},onFailed:()=>{o(`code`),s.displayErrorToast(i(t.I18nKey.CONVERSATION$ERROR_STARTING_CONVERSATION))}}),T=a.kind!==`cloud`,{data:E}=h.useSubConversations(T?b?.sub_conversation_ids:void 0),D=T?u.findPlannerConversationId(E,b?.id):null;(0,g.useEffect)(()=>{b?.id&&v({conversationId:b.id,serverPlanningConversationId:D,subConversationTaskId:d,localPlanningConversationId:y,setSubConversationTaskId:l,setLocalPlanningConversationId:f})},[b?.id,D,y,f,d,l]);let O=!!(b?.sub_conversation_ids&&b.sub_conversation_ids.length>0||d),k=T?!!(y||D):O;return{handlePlanClick:(0,g.useCallback)((e,r)=>{if(e?.preventDefault(),e?.stopPropagation(),o(`plan`),a.kind!==`cloud`){if(!b?.id||y||D||w)return;C({parentConversationId:b.id,initialMessage:r});return}O||!b?.id||x({parentConversationId:b.id,agentType:`plan`,entryPoint:`plan_sub_conversation`,...r?{query:r}:{}},{onSuccess:e=>{s.displaySuccessToast(i(t.I18nKey.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED)),e.task_id&&(l(e.task_id),n.setConversationState(b.id,{subConversationTaskId:e.task_id}))}})},[a.kind,b,x,C,O,w,y,D,o,l,i]),hasPlanner:k,isCreatingConversation:S||w}};exports.useHandlePlanClick=y;
2
2
  //# sourceMappingURL=use-handle-plan-click.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-handle-plan-click.cjs","names":[],"sources":["../../src/hooks/use-handle-plan-click.ts"],"sourcesContent":["import { useCallback, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport {\n getConversationState,\n setConversationState,\n} from \"#/utils/conversation-local-storage\";\n\n/**\n * Custom hook that encapsulates the logic for handling plan creation.\n * Returns a function that can be called to create a plan conversation and\n * the pending state of the conversation creation.\n *\n * @returns An object containing handlePlanClick function and isCreatingConversation boolean\n */\nexport const useHandlePlanClick = () => {\n const { t } = useTranslation(\"openhands\");\n const {\n setConversationMode,\n setSubConversationTaskId,\n subConversationTaskId,\n } = useConversationStore();\n const { data: conversation } = useActiveConversation();\n const { mutate: createConversation, isPending: isCreatingConversation } =\n useCreateConversation();\n\n // Restore subConversationTaskId from localStorage on conversation load\n // This handles the case where page was refreshed while sub-conversation creation was in progress\n useEffect(() => {\n if (!conversation?.id) return;\n\n const storedState = getConversationState(conversation.id);\n if (storedState.subConversationTaskId && !subConversationTaskId) {\n setSubConversationTaskId(storedState.subConversationTaskId);\n }\n }, [conversation?.id, subConversationTaskId, setSubConversationTaskId]);\n\n const handlePlanClick = useCallback(\n (event?: React.MouseEvent<HTMLButtonElement> | KeyboardEvent) => {\n event?.preventDefault();\n event?.stopPropagation();\n\n // Set conversation mode to \"plan\" immediately\n setConversationMode(\"plan\");\n\n // Check if sub_conversation_ids is not empty or if a sub-conversation creation is already in progress\n if (\n (conversation?.sub_conversation_ids &&\n conversation.sub_conversation_ids.length > 0) ||\n !conversation?.id ||\n subConversationTaskId\n ) {\n // Do nothing if any condition is true\n return;\n }\n\n // Create a new sub-conversation if we have a current conversation ID\n createConversation(\n {\n parentConversationId: conversation.id,\n agentType: \"plan\",\n entryPoint: \"plan_sub_conversation\",\n },\n {\n onSuccess: (data) => {\n displaySuccessToast(\n t(I18nKey.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED),\n );\n // Track the task ID to poll for sub-conversation creation\n if (data.task_id) {\n setSubConversationTaskId(data.task_id);\n // Persist to localStorage so it survives page refresh\n setConversationState(conversation.id, {\n subConversationTaskId: data.task_id,\n });\n }\n },\n },\n );\n },\n [\n conversation,\n createConversation,\n setConversationMode,\n setSubConversationTaskId,\n subConversationTaskId,\n t,\n ],\n );\n\n return { handlePlanClick, isCreatingConversation };\n};\n"],"mappings":"6aAmBA,IAAa,MAA2B,CACtC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CACJ,sBACA,2BACA,yBACE,EAAA,qBAAqB,EACnB,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAC/C,CAAE,OAAQ,EAAoB,UAAW,GAC7C,EAAA,sBAAsB,EAkExB,OA9DA,EAAA,EAAA,eAAgB,CACd,GAAI,CAAC,GAAc,GAAI,OAEvB,IAAM,EAAc,EAAA,qBAAqB,EAAa,EAAE,EACpD,EAAY,uBAAyB,CAAC,GACxC,EAAyB,EAAY,qBAAqB,CAE9D,EAAG,CAAC,GAAc,GAAI,EAAuB,CAAwB,CAAC,EAuD/D,CAAE,iBAAA,EAAA,EAAA,aApDN,GAAgE,CAC/D,GAAO,eAAe,EACtB,GAAO,gBAAgB,EAGvB,EAAoB,MAAM,EAIvB,KAAc,sBACb,EAAa,qBAAqB,OAAS,GAC7C,CAAC,GAAc,IACf,IAOF,EACE,CACE,qBAAsB,EAAa,GACnC,UAAW,OACX,WAAY,uBACd,EACA,CACE,UAAY,GAAS,CACnB,EAAA,oBACE,EAAE,EAAA,QAAQ,0CAA0C,CACtD,EAEI,EAAK,UACP,EAAyB,EAAK,OAAO,EAErC,EAAA,qBAAqB,EAAa,GAAI,CACpC,sBAAuB,EAAK,OAC9B,CAAC,EAEL,CACF,CACF,CACF,EACA,CACE,EACA,EACA,EACA,EACA,EACA,CACF,CAGO,EAAiB,wBAAuB,CACnD"}
1
+ {"version":3,"file":"use-handle-plan-click.cjs","names":[],"sources":["../../src/hooks/use-handle-plan-click.ts"],"sourcesContent":["import { useCallback, useEffect, type MouseEvent } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport {\n getConversationState,\n setConversationState,\n} from \"#/utils/conversation-local-storage\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport {\n CONVERSATION_QUERY_KEYS,\n LOCAL_PLANNER_MUTATION_KEYS,\n} from \"#/hooks/query/query-keys\";\nimport { useSubConversations } from \"#/hooks/query/use-sub-conversations\";\nimport { findPlannerConversationId } from \"#/utils/plan-file\";\nimport { invalidateConversationQueries } from \"#/hooks/mutation/conversation-mutation-utils\";\n\nfunction useCreateLocalPlanningConversationMutation(options: {\n onCreated: (planningConversationId: string) => void;\n onInitialized: () => void;\n onFailed: () => void;\n}) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: LOCAL_PLANNER_MUTATION_KEYS.create,\n mutationFn: (variables: {\n parentConversationId: string;\n initialMessage?: string;\n }) =>\n AgentServerConversationService.createLocalPlanningConversation(\n variables.parentConversationId,\n variables.initialMessage,\n ),\n onSuccess: (planningConversation, variables) => {\n options.onCreated(planningConversation.id);\n invalidateConversationQueries(\n queryClient,\n variables.parentConversationId,\n );\n queryClient.invalidateQueries({\n queryKey: CONVERSATION_QUERY_KEYS.subConversations,\n });\n options.onInitialized();\n },\n onError: options.onFailed,\n });\n}\n\nfunction restorePlanningConversationIds(options: {\n conversationId: string;\n serverPlanningConversationId: string | null;\n subConversationTaskId: string | null;\n localPlanningConversationId: string | null;\n setSubConversationTaskId: (taskId: string | null) => void;\n setLocalPlanningConversationId: (conversationId: string | null) => void;\n}) {\n const storedState = getConversationState(options.conversationId);\n if (storedState.subConversationTaskId && !options.subConversationTaskId) {\n options.setSubConversationTaskId(storedState.subConversationTaskId);\n }\n\n // Server first: `sub_conversation_ids` is derived by the agent-server from\n // the planner's `parent_conversation_id`, so it survives cleared site data\n // and follows the user to another browser. The localStorage hint is only the\n // fallback for agent-servers older than 1.37.1, which drop the parent link.\n const restoredId =\n options.serverPlanningConversationId ??\n getStoredConversationMetadata(options.conversationId)\n ?.local_planning_conversation_id ??\n null;\n\n if (restoredId && restoredId !== options.localPlanningConversationId) {\n options.setLocalPlanningConversationId(restoredId);\n }\n}\n\n/**\n * Custom hook that encapsulates the logic for handling plan creation.\n * Returns a function that can be called to create a plan conversation and\n * the pending state of the conversation creation.\n *\n * @returns An object containing handlePlanClick function and isCreatingConversation boolean\n */\nexport const useHandlePlanClick = () => {\n const { t } = useTranslation(\"openhands\");\n const { backend } = useActiveBackend();\n const {\n setConversationMode,\n setSubConversationTaskId,\n subConversationTaskId,\n setLocalPlanningConversationId,\n localPlanningConversationId,\n } = useConversationStore();\n const { data: conversation } = useActiveConversation();\n const { mutate: createConversation, isPending: isCreatingCloudConversation } =\n useCreateConversation();\n const {\n mutate: createLocalPlanningConversation,\n isPending: isCreatingLocalPlanningConversation,\n } = useCreateLocalPlanningConversationMutation({\n onCreated: setLocalPlanningConversationId,\n onInitialized: () => {\n displaySuccessToast(\n t(I18nKey.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED),\n );\n },\n // handlePlanClick sets conversationMode(\"plan\") before this mutation\n // starts. On failure, back out of that mode instead of stranding the\n // user in plan mode with no planner to talk to.\n onFailed: () => {\n setConversationMode(\"code\");\n displayErrorToast(t(I18nKey.CONVERSATION$ERROR_STARTING_CONVERSATION));\n },\n });\n\n // On local backends the agent-server reports the planner helper back on the\n // parent's `sub_conversation_ids` (it was created with\n // `parent_conversation_id`), so that is the authoritative handle. Cloud\n // sub-conversations are driven by their own task/socket plumbing.\n const isLocalBackend = backend.kind !== \"cloud\";\n const { data: rawSubConversations } = useSubConversations(\n isLocalBackend ? conversation?.sub_conversation_ids : undefined,\n );\n\n const serverPlanningConversationId = isLocalBackend\n ? findPlannerConversationId(rawSubConversations, conversation?.id)\n : null;\n\n // Restore planning conversation ids on conversation load. This handles page\n // refreshes while cloud or local planning conversation creation is in\n // progress, and recovers the local planner after browser storage is lost.\n useEffect(() => {\n if (!conversation?.id) return;\n\n restorePlanningConversationIds({\n conversationId: conversation.id,\n serverPlanningConversationId,\n subConversationTaskId,\n localPlanningConversationId,\n setSubConversationTaskId,\n setLocalPlanningConversationId,\n });\n }, [\n conversation?.id,\n serverPlanningConversationId,\n localPlanningConversationId,\n setLocalPlanningConversationId,\n subConversationTaskId,\n setSubConversationTaskId,\n ]);\n\n const hasCloudPlanner = !!(\n (conversation?.sub_conversation_ids &&\n conversation.sub_conversation_ids.length > 0) ||\n subConversationTaskId\n );\n // Whether a planner helper already exists for this conversation — callers\n // (e.g. the `/plan <task>` interceptor) use this to decide whether they can\n // send a message to the planner immediately, or must wait for creation.\n const hasPlanner = isLocalBackend\n ? !!(localPlanningConversationId || serverPlanningConversationId)\n : hasCloudPlanner;\n\n const handlePlanClick = useCallback(\n (\n event?: MouseEvent<HTMLButtonElement> | KeyboardEvent,\n initialMessage?: string,\n ) => {\n event?.preventDefault();\n event?.stopPropagation();\n\n setConversationMode(\"plan\");\n\n if (backend.kind !== \"cloud\") {\n // Guard on the server-reported helper, the store, and the mutation's\n // own in-flight state — the last one stops two rapid invocations\n // (e.g. a double-click) from both passing before either updates and\n // creating two planners for the same parent.\n if (\n !conversation?.id ||\n localPlanningConversationId ||\n serverPlanningConversationId ||\n isCreatingLocalPlanningConversation\n ) {\n return;\n }\n createLocalPlanningConversation({\n parentConversationId: conversation.id,\n initialMessage,\n });\n return;\n }\n\n if (hasCloudPlanner || !conversation?.id) {\n return;\n }\n\n createConversation(\n {\n parentConversationId: conversation.id,\n agentType: \"plan\",\n entryPoint: \"plan_sub_conversation\",\n ...(initialMessage ? { query: initialMessage } : {}),\n },\n {\n onSuccess: (data) => {\n displaySuccessToast(\n t(I18nKey.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED),\n );\n if (data.task_id) {\n setSubConversationTaskId(data.task_id);\n setConversationState(conversation.id, {\n subConversationTaskId: data.task_id,\n });\n }\n },\n },\n );\n },\n [\n backend.kind,\n conversation,\n createConversation,\n createLocalPlanningConversation,\n hasCloudPlanner,\n isCreatingLocalPlanningConversation,\n localPlanningConversationId,\n serverPlanningConversationId,\n setConversationMode,\n setSubConversationTaskId,\n t,\n ],\n );\n\n return {\n handlePlanClick,\n hasPlanner,\n isCreatingConversation:\n isCreatingCloudConversation || isCreatingLocalPlanningConversation,\n };\n};\n"],"mappings":"+7BA0BA,SAAS,EAA2C,EAIjD,CACD,IAAM,EAAc,EAAA,eAAe,EAEnC,OAAO,EAAA,YAAY,CACjB,YAAa,EAAA,4BAA4B,OACzC,WAAa,GAIX,EAAA,QAA+B,gCAC7B,EAAU,qBACV,EAAU,cACZ,EACF,WAAY,EAAsB,IAAc,CAC9C,EAAQ,UAAU,EAAqB,EAAE,EACzC,EAAA,8BACE,EACA,EAAU,oBACZ,EACA,EAAY,kBAAkB,CAC5B,SAAU,EAAA,wBAAwB,gBACpC,CAAC,EACD,EAAQ,cAAc,CACxB,EACA,QAAS,EAAQ,QACnB,CAAC,CACH,CAEA,SAAS,EAA+B,EAOrC,CACD,IAAM,EAAc,EAAA,qBAAqB,EAAQ,cAAc,EAC3D,EAAY,uBAAyB,CAAC,EAAQ,uBAChD,EAAQ,yBAAyB,EAAY,qBAAqB,EAOpE,IAAM,EACJ,EAAQ,8BACR,EAAA,8BAA8B,EAAQ,cAAc,GAChD,gCACJ,KAEE,GAAc,IAAe,EAAQ,6BACvC,EAAQ,+BAA+B,CAAU,CAErD,CASA,IAAa,MAA2B,CACtC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAE,WAAY,EAAA,iBAAiB,EAC/B,CACJ,sBACA,2BACA,wBACA,iCACA,+BACE,EAAA,qBAAqB,EACnB,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAC/C,CAAE,OAAQ,EAAoB,UAAW,GAC7C,EAAA,sBAAsB,EAClB,CACJ,OAAQ,EACR,UAAW,GACT,EAA2C,CAC7C,UAAW,EACX,kBAAqB,CACnB,EAAA,oBACE,EAAE,EAAA,QAAQ,0CAA0C,CACtD,CACF,EAIA,aAAgB,CACd,EAAoB,MAAM,EAC1B,EAAA,kBAAkB,EAAE,EAAA,QAAQ,wCAAwC,CAAC,CACvE,CACF,CAAC,EAMK,EAAiB,EAAQ,OAAS,QAClC,CAAE,KAAM,GAAwB,EAAA,oBACpC,EAAiB,GAAc,qBAAuB,IAAA,EACxD,EAEM,EAA+B,EACjC,EAAA,0BAA0B,EAAqB,GAAc,EAAE,EAC/D,MAKJ,EAAA,EAAA,eAAgB,CACT,GAAc,IAEnB,EAA+B,CAC7B,eAAgB,EAAa,GAC7B,+BACA,wBACA,8BACA,2BACA,gCACF,CAAC,CACH,EAAG,CACD,GAAc,GACd,EACA,EACA,EACA,EACA,CACF,CAAC,EAED,IAAM,EAAkB,CAAC,EACtB,GAAc,sBACb,EAAa,qBAAqB,OAAS,GAC7C,GAKI,EAAa,EACf,CAAC,EAAE,GAA+B,GAClC,EAyEJ,MAAO,CACL,iBAAA,EAAA,EAAA,cAtEE,EACA,IACG,CAMH,GALA,GAAO,eAAe,EACtB,GAAO,gBAAgB,EAEvB,EAAoB,MAAM,EAEtB,EAAQ,OAAS,QAAS,CAK5B,GACE,CAAC,GAAc,IACf,GACA,GACA,EAEA,OAEF,EAAgC,CAC9B,qBAAsB,EAAa,GACnC,gBACF,CAAC,EACD,MACF,CAEI,GAAmB,CAAC,GAAc,IAItC,EACE,CACE,qBAAsB,EAAa,GACnC,UAAW,OACX,WAAY,wBACZ,GAAI,EAAiB,CAAE,MAAO,CAAe,EAAI,CAAC,CACpD,EACA,CACE,UAAY,GAAS,CACnB,EAAA,oBACE,EAAE,EAAA,QAAQ,0CAA0C,CACtD,EACI,EAAK,UACP,EAAyB,EAAK,OAAO,EACrC,EAAA,qBAAqB,EAAa,GAAI,CACpC,sBAAuB,EAAK,OAC9B,CAAC,EAEL,CACF,CACF,CACF,EACA,CACE,EAAQ,KACR,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CAIA,EACA,aACA,uBACE,GAA+B,CACnC,CACF"}
@@ -1,3 +1,4 @@
1
+ import { type MouseEvent } from "react";
1
2
  /**
2
3
  * Custom hook that encapsulates the logic for handling plan creation.
3
4
  * Returns a function that can be called to create a plan conversation and
@@ -6,6 +7,7 @@
6
7
  * @returns An object containing handlePlanClick function and isCreatingConversation boolean
7
8
  */
8
9
  export declare const useHandlePlanClick: () => {
9
- handlePlanClick: (event?: React.MouseEvent<HTMLButtonElement> | KeyboardEvent) => void;
10
+ handlePlanClick: (event?: MouseEvent<HTMLButtonElement> | KeyboardEvent, initialMessage?: string) => void;
11
+ hasPlanner: boolean;
10
12
  isCreatingConversation: boolean;
11
13
  };
@@ -2,42 +2,101 @@ import { useTranslation as e } from "../node_modules/react-i18next/dist/es/useTr
2
2
  import { I18nKey as t } from "../i18n/declaration.js";
3
3
  import { getConversationState as n, setConversationState as r } from "../utils/conversation-local-storage.js";
4
4
  import { useConversationStore as i } from "../stores/conversation-store.js";
5
- import { displaySuccessToast as a } from "../utils/custom-toast-handlers.js";
6
- import { useActiveConversation as o } from "./query/use-active-conversation.js";
7
- import { useCreateConversation as s } from "./mutation/use-create-conversation.js";
8
- import { useCallback as c, useEffect as l } from "react";
5
+ import { CONVERSATION_QUERY_KEYS as a, LOCAL_PLANNER_MUTATION_KEYS as o } from "./query/query-keys.js";
6
+ import { useQueryClient as s } from "../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
7
+ import { useMutation as c } from "../node_modules/@tanstack/react-query/build/modern/useMutation.js";
8
+ import { displayErrorToast as l, displaySuccessToast as u } from "../utils/custom-toast-handlers.js";
9
+ import { useActiveBackend as d } from "../contexts/active-backend-context.js";
10
+ import { getStoredConversationMetadata as f } from "../api/conversation-metadata-store.js";
11
+ import { findPlannerConversationId as p } from "../utils/plan-file.js";
12
+ import m from "../api/conversation-service/agent-server-conversation-service.api.js";
13
+ import { invalidateConversationQueries as h } from "./mutation/conversation-mutation-utils.js";
14
+ import { useActiveConversation as g } from "./query/use-active-conversation.js";
15
+ import { useCreateConversation as _ } from "./mutation/use-create-conversation.js";
16
+ import { useSubConversations as v } from "./query/use-sub-conversations.js";
17
+ import { useCallback as y, useEffect as b } from "react";
9
18
  //#region src/hooks/use-handle-plan-click.ts
10
- var u = () => {
11
- let { t: u } = e("openhands"), { setConversationMode: d, setSubConversationTaskId: f, subConversationTaskId: p } = i(), { data: m } = o(), { mutate: h, isPending: g } = s();
12
- return l(() => {
13
- if (!m?.id) return;
14
- let e = n(m.id);
15
- e.subConversationTaskId && !p && f(e.subConversationTaskId);
19
+ function x(e) {
20
+ let t = s();
21
+ return c({
22
+ mutationKey: o.create,
23
+ mutationFn: (e) => m.createLocalPlanningConversation(e.parentConversationId, e.initialMessage),
24
+ onSuccess: (n, r) => {
25
+ e.onCreated(n.id), h(t, r.parentConversationId), t.invalidateQueries({ queryKey: a.subConversations }), e.onInitialized();
26
+ },
27
+ onError: e.onFailed
28
+ });
29
+ }
30
+ function S(e) {
31
+ let t = n(e.conversationId);
32
+ t.subConversationTaskId && !e.subConversationTaskId && e.setSubConversationTaskId(t.subConversationTaskId);
33
+ let r = e.serverPlanningConversationId ?? f(e.conversationId)?.local_planning_conversation_id ?? null;
34
+ r && r !== e.localPlanningConversationId && e.setLocalPlanningConversationId(r);
35
+ }
36
+ var C = () => {
37
+ let { t: n } = e("openhands"), { backend: a } = d(), { setConversationMode: o, setSubConversationTaskId: s, subConversationTaskId: c, setLocalPlanningConversationId: f, localPlanningConversationId: m } = i(), { data: h } = g(), { mutate: C, isPending: w } = _(), { mutate: T, isPending: E } = x({
38
+ onCreated: f,
39
+ onInitialized: () => {
40
+ u(n(t.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED));
41
+ },
42
+ onFailed: () => {
43
+ o("code"), l(n(t.CONVERSATION$ERROR_STARTING_CONVERSATION));
44
+ }
45
+ }), D = a.kind !== "cloud", { data: O } = v(D ? h?.sub_conversation_ids : void 0), k = D ? p(O, h?.id) : null;
46
+ b(() => {
47
+ h?.id && S({
48
+ conversationId: h.id,
49
+ serverPlanningConversationId: k,
50
+ subConversationTaskId: c,
51
+ localPlanningConversationId: m,
52
+ setSubConversationTaskId: s,
53
+ setLocalPlanningConversationId: f
54
+ });
16
55
  }, [
17
- m?.id,
18
- p,
19
- f
20
- ]), {
21
- handlePlanClick: c((e) => {
22
- e?.preventDefault(), e?.stopPropagation(), d("plan"), !(m?.sub_conversation_ids && m.sub_conversation_ids.length > 0 || !m?.id || p) && h({
23
- parentConversationId: m.id,
56
+ h?.id,
57
+ k,
58
+ m,
59
+ f,
60
+ c,
61
+ s
62
+ ]);
63
+ let A = !!(h?.sub_conversation_ids && h.sub_conversation_ids.length > 0 || c), j = D ? !!(m || k) : A;
64
+ return {
65
+ handlePlanClick: y((e, i) => {
66
+ if (e?.preventDefault(), e?.stopPropagation(), o("plan"), a.kind !== "cloud") {
67
+ if (!h?.id || m || k || E) return;
68
+ T({
69
+ parentConversationId: h.id,
70
+ initialMessage: i
71
+ });
72
+ return;
73
+ }
74
+ A || !h?.id || C({
75
+ parentConversationId: h.id,
24
76
  agentType: "plan",
25
- entryPoint: "plan_sub_conversation"
77
+ entryPoint: "plan_sub_conversation",
78
+ ...i ? { query: i } : {}
26
79
  }, { onSuccess: (e) => {
27
- a(u(t.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED)), e.task_id && (f(e.task_id), r(m.id, { subConversationTaskId: e.task_id }));
80
+ u(n(t.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED)), e.task_id && (s(e.task_id), r(h.id, { subConversationTaskId: e.task_id }));
28
81
  } });
29
82
  }, [
30
- m,
83
+ a.kind,
31
84
  h,
32
- d,
33
- f,
34
- p,
35
- u
85
+ C,
86
+ T,
87
+ A,
88
+ E,
89
+ m,
90
+ k,
91
+ o,
92
+ s,
93
+ n
36
94
  ]),
37
- isCreatingConversation: g
95
+ hasPlanner: j,
96
+ isCreatingConversation: w || E
38
97
  };
39
98
  };
40
99
  //#endregion
41
- export { u as useHandlePlanClick };
100
+ export { C as useHandlePlanClick };
42
101
 
43
102
  //# sourceMappingURL=use-handle-plan-click.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-handle-plan-click.js","names":[],"sources":["../../src/hooks/use-handle-plan-click.ts"],"sourcesContent":["import { useCallback, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport { displaySuccessToast } from \"#/utils/custom-toast-handlers\";\nimport {\n getConversationState,\n setConversationState,\n} from \"#/utils/conversation-local-storage\";\n\n/**\n * Custom hook that encapsulates the logic for handling plan creation.\n * Returns a function that can be called to create a plan conversation and\n * the pending state of the conversation creation.\n *\n * @returns An object containing handlePlanClick function and isCreatingConversation boolean\n */\nexport const useHandlePlanClick = () => {\n const { t } = useTranslation(\"openhands\");\n const {\n setConversationMode,\n setSubConversationTaskId,\n subConversationTaskId,\n } = useConversationStore();\n const { data: conversation } = useActiveConversation();\n const { mutate: createConversation, isPending: isCreatingConversation } =\n useCreateConversation();\n\n // Restore subConversationTaskId from localStorage on conversation load\n // This handles the case where page was refreshed while sub-conversation creation was in progress\n useEffect(() => {\n if (!conversation?.id) return;\n\n const storedState = getConversationState(conversation.id);\n if (storedState.subConversationTaskId && !subConversationTaskId) {\n setSubConversationTaskId(storedState.subConversationTaskId);\n }\n }, [conversation?.id, subConversationTaskId, setSubConversationTaskId]);\n\n const handlePlanClick = useCallback(\n (event?: React.MouseEvent<HTMLButtonElement> | KeyboardEvent) => {\n event?.preventDefault();\n event?.stopPropagation();\n\n // Set conversation mode to \"plan\" immediately\n setConversationMode(\"plan\");\n\n // Check if sub_conversation_ids is not empty or if a sub-conversation creation is already in progress\n if (\n (conversation?.sub_conversation_ids &&\n conversation.sub_conversation_ids.length > 0) ||\n !conversation?.id ||\n subConversationTaskId\n ) {\n // Do nothing if any condition is true\n return;\n }\n\n // Create a new sub-conversation if we have a current conversation ID\n createConversation(\n {\n parentConversationId: conversation.id,\n agentType: \"plan\",\n entryPoint: \"plan_sub_conversation\",\n },\n {\n onSuccess: (data) => {\n displaySuccessToast(\n t(I18nKey.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED),\n );\n // Track the task ID to poll for sub-conversation creation\n if (data.task_id) {\n setSubConversationTaskId(data.task_id);\n // Persist to localStorage so it survives page refresh\n setConversationState(conversation.id, {\n subConversationTaskId: data.task_id,\n });\n }\n },\n },\n );\n },\n [\n conversation,\n createConversation,\n setConversationMode,\n setSubConversationTaskId,\n subConversationTaskId,\n t,\n ],\n );\n\n return { handlePlanClick, isCreatingConversation };\n};\n"],"mappings":";;;;;;;;;AAmBA,IAAa,UAA2B;CACtC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EACJ,wBACA,6BACA,6BACE,EAAqB,GACnB,EAAE,MAAM,MAAiB,EAAsB,GAC/C,EAAE,QAAQ,GAAoB,WAAW,MAC7C,EAAsB;CAkExB,OA9DA,QAAgB;EACd,IAAI,CAAC,GAAc,IAAI;EAEvB,IAAM,IAAc,EAAqB,EAAa,EAAE;EACxD,AAAI,EAAY,yBAAyB,CAAC,KACxC,EAAyB,EAAY,qBAAqB;CAE9D,GAAG;EAAC,GAAc;EAAI;EAAuB;CAAwB,CAAC,GAuD/D;EAAE,iBArDe,GACrB,MAAgE;GAC/D,GAAO,eAAe,GACtB,GAAO,gBAAgB,GAGvB,EAAoB,MAAM,GAIvB,KAAc,wBACb,EAAa,qBAAqB,SAAS,KAC7C,CAAC,GAAc,MACf,MAOF,EACE;IACE,sBAAsB,EAAa;IACnC,WAAW;IACX,YAAY;GACd,GACA,EACE,YAAY,MAAS;IAKnB,AAJA,EACE,EAAE,EAAQ,0CAA0C,CACtD,GAEI,EAAK,YACP,EAAyB,EAAK,OAAO,GAErC,EAAqB,EAAa,IAAI,EACpC,uBAAuB,EAAK,QAC9B,CAAC;GAEL,EACF,CACF;EACF,GACA;GACE;GACA;GACA;GACA;GACA;GACA;EACF,CAGO;EAAiB;CAAuB;AACnD"}
1
+ {"version":3,"file":"use-handle-plan-click.js","names":[],"sources":["../../src/hooks/use-handle-plan-click.ts"],"sourcesContent":["import { useCallback, useEffect, type MouseEvent } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useConversationStore } from \"#/stores/conversation-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useCreateConversation } from \"#/hooks/mutation/use-create-conversation\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\nimport {\n getConversationState,\n setConversationState,\n} from \"#/utils/conversation-local-storage\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { getStoredConversationMetadata } from \"#/api/conversation-metadata-store\";\nimport {\n CONVERSATION_QUERY_KEYS,\n LOCAL_PLANNER_MUTATION_KEYS,\n} from \"#/hooks/query/query-keys\";\nimport { useSubConversations } from \"#/hooks/query/use-sub-conversations\";\nimport { findPlannerConversationId } from \"#/utils/plan-file\";\nimport { invalidateConversationQueries } from \"#/hooks/mutation/conversation-mutation-utils\";\n\nfunction useCreateLocalPlanningConversationMutation(options: {\n onCreated: (planningConversationId: string) => void;\n onInitialized: () => void;\n onFailed: () => void;\n}) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: LOCAL_PLANNER_MUTATION_KEYS.create,\n mutationFn: (variables: {\n parentConversationId: string;\n initialMessage?: string;\n }) =>\n AgentServerConversationService.createLocalPlanningConversation(\n variables.parentConversationId,\n variables.initialMessage,\n ),\n onSuccess: (planningConversation, variables) => {\n options.onCreated(planningConversation.id);\n invalidateConversationQueries(\n queryClient,\n variables.parentConversationId,\n );\n queryClient.invalidateQueries({\n queryKey: CONVERSATION_QUERY_KEYS.subConversations,\n });\n options.onInitialized();\n },\n onError: options.onFailed,\n });\n}\n\nfunction restorePlanningConversationIds(options: {\n conversationId: string;\n serverPlanningConversationId: string | null;\n subConversationTaskId: string | null;\n localPlanningConversationId: string | null;\n setSubConversationTaskId: (taskId: string | null) => void;\n setLocalPlanningConversationId: (conversationId: string | null) => void;\n}) {\n const storedState = getConversationState(options.conversationId);\n if (storedState.subConversationTaskId && !options.subConversationTaskId) {\n options.setSubConversationTaskId(storedState.subConversationTaskId);\n }\n\n // Server first: `sub_conversation_ids` is derived by the agent-server from\n // the planner's `parent_conversation_id`, so it survives cleared site data\n // and follows the user to another browser. The localStorage hint is only the\n // fallback for agent-servers older than 1.37.1, which drop the parent link.\n const restoredId =\n options.serverPlanningConversationId ??\n getStoredConversationMetadata(options.conversationId)\n ?.local_planning_conversation_id ??\n null;\n\n if (restoredId && restoredId !== options.localPlanningConversationId) {\n options.setLocalPlanningConversationId(restoredId);\n }\n}\n\n/**\n * Custom hook that encapsulates the logic for handling plan creation.\n * Returns a function that can be called to create a plan conversation and\n * the pending state of the conversation creation.\n *\n * @returns An object containing handlePlanClick function and isCreatingConversation boolean\n */\nexport const useHandlePlanClick = () => {\n const { t } = useTranslation(\"openhands\");\n const { backend } = useActiveBackend();\n const {\n setConversationMode,\n setSubConversationTaskId,\n subConversationTaskId,\n setLocalPlanningConversationId,\n localPlanningConversationId,\n } = useConversationStore();\n const { data: conversation } = useActiveConversation();\n const { mutate: createConversation, isPending: isCreatingCloudConversation } =\n useCreateConversation();\n const {\n mutate: createLocalPlanningConversation,\n isPending: isCreatingLocalPlanningConversation,\n } = useCreateLocalPlanningConversationMutation({\n onCreated: setLocalPlanningConversationId,\n onInitialized: () => {\n displaySuccessToast(\n t(I18nKey.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED),\n );\n },\n // handlePlanClick sets conversationMode(\"plan\") before this mutation\n // starts. On failure, back out of that mode instead of stranding the\n // user in plan mode with no planner to talk to.\n onFailed: () => {\n setConversationMode(\"code\");\n displayErrorToast(t(I18nKey.CONVERSATION$ERROR_STARTING_CONVERSATION));\n },\n });\n\n // On local backends the agent-server reports the planner helper back on the\n // parent's `sub_conversation_ids` (it was created with\n // `parent_conversation_id`), so that is the authoritative handle. Cloud\n // sub-conversations are driven by their own task/socket plumbing.\n const isLocalBackend = backend.kind !== \"cloud\";\n const { data: rawSubConversations } = useSubConversations(\n isLocalBackend ? conversation?.sub_conversation_ids : undefined,\n );\n\n const serverPlanningConversationId = isLocalBackend\n ? findPlannerConversationId(rawSubConversations, conversation?.id)\n : null;\n\n // Restore planning conversation ids on conversation load. This handles page\n // refreshes while cloud or local planning conversation creation is in\n // progress, and recovers the local planner after browser storage is lost.\n useEffect(() => {\n if (!conversation?.id) return;\n\n restorePlanningConversationIds({\n conversationId: conversation.id,\n serverPlanningConversationId,\n subConversationTaskId,\n localPlanningConversationId,\n setSubConversationTaskId,\n setLocalPlanningConversationId,\n });\n }, [\n conversation?.id,\n serverPlanningConversationId,\n localPlanningConversationId,\n setLocalPlanningConversationId,\n subConversationTaskId,\n setSubConversationTaskId,\n ]);\n\n const hasCloudPlanner = !!(\n (conversation?.sub_conversation_ids &&\n conversation.sub_conversation_ids.length > 0) ||\n subConversationTaskId\n );\n // Whether a planner helper already exists for this conversation — callers\n // (e.g. the `/plan <task>` interceptor) use this to decide whether they can\n // send a message to the planner immediately, or must wait for creation.\n const hasPlanner = isLocalBackend\n ? !!(localPlanningConversationId || serverPlanningConversationId)\n : hasCloudPlanner;\n\n const handlePlanClick = useCallback(\n (\n event?: MouseEvent<HTMLButtonElement> | KeyboardEvent,\n initialMessage?: string,\n ) => {\n event?.preventDefault();\n event?.stopPropagation();\n\n setConversationMode(\"plan\");\n\n if (backend.kind !== \"cloud\") {\n // Guard on the server-reported helper, the store, and the mutation's\n // own in-flight state — the last one stops two rapid invocations\n // (e.g. a double-click) from both passing before either updates and\n // creating two planners for the same parent.\n if (\n !conversation?.id ||\n localPlanningConversationId ||\n serverPlanningConversationId ||\n isCreatingLocalPlanningConversation\n ) {\n return;\n }\n createLocalPlanningConversation({\n parentConversationId: conversation.id,\n initialMessage,\n });\n return;\n }\n\n if (hasCloudPlanner || !conversation?.id) {\n return;\n }\n\n createConversation(\n {\n parentConversationId: conversation.id,\n agentType: \"plan\",\n entryPoint: \"plan_sub_conversation\",\n ...(initialMessage ? { query: initialMessage } : {}),\n },\n {\n onSuccess: (data) => {\n displaySuccessToast(\n t(I18nKey.PLANNING_AGENTT$PLANNING_AGENT_INITIALIZED),\n );\n if (data.task_id) {\n setSubConversationTaskId(data.task_id);\n setConversationState(conversation.id, {\n subConversationTaskId: data.task_id,\n });\n }\n },\n },\n );\n },\n [\n backend.kind,\n conversation,\n createConversation,\n createLocalPlanningConversation,\n hasCloudPlanner,\n isCreatingLocalPlanningConversation,\n localPlanningConversationId,\n serverPlanningConversationId,\n setConversationMode,\n setSubConversationTaskId,\n t,\n ],\n );\n\n return {\n handlePlanClick,\n hasPlanner,\n isCreatingConversation:\n isCreatingCloudConversation || isCreatingLocalPlanningConversation,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,SAAS,EAA2C,GAIjD;CACD,IAAM,IAAc,EAAe;CAEnC,OAAO,EAAY;EACjB,aAAa,EAA4B;EACzC,aAAa,MAIX,EAA+B,gCAC7B,EAAU,sBACV,EAAU,cACZ;EACF,YAAY,GAAsB,MAAc;GAS9C,AARA,EAAQ,UAAU,EAAqB,EAAE,GACzC,EACE,GACA,EAAU,oBACZ,GACA,EAAY,kBAAkB,EAC5B,UAAU,EAAwB,iBACpC,CAAC,GACD,EAAQ,cAAc;EACxB;EACA,SAAS,EAAQ;CACnB,CAAC;AACH;AAEA,SAAS,EAA+B,GAOrC;CACD,IAAM,IAAc,EAAqB,EAAQ,cAAc;CAC/D,AAAI,EAAY,yBAAyB,CAAC,EAAQ,yBAChD,EAAQ,yBAAyB,EAAY,qBAAqB;CAOpE,IAAM,IACJ,EAAQ,gCACR,EAA8B,EAAQ,cAAc,GAChD,kCACJ;CAEF,AAAI,KAAc,MAAe,EAAQ,+BACvC,EAAQ,+BAA+B,CAAU;AAErD;AASA,IAAa,UAA2B;CACtC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,EAAE,eAAY,EAAiB,GAC/B,EACJ,wBACA,6BACA,0BACA,mCACA,mCACE,EAAqB,GACnB,EAAE,MAAM,MAAiB,EAAsB,GAC/C,EAAE,QAAQ,GAAoB,WAAW,MAC7C,EAAsB,GAClB,EACJ,QAAQ,GACR,WAAW,MACT,EAA2C;EAC7C,WAAW;EACX,qBAAqB;GACnB,EACE,EAAE,EAAQ,0CAA0C,CACtD;EACF;EAIA,gBAAgB;GAEd,AADA,EAAoB,MAAM,GAC1B,EAAkB,EAAE,EAAQ,wCAAwC,CAAC;EACvE;CACF,CAAC,GAMK,IAAiB,EAAQ,SAAS,SAClC,EAAE,MAAM,MAAwB,EACpC,IAAiB,GAAc,uBAAuB,KAAA,CACxD,GAEM,IAA+B,IACjC,EAA0B,GAAqB,GAAc,EAAE,IAC/D;CAKJ,QAAgB;EACT,GAAc,MAEnB,EAA+B;GAC7B,gBAAgB,EAAa;GAC7B;GACA;GACA;GACA;GACA;EACF,CAAC;CACH,GAAG;EACD,GAAc;EACd;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,IAAM,IAAkB,CAAC,EACtB,GAAc,wBACb,EAAa,qBAAqB,SAAS,KAC7C,IAKI,IAAa,IACf,CAAC,EAAE,KAA+B,KAClC;CAyEJ,OAAO;EACL,iBAxEsB,GAEpB,GACA,MACG;GAMH,IALA,GAAO,eAAe,GACtB,GAAO,gBAAgB,GAEvB,EAAoB,MAAM,GAEtB,EAAQ,SAAS,SAAS;IAK5B,IACE,CAAC,GAAc,MACf,KACA,KACA,GAEA;IAEF,EAAgC;KAC9B,sBAAsB,EAAa;KACnC;IACF,CAAC;IACD;GACF;GAEI,KAAmB,CAAC,GAAc,MAItC,EACE;IACE,sBAAsB,EAAa;IACnC,WAAW;IACX,YAAY;IACZ,GAAI,IAAiB,EAAE,OAAO,EAAe,IAAI,CAAC;GACpD,GACA,EACE,YAAY,MAAS;IAInB,AAHA,EACE,EAAE,EAAQ,0CAA0C,CACtD,GACI,EAAK,YACP,EAAyB,EAAK,OAAO,GACrC,EAAqB,EAAa,IAAI,EACpC,uBAAuB,EAAK,QAC9B,CAAC;GAEL,EACF,CACF;EACF,GACA;GACE,EAAQ;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAIA;EACA;EACA,wBACE,KAA+B;CACnC;AACF"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs"),require("../context/navigation-context.cjs"),require("../utils/custom-toast-handlers.cjs"),require("../contexts/active-backend-context.cjs");const e=require("../types/automation.cjs");require("./query/use-automations.cjs"),require("../fixtures/home-automations-demo.cjs"),require("react");function t(t){return t?.status===e.AutomationRunStatus.PENDING||t?.status===e.AutomationRunStatus.RUNNING}exports.isInFlightAutomationRun=t;
1
+ require("../_virtual/_rolldown/runtime.cjs"),require("../context/navigation-context.cjs"),require("../utils/custom-toast-handlers.cjs"),require("../contexts/active-backend-context.cjs");const e=require("../types/automation.cjs");require("./use-automation-permissions.cjs"),require("./query/use-automations.cjs"),require("../fixtures/home-automations-demo.cjs"),require("react");function t(t){return t?.status===e.AutomationRunStatus.PENDING||t?.status===e.AutomationRunStatus.RUNNING}exports.isInFlightAutomationRun=t;
2
2
  //# sourceMappingURL=use-home-automation-actions.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-home-automation-actions.cjs","names":[],"sources":["../../src/hooks/use-home-automation-actions.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport {\n useCancelAutomationRun,\n useDispatchAutomation,\n useToggleAutomation,\n} from \"#/hooks/query/use-automations\";\nimport { useHasPermission } from \"#/hooks/use-has-permission\";\nimport { isHomeAutomationsDemoEnabled } from \"#/fixtures/home-automations-demo\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n AutomationRunStatus,\n type Automation,\n type AutomationRun,\n} from \"#/types/automation\";\nimport { getApiErrorMessage } from \"#/utils/api-error-message\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\n\nexport function isInFlightAutomationRun(\n run: AutomationRun | null | undefined,\n): boolean {\n return (\n run?.status === AutomationRunStatus.PENDING ||\n run?.status === AutomationRunStatus.RUNNING\n );\n}\n\n/**\n * Shared home-surface actions for pinned cards and activity rows:\n * run now, view, edit (local), turn off (with confirm), cancel in-flight.\n */\nexport function useHomeAutomationActions(\n automation: Automation,\n latestRun: AutomationRun | null,\n) {\n const { t } = useTranslation(\"openhands\");\n const { navigate } = useNavigation();\n const active = useActiveBackend();\n const canManage = useHasPermission(\"manage_automations\");\n const canEdit = active.backend.kind === \"local\";\n const isDemo = isHomeAutomationsDemoEnabled();\n\n const dispatchMutation = useDispatchAutomation();\n const toggleMutation = useToggleAutomation();\n const cancelMutation = useCancelAutomationRun();\n\n const [editOpen, setEditOpen] = useState(false);\n const [turnOffConfirmOpen, setTurnOffConfirmOpen] = useState(false);\n\n const isRunPending =\n dispatchMutation.isPending && dispatchMutation.variables === automation.id;\n const isCancelPending =\n cancelMutation.isPending &&\n cancelMutation.variables?.runId === latestRun?.id;\n const canCancel = canManage && isInFlightAutomationRun(latestRun);\n\n const runNow = useCallback(() => {\n if (isDemo) {\n displaySuccessToast(t(I18nKey.AUTOMATIONS$RUN_NOW_SUCCESS));\n return;\n }\n dispatchMutation.mutate(automation.id, {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.AUTOMATIONS$RUN_NOW_SUCCESS));\n },\n onError: (error) => {\n displayErrorToast(\n getApiErrorMessage(error, t(I18nKey.AUTOMATIONS$RUN_NOW_ERROR)),\n );\n },\n });\n }, [automation.id, dispatchMutation, isDemo, t]);\n\n const viewDetails = useCallback(() => {\n navigate?.(`/automations/${automation.id}`);\n }, [automation.id, navigate]);\n\n const openEdit = useCallback(() => {\n if (!canEdit) {\n viewDetails();\n return;\n }\n setEditOpen(true);\n }, [canEdit, viewDetails]);\n\n const requestTurnOff = useCallback(() => {\n setTurnOffConfirmOpen(true);\n }, []);\n\n const confirmTurnOff = useCallback(() => {\n setTurnOffConfirmOpen(false);\n if (isDemo) return;\n toggleMutation.mutate(\n { id: automation.id, enabled: false },\n {\n onError: (error) => {\n displayErrorToast(\n getApiErrorMessage(error, t(I18nKey.AUTOMATIONS$TURN_OFF_ERROR)),\n );\n },\n },\n );\n }, [automation.id, isDemo, t, toggleMutation]);\n\n const cancelTurnOff = useCallback(() => {\n setTurnOffConfirmOpen(false);\n }, []);\n\n const cancelRun = useCallback(() => {\n if (!latestRun || !isInFlightAutomationRun(latestRun)) return;\n if (isDemo) {\n displaySuccessToast(t(I18nKey.AUTOMATIONS$CANCEL_RUN_SUCCESS));\n return;\n }\n cancelMutation.mutate(\n { automationId: automation.id, runId: latestRun.id },\n {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.AUTOMATIONS$CANCEL_RUN_SUCCESS));\n },\n onError: (error) => {\n displayErrorToast(\n getApiErrorMessage(error, t(I18nKey.AUTOMATIONS$CANCEL_RUN_ERROR)),\n );\n },\n },\n );\n }, [automation.id, cancelMutation, isDemo, latestRun, t]);\n\n return {\n canManage,\n canEdit,\n isRunPending,\n isCancelPending,\n canCancel,\n editOpen,\n setEditOpen,\n turnOffConfirmOpen,\n runNow,\n viewDetails,\n openEdit,\n requestTurnOff,\n confirmTurnOff,\n cancelTurnOff,\n cancelRun,\n };\n}\n"],"mappings":"8UAuBA,SAAgB,EACd,EACS,CACT,OACE,GAAK,SAAW,EAAA,oBAAoB,SACpC,GAAK,SAAW,EAAA,oBAAoB,OAExC"}
1
+ {"version":3,"file":"use-home-automation-actions.cjs","names":[],"sources":["../../src/hooks/use-home-automation-actions.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport {\n useCancelAutomationRun,\n useDispatchAutomation,\n useToggleAutomation,\n} from \"#/hooks/query/use-automations\";\nimport {\n useAutomationPermissions,\n useIsAutomationOwner,\n} from \"#/hooks/use-automation-permissions\";\nimport { isHomeAutomationsDemoEnabled } from \"#/fixtures/home-automations-demo\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n AutomationRunStatus,\n type Automation,\n type AutomationRun,\n} from \"#/types/automation\";\nimport { getApiErrorMessage } from \"#/utils/api-error-message\";\nimport {\n displayErrorToast,\n displaySuccessToast,\n} from \"#/utils/custom-toast-handlers\";\n\nexport function isInFlightAutomationRun(\n run: AutomationRun | null | undefined,\n): boolean {\n return (\n run?.status === AutomationRunStatus.PENDING ||\n run?.status === AutomationRunStatus.RUNNING\n );\n}\n\n/**\n * Shared home-surface actions for pinned cards and activity rows:\n * run now, view, edit (local), turn off (with confirm), cancel in-flight.\n */\nexport function useHomeAutomationActions(\n automation: Automation,\n latestRun: AutomationRun | null,\n) {\n const { t } = useTranslation(\"openhands\");\n const { navigate } = useNavigation();\n const active = useActiveBackend();\n const { canManage: hasManagePermission } = useAutomationPermissions();\n const isOwner = useIsAutomationOwner(automation);\n // Write actions on a specific automation are allowed when the user has\n // manage permission OR is the automation's creator (creator escape hatch).\n const canManage = hasManagePermission || isOwner;\n const canEdit = active.backend.kind === \"local\";\n const isDemo = isHomeAutomationsDemoEnabled();\n\n const dispatchMutation = useDispatchAutomation();\n const toggleMutation = useToggleAutomation();\n const cancelMutation = useCancelAutomationRun();\n\n const [editOpen, setEditOpen] = useState(false);\n const [turnOffConfirmOpen, setTurnOffConfirmOpen] = useState(false);\n\n const isRunPending =\n dispatchMutation.isPending && dispatchMutation.variables === automation.id;\n const isCancelPending =\n cancelMutation.isPending &&\n cancelMutation.variables?.runId === latestRun?.id;\n const canCancel = canManage && isInFlightAutomationRun(latestRun);\n\n const runNow = useCallback(() => {\n if (isDemo) {\n displaySuccessToast(t(I18nKey.AUTOMATIONS$RUN_NOW_SUCCESS));\n return;\n }\n dispatchMutation.mutate(automation.id, {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.AUTOMATIONS$RUN_NOW_SUCCESS));\n },\n onError: (error) => {\n displayErrorToast(\n getApiErrorMessage(error, t(I18nKey.AUTOMATIONS$RUN_NOW_ERROR)),\n );\n },\n });\n }, [automation.id, dispatchMutation, isDemo, t]);\n\n const viewDetails = useCallback(() => {\n navigate?.(`/automations/${automation.id}`);\n }, [automation.id, navigate]);\n\n const openEdit = useCallback(() => {\n if (!canEdit) {\n viewDetails();\n return;\n }\n setEditOpen(true);\n }, [canEdit, viewDetails]);\n\n const requestTurnOff = useCallback(() => {\n setTurnOffConfirmOpen(true);\n }, []);\n\n const confirmTurnOff = useCallback(() => {\n setTurnOffConfirmOpen(false);\n if (isDemo) return;\n toggleMutation.mutate(\n { id: automation.id, enabled: false },\n {\n onError: (error) => {\n displayErrorToast(\n getApiErrorMessage(error, t(I18nKey.AUTOMATIONS$TURN_OFF_ERROR)),\n );\n },\n },\n );\n }, [automation.id, isDemo, t, toggleMutation]);\n\n const cancelTurnOff = useCallback(() => {\n setTurnOffConfirmOpen(false);\n }, []);\n\n const cancelRun = useCallback(() => {\n if (!latestRun || !isInFlightAutomationRun(latestRun)) return;\n if (isDemo) {\n displaySuccessToast(t(I18nKey.AUTOMATIONS$CANCEL_RUN_SUCCESS));\n return;\n }\n cancelMutation.mutate(\n { automationId: automation.id, runId: latestRun.id },\n {\n onSuccess: () => {\n displaySuccessToast(t(I18nKey.AUTOMATIONS$CANCEL_RUN_SUCCESS));\n },\n onError: (error) => {\n displayErrorToast(\n getApiErrorMessage(error, t(I18nKey.AUTOMATIONS$CANCEL_RUN_ERROR)),\n );\n },\n },\n );\n }, [automation.id, cancelMutation, isDemo, latestRun, t]);\n\n return {\n canManage,\n canEdit,\n isRunPending,\n isCancelPending,\n canCancel,\n editOpen,\n setEditOpen,\n turnOffConfirmOpen,\n runNow,\n viewDetails,\n openEdit,\n requestTurnOff,\n confirmTurnOff,\n cancelTurnOff,\n cancelRun,\n };\n}\n"],"mappings":"0XA0BA,SAAgB,EACd,EACS,CACT,OACE,GAAK,SAAW,EAAA,oBAAoB,SACpC,GAAK,SAAW,EAAA,oBAAoB,OAExC"}
@@ -2,6 +2,7 @@ import "../context/navigation-context.js";
2
2
  import "../utils/custom-toast-handlers.js";
3
3
  import "../contexts/active-backend-context.js";
4
4
  import { AutomationRunStatus as e } from "../types/automation.js";
5
+ import "./use-automation-permissions.js";
5
6
  import "./query/use-automations.js";
6
7
  import "../fixtures/home-automations-demo.js";
7
8
  import "react";