@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
@@ -27,7 +27,7 @@ function _({ icon: e, keyName: t, value: n, iconTestId: r }) {
27
27
  testId: r
28
28
  }), /* @__PURE__ */ p("span", {
29
29
  className: "truncate leading-4",
30
- children: l(n)
30
+ children: l(n || t)
31
31
  })] });
32
32
  }
33
33
  function v({ tags: i }) {
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-tag-chips.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-chips.tsx"],"sourcesContent":["import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport {\n computeVisibleTagChipCount,\n formatConversationTagTooltip,\n getConversationTagLabel,\n truncateTagChipValue,\n} from \"./conversation-tag-display\";\nimport {\n getConversationTagIcon,\n type ConversationTagIcon,\n} from \"./conversation-tag-icons\";\nimport {\n CONVERSATION_CARD_META_CHIP_CLASSNAME,\n CONVERSATION_CARD_META_CHIP_ICON_CLASSNAME,\n CONVERSATION_CARD_META_CHIP_ICON_SLOT_CLASSNAME,\n} from \"./conversation-card-meta-chip\";\n\ninterface ConversationTagChipsProps {\n tags: Array<[string, string]>;\n}\n\n/**\n * Fixed line-height slot so Lucide / react-icons / local SVGs share the same\n * optical center as the ``leading-4`` chip / overflow text (raw ``h-3 w-3``\n * SVGs sit on the baseline and look high or low depending on the glyph).\n */\nfunction TagIconSlot({\n icon: Icon,\n keyName,\n testId,\n}: {\n icon: ConversationTagIcon;\n keyName?: string;\n testId?: string;\n}) {\n return (\n <span\n className={CONVERSATION_CARD_META_CHIP_ICON_SLOT_CLASSNAME}\n aria-hidden\n >\n <Icon\n data-testid={testId}\n data-tag-key={keyName}\n aria-hidden\n className={CONVERSATION_CARD_META_CHIP_ICON_CLASSNAME}\n />\n </span>\n );\n}\n\nfunction TagChipContent({\n icon,\n keyName,\n value,\n iconTestId,\n}: {\n icon: ConversationTagIcon;\n keyName: string;\n value: string;\n /**\n * Only the visible row passes this. The off-screen measure row renders the\n * same chips, so tagging both would emit every chip test id twice and break\n * ``getByTestId`` (singular) for any card with tags.\n */\n iconTestId?: string;\n}) {\n return (\n <>\n <TagIconSlot icon={icon} keyName={keyName} testId={iconTestId} />\n <span className=\"truncate leading-4\">{truncateTagChipValue(value)}</span>\n </>\n );\n}\n\n/**\n * Single-row tag chips for a conversation card. Chip labels are value-only\n * (key lives in the tooltip); chips that do not fit fold behind a ``+N``\n * button that opens a key/value popover.\n *\n * The overflow popover is portaled with ``position: fixed`` so it is not\n * clipped by the chip row's ``overflow-hidden`` or the sidebar scroller.\n */\nexport function ConversationTagChips({ tags }: ConversationTagChipsProps) {\n const { t } = useTranslation(\"openhands\");\n const containerRef = React.useRef<HTMLDivElement>(null);\n const measureRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const popoverRef = React.useRef<HTMLDivElement>(null);\n const [visibleCount, setVisibleCount] = React.useState(tags.length);\n const [isOverflowOpen, setIsOverflowOpen] = React.useState(false);\n const [popoverBox, setPopoverBox] = React.useState<{\n top: number;\n left: number;\n } | null>(null);\n\n const recomputeVisibleCount = React.useCallback(() => {\n const container = containerRef.current;\n const measure = measureRef.current;\n if (!container || !measure) {\n return;\n }\n\n const widths = Array.from(measure.children).map(\n (child) => (child as HTMLElement).offsetWidth,\n );\n setVisibleCount(computeVisibleTagChipCount(widths, container.clientWidth));\n }, []);\n\n const measurePopover = React.useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n const rect = trigger.getBoundingClientRect();\n const gutter = 8;\n const width = 16 * 16;\n let left = rect.left;\n if (left + width > window.innerWidth - gutter) {\n left = Math.max(gutter, window.innerWidth - gutter - width);\n }\n setPopoverBox({ top: rect.bottom + 4, left });\n }, []);\n\n // Callers build this array fresh on every render (``getDisplayConversationTags``\n // returns a new array), so keying the reset effect on ``tags`` identity would\n // fire on every parent render — closing an open ``+N`` popover and forcing a\n // layout read on each 10s panel refetch. Compare tag *content* instead.\n const tagsKey = tags.map(([key, value]) => `${key}=${value}`).join(\"\\u001f\");\n const lastTagsKeyRef = React.useRef<string | null>(null);\n\n React.useLayoutEffect(() => {\n if (lastTagsKeyRef.current === tagsKey) {\n return;\n }\n lastTagsKeyRef.current = tagsKey;\n setIsOverflowOpen(false);\n recomputeVisibleCount();\n }, [tagsKey, recomputeVisibleCount]);\n\n React.useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n const observer = new ResizeObserver(() => recomputeVisibleCount());\n observer.observe(container);\n return () => observer.disconnect();\n }, [recomputeVisibleCount]);\n\n React.useLayoutEffect(() => {\n if (!isOverflowOpen) {\n setPopoverBox(null);\n return undefined;\n }\n measurePopover();\n window.addEventListener(\"resize\", measurePopover);\n window.addEventListener(\"scroll\", measurePopover, true);\n return () => {\n window.removeEventListener(\"resize\", measurePopover);\n window.removeEventListener(\"scroll\", measurePopover, true);\n };\n }, [isOverflowOpen, measurePopover]);\n\n React.useEffect(() => {\n if (!isOverflowOpen) {\n return undefined;\n }\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (triggerRef.current?.contains(target)) {\n return;\n }\n if (popoverRef.current?.contains(target)) {\n return;\n }\n setIsOverflowOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOverflowOpen(false);\n }\n };\n // mousedown (not click) so the opening click cannot race-close the panel,\n // and so NavigationLink activation is easier to cancel on the trigger.\n document.addEventListener(\"mousedown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [isOverflowOpen]);\n\n if (tags.length === 0) {\n return null;\n }\n\n const hiddenCount = Math.max(0, tags.length - visibleCount);\n const visibleTags = tags.slice(0, visibleCount);\n const overflowTags = tags.slice(visibleCount);\n\n const stopCardNavigation = (event: React.SyntheticEvent) => {\n // Don't preventDefault on mousedown — that suppresses the subsequent click\n // when the chip sits inside a conversation NavigationLink.\n event.stopPropagation();\n };\n\n const activateOverflow = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setIsOverflowOpen((open) => !open);\n };\n\n return (\n <div\n data-testid=\"conversation-card-tag-chips\"\n className=\"relative min-w-0 w-full\"\n >\n <div\n ref={measureRef}\n aria-hidden\n className=\"pointer-events-none fixed top-0 -left-[10000px] z-[-1] flex flex-nowrap items-center gap-1 opacity-0\"\n >\n {tags.map(([key, value]) => (\n <span key={key} className={CONVERSATION_CARD_META_CHIP_CLASSNAME}>\n <TagChipContent\n icon={getConversationTagIcon(key, value)}\n keyName={key}\n value={value}\n />\n </span>\n ))}\n </div>\n\n <div\n ref={containerRef}\n data-testid=\"conversation-card-tag-row\"\n className=\"flex w-full min-w-0 max-w-full flex-nowrap items-center gap-1 overflow-hidden\"\n >\n {visibleTags.map(([key, value]) => (\n <span\n key={key}\n data-testid=\"conversation-card-tag-chip\"\n title={formatConversationTagTooltip(key, value, t)}\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n >\n <TagChipContent\n icon={getConversationTagIcon(key, value)}\n keyName={key}\n value={value}\n iconTestId=\"conversation-card-tag-chip-icon\"\n />\n </span>\n ))}\n {hiddenCount > 0 ? (\n <button\n ref={triggerRef}\n type=\"button\"\n data-testid=\"conversation-card-tag-overflow\"\n aria-expanded={isOverflowOpen}\n aria-haspopup=\"dialog\"\n aria-label={t(I18nKey.CONVERSATION$TAGS_OVERFLOW_ARIA, {\n count: hiddenCount,\n })}\n onMouseDown={stopCardNavigation}\n onClick={activateOverflow}\n className={cn(\n CONVERSATION_CARD_META_CHIP_CLASSNAME,\n \"shrink-0 self-center hover:bg-[var(--oh-interactive-hover)] hover:text-[var(--foreground)]\",\n )}\n >\n {/* Match chip height (icon slot + label) so +N shares the same centerline. */}\n <span className=\"inline-flex h-4 w-0 shrink-0\" aria-hidden />\n <span className=\"leading-4\">{`+${hiddenCount}`}</span>\n </button>\n ) : null}\n </div>\n\n {isOverflowOpen &&\n popoverBox &&\n typeof document !== \"undefined\" &&\n createPortal(\n // Stop card-level click activation when interacting with the list.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- dialog surface must swallow clicks\n <div\n ref={popoverRef}\n role=\"dialog\"\n data-testid=\"conversation-card-tag-overflow-popover\"\n className={cn(\n \"z-[9999] min-w-[10rem] max-w-[16rem]\",\n \"rounded-md border border-[var(--oh-border-subtle)]\",\n \"bg-[var(--oh-surface)] p-2 shadow-lg\",\n )}\n style={{\n position: \"fixed\",\n top: popoverBox.top,\n left: popoverBox.left,\n }}\n onMouseDown={stopCardNavigation}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n <dl className=\"m-0 flex flex-col gap-1\">\n {overflowTags.map(([key, value]) => (\n <div\n key={key}\n data-testid=\"conversation-card-tag-overflow-row\"\n className=\"grid grid-cols-[minmax(0,auto)_minmax(0,1fr)] gap-x-2 text-[10px] leading-4\"\n >\n <dt className=\"m-0 inline-flex min-w-0 items-center gap-1 whitespace-normal break-words text-[var(--oh-muted)]\">\n <TagIconSlot icon={getConversationTagIcon(key, value)} />\n <span className=\"min-w-0 whitespace-normal break-words leading-4\">\n {getConversationTagLabel(key, t)}\n </span>\n </dt>\n <dd\n className=\"m-0 whitespace-normal break-words text-left leading-4 text-[var(--foreground)]\"\n title={value}\n >\n {value}\n </dd>\n </div>\n ))}\n </dl>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AA8BA,SAAS,EAAY,EACnB,MAAM,GACN,YACA,aAKC;CACD,OACE,kBAAC,QAAD;EACE,WAAW;EACX,eAAA;YAEA,kBAAC,GAAD;GACE,eAAa;GACb,gBAAc;GACd,eAAA;GACA,WAAW;EACZ,CAAA;CACG,CAAA;AAEV;AAEA,SAAS,EAAe,EACtB,SACA,YACA,UACA,iBAWC;CACD,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EAAmB;EAAe;EAAS,QAAQ;CAAa,CAAA,GAChE,kBAAC,QAAD;EAAM,WAAU;YAAsB,EAAqB,CAAK;CAAQ,CAAA,CACxE,EAAA,CAAA;AAEN;AAUA,SAAgB,EAAqB,EAAE,WAAmC;CACxE,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAe,EAAM,OAAuB,IAAI,GAChD,IAAa,EAAM,OAAuB,IAAI,GAC9C,IAAa,EAAM,OAA0B,IAAI,GACjD,IAAa,EAAM,OAAuB,IAAI,GAC9C,CAAC,GAAc,KAAmB,EAAM,SAAS,EAAK,MAAM,GAC5D,CAAC,GAAgB,KAAqB,EAAM,SAAS,EAAK,GAC1D,CAAC,GAAY,KAAiB,EAAM,SAGhC,IAAI,GAER,IAAwB,EAAM,kBAAkB;EACpD,IAAM,IAAY,EAAa,SACzB,IAAU,EAAW;EACvB,CAAC,KAAa,CAAC,KAOnB,EAAgB,EAHD,MAAM,KAAK,EAAQ,QAAQ,EAAE,KACzC,MAAW,EAAsB,WAEO,GAAQ,EAAU,WAAW,CAAC;CAC3E,GAAG,CAAC,CAAC,GAEC,IAAiB,EAAM,kBAAkB;EAC7C,IAAM,IAAU,EAAW;EAC3B,IAAI,CAAC,GACH;EAEF,IAAM,IAAO,EAAQ,sBAAsB,GAGvC,IAAO,EAAK;EAIhB,AAHI,IAAO,MAAQ,OAAO,aAAa,MACrC,IAAO,KAAK,IAAI,GAAQ,OAAO,aAAa,IAAS,GAAK,IAE5D,EAAc;GAAE,KAAK,EAAK,SAAS;GAAG;EAAK,CAAC;CAC9C,GAAG,CAAC,CAAC,GAMC,IAAU,EAAK,KAAK,CAAC,GAAK,OAAW,GAAG,EAAI,GAAG,GAAO,EAAE,KAAK,GAAQ,GACrE,IAAiB,EAAM,OAAsB,IAAI;CAiEvD,IA/DA,EAAM,sBAAsB;EACtB,EAAe,YAAY,MAG/B,EAAe,UAAU,GACzB,EAAkB,EAAK,GACvB,EAAsB;CACxB,GAAG,CAAC,GAAS,CAAqB,CAAC,GAEnC,EAAM,gBAAgB;EACpB,IAAM,IAAY,EAAa;EAC/B,IAAI,CAAC,KAAa,OAAO,iBAAmB,KAC1C;EAGF,IAAM,IAAW,IAAI,qBAAqB,EAAsB,CAAC;EAEjE,OADA,EAAS,QAAQ,CAAS,SACb,EAAS,WAAW;CACnC,GAAG,CAAC,CAAqB,CAAC,GAE1B,EAAM,sBAAsB;EAC1B,IAAI,CAAC,GAAgB;GACnB,EAAc,IAAI;GAClB;EACF;EAIA,OAHA,EAAe,GACf,OAAO,iBAAiB,UAAU,CAAc,GAChD,OAAO,iBAAiB,UAAU,GAAgB,EAAI,SACzC;GAEX,AADA,OAAO,oBAAoB,UAAU,CAAc,GACnD,OAAO,oBAAoB,UAAU,GAAgB,EAAI;EAC3D;CACF,GAAG,CAAC,GAAgB,CAAc,CAAC,GAEnC,EAAM,gBAAgB;EACpB,IAAI,CAAC,GACH;EAEF,IAAM,KAAiB,MAAsB;GAC3C,IAAM,IAAS,EAAM;GACjB,EAAW,SAAS,SAAS,CAAM,KAGnC,EAAW,SAAS,SAAS,CAAM,KAGvC,EAAkB,EAAK;EACzB,GACM,KAAa,MAAyB;GAC1C,AAAI,EAAM,QAAQ,YAChB,EAAkB,EAAK;EAE3B;EAKA,OAFA,SAAS,iBAAiB,aAAa,CAAa,GACpD,SAAS,iBAAiB,WAAW,CAAS,SACjC;GAEX,AADA,SAAS,oBAAoB,aAAa,CAAa,GACvD,SAAS,oBAAoB,WAAW,CAAS;EACnD;CACF,GAAG,CAAC,CAAc,CAAC,GAEf,EAAK,WAAW,GAClB,OAAO;CAGT,IAAM,IAAc,KAAK,IAAI,GAAG,EAAK,SAAS,CAAY,GACpD,IAAc,EAAK,MAAM,GAAG,CAAY,GACxC,IAAe,EAAK,MAAM,CAAY,GAEtC,KAAsB,MAAgC;EAG1D,EAAM,gBAAgB;CACxB;CAQA,OACE,kBAAC,OAAD;EACE,eAAY;EACZ,WAAU;YAFZ;GAIE,kBAAC,OAAD;IACE,KAAK;IACL,eAAA;IACA,WAAU;cAET,EAAK,KAAK,CAAC,GAAK,OACf,kBAAC,QAAD;KAAgB,WAAW;eACzB,kBAAC,GAAD;MACE,MAAM,EAAuB,GAAK,CAAK;MACvC,SAAS;MACF;KACR,CAAA;IACG,GANK,CAML,CACP;GACE,CAAA;GAEL,kBAAC,OAAD;IACE,KAAK;IACL,eAAY;IACZ,WAAU;cAHZ,CAKG,EAAY,KAAK,CAAC,GAAK,OACtB,kBAAC,QAAD;KAEE,eAAY;KACZ,OAAO,EAA6B,GAAK,GAAO,CAAC;KACjD,WAAW;eAEX,kBAAC,GAAD;MACE,MAAM,EAAuB,GAAK,CAAK;MACvC,SAAS;MACF;MACP,YAAW;KACZ,CAAA;IACG,GAXC,CAWD,CACP,GACA,IAAc,IACb,kBAAC,UAAD;KACE,KAAK;KACL,MAAK;KACL,eAAY;KACZ,iBAAe;KACf,iBAAc;KACd,cAAY,EAAE,EAAQ,iCAAiC,EACrD,OAAO,EACT,CAAC;KACD,aAAa;KACb,UA1DgB,MAA+C;MAGvE,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,GAAmB,MAAS,CAAC,CAAI;KACnC;KAuDU,WAAW,EACT,GACA,4FACF;eAdF,CAiBE,kBAAC,QAAD;MAAM,WAAU;MAA+B,eAAA;KAAa,CAAA,GAC5D,kBAAC,QAAD;MAAM,WAAU;gBAAa,IAAI;KAAoB,CAAA,CAC/C;SACN,IACD;;GAEJ,KACC,KACA,OAAO,WAAa,OACpB,EAGE,kBAAC,OAAD;IACE,KAAK;IACL,MAAK;IACL,eAAY;IACZ,WAAW,EACT,wCACA,sDACA,sCACF;IACA,OAAO;KACL,UAAU;KACV,KAAK,EAAW;KAChB,MAAM,EAAW;IACnB;IACA,aAAa;IACb,UAAU,MAAU;KAElB,AADA,EAAM,eAAe,GACrB,EAAM,gBAAgB;IACxB;cAEA,kBAAC,MAAD;KAAI,WAAU;eACX,EAAa,KAAK,CAAC,GAAK,OACvB,kBAAC,OAAD;MAEE,eAAY;MACZ,WAAU;gBAHZ,CAKE,kBAAC,MAAD;OAAI,WAAU;iBAAd,CACE,kBAAC,GAAD,EAAa,MAAM,EAAuB,GAAK,CAAK,EAAI,CAAA,GACxD,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAwB,GAAK,CAAC;OAC3B,CAAA,CACJ;UACJ,kBAAC,MAAD;OACE,WAAU;OACV,OAAO;iBAEN;MACC,CAAA,CACD;QAhBE,CAgBF,CACN;IACC,CAAA;GACD,CAAA,GACL,SAAS,IACX;EACC;;AAET"}
1
+ {"version":3,"file":"conversation-tag-chips.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-chips.tsx"],"sourcesContent":["import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { cn } from \"#/utils/utils\";\nimport {\n computeVisibleTagChipCount,\n formatConversationTagTooltip,\n getConversationTagLabel,\n truncateTagChipValue,\n} from \"./conversation-tag-display\";\nimport {\n getConversationTagIcon,\n type ConversationTagIcon,\n} from \"./conversation-tag-icons\";\nimport {\n CONVERSATION_CARD_META_CHIP_CLASSNAME,\n CONVERSATION_CARD_META_CHIP_ICON_CLASSNAME,\n CONVERSATION_CARD_META_CHIP_ICON_SLOT_CLASSNAME,\n} from \"./conversation-card-meta-chip\";\n\ninterface ConversationTagChipsProps {\n tags: Array<[string, string]>;\n}\n\n/**\n * Fixed line-height slot so Lucide / react-icons / local SVGs share the same\n * optical center as the ``leading-4`` chip / overflow text (raw ``h-3 w-3``\n * SVGs sit on the baseline and look high or low depending on the glyph).\n */\nfunction TagIconSlot({\n icon: Icon,\n keyName,\n testId,\n}: {\n icon: ConversationTagIcon;\n keyName?: string;\n testId?: string;\n}) {\n return (\n <span\n className={CONVERSATION_CARD_META_CHIP_ICON_SLOT_CLASSNAME}\n aria-hidden\n >\n <Icon\n data-testid={testId}\n data-tag-key={keyName}\n aria-hidden\n className={CONVERSATION_CARD_META_CHIP_ICON_CLASSNAME}\n />\n </span>\n );\n}\n\nfunction TagChipContent({\n icon,\n keyName,\n value,\n iconTestId,\n}: {\n icon: ConversationTagIcon;\n keyName: string;\n value: string;\n /**\n * Only the visible row passes this. The off-screen measure row renders the\n * same chips, so tagging both would emit every chip test id twice and break\n * ``getByTestId`` (singular) for any card with tags.\n */\n iconTestId?: string;\n}) {\n return (\n <>\n <TagIconSlot icon={icon} keyName={keyName} testId={iconTestId} />\n {/* Bare tags (empty value) fall back to the key so the chip is never\n an empty pill. */}\n <span className=\"truncate leading-4\">\n {truncateTagChipValue(value || keyName)}\n </span>\n </>\n );\n}\n\n/**\n * Single-row tag chips for a conversation card. Chip labels are value-only\n * (bare tags with an empty value show the key; the full ``key: value`` pair\n * lives in the tooltip); chips that do not fit fold behind a ``+N``\n * button that opens a key/value popover.\n *\n * The overflow popover is portaled with ``position: fixed`` so it is not\n * clipped by the chip row's ``overflow-hidden`` or the sidebar scroller.\n */\nexport function ConversationTagChips({ tags }: ConversationTagChipsProps) {\n const { t } = useTranslation(\"openhands\");\n const containerRef = React.useRef<HTMLDivElement>(null);\n const measureRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const popoverRef = React.useRef<HTMLDivElement>(null);\n const [visibleCount, setVisibleCount] = React.useState(tags.length);\n const [isOverflowOpen, setIsOverflowOpen] = React.useState(false);\n const [popoverBox, setPopoverBox] = React.useState<{\n top: number;\n left: number;\n } | null>(null);\n\n const recomputeVisibleCount = React.useCallback(() => {\n const container = containerRef.current;\n const measure = measureRef.current;\n if (!container || !measure) {\n return;\n }\n\n const widths = Array.from(measure.children).map(\n (child) => (child as HTMLElement).offsetWidth,\n );\n setVisibleCount(computeVisibleTagChipCount(widths, container.clientWidth));\n }, []);\n\n const measurePopover = React.useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n const rect = trigger.getBoundingClientRect();\n const gutter = 8;\n const width = 16 * 16;\n let left = rect.left;\n if (left + width > window.innerWidth - gutter) {\n left = Math.max(gutter, window.innerWidth - gutter - width);\n }\n setPopoverBox({ top: rect.bottom + 4, left });\n }, []);\n\n // Callers build this array fresh on every render (``getDisplayConversationTags``\n // returns a new array), so keying the reset effect on ``tags`` identity would\n // fire on every parent render — closing an open ``+N`` popover and forcing a\n // layout read on each 10s panel refetch. Compare tag *content* instead.\n const tagsKey = tags.map(([key, value]) => `${key}=${value}`).join(\"\\u001f\");\n const lastTagsKeyRef = React.useRef<string | null>(null);\n\n React.useLayoutEffect(() => {\n if (lastTagsKeyRef.current === tagsKey) {\n return;\n }\n lastTagsKeyRef.current = tagsKey;\n setIsOverflowOpen(false);\n recomputeVisibleCount();\n }, [tagsKey, recomputeVisibleCount]);\n\n React.useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n const observer = new ResizeObserver(() => recomputeVisibleCount());\n observer.observe(container);\n return () => observer.disconnect();\n }, [recomputeVisibleCount]);\n\n React.useLayoutEffect(() => {\n if (!isOverflowOpen) {\n setPopoverBox(null);\n return undefined;\n }\n measurePopover();\n window.addEventListener(\"resize\", measurePopover);\n window.addEventListener(\"scroll\", measurePopover, true);\n return () => {\n window.removeEventListener(\"resize\", measurePopover);\n window.removeEventListener(\"scroll\", measurePopover, true);\n };\n }, [isOverflowOpen, measurePopover]);\n\n React.useEffect(() => {\n if (!isOverflowOpen) {\n return undefined;\n }\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (triggerRef.current?.contains(target)) {\n return;\n }\n if (popoverRef.current?.contains(target)) {\n return;\n }\n setIsOverflowOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOverflowOpen(false);\n }\n };\n // mousedown (not click) so the opening click cannot race-close the panel,\n // and so NavigationLink activation is easier to cancel on the trigger.\n document.addEventListener(\"mousedown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [isOverflowOpen]);\n\n if (tags.length === 0) {\n return null;\n }\n\n const hiddenCount = Math.max(0, tags.length - visibleCount);\n const visibleTags = tags.slice(0, visibleCount);\n const overflowTags = tags.slice(visibleCount);\n\n const stopCardNavigation = (event: React.SyntheticEvent) => {\n // Don't preventDefault on mousedown — that suppresses the subsequent click\n // when the chip sits inside a conversation NavigationLink.\n event.stopPropagation();\n };\n\n const activateOverflow = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setIsOverflowOpen((open) => !open);\n };\n\n return (\n <div\n data-testid=\"conversation-card-tag-chips\"\n className=\"relative min-w-0 w-full\"\n >\n <div\n ref={measureRef}\n aria-hidden\n className=\"pointer-events-none fixed top-0 -left-[10000px] z-[-1] flex flex-nowrap items-center gap-1 opacity-0\"\n >\n {tags.map(([key, value]) => (\n <span key={key} className={CONVERSATION_CARD_META_CHIP_CLASSNAME}>\n <TagChipContent\n icon={getConversationTagIcon(key, value)}\n keyName={key}\n value={value}\n />\n </span>\n ))}\n </div>\n\n <div\n ref={containerRef}\n data-testid=\"conversation-card-tag-row\"\n className=\"flex w-full min-w-0 max-w-full flex-nowrap items-center gap-1 overflow-hidden\"\n >\n {visibleTags.map(([key, value]) => (\n <span\n key={key}\n data-testid=\"conversation-card-tag-chip\"\n title={formatConversationTagTooltip(key, value, t)}\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n >\n <TagChipContent\n icon={getConversationTagIcon(key, value)}\n keyName={key}\n value={value}\n iconTestId=\"conversation-card-tag-chip-icon\"\n />\n </span>\n ))}\n {hiddenCount > 0 ? (\n <button\n ref={triggerRef}\n type=\"button\"\n data-testid=\"conversation-card-tag-overflow\"\n aria-expanded={isOverflowOpen}\n aria-haspopup=\"dialog\"\n aria-label={t(I18nKey.CONVERSATION$TAGS_OVERFLOW_ARIA, {\n count: hiddenCount,\n })}\n onMouseDown={stopCardNavigation}\n onClick={activateOverflow}\n className={cn(\n CONVERSATION_CARD_META_CHIP_CLASSNAME,\n \"shrink-0 self-center hover:bg-[var(--oh-interactive-hover)] hover:text-[var(--foreground)]\",\n )}\n >\n {/* Match chip height (icon slot + label) so +N shares the same centerline. */}\n <span className=\"inline-flex h-4 w-0 shrink-0\" aria-hidden />\n <span className=\"leading-4\">{`+${hiddenCount}`}</span>\n </button>\n ) : null}\n </div>\n\n {isOverflowOpen &&\n popoverBox &&\n typeof document !== \"undefined\" &&\n createPortal(\n // Stop card-level click activation when interacting with the list.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- dialog surface must swallow clicks\n <div\n ref={popoverRef}\n role=\"dialog\"\n data-testid=\"conversation-card-tag-overflow-popover\"\n className={cn(\n \"z-[9999] min-w-[10rem] max-w-[16rem]\",\n \"rounded-md border border-[var(--oh-border-subtle)]\",\n \"bg-[var(--oh-surface)] p-2 shadow-lg\",\n )}\n style={{\n position: \"fixed\",\n top: popoverBox.top,\n left: popoverBox.left,\n }}\n onMouseDown={stopCardNavigation}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n <dl className=\"m-0 flex flex-col gap-1\">\n {overflowTags.map(([key, value]) => (\n <div\n key={key}\n data-testid=\"conversation-card-tag-overflow-row\"\n className=\"grid grid-cols-[minmax(0,auto)_minmax(0,1fr)] gap-x-2 text-[10px] leading-4\"\n >\n <dt className=\"m-0 inline-flex min-w-0 items-center gap-1 whitespace-normal break-words text-[var(--oh-muted)]\">\n <TagIconSlot icon={getConversationTagIcon(key, value)} />\n <span className=\"min-w-0 whitespace-normal break-words leading-4\">\n {getConversationTagLabel(key, t)}\n </span>\n </dt>\n <dd\n className=\"m-0 whitespace-normal break-words text-left leading-4 text-[var(--foreground)]\"\n title={value}\n >\n {value}\n </dd>\n </div>\n ))}\n </dl>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../i18n/declaration.cjs");function t(e){switch(e.trim().toLowerCase()){case`git_provider`:return`git`;case`repo_name`:case`repo`:case`repository`:return`repo`;case`selected_branch`:case`branch`:return`branch`;case`archiveworkspacepath`:case`workspace`:case`working_dir`:return`workspace`;case`appmode`:case`app_mode`:case`mode`:return`app_mode`;case`worktools`:case`work_tools`:case`tools`:return`work_tools`;case`workwsid`:case`work_wsid`:case`wsid`:case`workspace_id`:return`work_wsid`;default:return`other`}}function n(e){let t=e.trim();if(!t)return t;let n=t.replace(/[_-]+/g,` `).replace(/\s+/g,` `);return n.charAt(0).toUpperCase()+n.slice(1)}function r(r,i){switch(t(r)){case`git`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_GIT);case`repo`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_REPO);case`branch`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_BRANCH);case`workspace`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_WORKSPACE);case`app_mode`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_APP_MODE);case`work_tools`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_TOOLS);case`work_wsid`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_WSID);default:return n(r)}}function i(e,t,n){return`${r(e,n)}: ${t}`}function a(e,t=14){let n=Array.from(e);return n.length<=t?e:t<=1?`…`:`${n.slice(0,t-1).join(``)}…`}function o(e,t,n={}){let r=n.gapPx??4,i=n.overflowWidthPx??36;if(e.length===0)return 0;if(t<=0)return e.length;let a=0;for(let n=0;n<e.length;n+=1){let o=e[n],s=n>0?r:0,c=e.length-n-1>0?i+r:0;if(a+s+o+c>t)return n;a+=s+o}return e.length}exports.computeVisibleTagChipCount=o,exports.formatConversationTagTooltip=i,exports.getConversationTagLabel=r,exports.truncateTagChipValue=a;
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../i18n/declaration.cjs");function t(e){switch(e.trim().toLowerCase()){case`git_provider`:return`git`;case`repo_name`:case`repo`:case`repository`:return`repo`;case`selected_branch`:case`branch`:return`branch`;case`archiveworkspacepath`:case`workspace`:case`working_dir`:return`workspace`;case`appmode`:case`app_mode`:case`mode`:return`app_mode`;case`worktools`:case`work_tools`:case`tools`:return`work_tools`;case`workwsid`:case`work_wsid`:case`wsid`:case`workspace_id`:return`work_wsid`;default:return`other`}}function n(e){let t=e.trim();if(!t)return t;let n=t.replace(/[_-]+/g,` `).replace(/\s+/g,` `);return n.charAt(0).toUpperCase()+n.slice(1)}function r(r,i){switch(t(r)){case`git`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_GIT);case`repo`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_REPO);case`branch`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_BRANCH);case`workspace`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_WORKSPACE);case`app_mode`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_APP_MODE);case`work_tools`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_TOOLS);case`work_wsid`:return i(e.I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_WSID);default:return n(r)}}function i(e,t,n){let i=r(e,n);return t?`${i}: ${t}`:i}function a(e,t=14){let n=Array.from(e);return n.length<=t?e:t<=1?`…`:`${n.slice(0,t-1).join(``)}…`}function o(e,t,n={}){let r=n.gapPx??4,i=n.overflowWidthPx??36;if(e.length===0)return 0;if(t<=0)return e.length;let a=0;for(let n=0;n<e.length;n+=1){let o=e[n],s=n>0?r:0,c=e.length-n-1>0?i+r:0;if(a+s+o+c>t)return n;a+=s+o}return e.length}exports.computeVisibleTagChipCount=o,exports.formatConversationTagTooltip=i,exports.getConversationTagLabel=r,exports.truncateTagChipValue=a;
2
2
  //# sourceMappingURL=conversation-tag-display.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-tag-display.cjs","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-display.ts"],"sourcesContent":["/**\n * Display helpers for conversation tag chips. Pure (no React) so fit/truncate\n * behavior can be unit-tested without laying out the sidebar card.\n */\n\nimport { I18nKey } from \"#/i18n/declaration\";\n\n/** Max characters shown on a chip before hard truncation with an ellipsis. */\nexport const TAG_CHIP_VALUE_MAX_LENGTH = 14;\n\n/** Horizontal gap between chips (matches Tailwind ``gap-1`` = 4px). */\nexport const TAG_CHIP_GAP_PX = 4;\n\n/**\n * Reserved width for the ``+N`` overflow control when deciding how many chips\n * fit on one row. Slightly generous so the button never wraps under a chip.\n */\nexport const TAG_CHIP_OVERFLOW_WIDTH_PX = 36;\n\n/** Known tag keys that already have a dedicated hovercard label. */\nexport type ConversationTagLabelKind =\n | \"git\"\n | \"repo\"\n | \"branch\"\n | \"workspace\"\n | \"app_mode\"\n | \"work_tools\"\n | \"work_wsid\"\n | \"other\";\n\n/**\n * Map a server tag key to a hovercard label kind. ``archiveworkspacepath`` is\n * treated as \"workspace\" — the sandbox working directory for the conversation.\n * ACM / Work stamps (``Appmode``, ``Worktools``, ``Workwsid``) get dedicated\n * kinds so chips and hovercards show friendly labels instead of the wire key.\n *\n * ``origin`` / ``source`` deliberately stay \"other\" (humanized to \"Origin\" /\n * \"Source\"): they name where a conversation came from — Slack, an API call, an\n * automation — which is not a git fact. Only ``git_provider`` is \"Git\".\n */\nexport function getConversationTagLabelKind(\n key: string,\n): ConversationTagLabelKind {\n switch (key.trim().toLowerCase()) {\n case \"git_provider\":\n return \"git\";\n case \"repo_name\":\n case \"repo\":\n case \"repository\":\n return \"repo\";\n case \"selected_branch\":\n case \"branch\":\n return \"branch\";\n case \"archiveworkspacepath\":\n case \"workspace\":\n case \"working_dir\":\n return \"workspace\";\n case \"appmode\":\n case \"app_mode\":\n case \"mode\":\n return \"app_mode\";\n case \"worktools\":\n case \"work_tools\":\n case \"tools\":\n return \"work_tools\";\n case \"workwsid\":\n case \"work_wsid\":\n case \"wsid\":\n case \"workspace_id\":\n return \"work_wsid\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Soften unknown snake_case / kebab-case keys for tooltips and overflow rows\n * (``selected_branch`` is mapped above; this covers free-form keys like\n * ``env`` → ``Env``).\n */\nexport function humanizeConversationTagKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) {\n return trimmed;\n }\n const words = trimmed.replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \");\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Localized label for a tag key (chip tooltip, overflow popover, hovercard).\n * Known keys use the preview copy; everything else is humanized.\n */\nexport function getConversationTagLabel(\n key: string,\n t: (key: I18nKey) => string,\n): string {\n switch (getConversationTagLabelKind(key)) {\n case \"git\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_GIT);\n case \"repo\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_REPO);\n case \"branch\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_BRANCH);\n case \"workspace\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORKSPACE);\n case \"app_mode\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_APP_MODE);\n case \"work_tools\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_TOOLS);\n case \"work_wsid\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_WSID);\n default:\n return humanizeConversationTagKey(key);\n }\n}\n\n/** ``Branch: main`` — used by chip ``title`` tooltips. */\nexport function formatConversationTagTooltip(\n key: string,\n value: string,\n t: (key: I18nKey) => string,\n): string {\n return `${getConversationTagLabel(key, t)}: ${value}`;\n}\n\n/**\n * Hard-truncate a tag value for the chip label. The full ``key: value`` string\n * stays available via tooltip / overflow popover.\n *\n * Measures and slices by code point rather than UTF-16 code unit: values\n * stamped by Slack / Discord automations carry emoji, and cutting between the\n * halves of a surrogate pair leaves a lone surrogate that browsers draw as a\n * replacement glyph.\n */\nexport function truncateTagChipValue(\n value: string,\n maxLength: number = TAG_CHIP_VALUE_MAX_LENGTH,\n): string {\n const characters = Array.from(value);\n if (characters.length <= maxLength) {\n return value;\n }\n if (maxLength <= 1) {\n return \"…\";\n }\n return `${characters.slice(0, maxLength - 1).join(\"\")}…`;\n}\n\n/**\n * How many chips fit in ``containerWidth`` while keeping a single nowrap row\n * and reserving space for a ``+N`` overflow control when any chips would hide.\n *\n * Returns ``widths.length`` when ``containerWidth <= 0`` (not laid out yet /\n * jsdom) so callers can show every chip until a real measurement arrives.\n * Returns ``0`` when the row is too narrow for even one chip + overflow — the\n * UI then shows only the ``+N`` control with the full list in the popover.\n */\nexport function computeVisibleTagChipCount(\n widths: number[],\n containerWidth: number,\n options: {\n gapPx?: number;\n overflowWidthPx?: number;\n } = {},\n): number {\n const gapPx = options.gapPx ?? TAG_CHIP_GAP_PX;\n const overflowWidthPx = options.overflowWidthPx ?? TAG_CHIP_OVERFLOW_WIDTH_PX;\n\n if (widths.length === 0) {\n return 0;\n }\n if (containerWidth <= 0) {\n return widths.length;\n }\n\n let used = 0;\n for (let i = 0; i < widths.length; i += 1) {\n const width = widths[i]!;\n const gap = i > 0 ? gapPx : 0;\n const remaining = widths.length - i - 1;\n const reserve = remaining > 0 ? overflowWidthPx + gapPx : 0;\n if (used + gap + width + reserve > containerWidth) {\n return i;\n }\n used += gap + width;\n }\n return widths.length;\n}\n"],"mappings":"0GAwCA,SAAgB,EACd,EAC0B,CAC1B,OAAQ,EAAI,KAAK,EAAE,YAAY,EAA/B,CACE,IAAK,eACH,MAAO,MACT,IAAK,YACL,IAAK,OACL,IAAK,aACH,MAAO,OACT,IAAK,kBACL,IAAK,SACH,MAAO,SACT,IAAK,uBACL,IAAK,YACL,IAAK,cACH,MAAO,YACT,IAAK,UACL,IAAK,WACL,IAAK,OACH,MAAO,WACT,IAAK,YACL,IAAK,aACL,IAAK,QACH,MAAO,aACT,IAAK,WACL,IAAK,YACL,IAAK,OACL,IAAK,eACH,MAAO,YACT,QACE,MAAO,OACX,CACF,CAOA,SAAgB,EAA2B,EAAqB,CAC9D,IAAM,EAAU,EAAI,KAAK,EACzB,GAAI,CAAC,EACH,OAAO,EAET,IAAM,EAAQ,EAAQ,QAAQ,SAAU,GAAG,EAAE,QAAQ,OAAQ,GAAG,EAChE,OAAO,EAAM,OAAO,CAAC,EAAE,YAAY,EAAI,EAAM,MAAM,CAAC,CACtD,CAMA,SAAgB,EACd,EACA,EACQ,CACR,OAAQ,EAA4B,CAAG,EAAvC,CACE,IAAK,MACH,OAAO,EAAE,EAAA,QAAQ,8BAA8B,EACjD,IAAK,OACH,OAAO,EAAE,EAAA,QAAQ,+BAA+B,EAClD,IAAK,SACH,OAAO,EAAE,EAAA,QAAQ,iCAAiC,EACpD,IAAK,YACH,OAAO,EAAE,EAAA,QAAQ,oCAAoC,EACvD,IAAK,WACH,OAAO,EAAE,EAAA,QAAQ,mCAAmC,EACtD,IAAK,aACH,OAAO,EAAE,EAAA,QAAQ,qCAAqC,EACxD,IAAK,YACH,OAAO,EAAE,EAAA,QAAQ,oCAAoC,EACvD,QACE,OAAO,EAA2B,CAAG,CACzC,CACF,CAGA,SAAgB,EACd,EACA,EACA,EACQ,CACR,MAAO,GAAG,EAAwB,EAAK,CAAC,EAAE,IAAI,GAChD,CAWA,SAAgB,EACd,EACA,EAAA,GACQ,CACR,IAAM,EAAa,MAAM,KAAK,CAAK,EAOnC,OANI,EAAW,QAAU,EAChB,EAEL,GAAa,EACR,IAEF,GAAG,EAAW,MAAM,EAAG,EAAY,CAAC,EAAE,KAAK,EAAE,EAAE,EACxD,CAWA,SAAgB,EACd,EACA,EACA,EAGI,CAAC,EACG,CACR,IAAM,EAAQ,EAAQ,OAAA,EAChB,EAAkB,EAAQ,iBAAA,GAEhC,GAAI,EAAO,SAAW,EACpB,MAAO,GAET,GAAI,GAAkB,EACpB,OAAO,EAAO,OAGhB,IAAI,EAAO,EACX,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,GAAK,EAAG,CACzC,IAAM,EAAQ,EAAO,GACf,EAAM,EAAI,EAAI,EAAQ,EAEtB,EADY,EAAO,OAAS,EAAI,EACV,EAAI,EAAkB,EAAQ,EAC1D,GAAI,EAAO,EAAM,EAAQ,EAAU,EACjC,OAAO,EAET,GAAQ,EAAM,CAChB,CACA,OAAO,EAAO,MAChB"}
1
+ {"version":3,"file":"conversation-tag-display.cjs","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-display.ts"],"sourcesContent":["/**\n * Display helpers for conversation tag chips. Pure (no React) so fit/truncate\n * behavior can be unit-tested without laying out the sidebar card.\n */\n\nimport { I18nKey } from \"#/i18n/declaration\";\n\n/** Max characters shown on a chip before hard truncation with an ellipsis. */\nexport const TAG_CHIP_VALUE_MAX_LENGTH = 14;\n\n/** Horizontal gap between chips (matches Tailwind ``gap-1`` = 4px). */\nexport const TAG_CHIP_GAP_PX = 4;\n\n/**\n * Reserved width for the ``+N`` overflow control when deciding how many chips\n * fit on one row. Slightly generous so the button never wraps under a chip.\n */\nexport const TAG_CHIP_OVERFLOW_WIDTH_PX = 36;\n\n/** Known tag keys that already have a dedicated hovercard label. */\nexport type ConversationTagLabelKind =\n | \"git\"\n | \"repo\"\n | \"branch\"\n | \"workspace\"\n | \"app_mode\"\n | \"work_tools\"\n | \"work_wsid\"\n | \"other\";\n\n/**\n * Map a server tag key to a hovercard label kind. ``archiveworkspacepath`` is\n * treated as \"workspace\" — the sandbox working directory for the conversation.\n * ACM / Work stamps (``Appmode``, ``Worktools``, ``Workwsid``) get dedicated\n * kinds so chips and hovercards show friendly labels instead of the wire key.\n *\n * ``origin`` / ``source`` deliberately stay \"other\" (humanized to \"Origin\" /\n * \"Source\"): they name where a conversation came from — Slack, an API call, an\n * automation — which is not a git fact. Only ``git_provider`` is \"Git\".\n */\nexport function getConversationTagLabelKind(\n key: string,\n): ConversationTagLabelKind {\n switch (key.trim().toLowerCase()) {\n case \"git_provider\":\n return \"git\";\n case \"repo_name\":\n case \"repo\":\n case \"repository\":\n return \"repo\";\n case \"selected_branch\":\n case \"branch\":\n return \"branch\";\n case \"archiveworkspacepath\":\n case \"workspace\":\n case \"working_dir\":\n return \"workspace\";\n case \"appmode\":\n case \"app_mode\":\n case \"mode\":\n return \"app_mode\";\n case \"worktools\":\n case \"work_tools\":\n case \"tools\":\n return \"work_tools\";\n case \"workwsid\":\n case \"work_wsid\":\n case \"wsid\":\n case \"workspace_id\":\n return \"work_wsid\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Soften unknown snake_case / kebab-case keys for tooltips and overflow rows\n * (``selected_branch`` is mapped above; this covers free-form keys like\n * ``env`` → ``Env``).\n */\nexport function humanizeConversationTagKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) {\n return trimmed;\n }\n const words = trimmed.replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \");\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Localized label for a tag key (chip tooltip, overflow popover, hovercard).\n * Known keys use the preview copy; everything else is humanized.\n */\nexport function getConversationTagLabel(\n key: string,\n t: (key: I18nKey) => string,\n): string {\n switch (getConversationTagLabelKind(key)) {\n case \"git\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_GIT);\n case \"repo\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_REPO);\n case \"branch\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_BRANCH);\n case \"workspace\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORKSPACE);\n case \"app_mode\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_APP_MODE);\n case \"work_tools\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_TOOLS);\n case \"work_wsid\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_WSID);\n default:\n return humanizeConversationTagKey(key);\n }\n}\n\n/** ``Branch: main`` — used by chip ``title`` tooltips. Bare tags (empty\n * value) show the label alone, no dangling colon. */\nexport function formatConversationTagTooltip(\n key: string,\n value: string,\n t: (key: I18nKey) => string,\n): string {\n const label = getConversationTagLabel(key, t);\n return value ? `${label}: ${value}` : label;\n}\n\n/**\n * Hard-truncate a tag value for the chip label. The full ``key: value`` string\n * stays available via tooltip / overflow popover.\n *\n * Measures and slices by code point rather than UTF-16 code unit: values\n * stamped by Slack / Discord automations carry emoji, and cutting between the\n * halves of a surrogate pair leaves a lone surrogate that browsers draw as a\n * replacement glyph.\n */\nexport function truncateTagChipValue(\n value: string,\n maxLength: number = TAG_CHIP_VALUE_MAX_LENGTH,\n): string {\n const characters = Array.from(value);\n if (characters.length <= maxLength) {\n return value;\n }\n if (maxLength <= 1) {\n return \"…\";\n }\n return `${characters.slice(0, maxLength - 1).join(\"\")}…`;\n}\n\n/**\n * How many chips fit in ``containerWidth`` while keeping a single nowrap row\n * and reserving space for a ``+N`` overflow control when any chips would hide.\n *\n * Returns ``widths.length`` when ``containerWidth <= 0`` (not laid out yet /\n * jsdom) so callers can show every chip until a real measurement arrives.\n * Returns ``0`` when the row is too narrow for even one chip + overflow — the\n * UI then shows only the ``+N`` control with the full list in the popover.\n */\nexport function computeVisibleTagChipCount(\n widths: number[],\n containerWidth: number,\n options: {\n gapPx?: number;\n overflowWidthPx?: number;\n } = {},\n): number {\n const gapPx = options.gapPx ?? TAG_CHIP_GAP_PX;\n const overflowWidthPx = options.overflowWidthPx ?? TAG_CHIP_OVERFLOW_WIDTH_PX;\n\n if (widths.length === 0) {\n return 0;\n }\n if (containerWidth <= 0) {\n return widths.length;\n }\n\n let used = 0;\n for (let i = 0; i < widths.length; i += 1) {\n const width = widths[i]!;\n const gap = i > 0 ? gapPx : 0;\n const remaining = widths.length - i - 1;\n const reserve = remaining > 0 ? overflowWidthPx + gapPx : 0;\n if (used + gap + width + reserve > containerWidth) {\n return i;\n }\n used += gap + width;\n }\n return widths.length;\n}\n"],"mappings":"0GAwCA,SAAgB,EACd,EAC0B,CAC1B,OAAQ,EAAI,KAAK,EAAE,YAAY,EAA/B,CACE,IAAK,eACH,MAAO,MACT,IAAK,YACL,IAAK,OACL,IAAK,aACH,MAAO,OACT,IAAK,kBACL,IAAK,SACH,MAAO,SACT,IAAK,uBACL,IAAK,YACL,IAAK,cACH,MAAO,YACT,IAAK,UACL,IAAK,WACL,IAAK,OACH,MAAO,WACT,IAAK,YACL,IAAK,aACL,IAAK,QACH,MAAO,aACT,IAAK,WACL,IAAK,YACL,IAAK,OACL,IAAK,eACH,MAAO,YACT,QACE,MAAO,OACX,CACF,CAOA,SAAgB,EAA2B,EAAqB,CAC9D,IAAM,EAAU,EAAI,KAAK,EACzB,GAAI,CAAC,EACH,OAAO,EAET,IAAM,EAAQ,EAAQ,QAAQ,SAAU,GAAG,EAAE,QAAQ,OAAQ,GAAG,EAChE,OAAO,EAAM,OAAO,CAAC,EAAE,YAAY,EAAI,EAAM,MAAM,CAAC,CACtD,CAMA,SAAgB,EACd,EACA,EACQ,CACR,OAAQ,EAA4B,CAAG,EAAvC,CACE,IAAK,MACH,OAAO,EAAE,EAAA,QAAQ,8BAA8B,EACjD,IAAK,OACH,OAAO,EAAE,EAAA,QAAQ,+BAA+B,EAClD,IAAK,SACH,OAAO,EAAE,EAAA,QAAQ,iCAAiC,EACpD,IAAK,YACH,OAAO,EAAE,EAAA,QAAQ,oCAAoC,EACvD,IAAK,WACH,OAAO,EAAE,EAAA,QAAQ,mCAAmC,EACtD,IAAK,aACH,OAAO,EAAE,EAAA,QAAQ,qCAAqC,EACxD,IAAK,YACH,OAAO,EAAE,EAAA,QAAQ,oCAAoC,EACvD,QACE,OAAO,EAA2B,CAAG,CACzC,CACF,CAIA,SAAgB,EACd,EACA,EACA,EACQ,CACR,IAAM,EAAQ,EAAwB,EAAK,CAAC,EAC5C,OAAO,EAAQ,GAAG,EAAM,IAAI,IAAU,CACxC,CAWA,SAAgB,EACd,EACA,EAAA,GACQ,CACR,IAAM,EAAa,MAAM,KAAK,CAAK,EAOnC,OANI,EAAW,QAAU,EAChB,EAEL,GAAa,EACR,IAEF,GAAG,EAAW,MAAM,EAAG,EAAY,CAAC,EAAE,KAAK,EAAE,EAAE,EACxD,CAWA,SAAgB,EACd,EACA,EACA,EAGI,CAAC,EACG,CACR,IAAM,EAAQ,EAAQ,OAAA,EAChB,EAAkB,EAAQ,iBAAA,GAEhC,GAAI,EAAO,SAAW,EACpB,MAAO,GAET,GAAI,GAAkB,EACpB,OAAO,EAAO,OAGhB,IAAI,EAAO,EACX,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,GAAK,EAAG,CACzC,IAAM,EAAQ,EAAO,GACf,EAAM,EAAI,EAAI,EAAQ,EAEtB,EADY,EAAO,OAAS,EAAI,EACV,EAAI,EAAkB,EAAQ,EAC1D,GAAI,EAAO,EAAM,EAAQ,EAAU,EACjC,OAAO,EAET,GAAQ,EAAM,CAChB,CACA,OAAO,EAAO,MAChB"}
@@ -36,7 +36,8 @@ export declare function humanizeConversationTagKey(key: string): string;
36
36
  * Known keys use the preview copy; everything else is humanized.
37
37
  */
38
38
  export declare function getConversationTagLabel(key: string, t: (key: I18nKey) => string): string;
39
- /** ``Branch: main`` — used by chip ``title`` tooltips. */
39
+ /** ``Branch: main`` — used by chip ``title`` tooltips. Bare tags (empty
40
+ * value) show the label alone, no dangling colon. */
40
41
  export declare function formatConversationTagTooltip(key: string, value: string, t: (key: I18nKey) => string): string;
41
42
  /**
42
43
  * Hard-truncate a tag value for the chip label. The full ``key: value`` string
@@ -42,7 +42,8 @@ function r(r, i) {
42
42
  }
43
43
  }
44
44
  function i(e, t, n) {
45
- return `${r(e, n)}: ${t}`;
45
+ let i = r(e, n);
46
+ return t ? `${i}: ${t}` : i;
46
47
  }
47
48
  function a(e, t = 14) {
48
49
  let n = Array.from(e);
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-tag-display.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-display.ts"],"sourcesContent":["/**\n * Display helpers for conversation tag chips. Pure (no React) so fit/truncate\n * behavior can be unit-tested without laying out the sidebar card.\n */\n\nimport { I18nKey } from \"#/i18n/declaration\";\n\n/** Max characters shown on a chip before hard truncation with an ellipsis. */\nexport const TAG_CHIP_VALUE_MAX_LENGTH = 14;\n\n/** Horizontal gap between chips (matches Tailwind ``gap-1`` = 4px). */\nexport const TAG_CHIP_GAP_PX = 4;\n\n/**\n * Reserved width for the ``+N`` overflow control when deciding how many chips\n * fit on one row. Slightly generous so the button never wraps under a chip.\n */\nexport const TAG_CHIP_OVERFLOW_WIDTH_PX = 36;\n\n/** Known tag keys that already have a dedicated hovercard label. */\nexport type ConversationTagLabelKind =\n | \"git\"\n | \"repo\"\n | \"branch\"\n | \"workspace\"\n | \"app_mode\"\n | \"work_tools\"\n | \"work_wsid\"\n | \"other\";\n\n/**\n * Map a server tag key to a hovercard label kind. ``archiveworkspacepath`` is\n * treated as \"workspace\" — the sandbox working directory for the conversation.\n * ACM / Work stamps (``Appmode``, ``Worktools``, ``Workwsid``) get dedicated\n * kinds so chips and hovercards show friendly labels instead of the wire key.\n *\n * ``origin`` / ``source`` deliberately stay \"other\" (humanized to \"Origin\" /\n * \"Source\"): they name where a conversation came from — Slack, an API call, an\n * automation — which is not a git fact. Only ``git_provider`` is \"Git\".\n */\nexport function getConversationTagLabelKind(\n key: string,\n): ConversationTagLabelKind {\n switch (key.trim().toLowerCase()) {\n case \"git_provider\":\n return \"git\";\n case \"repo_name\":\n case \"repo\":\n case \"repository\":\n return \"repo\";\n case \"selected_branch\":\n case \"branch\":\n return \"branch\";\n case \"archiveworkspacepath\":\n case \"workspace\":\n case \"working_dir\":\n return \"workspace\";\n case \"appmode\":\n case \"app_mode\":\n case \"mode\":\n return \"app_mode\";\n case \"worktools\":\n case \"work_tools\":\n case \"tools\":\n return \"work_tools\";\n case \"workwsid\":\n case \"work_wsid\":\n case \"wsid\":\n case \"workspace_id\":\n return \"work_wsid\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Soften unknown snake_case / kebab-case keys for tooltips and overflow rows\n * (``selected_branch`` is mapped above; this covers free-form keys like\n * ``env`` → ``Env``).\n */\nexport function humanizeConversationTagKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) {\n return trimmed;\n }\n const words = trimmed.replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \");\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Localized label for a tag key (chip tooltip, overflow popover, hovercard).\n * Known keys use the preview copy; everything else is humanized.\n */\nexport function getConversationTagLabel(\n key: string,\n t: (key: I18nKey) => string,\n): string {\n switch (getConversationTagLabelKind(key)) {\n case \"git\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_GIT);\n case \"repo\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_REPO);\n case \"branch\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_BRANCH);\n case \"workspace\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORKSPACE);\n case \"app_mode\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_APP_MODE);\n case \"work_tools\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_TOOLS);\n case \"work_wsid\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_WSID);\n default:\n return humanizeConversationTagKey(key);\n }\n}\n\n/** ``Branch: main`` — used by chip ``title`` tooltips. */\nexport function formatConversationTagTooltip(\n key: string,\n value: string,\n t: (key: I18nKey) => string,\n): string {\n return `${getConversationTagLabel(key, t)}: ${value}`;\n}\n\n/**\n * Hard-truncate a tag value for the chip label. The full ``key: value`` string\n * stays available via tooltip / overflow popover.\n *\n * Measures and slices by code point rather than UTF-16 code unit: values\n * stamped by Slack / Discord automations carry emoji, and cutting between the\n * halves of a surrogate pair leaves a lone surrogate that browsers draw as a\n * replacement glyph.\n */\nexport function truncateTagChipValue(\n value: string,\n maxLength: number = TAG_CHIP_VALUE_MAX_LENGTH,\n): string {\n const characters = Array.from(value);\n if (characters.length <= maxLength) {\n return value;\n }\n if (maxLength <= 1) {\n return \"…\";\n }\n return `${characters.slice(0, maxLength - 1).join(\"\")}…`;\n}\n\n/**\n * How many chips fit in ``containerWidth`` while keeping a single nowrap row\n * and reserving space for a ``+N`` overflow control when any chips would hide.\n *\n * Returns ``widths.length`` when ``containerWidth <= 0`` (not laid out yet /\n * jsdom) so callers can show every chip until a real measurement arrives.\n * Returns ``0`` when the row is too narrow for even one chip + overflow — the\n * UI then shows only the ``+N`` control with the full list in the popover.\n */\nexport function computeVisibleTagChipCount(\n widths: number[],\n containerWidth: number,\n options: {\n gapPx?: number;\n overflowWidthPx?: number;\n } = {},\n): number {\n const gapPx = options.gapPx ?? TAG_CHIP_GAP_PX;\n const overflowWidthPx = options.overflowWidthPx ?? TAG_CHIP_OVERFLOW_WIDTH_PX;\n\n if (widths.length === 0) {\n return 0;\n }\n if (containerWidth <= 0) {\n return widths.length;\n }\n\n let used = 0;\n for (let i = 0; i < widths.length; i += 1) {\n const width = widths[i]!;\n const gap = i > 0 ? gapPx : 0;\n const remaining = widths.length - i - 1;\n const reserve = remaining > 0 ? overflowWidthPx + gapPx : 0;\n if (used + gap + width + reserve > containerWidth) {\n return i;\n }\n used += gap + width;\n }\n return widths.length;\n}\n"],"mappings":";AAwCA,SAAgB,EACd,GAC0B;CAC1B,QAAQ,EAAI,KAAK,EAAE,YAAY,GAA/B;EACE,KAAK,gBACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,cACH,OAAO;EACT,KAAK;EACL,KAAK,UACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,eACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,QACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,gBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAOA,SAAgB,EAA2B,GAAqB;CAC9D,IAAM,IAAU,EAAI,KAAK;CACzB,IAAI,CAAC,GACH,OAAO;CAET,IAAM,IAAQ,EAAQ,QAAQ,UAAU,GAAG,EAAE,QAAQ,QAAQ,GAAG;CAChE,OAAO,EAAM,OAAO,CAAC,EAAE,YAAY,IAAI,EAAM,MAAM,CAAC;AACtD;AAMA,SAAgB,EACd,GACA,GACQ;CACR,QAAQ,EAA4B,CAAG,GAAvC;EACE,KAAK,OACH,OAAO,EAAE,EAAQ,8BAA8B;EACjD,KAAK,QACH,OAAO,EAAE,EAAQ,+BAA+B;EAClD,KAAK,UACH,OAAO,EAAE,EAAQ,iCAAiC;EACpD,KAAK,aACH,OAAO,EAAE,EAAQ,oCAAoC;EACvD,KAAK,YACH,OAAO,EAAE,EAAQ,mCAAmC;EACtD,KAAK,cACH,OAAO,EAAE,EAAQ,qCAAqC;EACxD,KAAK,aACH,OAAO,EAAE,EAAQ,oCAAoC;EACvD,SACE,OAAO,EAA2B,CAAG;CACzC;AACF;AAGA,SAAgB,EACd,GACA,GACA,GACQ;CACR,OAAO,GAAG,EAAwB,GAAK,CAAC,EAAE,IAAI;AAChD;AAWA,SAAgB,EACd,GACA,IAAA,IACQ;CACR,IAAM,IAAa,MAAM,KAAK,CAAK;CAOnC,OANI,EAAW,UAAU,IAChB,IAEL,KAAa,IACR,MAEF,GAAG,EAAW,MAAM,GAAG,IAAY,CAAC,EAAE,KAAK,EAAE,EAAE;AACxD;AAWA,SAAgB,EACd,GACA,GACA,IAGI,CAAC,GACG;CACR,IAAM,IAAQ,EAAQ,SAAA,GAChB,IAAkB,EAAQ,mBAAA;CAEhC,IAAI,EAAO,WAAW,GACpB,OAAO;CAET,IAAI,KAAkB,GACpB,OAAO,EAAO;CAGhB,IAAI,IAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK,GAAG;EACzC,IAAM,IAAQ,EAAO,IACf,IAAM,IAAI,IAAI,IAAQ,GAEtB,IADY,EAAO,SAAS,IAAI,IACV,IAAI,IAAkB,IAAQ;EAC1D,IAAI,IAAO,IAAM,IAAQ,IAAU,GACjC,OAAO;EAET,KAAQ,IAAM;CAChB;CACA,OAAO,EAAO;AAChB"}
1
+ {"version":3,"file":"conversation-tag-display.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-display.ts"],"sourcesContent":["/**\n * Display helpers for conversation tag chips. Pure (no React) so fit/truncate\n * behavior can be unit-tested without laying out the sidebar card.\n */\n\nimport { I18nKey } from \"#/i18n/declaration\";\n\n/** Max characters shown on a chip before hard truncation with an ellipsis. */\nexport const TAG_CHIP_VALUE_MAX_LENGTH = 14;\n\n/** Horizontal gap between chips (matches Tailwind ``gap-1`` = 4px). */\nexport const TAG_CHIP_GAP_PX = 4;\n\n/**\n * Reserved width for the ``+N`` overflow control when deciding how many chips\n * fit on one row. Slightly generous so the button never wraps under a chip.\n */\nexport const TAG_CHIP_OVERFLOW_WIDTH_PX = 36;\n\n/** Known tag keys that already have a dedicated hovercard label. */\nexport type ConversationTagLabelKind =\n | \"git\"\n | \"repo\"\n | \"branch\"\n | \"workspace\"\n | \"app_mode\"\n | \"work_tools\"\n | \"work_wsid\"\n | \"other\";\n\n/**\n * Map a server tag key to a hovercard label kind. ``archiveworkspacepath`` is\n * treated as \"workspace\" — the sandbox working directory for the conversation.\n * ACM / Work stamps (``Appmode``, ``Worktools``, ``Workwsid``) get dedicated\n * kinds so chips and hovercards show friendly labels instead of the wire key.\n *\n * ``origin`` / ``source`` deliberately stay \"other\" (humanized to \"Origin\" /\n * \"Source\"): they name where a conversation came from — Slack, an API call, an\n * automation — which is not a git fact. Only ``git_provider`` is \"Git\".\n */\nexport function getConversationTagLabelKind(\n key: string,\n): ConversationTagLabelKind {\n switch (key.trim().toLowerCase()) {\n case \"git_provider\":\n return \"git\";\n case \"repo_name\":\n case \"repo\":\n case \"repository\":\n return \"repo\";\n case \"selected_branch\":\n case \"branch\":\n return \"branch\";\n case \"archiveworkspacepath\":\n case \"workspace\":\n case \"working_dir\":\n return \"workspace\";\n case \"appmode\":\n case \"app_mode\":\n case \"mode\":\n return \"app_mode\";\n case \"worktools\":\n case \"work_tools\":\n case \"tools\":\n return \"work_tools\";\n case \"workwsid\":\n case \"work_wsid\":\n case \"wsid\":\n case \"workspace_id\":\n return \"work_wsid\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Soften unknown snake_case / kebab-case keys for tooltips and overflow rows\n * (``selected_branch`` is mapped above; this covers free-form keys like\n * ``env`` → ``Env``).\n */\nexport function humanizeConversationTagKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) {\n return trimmed;\n }\n const words = trimmed.replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \");\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Localized label for a tag key (chip tooltip, overflow popover, hovercard).\n * Known keys use the preview copy; everything else is humanized.\n */\nexport function getConversationTagLabel(\n key: string,\n t: (key: I18nKey) => string,\n): string {\n switch (getConversationTagLabelKind(key)) {\n case \"git\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_GIT);\n case \"repo\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_REPO);\n case \"branch\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_BRANCH);\n case \"workspace\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORKSPACE);\n case \"app_mode\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_APP_MODE);\n case \"work_tools\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_TOOLS);\n case \"work_wsid\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_WSID);\n default:\n return humanizeConversationTagKey(key);\n }\n}\n\n/** ``Branch: main`` — used by chip ``title`` tooltips. Bare tags (empty\n * value) show the label alone, no dangling colon. */\nexport function formatConversationTagTooltip(\n key: string,\n value: string,\n t: (key: I18nKey) => string,\n): string {\n const label = getConversationTagLabel(key, t);\n return value ? `${label}: ${value}` : label;\n}\n\n/**\n * Hard-truncate a tag value for the chip label. The full ``key: value`` string\n * stays available via tooltip / overflow popover.\n *\n * Measures and slices by code point rather than UTF-16 code unit: values\n * stamped by Slack / Discord automations carry emoji, and cutting between the\n * halves of a surrogate pair leaves a lone surrogate that browsers draw as a\n * replacement glyph.\n */\nexport function truncateTagChipValue(\n value: string,\n maxLength: number = TAG_CHIP_VALUE_MAX_LENGTH,\n): string {\n const characters = Array.from(value);\n if (characters.length <= maxLength) {\n return value;\n }\n if (maxLength <= 1) {\n return \"…\";\n }\n return `${characters.slice(0, maxLength - 1).join(\"\")}…`;\n}\n\n/**\n * How many chips fit in ``containerWidth`` while keeping a single nowrap row\n * and reserving space for a ``+N`` overflow control when any chips would hide.\n *\n * Returns ``widths.length`` when ``containerWidth <= 0`` (not laid out yet /\n * jsdom) so callers can show every chip until a real measurement arrives.\n * Returns ``0`` when the row is too narrow for even one chip + overflow — the\n * UI then shows only the ``+N`` control with the full list in the popover.\n */\nexport function computeVisibleTagChipCount(\n widths: number[],\n containerWidth: number,\n options: {\n gapPx?: number;\n overflowWidthPx?: number;\n } = {},\n): number {\n const gapPx = options.gapPx ?? TAG_CHIP_GAP_PX;\n const overflowWidthPx = options.overflowWidthPx ?? TAG_CHIP_OVERFLOW_WIDTH_PX;\n\n if (widths.length === 0) {\n return 0;\n }\n if (containerWidth <= 0) {\n return widths.length;\n }\n\n let used = 0;\n for (let i = 0; i < widths.length; i += 1) {\n const width = widths[i]!;\n const gap = i > 0 ? gapPx : 0;\n const remaining = widths.length - i - 1;\n const reserve = remaining > 0 ? overflowWidthPx + gapPx : 0;\n if (used + gap + width + reserve > containerWidth) {\n return i;\n }\n used += gap + width;\n }\n return widths.length;\n}\n"],"mappings":";AAwCA,SAAgB,EACd,GAC0B;CAC1B,QAAQ,EAAI,KAAK,EAAE,YAAY,GAA/B;EACE,KAAK,gBACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,cACH,OAAO;EACT,KAAK;EACL,KAAK,UACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,eACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,QACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,gBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAOA,SAAgB,EAA2B,GAAqB;CAC9D,IAAM,IAAU,EAAI,KAAK;CACzB,IAAI,CAAC,GACH,OAAO;CAET,IAAM,IAAQ,EAAQ,QAAQ,UAAU,GAAG,EAAE,QAAQ,QAAQ,GAAG;CAChE,OAAO,EAAM,OAAO,CAAC,EAAE,YAAY,IAAI,EAAM,MAAM,CAAC;AACtD;AAMA,SAAgB,EACd,GACA,GACQ;CACR,QAAQ,EAA4B,CAAG,GAAvC;EACE,KAAK,OACH,OAAO,EAAE,EAAQ,8BAA8B;EACjD,KAAK,QACH,OAAO,EAAE,EAAQ,+BAA+B;EAClD,KAAK,UACH,OAAO,EAAE,EAAQ,iCAAiC;EACpD,KAAK,aACH,OAAO,EAAE,EAAQ,oCAAoC;EACvD,KAAK,YACH,OAAO,EAAE,EAAQ,mCAAmC;EACtD,KAAK,cACH,OAAO,EAAE,EAAQ,qCAAqC;EACxD,KAAK,aACH,OAAO,EAAE,EAAQ,oCAAoC;EACvD,SACE,OAAO,EAA2B,CAAG;CACzC;AACF;AAIA,SAAgB,EACd,GACA,GACA,GACQ;CACR,IAAM,IAAQ,EAAwB,GAAK,CAAC;CAC5C,OAAO,IAAQ,GAAG,EAAM,IAAI,MAAU;AACxC;AAWA,SAAgB,EACd,GACA,IAAA,IACQ;CACR,IAAM,IAAa,MAAM,KAAK,CAAK;CAOnC,OANI,EAAW,UAAU,IAChB,IAEL,KAAa,IACR,MAEF,GAAG,EAAW,MAAM,GAAG,IAAY,CAAC,EAAE,KAAK,EAAE,EAAE;AACxD;AAWA,SAAgB,EACd,GACA,GACA,IAGI,CAAC,GACG;CACR,IAAM,IAAQ,EAAQ,SAAA,GAChB,IAAkB,EAAQ,mBAAA;CAEhC,IAAI,EAAO,WAAW,GACpB,OAAO;CAET,IAAI,KAAkB,GACpB,OAAO,EAAO;CAGhB,IAAI,IAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK,GAAG;EACzC,IAAM,IAAQ,EAAO,IACf,IAAM,IAAI,IAAI,IAAQ,GAEtB,IADY,EAAO,SAAS,IAAI,IACV,IAAI,IAAkB,IAAQ;EAC1D,IAAI,IAAO,IAAM,IAAQ,IAAU,GACjC,OAAO;EAET,KAAQ,IAAM;CAChB;CACA,OAAO,EAAO;AAChB"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/clock-3.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/folder.cjs"),a=require("../../../node_modules/lucide-react/dist/esm/icons/list-filter.cjs"),o=require("../../../node_modules/lucide-react/dist/esm/icons/shrink.cjs"),s=require("../../../node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs"),c=require("../../../node_modules/lucide-react/dist/esm/icons/star.cjs"),l=require("../../../node_modules/lucide-react/dist/esm/icons/tag.cjs"),u=require("../../../node_modules/lucide-react/dist/esm/icons/trash-2.cjs"),d=require("../../../utils/utils.cjs"),f=require("../../../utils/dropdown-classes.cjs"),p=require("./conversation-panel-list-helpers.cjs"),m=require("../../../stores/conversation-panel-preferences-store.cjs"),h=require("./menu-heading.cjs"),g=require("./menu-separator.cjs"),_=require("./menu-row.cjs"),v=require("./advanced-conversation-options-modal.cjs");let y=require("react");y=e.__toESM(y,1);let b=require("react/jsx-runtime");var x=[{id:`by-workspace`,icon:i.Folder,settings:{...m.DEFAULT_LAYOUT_SETTINGS,organizeMode:`grouped`}},{id:`recent-activity`,icon:r.Clock3,labelKey:n.I18nKey.CONVERSATION_PANEL$LAYOUT_RECENT_ACTIVITY,settings:{...m.DEFAULT_LAYOUT_SETTINGS,showOlderConversations:!1}},{id:`focused`,icon:c.Star,labelKey:n.I18nKey.CONVERSATION_PANEL$LAYOUT_FOCUSED,settings:{...m.DEFAULT_LAYOUT_SETTINGS,threadScope:`relevant`,showOlderConversations:!1}},{id:`minimal`,icon:o.Shrink,labelKey:n.I18nKey.CONVERSATION_PANEL$LAYOUT_MINIMAL,settings:{...m.DEFAULT_LAYOUT_SETTINGS,threadScope:`relevant`,showOlderConversations:!1,showRepoBranchMetadata:!1,showLlmProfiles:!1,showTagsMetadata:!1,showHoverMetadata:!1}}];function S(e){return x.find(t=>Object.entries(t.settings).every(([t,n])=>e[t]===n))??null}function C({menuOpen:e,setMenuOpen:r,menuRef:i,backendKind:o,tagFacets:c,automationNameFacets:C,totalConversationsCount:T,onRequestDeleteAll:E}){let{t:D}=t.useTranslation(`openhands`),O=m.useConversationPanelPreferencesStore(),[k,A]=y.default.useState(!1),[j,M]=y.default.useState(!1),N=D(o===`local`?n.I18nKey.CONVERSATION_PANEL$BY_WORKSPACE:n.I18nKey.CONVERSATION_PANEL$BY_REPOSITORY),P=S(O),F=y.default.useRef(null),I=y.default.useRef(null),L=y.default.useRef(e);return y.default.useEffect(()=>{e?(I.current?.querySelector(`[role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]`))?.focus():L.current&&F.current?.focus(),L.current=e},[e]),(0,b.jsxs)(`div`,{ref:i,className:`relative shrink-0 pr-0.5`,children:[(0,b.jsx)(`button`,{ref:F,type:`button`,"data-testid":`conversation-layouts-toggle`,"aria-label":D(n.I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING),"aria-haspopup":`menu`,"aria-expanded":e,onClick:()=>r(!e),className:d.cn(`relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]`,f.dropdownInstantColorClassName),children:(0,b.jsx)(a.ListFilter,{className:`shrink-0`,size:14,strokeWidth:2,"aria-hidden":!0})}),e?(0,b.jsxs)(`div`,{ref:I,role:`menu`,"aria-orientation":`vertical`,"aria-label":D(n.I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING),tabIndex:-1,"data-testid":`conversation-layouts-menu`,onKeyDown:e=>{if(e.key===`Escape`){e.preventDefault(),r(!1);return}if(e.key!==`ArrowDown`&&e.key!==`ArrowUp`)return;let t=I.current;if(!t)return;let n=Array.from(t.querySelectorAll(`[role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]`)).filter(e=>!e.disabled);if(n.length===0)return;let i=n.indexOf(document.activeElement),a=e.key===`ArrowDown`?1:-1,o=((i===-1?0:i)+a+n.length)%n.length;e.preventDefault(),n[o]?.focus()},className:d.cn(`absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg`,f.dropdownMenuListClassName,f.dropdownMenuViewportScrollClassName),children:[(0,b.jsx)(h.MenuHeading,{children:D(n.I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}),x.map(e=>(0,b.jsx)(_.MenuRow,{icon:e.icon,label:e.labelKey?D(e.labelKey):N,selected:P?.id===e.id,testId:`layout-preset-${e.id}`,onClick:()=>{O.applyLayoutSettings(e.settings),r(!1)}},e.id)),(0,b.jsx)(g.MenuSeparator,{}),(0,b.jsx)(_.MenuRow,{icon:l.Tag,label:D(n.I18nKey.CONVERSATION_PANEL$TAG_FILTERS),testId:`tag-filters-section`,onClick:()=>A(!k)}),k?c.length>0?c.map(e=>(0,b.jsx)(_.MenuRow,{icon:l.Tag,label:p.formatTagFacetLabel(e),selected:O.selectedTagFacets.includes(e),testId:`tag-facet-row-${e}`,onClick:()=>O.toggleTagFacet(e)},e)):(0,b.jsx)(`p`,{"data-testid":`tag-filters-empty`,className:`px-2 py-1 text-[11px] text-[var(--oh-muted)]/70`,children:D(n.I18nKey.CONVERSATION_PANEL$NO_VISIBLE_TAGS)}):null,(0,b.jsx)(g.MenuSeparator,{}),(0,b.jsx)(_.MenuRow,{icon:s.SlidersHorizontal,label:P?D(n.I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS):`${D(n.I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)} · ${D(n.I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS_CUSTOM)}`,testId:`advanced-options-row`,onClick:()=>{r(!1),M(!0)}}),(0,b.jsx)(g.MenuSeparator,{}),(0,b.jsx)(_.MenuRow,{testId:`delete-all-conversations`,icon:u.Trash2,label:w(D(n.I18nKey.CONVERSATION$DELETE_ALL)),disabled:T===0,destructive:!0,onClick:()=>{T!==0&&(E(),r(!1))}})]}):null,(0,b.jsx)(v.AdvancedConversationOptionsModal,{open:j,onClose:()=>M(!1),backendKind:o,automationNameFacets:C})]})}var w=e=>e.length>0?e.charAt(0).toUpperCase()+e.slice(1):e;exports.ConversationLayoutsMenu=C;
2
+ //# sourceMappingURL=conversation-layouts-menu.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-layouts-menu.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-layouts-menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n Clock3,\n Folder,\n ListFilter,\n Shrink,\n SlidersHorizontal,\n Star,\n Tag,\n Trash2,\n} from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownInstantColorClassName,\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n} from \"#/utils/dropdown-classes\";\nimport {\n DEFAULT_LAYOUT_SETTINGS,\n useConversationPanelPreferencesStore,\n type LayoutSettingsSlice,\n} from \"#/stores/conversation-panel-preferences-store\";\nimport { formatTagFacetLabel } from \"./conversation-panel-list-helpers\";\nimport { MenuHeading } from \"./menu-heading\";\nimport { MenuSeparator } from \"./menu-separator\";\nimport { MenuRow } from \"./menu-row\";\nimport { AdvancedConversationOptionsModal } from \"./advanced-conversation-options-modal\";\n\ninterface LayoutPreset {\n id: string;\n icon: React.ComponentType<{ className?: string; \"aria-hidden\"?: boolean }>;\n /** Omitted for the backend-dependent first preset (workspace vs repo). */\n labelKey?: I18nKey;\n settings: LayoutSettingsSlice;\n}\n\n/**\n * Layout presets are complete preference bundles (design inference from the\n * 2026-08-14 PM walkthrough video; the video names the presets but not their\n * exact bundles). Applying one replaces every layout-controlled field so a\n * previous preset cannot leak into the next one. Any manual deviation reads\n * as \"Custom\".\n */\nconst LAYOUT_PRESETS: LayoutPreset[] = [\n {\n id: \"by-workspace\",\n icon: Folder,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n organizeMode: \"grouped\",\n },\n },\n {\n id: \"recent-activity\",\n icon: Clock3,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_RECENT_ACTIVITY,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n showOlderConversations: false,\n },\n },\n {\n id: \"focused\",\n icon: Star,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_FOCUSED,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n threadScope: \"relevant\",\n showOlderConversations: false,\n },\n },\n {\n id: \"minimal\",\n icon: Shrink,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_MINIMAL,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n threadScope: \"relevant\",\n showOlderConversations: false,\n showRepoBranchMetadata: false,\n showLlmProfiles: false,\n showTagsMetadata: false,\n showHoverMetadata: false,\n },\n },\n];\n\nexport function getActiveLayoutPreset(\n settings: LayoutSettingsSlice,\n): LayoutPreset | null {\n return (\n LAYOUT_PRESETS.find((preset) =>\n Object.entries(preset.settings).every(\n ([key, value]) => settings[key as keyof LayoutSettingsSlice] === value,\n ),\n ) ?? null\n );\n}\n\nexport interface ConversationLayoutsMenuProps {\n menuOpen: boolean;\n setMenuOpen: (open: boolean) => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n backendKind: BackendKind;\n /** Distinct user-facing `key=value` facets among the loaded conversations. */\n tagFacets: readonly string[];\n /** Distinct automation names; the advanced modal owns their facet rows. */\n automationNameFacets: readonly string[];\n totalConversationsCount: number;\n onRequestDeleteAll: () => void;\n}\n\nexport function ConversationLayoutsMenu({\n menuOpen,\n setMenuOpen,\n menuRef,\n backendKind,\n tagFacets,\n automationNameFacets,\n totalConversationsCount,\n onRequestDeleteAll,\n}: ConversationLayoutsMenuProps) {\n const { t } = useTranslation(\"openhands\");\n const preferences = useConversationPanelPreferencesStore();\n const [tagSectionExpanded, setTagSectionExpanded] = React.useState(false);\n const [advancedOpen, setAdvancedOpen] = React.useState(false);\n\n const groupedLabel =\n backendKind === \"local\"\n ? t(I18nKey.CONVERSATION_PANEL$BY_WORKSPACE)\n : t(I18nKey.CONVERSATION_PANEL$BY_REPOSITORY);\n\n const activePreset = getActiveLayoutPreset(preferences);\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const menuContentRef = React.useRef<HTMLDivElement>(null);\n\n // Mirror the filter menu's focus management: focus into the menu on open,\n // return focus to the trigger on close.\n const wasOpenRef = React.useRef(menuOpen);\n React.useEffect(() => {\n if (menuOpen) {\n const firstItem =\n menuContentRef.current?.querySelector<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]',\n );\n firstItem?.focus();\n } else if (wasOpenRef.current) {\n triggerRef.current?.focus();\n }\n wasOpenRef.current = menuOpen;\n }, [menuOpen]);\n\n const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setMenuOpen(false);\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n const container = menuContentRef.current;\n if (!container) return;\n const items = Array.from(\n container.querySelectorAll<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]',\n ),\n ).filter((el) => !el.disabled);\n if (items.length === 0) return;\n const currentIdx = items.indexOf(\n document.activeElement as HTMLButtonElement,\n );\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n const start = currentIdx === -1 ? 0 : currentIdx;\n const nextIdx = (start + delta + items.length) % items.length;\n event.preventDefault();\n items[nextIdx]?.focus();\n };\n\n return (\n <div ref={menuRef} className=\"relative shrink-0 pr-0.5\">\n <button\n ref={triggerRef}\n type=\"button\"\n data-testid=\"conversation-layouts-toggle\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(!menuOpen)}\n className={cn(\n \"relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]\",\n dropdownInstantColorClassName,\n )}\n >\n <ListFilter\n className=\"shrink-0\"\n size={14}\n strokeWidth={2}\n aria-hidden\n />\n </button>\n\n {menuOpen ? (\n <div\n ref={menuContentRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n tabIndex={-1}\n data-testid=\"conversation-layouts-menu\"\n onKeyDown={handleMenuKeyDown}\n className={cn(\n \"absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg\",\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n )}\n >\n <MenuHeading>\n {t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n </MenuHeading>\n {LAYOUT_PRESETS.map((preset) => (\n <MenuRow\n key={preset.id}\n icon={preset.icon}\n label={preset.labelKey ? t(preset.labelKey) : groupedLabel}\n selected={activePreset?.id === preset.id}\n testId={`layout-preset-${preset.id}`}\n onClick={() => {\n preferences.applyLayoutSettings(preset.settings);\n setMenuOpen(false);\n }}\n />\n ))}\n\n <MenuSeparator />\n <MenuRow\n icon={Tag}\n label={t(I18nKey.CONVERSATION_PANEL$TAG_FILTERS)}\n testId=\"tag-filters-section\"\n onClick={() => setTagSectionExpanded(!tagSectionExpanded)}\n />\n {tagSectionExpanded ? (\n tagFacets.length > 0 ? (\n tagFacets.map((facet) => (\n <MenuRow\n key={facet}\n icon={Tag}\n label={formatTagFacetLabel(facet)}\n selected={preferences.selectedTagFacets.includes(facet)}\n testId={`tag-facet-row-${facet}`}\n onClick={() => preferences.toggleTagFacet(facet)}\n />\n ))\n ) : (\n <p\n data-testid=\"tag-filters-empty\"\n className=\"px-2 py-1 text-[11px] text-[var(--oh-muted)]/70\"\n >\n {t(I18nKey.CONVERSATION_PANEL$NO_VISIBLE_TAGS)}\n </p>\n )\n ) : null}\n\n <MenuSeparator />\n <MenuRow\n icon={SlidersHorizontal}\n label={\n activePreset\n ? t(I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)\n : `${t(I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)} · ${t(\n I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS_CUSTOM,\n )}`\n }\n testId=\"advanced-options-row\"\n onClick={() => {\n setMenuOpen(false);\n setAdvancedOpen(true);\n }}\n />\n\n <MenuSeparator />\n <MenuRow\n testId=\"delete-all-conversations\"\n icon={Trash2}\n label={capitalizeLabel(t(I18nKey.CONVERSATION$DELETE_ALL))}\n disabled={totalConversationsCount === 0}\n destructive\n onClick={() => {\n if (totalConversationsCount === 0) return;\n onRequestDeleteAll();\n setMenuOpen(false);\n }}\n />\n </div>\n ) : null}\n\n <AdvancedConversationOptionsModal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n backendKind={backendKind}\n automationNameFacets={automationNameFacets}\n />\n </div>\n );\n}\n\nconst capitalizeLabel = (label: string) =>\n label.length > 0 ? label.charAt(0).toUpperCase() + label.slice(1) : label;\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ import { I18nKey } from "#/i18n/declaration";
3
+ import type { BackendKind } from "#/api/backend-registry/types";
4
+ import { type LayoutSettingsSlice } from "#/stores/conversation-panel-preferences-store";
5
+ interface LayoutPreset {
6
+ id: string;
7
+ icon: React.ComponentType<{
8
+ className?: string;
9
+ "aria-hidden"?: boolean;
10
+ }>;
11
+ /** Omitted for the backend-dependent first preset (workspace vs repo). */
12
+ labelKey?: I18nKey;
13
+ settings: LayoutSettingsSlice;
14
+ }
15
+ export declare function getActiveLayoutPreset(settings: LayoutSettingsSlice): LayoutPreset | null;
16
+ export interface ConversationLayoutsMenuProps {
17
+ menuOpen: boolean;
18
+ setMenuOpen: (open: boolean) => void;
19
+ menuRef: React.RefObject<HTMLDivElement | null>;
20
+ backendKind: BackendKind;
21
+ /** Distinct user-facing `key=value` facets among the loaded conversations. */
22
+ tagFacets: readonly string[];
23
+ /** Distinct automation names; the advanced modal owns their facet rows. */
24
+ automationNameFacets: readonly string[];
25
+ totalConversationsCount: number;
26
+ onRequestDeleteAll: () => void;
27
+ }
28
+ export declare function ConversationLayoutsMenu({ menuOpen, setMenuOpen, menuRef, backendKind, tagFacets, automationNameFacets, totalConversationsCount, onRequestDeleteAll, }: ConversationLayoutsMenuProps): React.JSX.Element;
29
+ export {};
@@ -0,0 +1,177 @@
1
+ import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
+ import { I18nKey as t } from "../../../i18n/declaration.js";
3
+ import { Clock3 as n } from "../../../node_modules/lucide-react/dist/esm/icons/clock-3.js";
4
+ import { Folder as r } from "../../../node_modules/lucide-react/dist/esm/icons/folder.js";
5
+ import { ListFilter as i } from "../../../node_modules/lucide-react/dist/esm/icons/list-filter.js";
6
+ import { Shrink as a } from "../../../node_modules/lucide-react/dist/esm/icons/shrink.js";
7
+ import { SlidersHorizontal as o } from "../../../node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js";
8
+ import { Star as s } from "../../../node_modules/lucide-react/dist/esm/icons/star.js";
9
+ import { Tag as c } from "../../../node_modules/lucide-react/dist/esm/icons/tag.js";
10
+ import { Trash2 as l } from "../../../node_modules/lucide-react/dist/esm/icons/trash-2.js";
11
+ import { cn as u } from "../../../utils/utils.js";
12
+ import { dropdownInstantColorClassName as d, dropdownMenuListClassName as f, dropdownMenuViewportScrollClassName as p } from "../../../utils/dropdown-classes.js";
13
+ import { formatTagFacetLabel as m } from "./conversation-panel-list-helpers.js";
14
+ import { DEFAULT_LAYOUT_SETTINGS as h, useConversationPanelPreferencesStore as g } from "../../../stores/conversation-panel-preferences-store.js";
15
+ import { MenuHeading as _ } from "./menu-heading.js";
16
+ import { MenuSeparator as v } from "./menu-separator.js";
17
+ import { MenuRow as y } from "./menu-row.js";
18
+ import { AdvancedConversationOptionsModal as b } from "./advanced-conversation-options-modal.js";
19
+ import x from "react";
20
+ import { jsx as S, jsxs as C } from "react/jsx-runtime";
21
+ //#region src/components/features/conversation-panel/conversation-layouts-menu.tsx
22
+ var w = [
23
+ {
24
+ id: "by-workspace",
25
+ icon: r,
26
+ settings: {
27
+ ...h,
28
+ organizeMode: "grouped"
29
+ }
30
+ },
31
+ {
32
+ id: "recent-activity",
33
+ icon: n,
34
+ labelKey: t.CONVERSATION_PANEL$LAYOUT_RECENT_ACTIVITY,
35
+ settings: {
36
+ ...h,
37
+ showOlderConversations: !1
38
+ }
39
+ },
40
+ {
41
+ id: "focused",
42
+ icon: s,
43
+ labelKey: t.CONVERSATION_PANEL$LAYOUT_FOCUSED,
44
+ settings: {
45
+ ...h,
46
+ threadScope: "relevant",
47
+ showOlderConversations: !1
48
+ }
49
+ },
50
+ {
51
+ id: "minimal",
52
+ icon: a,
53
+ labelKey: t.CONVERSATION_PANEL$LAYOUT_MINIMAL,
54
+ settings: {
55
+ ...h,
56
+ threadScope: "relevant",
57
+ showOlderConversations: !1,
58
+ showRepoBranchMetadata: !1,
59
+ showLlmProfiles: !1,
60
+ showTagsMetadata: !1,
61
+ showHoverMetadata: !1
62
+ }
63
+ }
64
+ ];
65
+ function T(e) {
66
+ return w.find((t) => Object.entries(t.settings).every(([t, n]) => e[t] === n)) ?? null;
67
+ }
68
+ function E({ menuOpen: n, setMenuOpen: r, menuRef: a, backendKind: s, tagFacets: h, automationNameFacets: E, totalConversationsCount: O, onRequestDeleteAll: k }) {
69
+ let { t: A } = e("openhands"), j = g(), [M, N] = x.useState(!1), [P, F] = x.useState(!1), I = A(s === "local" ? t.CONVERSATION_PANEL$BY_WORKSPACE : t.CONVERSATION_PANEL$BY_REPOSITORY), L = T(j), R = x.useRef(null), z = x.useRef(null), B = x.useRef(n);
70
+ return x.useEffect(() => {
71
+ n ? (z.current?.querySelector("[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]"))?.focus() : B.current && R.current?.focus(), B.current = n;
72
+ }, [n]), /* @__PURE__ */ C("div", {
73
+ ref: a,
74
+ className: "relative shrink-0 pr-0.5",
75
+ children: [
76
+ /* @__PURE__ */ S("button", {
77
+ ref: R,
78
+ type: "button",
79
+ "data-testid": "conversation-layouts-toggle",
80
+ "aria-label": A(t.CONVERSATION_PANEL$LAYOUTS_HEADING),
81
+ "aria-haspopup": "menu",
82
+ "aria-expanded": n,
83
+ onClick: () => r(!n),
84
+ className: u("relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]", d),
85
+ children: /* @__PURE__ */ S(i, {
86
+ className: "shrink-0",
87
+ size: 14,
88
+ strokeWidth: 2,
89
+ "aria-hidden": !0
90
+ })
91
+ }),
92
+ n ? /* @__PURE__ */ C("div", {
93
+ ref: z,
94
+ role: "menu",
95
+ "aria-orientation": "vertical",
96
+ "aria-label": A(t.CONVERSATION_PANEL$LAYOUTS_HEADING),
97
+ tabIndex: -1,
98
+ "data-testid": "conversation-layouts-menu",
99
+ onKeyDown: (e) => {
100
+ if (e.key === "Escape") {
101
+ e.preventDefault(), r(!1);
102
+ return;
103
+ }
104
+ if (e.key !== "ArrowDown" && e.key !== "ArrowUp") return;
105
+ let t = z.current;
106
+ if (!t) return;
107
+ let n = Array.from(t.querySelectorAll("[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]")).filter((e) => !e.disabled);
108
+ if (n.length === 0) return;
109
+ let i = n.indexOf(document.activeElement), a = e.key === "ArrowDown" ? 1 : -1, o = ((i === -1 ? 0 : i) + a + n.length) % n.length;
110
+ e.preventDefault(), n[o]?.focus();
111
+ },
112
+ className: u("absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg", f, p),
113
+ children: [
114
+ /* @__PURE__ */ S(_, { children: A(t.CONVERSATION_PANEL$LAYOUTS_HEADING) }),
115
+ w.map((e) => /* @__PURE__ */ S(y, {
116
+ icon: e.icon,
117
+ label: e.labelKey ? A(e.labelKey) : I,
118
+ selected: L?.id === e.id,
119
+ testId: `layout-preset-${e.id}`,
120
+ onClick: () => {
121
+ j.applyLayoutSettings(e.settings), r(!1);
122
+ }
123
+ }, e.id)),
124
+ /* @__PURE__ */ S(v, {}),
125
+ /* @__PURE__ */ S(y, {
126
+ icon: c,
127
+ label: A(t.CONVERSATION_PANEL$TAG_FILTERS),
128
+ testId: "tag-filters-section",
129
+ onClick: () => N(!M)
130
+ }),
131
+ M ? h.length > 0 ? h.map((e) => /* @__PURE__ */ S(y, {
132
+ icon: c,
133
+ label: m(e),
134
+ selected: j.selectedTagFacets.includes(e),
135
+ testId: `tag-facet-row-${e}`,
136
+ onClick: () => j.toggleTagFacet(e)
137
+ }, e)) : /* @__PURE__ */ S("p", {
138
+ "data-testid": "tag-filters-empty",
139
+ className: "px-2 py-1 text-[11px] text-[var(--oh-muted)]/70",
140
+ children: A(t.CONVERSATION_PANEL$NO_VISIBLE_TAGS)
141
+ }) : null,
142
+ /* @__PURE__ */ S(v, {}),
143
+ /* @__PURE__ */ S(y, {
144
+ icon: o,
145
+ label: L ? A(t.CONVERSATION_PANEL$ADVANCED_OPTIONS) : `${A(t.CONVERSATION_PANEL$ADVANCED_OPTIONS)} · ${A(t.CONVERSATION_PANEL$ADVANCED_OPTIONS_CUSTOM)}`,
146
+ testId: "advanced-options-row",
147
+ onClick: () => {
148
+ r(!1), F(!0);
149
+ }
150
+ }),
151
+ /* @__PURE__ */ S(v, {}),
152
+ /* @__PURE__ */ S(y, {
153
+ testId: "delete-all-conversations",
154
+ icon: l,
155
+ label: D(A(t.CONVERSATION$DELETE_ALL)),
156
+ disabled: O === 0,
157
+ destructive: !0,
158
+ onClick: () => {
159
+ O !== 0 && (k(), r(!1));
160
+ }
161
+ })
162
+ ]
163
+ }) : null,
164
+ /* @__PURE__ */ S(b, {
165
+ open: P,
166
+ onClose: () => F(!1),
167
+ backendKind: s,
168
+ automationNameFacets: E
169
+ })
170
+ ]
171
+ });
172
+ }
173
+ var D = (e) => e.length > 0 ? e.charAt(0).toUpperCase() + e.slice(1) : e;
174
+ //#endregion
175
+ export { E as ConversationLayoutsMenu };
176
+
177
+ //# sourceMappingURL=conversation-layouts-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-layouts-menu.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-layouts-menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n Clock3,\n Folder,\n ListFilter,\n Shrink,\n SlidersHorizontal,\n Star,\n Tag,\n Trash2,\n} from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownInstantColorClassName,\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n} from \"#/utils/dropdown-classes\";\nimport {\n DEFAULT_LAYOUT_SETTINGS,\n useConversationPanelPreferencesStore,\n type LayoutSettingsSlice,\n} from \"#/stores/conversation-panel-preferences-store\";\nimport { formatTagFacetLabel } from \"./conversation-panel-list-helpers\";\nimport { MenuHeading } from \"./menu-heading\";\nimport { MenuSeparator } from \"./menu-separator\";\nimport { MenuRow } from \"./menu-row\";\nimport { AdvancedConversationOptionsModal } from \"./advanced-conversation-options-modal\";\n\ninterface LayoutPreset {\n id: string;\n icon: React.ComponentType<{ className?: string; \"aria-hidden\"?: boolean }>;\n /** Omitted for the backend-dependent first preset (workspace vs repo). */\n labelKey?: I18nKey;\n settings: LayoutSettingsSlice;\n}\n\n/**\n * Layout presets are complete preference bundles (design inference from the\n * 2026-08-14 PM walkthrough video; the video names the presets but not their\n * exact bundles). Applying one replaces every layout-controlled field so a\n * previous preset cannot leak into the next one. Any manual deviation reads\n * as \"Custom\".\n */\nconst LAYOUT_PRESETS: LayoutPreset[] = [\n {\n id: \"by-workspace\",\n icon: Folder,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n organizeMode: \"grouped\",\n },\n },\n {\n id: \"recent-activity\",\n icon: Clock3,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_RECENT_ACTIVITY,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n showOlderConversations: false,\n },\n },\n {\n id: \"focused\",\n icon: Star,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_FOCUSED,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n threadScope: \"relevant\",\n showOlderConversations: false,\n },\n },\n {\n id: \"minimal\",\n icon: Shrink,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_MINIMAL,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n threadScope: \"relevant\",\n showOlderConversations: false,\n showRepoBranchMetadata: false,\n showLlmProfiles: false,\n showTagsMetadata: false,\n showHoverMetadata: false,\n },\n },\n];\n\nexport function getActiveLayoutPreset(\n settings: LayoutSettingsSlice,\n): LayoutPreset | null {\n return (\n LAYOUT_PRESETS.find((preset) =>\n Object.entries(preset.settings).every(\n ([key, value]) => settings[key as keyof LayoutSettingsSlice] === value,\n ),\n ) ?? null\n );\n}\n\nexport interface ConversationLayoutsMenuProps {\n menuOpen: boolean;\n setMenuOpen: (open: boolean) => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n backendKind: BackendKind;\n /** Distinct user-facing `key=value` facets among the loaded conversations. */\n tagFacets: readonly string[];\n /** Distinct automation names; the advanced modal owns their facet rows. */\n automationNameFacets: readonly string[];\n totalConversationsCount: number;\n onRequestDeleteAll: () => void;\n}\n\nexport function ConversationLayoutsMenu({\n menuOpen,\n setMenuOpen,\n menuRef,\n backendKind,\n tagFacets,\n automationNameFacets,\n totalConversationsCount,\n onRequestDeleteAll,\n}: ConversationLayoutsMenuProps) {\n const { t } = useTranslation(\"openhands\");\n const preferences = useConversationPanelPreferencesStore();\n const [tagSectionExpanded, setTagSectionExpanded] = React.useState(false);\n const [advancedOpen, setAdvancedOpen] = React.useState(false);\n\n const groupedLabel =\n backendKind === \"local\"\n ? t(I18nKey.CONVERSATION_PANEL$BY_WORKSPACE)\n : t(I18nKey.CONVERSATION_PANEL$BY_REPOSITORY);\n\n const activePreset = getActiveLayoutPreset(preferences);\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const menuContentRef = React.useRef<HTMLDivElement>(null);\n\n // Mirror the filter menu's focus management: focus into the menu on open,\n // return focus to the trigger on close.\n const wasOpenRef = React.useRef(menuOpen);\n React.useEffect(() => {\n if (menuOpen) {\n const firstItem =\n menuContentRef.current?.querySelector<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]',\n );\n firstItem?.focus();\n } else if (wasOpenRef.current) {\n triggerRef.current?.focus();\n }\n wasOpenRef.current = menuOpen;\n }, [menuOpen]);\n\n const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setMenuOpen(false);\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n const container = menuContentRef.current;\n if (!container) return;\n const items = Array.from(\n container.querySelectorAll<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]',\n ),\n ).filter((el) => !el.disabled);\n if (items.length === 0) return;\n const currentIdx = items.indexOf(\n document.activeElement as HTMLButtonElement,\n );\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n const start = currentIdx === -1 ? 0 : currentIdx;\n const nextIdx = (start + delta + items.length) % items.length;\n event.preventDefault();\n items[nextIdx]?.focus();\n };\n\n return (\n <div ref={menuRef} className=\"relative shrink-0 pr-0.5\">\n <button\n ref={triggerRef}\n type=\"button\"\n data-testid=\"conversation-layouts-toggle\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(!menuOpen)}\n className={cn(\n \"relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]\",\n dropdownInstantColorClassName,\n )}\n >\n <ListFilter\n className=\"shrink-0\"\n size={14}\n strokeWidth={2}\n aria-hidden\n />\n </button>\n\n {menuOpen ? (\n <div\n ref={menuContentRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n tabIndex={-1}\n data-testid=\"conversation-layouts-menu\"\n onKeyDown={handleMenuKeyDown}\n className={cn(\n \"absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg\",\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n )}\n >\n <MenuHeading>\n {t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n </MenuHeading>\n {LAYOUT_PRESETS.map((preset) => (\n <MenuRow\n key={preset.id}\n icon={preset.icon}\n label={preset.labelKey ? t(preset.labelKey) : groupedLabel}\n selected={activePreset?.id === preset.id}\n testId={`layout-preset-${preset.id}`}\n onClick={() => {\n preferences.applyLayoutSettings(preset.settings);\n setMenuOpen(false);\n }}\n />\n ))}\n\n <MenuSeparator />\n <MenuRow\n icon={Tag}\n label={t(I18nKey.CONVERSATION_PANEL$TAG_FILTERS)}\n testId=\"tag-filters-section\"\n onClick={() => setTagSectionExpanded(!tagSectionExpanded)}\n />\n {tagSectionExpanded ? (\n tagFacets.length > 0 ? (\n tagFacets.map((facet) => (\n <MenuRow\n key={facet}\n icon={Tag}\n label={formatTagFacetLabel(facet)}\n selected={preferences.selectedTagFacets.includes(facet)}\n testId={`tag-facet-row-${facet}`}\n onClick={() => preferences.toggleTagFacet(facet)}\n />\n ))\n ) : (\n <p\n data-testid=\"tag-filters-empty\"\n className=\"px-2 py-1 text-[11px] text-[var(--oh-muted)]/70\"\n >\n {t(I18nKey.CONVERSATION_PANEL$NO_VISIBLE_TAGS)}\n </p>\n )\n ) : null}\n\n <MenuSeparator />\n <MenuRow\n icon={SlidersHorizontal}\n label={\n activePreset\n ? t(I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)\n : `${t(I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)} · ${t(\n I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS_CUSTOM,\n )}`\n }\n testId=\"advanced-options-row\"\n onClick={() => {\n setMenuOpen(false);\n setAdvancedOpen(true);\n }}\n />\n\n <MenuSeparator />\n <MenuRow\n testId=\"delete-all-conversations\"\n icon={Trash2}\n label={capitalizeLabel(t(I18nKey.CONVERSATION$DELETE_ALL))}\n disabled={totalConversationsCount === 0}\n destructive\n onClick={() => {\n if (totalConversationsCount === 0) return;\n onRequestDeleteAll();\n setMenuOpen(false);\n }}\n />\n </div>\n ) : null}\n\n <AdvancedConversationOptionsModal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n backendKind={backendKind}\n automationNameFacets={automationNameFacets}\n />\n </div>\n );\n}\n\nconst capitalizeLabel = (label: string) =>\n label.length > 0 ? label.charAt(0).toUpperCase() + label.slice(1) : label;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA8CA,IAAM,IAAiC;CACrC;EACE,IAAI;EACJ,MAAM;EACN,UAAU;GACR,GAAG;GACH,cAAc;EAChB;CACF;CACA;EACE,IAAI;EACJ,MAAM;EACN,UAAU,EAAQ;EAClB,UAAU;GACR,GAAG;GACH,wBAAwB;EAC1B;CACF;CACA;EACE,IAAI;EACJ,MAAM;EACN,UAAU,EAAQ;EAClB,UAAU;GACR,GAAG;GACH,aAAa;GACb,wBAAwB;EAC1B;CACF;CACA;EACE,IAAI;EACJ,MAAM;EACN,UAAU,EAAQ;EAClB,UAAU;GACR,GAAG;GACH,aAAa;GACb,wBAAwB;GACxB,wBAAwB;GACxB,iBAAiB;GACjB,kBAAkB;GAClB,mBAAmB;EACrB;CACF;AACF;AAEA,SAAgB,EACd,GACqB;CACrB,OACE,EAAe,MAAM,MACnB,OAAO,QAAQ,EAAO,QAAQ,EAAE,OAC7B,CAAC,GAAK,OAAW,EAAS,OAAsC,CACnE,CACF,KAAK;AAET;AAeA,SAAgB,EAAwB,EACtC,aACA,gBACA,YACA,gBACA,cACA,yBACA,4BACA,yBAC+B;CAC/B,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAc,EAAqC,GACnD,CAAC,GAAoB,KAAyB,EAAM,SAAS,EAAK,GAClE,CAAC,GAAc,KAAmB,EAAM,SAAS,EAAK,GAEtD,IAEA,EADJ,MAAgB,UACV,EAAQ,kCACR,EAAQ,gCAAgC,GAE1C,IAAe,EAAsB,CAAW,GAEhD,IAAa,EAAM,OAA0B,IAAI,GACjD,IAAiB,EAAM,OAAuB,IAAI,GAIlD,IAAa,EAAM,OAAO,CAAQ;CAuCxC,OAtCA,EAAM,gBAAgB;EAUpB,AATI,KAEA,EAAe,SAAS,cACtB,4EACF,IACS,MAAM,IACR,EAAW,WACpB,EAAW,SAAS,MAAM,GAE5B,EAAW,UAAU;CACvB,GAAG,CAAC,CAAQ,CAAC,GA4BX,kBAAC,OAAD;EAAK,KAAK;EAAS,WAAU;YAA7B;GACE,kBAAC,UAAD;IACE,KAAK;IACL,MAAK;IACL,eAAY;IACZ,cAAY,EAAE,EAAQ,kCAAkC;IACxD,iBAAc;IACd,iBAAe;IACf,eAAe,EAAY,CAAC,CAAQ;IACpC,WAAW,EACT,mJACA,CACF;cAEA,kBAAC,GAAD;KACE,WAAU;KACV,MAAM;KACN,aAAa;KACb,eAAA;IACD,CAAA;GACK,CAAA;GAEP,IACC,kBAAC,OAAD;IACE,KAAK;IACL,MAAK;IACL,oBAAiB;IACjB,cAAY,EAAE,EAAQ,kCAAkC;IACxD,UAAU;IACV,eAAY;IACZ,YAxDmB,MAA+C;KACxE,IAAI,EAAM,QAAQ,UAAU;MAE1B,AADA,EAAM,eAAe,GACrB,EAAY,EAAK;MACjB;KACF;KACA,IAAI,EAAM,QAAQ,eAAe,EAAM,QAAQ,WAAW;KAC1D,IAAM,IAAY,EAAe;KACjC,IAAI,CAAC,GAAW;KAChB,IAAM,IAAQ,MAAM,KAClB,EAAU,iBACR,4EACF,CACF,EAAE,QAAQ,MAAO,CAAC,EAAG,QAAQ;KAC7B,IAAI,EAAM,WAAW,GAAG;KACxB,IAAM,IAAa,EAAM,QACvB,SAAS,aACX,GACM,IAAQ,EAAM,QAAQ,cAAc,IAAI,IAExC,MADQ,MAAe,KAAK,IAAI,KACb,IAAQ,EAAM,UAAU,EAAM;KAEvD,AADA,EAAM,eAAe,GACrB,EAAM,IAAU,MAAM;IACxB;IAkCQ,WAAW,EACT,2JACA,GACA,CACF;cAZF;KAcE,kBAAC,GAAD,EAAA,UACG,EAAE,EAAQ,kCAAkC,EAClC,CAAA;KACZ,EAAe,KAAK,MACnB,kBAAC,GAAD;MAEE,MAAM,EAAO;MACb,OAAO,EAAO,WAAW,EAAE,EAAO,QAAQ,IAAI;MAC9C,UAAU,GAAc,OAAO,EAAO;MACtC,QAAQ,iBAAiB,EAAO;MAChC,eAAe;OAEb,AADA,EAAY,oBAAoB,EAAO,QAAQ,GAC/C,EAAY,EAAK;MACnB;KACD,GATM,EAAO,EASb,CACF;KAED,kBAAC,GAAD,CAAgB,CAAA;KAChB,kBAAC,GAAD;MACE,MAAM;MACN,OAAO,EAAE,EAAQ,8BAA8B;MAC/C,QAAO;MACP,eAAe,EAAsB,CAAC,CAAkB;KACzD,CAAA;KACA,IACC,EAAU,SAAS,IACjB,EAAU,KAAK,MACb,kBAAC,GAAD;MAEE,MAAM;MACN,OAAO,EAAoB,CAAK;MAChC,UAAU,EAAY,kBAAkB,SAAS,CAAK;MACtD,QAAQ,iBAAiB;MACzB,eAAe,EAAY,eAAe,CAAK;KAChD,GANM,CAMN,CACF,IAED,kBAAC,KAAD;MACE,eAAY;MACZ,WAAU;gBAET,EAAE,EAAQ,kCAAkC;KAC5C,CAAA,IAEH;KAEJ,kBAAC,GAAD,CAAgB,CAAA;KAChB,kBAAC,GAAD;MACE,MAAM;MACN,OACE,IACI,EAAE,EAAQ,mCAAmC,IAC7C,GAAG,EAAE,EAAQ,mCAAmC,EAAE,KAAK,EACrD,EAAQ,0CACV;MAEN,QAAO;MACP,eAAe;OAEb,AADA,EAAY,EAAK,GACjB,EAAgB,EAAI;MACtB;KACD,CAAA;KAED,kBAAC,GAAD,CAAgB,CAAA;KAChB,kBAAC,GAAD;MACE,QAAO;MACP,MAAM;MACN,OAAO,EAAgB,EAAE,EAAQ,uBAAuB,CAAC;MACzD,UAAU,MAA4B;MACtC,aAAA;MACA,eAAe;OACT,MAA4B,MAChC,EAAmB,GACnB,EAAY,EAAK;MACnB;KACD,CAAA;IACE;QACH;GAEJ,kBAAC,GAAD;IACE,MAAM;IACN,eAAe,EAAgB,EAAK;IACvB;IACS;GACvB,CAAA;EACE;;AAET;AAEA,IAAM,KAAmB,MACvB,EAAM,SAAS,IAAI,EAAM,OAAO,CAAC,EAAE,YAAY,IAAI,EAAM,MAAM,CAAC,IAAI"}
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../api/agent-server-adapter.cjs");function t(e,t,n){if(!t)return[...e];let r=e.filter(e=>t.has(e.id));if(n!=null&&!r.some(e=>e.id===n)){let t=e.find(e=>e.id===n);t&&r.push(t)}return r}function n(e,n){let r=n.limit??5,i=t(e,n.discoveryConversationIds,n.activeConversationId),a;if(i.length<=r)a=i;else{let e=n.activeConversationId==null?-1:i.findIndex(e=>e.id===n.activeConversationId);a=e>=r?[...i.slice(0,r-1),i[e]]:i.slice(0,r)}let o=a.length<e.length;return n.expanded?{visibleConversations:[...e],isPreviewTruncated:o,isShowingAll:!0}:{visibleConversations:a,isPreviewTruncated:o,isShowingAll:!o}}function r(e,t){let n=new Map(t.map(e=>[e.id,e]));return e.map(e=>n.get(e)).filter(e=>e!=null)}function i(e,t){if(t.length===0)return[...e];let n=new Set(t);return e.filter(e=>!n.has(e.id))}var a=`__unnamed__`;function o(t){if(t.trigger===`automation`)return!0;let n=t.tags;return n?e.AUTOMATION_TAG_KEYS.some(e=>!!n[e]):!1}function s(e){return e.tags?.automationname?.trim()||`__unnamed__`}function c(e){let t=new Set,n=!1;for(let r of e){if(!o(r))continue;let e=s(r);e===`__unnamed__`?n=!0:t.add(e)}let r=[...t].sort((e,t)=>e.localeCompare(t));return n&&r.push(a),r}function l(e,t,n,r){if(t===`all`)return[...e];if(t===`hide-automations`)return e.filter(e=>!o(e));let i=new Set(r),a=n.filter(e=>i.has(e)),c=a.length>0?new Set(a):null;return e.filter(e=>o(e)?c===null||c.has(s(e)):!1)}function u(e,t,n){if(t===`local`)return e===`__none_workspace`?{}:e.startsWith(`ws:`)?{workingDir:e.slice(3)}:{};if(e===`__none_repo`)return{};if(e.startsWith(`repo:`)){let t=e.slice(5),r=n[0];return{repository:{name:t,gitProvider:r?.git_provider??`github`,branch:r?.selected_branch??`main`}}}return{}}function d(e){if(!e)return 0;let t=Date.parse(e);return Number.isFinite(t)?t:0}function f(e,t){let n=t===`created`?`created_at`:`updated_at`;return[...e].sort((e,t)=>d(t[n])-d(e[n]))}function p(e){let t=e.selected_workspace?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_workspace`,label:``};let n=t.split(`/`).filter(Boolean).pop()??t;return{id:`ws:${t}`,label:n}}function m(e){let t=e.selected_repository?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_repo`,label:``};let n=t.split(`/`).filter(Boolean),r=n.length?(n[n.length-1]??t).replace(/\.git$/,``):t.replace(/\.git$/,``);return{id:`repo:${t}`,label:r}}function h(e,t){return t===`local`?p(e):m(e)}function g(e,t,n,r){let i=e.map(e=>({conversationId:e.id,groupId:h(e,n).id,page:t.get(e.id)??0})),a=new Map;for(let{groupId:e,page:t}of i){let n=a.get(e);(n===void 0||t<n)&&a.set(e,t)}let o=new Set;for(let{conversationId:e,groupId:t,page:n}of i)n===a.get(t)&&o.add(e);let s=r?.forceIncludeConversationId;return s!=null&&e.some(e=>e.id===s)&&o.add(s),o}function _(e,t,n,r,i){let a=new Map;if(t===`local`&&i)for(let e of i){let t=e.path.trim().replace(/\/+$/,``);t&&a.set(`ws:${t}`,{label:e.name,conversations:[]})}for(let n of e){let{id:e,label:i}=h(n,t),o=e===`__none_workspace`?r.emptyWorkspace:e===`__none_repo`?r.emptyRepository:i,s=a.get(e);s?s.conversations.push(n):a.set(e,{label:o,conversations:[n]})}let o=[...a.entries()].map(([e,r])=>{let i=f(r.conversations,n);return{id:e,label:r.label,conversations:i,launch:u(e,t,i)}}),s=e=>e.conversations.reduce((e,t)=>Math.max(e,d(n===`created`?t.created_at:t.updated_at)),0);return o.sort((e,t)=>s(t)-s(e)),o}function v(e,t){if(t.length===0)return[...e];let n=new Map(e.map(e=>[e.id,e])),r=[],i=new Set;for(let e of t){let t=n.get(e);t&&(r.push(t),i.add(e))}for(let t of e)i.has(t.id)||r.push(t);return r}function y(e,t,n,r,i=`after`){if(n===r)return[...e];let a=v(t.map(e=>({id:e})),e).map(e=>e.id),o=a.indexOf(n),s=a.indexOf(r);if(o<0||s<0)return[...e];let c=[...a];c.splice(o,1);let l=c.indexOf(r),u=i===`before`?l:l+1;return c.splice(u,0,n),c}exports.UNNAMED_AUTOMATION_FACET=a,exports.applyAutomationConversationFilter=l,exports.applyGroupFolderOrder=v,exports.collectAutomationNameFacets=c,exports.filterOutPinnedConversations=i,exports.getGroupConversationPreview=n,exports.getGroupDiscoveryConversationIds=g,exports.groupConversations=_,exports.moveGroupFolderOrder=y,exports.resolvePinnedConversations=r,exports.sortConversationsByField=f;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../api/agent-server-adapter.cjs");var t=[`1h`,`1d`,`7d`,`30d`],n={"1h":3600*1e3,"1d":1440*60*1e3,"7d":10080*60*1e3,"30d":720*60*60*1e3};function r(e){return typeof e==`string`&&t.includes(e)}function i(e,t,n=Date.now()){let r=n-t,i=[],a=[];for(let t of e){let e=t.updated_at?Date.parse(t.updated_at):NaN;Number.isFinite(e)&&e<r?a.push(t):i.push(t)}return{recent:i,older:a}}function a(e,t,n){if(!t)return[...e];let r=e.filter(e=>t.has(e.id));if(n!=null&&!r.some(e=>e.id===n)){let t=e.find(e=>e.id===n);t&&r.push(t)}return r}function o(e,t){let n=t.limit??5,r=a(e,t.discoveryConversationIds,t.activeConversationId),i;if(r.length<=n)i=r;else{let e=t.activeConversationId==null?-1:r.findIndex(e=>e.id===t.activeConversationId);i=e>=n?[...r.slice(0,n-1),r[e]]:r.slice(0,n)}let o=i.length<e.length;return t.expanded?{visibleConversations:[...e],isPreviewTruncated:o,isShowingAll:!0}:{visibleConversations:i,isPreviewTruncated:o,isShowingAll:!o}}function s(e,t){let n=new Map(t.map(e=>[e.id,e]));return e.map(e=>n.get(e)).filter(e=>e!=null)}function c(e,t){if(t.length===0)return[...e];let n=new Set(t);return e.filter(e=>!n.has(e.id))}var l=`__unnamed__`;function u(t){if(t.trigger===`automation`)return!0;let n=t.tags;return n?e.AUTOMATION_TAG_KEYS.some(e=>!!n[e]):!1}function d(e){return e.tags?.automationname?.trim()||`__unnamed__`}function f(e){let t=new Set,n=!1;for(let r of e){if(!u(r))continue;let e=d(r);e===`__unnamed__`?n=!0:t.add(e)}let r=[...t].sort((e,t)=>e.localeCompare(t));return n&&r.push(l),r}function p(e,t,n,r){if(t===`all`)return[...e];if(t===`hide-automations`)return e.filter(e=>!u(e));let i=new Set(r),a=n.filter(e=>i.has(e)),o=a.length>0?new Set(a):null;return e.filter(e=>u(e)?o===null||o.has(d(e)):!1)}function m(t){let n=new Set;for(let r of t)for(let[t,i]of e.getDisplayConversationTags(r.tags))n.add(`${t}=${i}`);return[...n].sort((e,t)=>e.localeCompare(t))}function h(e){return e.endsWith(`=`)?e.slice(0,-1):e}function g(t,n,r){let i=new Set(r),a=n.filter(e=>i.has(e));if(a.length===0)return[...t];let o=new Set(a);return t.filter(t=>e.getDisplayConversationTags(t.tags).some(([e,t])=>o.has(`${e}=${t}`)))}function _(e,t,n){if(t===`local`)return e===`__none_workspace`?{}:e.startsWith(`ws:`)?{workingDir:e.slice(3)}:{};if(e===`__none_repo`)return{};if(e.startsWith(`repo:`)){let t=e.slice(5),r=n[0];return{repository:{name:t,gitProvider:r?.git_provider??`github`,branch:r?.selected_branch??`main`}}}return{}}function v(e){if(!e)return 0;let t=Date.parse(e);return Number.isFinite(t)?t:0}function y(e,t){let n=t===`created`?`created_at`:`updated_at`;return[...e].sort((e,t)=>v(t[n])-v(e[n]))}function b(e){let t=e.selected_workspace?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_workspace`,label:``};let n=t.split(`/`).filter(Boolean).pop()??t;return{id:`ws:${t}`,label:n}}function x(e){let t=e.selected_repository?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_repo`,label:``};let n=t.split(`/`).filter(Boolean),r=n.length?(n[n.length-1]??t).replace(/\.git$/,``):t.replace(/\.git$/,``);return{id:`repo:${t}`,label:r}}function S(e,t){return t===`local`?b(e):x(e)}function C(e,t,n,r){let i=e.map(e=>({conversationId:e.id,groupId:S(e,n).id,page:t.get(e.id)??0})),a=new Map;for(let{groupId:e,page:t}of i){let n=a.get(e);(n===void 0||t<n)&&a.set(e,t)}let o=new Set;for(let{conversationId:e,groupId:t,page:n}of i)n===a.get(t)&&o.add(e);let s=r?.forceIncludeConversationId;return s!=null&&e.some(e=>e.id===s)&&o.add(s),o}function w(e,t,n,r,i){let a=new Map;if(t===`local`&&i)for(let e of i){let t=e.path.trim().replace(/\/+$/,``);t&&a.set(`ws:${t}`,{label:e.name,conversations:[]})}for(let n of e){let{id:e,label:i}=S(n,t),o=e===`__none_workspace`?r.emptyWorkspace:e===`__none_repo`?r.emptyRepository:i,s=a.get(e);s?s.conversations.push(n):a.set(e,{label:o,conversations:[n]})}let o=[...a.entries()].map(([e,r])=>{let i=y(r.conversations,n);return{id:e,label:r.label,conversations:i,launch:_(e,t,i)}}),s=e=>e.conversations.reduce((e,t)=>Math.max(e,v(n===`created`?t.created_at:t.updated_at)),0);return o.sort((e,t)=>s(t)-s(e)),o}function T(e,t){if(t.length===0)return[...e];let n=new Map(e.map(e=>[e.id,e])),r=[],i=new Set;for(let e of t){let t=n.get(e);t&&(r.push(t),i.add(e))}for(let t of e)i.has(t.id)||r.push(t);return r}function E(e,t,n,r,i=`after`){if(n===r)return[...e];let a=T(t.map(e=>({id:e})),e).map(e=>e.id),o=a.indexOf(n),s=a.indexOf(r);if(o<0||s<0)return[...e];let c=[...a];c.splice(o,1);let l=c.indexOf(r),u=i===`before`?l:l+1;return c.splice(u,0,n),c}exports.OLDER_CONVERSATION_CUTOFFS=t,exports.OLDER_CONVERSATION_CUTOFF_MS=n,exports.UNNAMED_AUTOMATION_FACET=l,exports.applyAutomationConversationFilter=p,exports.applyGroupFolderOrder=T,exports.applyTagConversationFilter=g,exports.collectAutomationNameFacets=f,exports.collectTagFacets=m,exports.filterOutPinnedConversations=c,exports.formatTagFacetLabel=h,exports.getGroupConversationPreview=o,exports.getGroupDiscoveryConversationIds=C,exports.groupConversations=w,exports.isOlderConversationCutoff=r,exports.moveGroupFolderOrder=E,exports.partitionByCutoff=i,exports.resolvePinnedConversations=s,exports.sortConversationsByField=y;
2
2
  //# sourceMappingURL=conversation-panel-list-helpers.cjs.map