@openhands/agent-canvas 1.10.0 → 1.12.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 (531) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-DLe_gVDY.js → acp-providers-BkL3HWa3.js} +1 -1
  4. package/build/assets/{active-backend-context-B0wI7OzM.js → active-backend-context-B_bg5h9O.js} +1 -1
  5. package/build/assets/{agent-context-settings-CaQtdNA-.js → agent-context-settings-CzWS1DgR.js} +1 -1
  6. package/build/assets/{agent-profiles-settings-CvuErjp6.js → agent-profiles-settings-hd2cAIZM.js} +1 -1
  7. package/build/assets/agent-server-conversation-service.api-BheU4HX3.js +86 -0
  8. package/build/assets/{agent-settings-UE-U4Xii.js → agent-settings-D2J1dKVd.js} +1 -1
  9. package/build/assets/agent-settings-D_SVrWhI.js +1 -0
  10. package/build/assets/{alert-banner-BMaOtTCG.js → alert-banner-lrK-2_0Y.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-Cy66vT4D.js → api-key-entry-screen-D70oJj2c.js} +1 -1
  12. package/build/assets/app-settings-D0OKHB3M.js +1 -0
  13. package/build/assets/{automation-detail-fuITm6i3.js → automation-detail-C0SxWTnQ.js} +3 -3
  14. package/build/assets/{automation-export-CRq40mux.js → automation-export-BjQa_fT6.js} +1 -1
  15. package/build/assets/{automation-setup-route-EXDazOHW.js → automation-setup-route-BzCNpljP.js} +1 -1
  16. package/build/assets/{automation-templates-BArZsaxP.js → automation-templates-D9gs6ihu.js} +1 -1
  17. package/build/assets/{automations-list-CG4HKOTn.js → automations-list-dZg8zOCl.js} +1 -1
  18. package/build/assets/{back-nav-button-BZB6H7xz.js → back-nav-button-B3pYwmUJ.js} +1 -1
  19. package/build/assets/{backend-form-modal-B_lXjOGa.js → backend-form-modal-HwclKrUS.js} +1 -1
  20. package/build/assets/{backend-synced-settings-badge-B_NXJ3u1.js → backend-synced-settings-badge-YI3k09Wr.js} +1 -1
  21. package/build/assets/{badge-C64c-7PO.js → badge-Dpn3-LTV.js} +1 -1
  22. package/build/assets/{base-modal-C0RQPug5.js → base-modal-3NmIOKDm.js} +1 -1
  23. package/build/assets/{brand-button-DJmFCyMK.js → brand-button-CJcwjnfb.js} +1 -1
  24. package/build/assets/{browser-D3gd2n83.js → browser--eoQOo4M.js} +1 -1
  25. package/build/assets/{browser-tab-BicAWuJ1.js → browser-tab-4CPdj3J3.js} +1 -1
  26. package/build/assets/{chat-send-button-CCrH1E8u.js → chat-send-button-B8n6-DQA.js} +1 -1
  27. package/build/assets/{circle-plus-check-toggle-CB_sNERY.js → circle-plus-check-toggle-BVzv5EkZ.js} +1 -1
  28. package/build/assets/{cloud-funnel-analytics-XynamQGU.js → cloud-funnel-analytics-CcSez21r.js} +1 -1
  29. package/build/assets/{combobox-caret-Bwiifgjs.js → combobox-caret-BlmRwiM8.js} +1 -1
  30. package/build/assets/command-menu-BKOLj-TC.js +1 -0
  31. package/build/assets/{condenser-settings-cNGy75gq.js → condenser-settings-DLQogFnB.js} +1 -1
  32. package/build/assets/{confirmation-modal-BATFmFyP.js → confirmation-modal-DAH0XtOp.js} +1 -1
  33. package/build/assets/{context-menu-list-item-DhJCcBA0.js → context-menu-list-item-BQhmFVEK.js} +1 -1
  34. package/build/assets/{conversation-Csdxh9Xt.js → conversation-Cmyw9bFh.js} +4 -4
  35. package/build/assets/conversation-CvoGZ5vC.js +1 -0
  36. package/build/assets/conversation-panel-CvoGZ5vC.js +1 -0
  37. package/build/assets/{conversation-state-store-C2QzhPaK.js → conversation-state-store-CtgILxWF.js} +1 -1
  38. package/build/assets/{conversation-tab-empty-state-D3fb5xIA.js → conversation-tab-empty-state-C9sfDOlt.js} +1 -1
  39. package/build/assets/{copy-to-clipboard-button-c4MQwKGj.js → copy-to-clipboard-button-DatoElj8.js} +1 -1
  40. package/build/assets/{device-verify-oFpQoLgm.js → device-verify-BIjXeW9N.js} +1 -1
  41. package/build/assets/{dropdown-classes-f91ARMV1.js → dropdown-classes-zFW7qPSK.js} +1 -1
  42. package/build/assets/{entry.client-BCzY2Bf3.js → entry.client-EBn3ZtNP.js} +2 -2
  43. package/build/assets/{enum-filter-dropdown-HG3q3rkV.js → enum-filter-dropdown-CctILg5t.js} +1 -1
  44. package/build/assets/{environment-switch-overlay-CquZXolz.js → environment-switch-overlay-Cvmo6clk.js} +1 -1
  45. package/build/assets/{extensions-hub-BeweE0PW.js → extensions-hub-BZ3HYztk.js} +1 -1
  46. package/build/assets/{extensions-navigation-Dd58NlUF.js → extensions-navigation-Bnx32WAb.js} +1 -1
  47. package/build/assets/{files-tab-CLLG55-q.js → files-tab-D5zuU5TY.js} +1 -1
  48. package/build/assets/{form-control-classes-pHtZUI6K.js → form-control-classes-DLN3Qgub.js} +1 -1
  49. package/build/assets/format-model-name-BN_rx1Y3.js +1 -0
  50. package/build/assets/{format-relative-time-6-3uvOXe.js → format-relative-time-BerVamGl.js} +1 -1
  51. package/build/assets/{git-provider-icon-wg7ShB98.js → git-provider-icon-zuKz2cwo.js} +1 -1
  52. package/build/assets/{git-repo-dropdown-CWnaUyxL.js → git-repo-dropdown-B5VnMftu.js} +1 -1
  53. package/build/assets/git-repo-dropdown-Bo7ciSNX.js +1 -0
  54. package/build/assets/{highlighted-source-view-DBtI3por.js → highlighted-source-view-CgJfD5VT.js} +1 -1
  55. package/build/assets/home-DqyeeFA_.js +1 -0
  56. package/build/assets/{home-BpZQkDWM.js → home-Y0aDou-a.js} +1 -1
  57. package/build/assets/{home-store-DM4qw1lF.js → home-store-Cubdq0uP.js} +1 -1
  58. package/build/assets/index-home-DqyeeFA_.js +1 -0
  59. package/build/assets/install-server-modal-DW6dSyGr.js +1 -0
  60. package/build/assets/{kebab-menu-item-content-By16Tm_0.js → kebab-menu-item-content-CKydZrbH.js} +1 -1
  61. package/build/assets/{launch-C9uijypN.js → launch-c4GEP8oo.js} +1 -1
  62. package/build/assets/llm-not-configured-banner-DCE_0B4I.js +27 -0
  63. package/build/assets/llm-settings-8eWBF3Ij.js +1 -0
  64. package/build/assets/llm-settings-D9ko42Pi.js +1 -0
  65. package/build/assets/{llm-subscription-service-DwjJ8-_X.js → llm-subscription-service-B3K-97lP.js} +1 -1
  66. package/build/assets/{loading-spinner-6Yj-YyoS.js → loading-spinner-CN3riY7k.js} +1 -1
  67. package/build/assets/{manage-backends-modal-DrwErS0N.js → manage-backends-modal-DTCME_Pu.js} +1 -1
  68. package/build/assets/manifest-e1c3bc3b.js +1 -0
  69. package/build/assets/{manifest-subpage-layout-CtqVwIvJ.js → manifest-subpage-layout-Ds7G5GZ8.js} +1 -1
  70. package/build/assets/map-provider-7Bp2aih5.js +1 -0
  71. package/build/assets/markdown-renderer-DzvgdZey.js +8 -0
  72. package/build/assets/mcp-Da7wFU7A.js +9 -0
  73. package/build/assets/{mcp-marketplace-utils-BMnYz0Gc.js → mcp-marketplace-utils-DSLou4n7.js} +1 -1
  74. package/build/assets/messages-B2l0qLVk.js +40 -0
  75. package/build/assets/{modal-body-BHGCSAtj.js → modal-body-duRaxj_K.js} +1 -1
  76. package/build/assets/{modal-classes-DSTLuxkA.js → modal-classes-CLEXO6dj.js} +1 -1
  77. package/build/assets/{modal-close-button-dheWZ2ys.js → modal-close-button-D0aT02hs.js} +1 -1
  78. package/build/assets/npm-Cswluf6-.js +1 -0
  79. package/build/assets/{onboarding-5CZvRBbh.js → onboarding-BKbTYlW1.js} +1 -1
  80. package/build/assets/{onboarding-modal-CD2ehuxt.js → onboarding-modal-DrrGlEQq.js} +1 -1
  81. package/build/assets/{organization-service.api-Dsuoep0g.js → organization-service.api-DK8csGvK.js} +1 -1
  82. package/build/assets/{planner-tab-DeO7Thb0.js → planner-tab-D-mZ1I7n.js} +1 -1
  83. package/build/assets/{plugins-management-service-C9f75R6X.js → plugins-management-service-CywqyfLK.js} +1 -1
  84. package/build/assets/{profiles-service.api-Dl20_2IM.js → profiles-service.api-vcE_jJCe.js} +1 -1
  85. package/build/assets/{providers-CeuhK46N.js → providers-CdrPPm0z.js} +1 -1
  86. package/build/assets/{proxy-CIGI9zQC.js → proxy-b4aqL4SX.js} +1 -1
  87. package/build/assets/recommended-automations-launcher-DIYgUdMm.js +1 -0
  88. package/build/assets/{root-BQPNqNvD.js → root-CBBi6IAe.js} +2 -2
  89. package/build/assets/root-CRK9fOFd.css +1 -0
  90. package/build/assets/root-layout-BFN2rCOy.js +2 -0
  91. package/build/assets/{schema-field-z2vSLuLo.js → schema-field-Z-rMg9ti.js} +1 -1
  92. package/build/assets/{sdk-section-page-BnCXAytf.js → sdk-section-page-m_cjygxR.js} +1 -1
  93. package/build/assets/{secrets-service-DGUNlwQd.js → secrets-service-BHF4fxML.js} +1 -1
  94. package/build/assets/{secrets-settings-DUmML_dK.js → secrets-settings-aBGXtQhX.js} +1 -1
  95. package/build/assets/{segmented-toggle-eSofF7gn.js → segmented-toggle-SmvsR3jW.js} +1 -1
  96. package/build/assets/settings-CZPGNens.js +1 -0
  97. package/build/assets/{settings-dropdown-input-Cx4g7Xfl.js → settings-dropdown-input-TWIeiG02.js} +1 -1
  98. package/build/assets/{settings-index-BECdgecg.js → settings-index-Dtlegd6s.js} +1 -1
  99. package/build/assets/{settings-input-BQY115xH.js → settings-input-D61Vzp9e.js} +1 -1
  100. package/build/assets/{settings-list-classes-C9cLrrcc.js → settings-list-classes-sE0ASr1s.js} +1 -1
  101. package/build/assets/{settings-modal-ChBJNTdd.js → settings-modal-CalzJP2l.js} +1 -1
  102. package/build/assets/{settings-service.api-Dz9cZyvx.js → settings-service.api-DfPYaxZJ.js} +1 -1
  103. package/build/assets/{settings-switch-BIodMVz9.js → settings-switch-Drt-rF5s.js} +1 -1
  104. package/build/assets/{settings-utils-BL_Z9uIe.js → settings-utils-gw2ppAvw.js} +1 -1
  105. package/build/assets/{shared-conversation-CSF0aTuE.js → shared-conversation-BIAcuORk.js} +1 -1
  106. package/build/assets/{wrench-DRitTfwe.js → shield-check-D2cpEpv3.js} +1 -1
  107. package/build/assets/{sidebar-layout-DEycoFd_.js → sidebar-layout-Dxg6zc2K.js} +1 -1
  108. package/build/assets/{sidebar-mobile-menu-toggle-DeRvTupV.js → sidebar-mobile-menu-toggle-C6HpQ55l.js} +1 -1
  109. package/build/assets/{sidebar-nav-link-BjpQ-NVc.js → sidebar-nav-link-CxLoG-dG.js} +1 -1
  110. package/build/assets/sidebar-store-BJeYY-E9.js +1 -0
  111. package/build/assets/{skill-card-pill-row-BH6fPGba.js → skill-card-pill-row-B_BYBONu.js} +1 -1
  112. package/build/assets/{skill-icon-badge-D4uznfjU.js → skill-icon-badge-CN41Hy9l.js} +1 -1
  113. package/build/assets/{skill-scope-DH_AUUUP.js → skill-scope-Dt1V5X2p.js} +1 -1
  114. package/build/assets/{skills-plugins-vfvOk34h.js → skills-plugins-B-H0cCOP.js} +1 -1
  115. package/build/assets/skills-settings-DthdIDUb.js +2 -0
  116. package/build/assets/{styled-tooltip-CQ9JEFiO.js → styled-tooltip-C5C07RQC.js} +1 -1
  117. package/build/assets/{task-list-tab-DeF_uXdw.js → task-list-tab-BTde81Iu.js} +1 -1
  118. package/build/assets/{terminal-DRc4rup7.js → terminal-DRrJo-cR.js} +1 -1
  119. package/build/assets/{toggle-switch--8n8NeV_.js → toggle-switch-CIioisto.js} +1 -1
  120. package/build/assets/{typography-BSbUhJPn.js → typography-D9tiHct7.js} +1 -1
  121. package/build/assets/{use-acp-credential-form-BGKFi1VL.js → use-acp-credential-form-DGyo0QvL.js} +1 -1
  122. package/build/assets/{use-activate-agent-profile-2nvALjC-.js → use-activate-agent-profile-DrPzIKJF.js} +1 -1
  123. package/build/assets/{use-agent-profiles-BlQA67MW.js → use-agent-profiles-B37XWDLq.js} +1 -1
  124. package/build/assets/{use-can-manage-org-profiles-Clw5Dh1s.js → use-can-manage-org-profiles-BzE28H3x.js} +1 -1
  125. package/build/assets/{use-cloud-current-user-id-B8AQSQFM.js → use-cloud-current-user-id-U6HPjy50.js} +1 -1
  126. package/build/assets/{use-config-C3zGuUQI.js → use-config-DapX3pjC.js} +1 -1
  127. package/build/assets/{use-create-conversation-FaP0kUpg.js → use-create-conversation-CRf1dCm5.js} +1 -1
  128. package/build/assets/{use-create-secret-CgQ3pXd6.js → use-create-secret-DcpT3RPw.js} +1 -1
  129. package/build/assets/{use-llm-profiles-C-tDO6UB.js → use-llm-profiles-CHxqoHiN.js} +1 -1
  130. package/build/assets/{use-manifest-capabilities-DLP5wCxp.js → use-manifest-capabilities-zihHDbMW.js} +1 -1
  131. package/build/assets/{use-onboarding-completion-BiCdXvlU.js → use-onboarding-completion-6kWOW3ul.js} +1 -1
  132. package/build/assets/{use-plugins-marketplace-DRFNLBlr.js → use-plugins-marketplace-CqkR8kLE.js} +1 -1
  133. package/build/assets/{use-save-agent-profile-CaGVAudI.js → use-save-agent-profile-CH9_EXQG.js} +1 -1
  134. package/build/assets/{use-save-settings-C9B8Y-h3.js → use-save-settings-DIEurJ3D.js} +1 -1
  135. package/build/assets/{use-settings-3RcgdUuZ.js → use-settings-BmLzQjnC.js} +1 -1
  136. package/build/assets/use-settings-nav-items-DV9qgeu7.js +16 -0
  137. package/build/assets/{use-tracking-CTtkLAmx.js → use-tracking-salbPJxT.js} +1 -1
  138. package/build/assets/{use-user-conversation-Bei82QsZ.js → use-user-conversation-Dt-W6uNw.js} +1 -1
  139. package/build/assets/utils-DPQfkd-7.js +1 -0
  140. package/build/assets/{verification-settings-nD61Ijph.js → verification-settings-oi54wEc1.js} +1 -1
  141. package/build/assets/wrench-B1_H-tL1.js +1 -0
  142. package/build/index.html +4 -4
  143. package/build/locales/ar/openhands.json +39 -2
  144. package/build/locales/ca/openhands.json +39 -2
  145. package/build/locales/de/openhands.json +39 -2
  146. package/build/locales/en/openhands.json +39 -2
  147. package/build/locales/es/openhands.json +39 -2
  148. package/build/locales/fr/openhands.json +39 -2
  149. package/build/locales/it/openhands.json +39 -2
  150. package/build/locales/ja/openhands.json +39 -2
  151. package/build/locales/ko-KR/openhands.json +39 -2
  152. package/build/locales/no/openhands.json +39 -2
  153. package/build/locales/pt/openhands.json +39 -2
  154. package/build/locales/tr/openhands.json +39 -2
  155. package/build/locales/uk/openhands.json +39 -2
  156. package/build/locales/zh-CN/openhands.json +39 -2
  157. package/build/locales/zh-TW/openhands.json +39 -2
  158. package/config/defaults.json +1 -1
  159. package/dist/api/agent-server-adapter.cjs +3 -3
  160. package/dist/api/agent-server-adapter.cjs.map +1 -1
  161. package/dist/api/agent-server-adapter.d.ts +32 -5
  162. package/dist/api/agent-server-adapter.js +120 -91
  163. package/dist/api/agent-server-adapter.js.map +1 -1
  164. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  165. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  166. package/dist/api/cloud/conversation-service.api.d.ts +19 -2
  167. package/dist/api/cloud/conversation-service.api.js +51 -47
  168. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  169. package/dist/api/conversation-file-upload.api.cjs +1 -1
  170. package/dist/api/conversation-file-upload.api.js +10 -10
  171. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  172. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  173. package/dist/api/conversation-service/agent-server-conversation-service.api.js +55 -61
  174. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  175. package/dist/api/event-service/event-service.api.cjs +1 -1
  176. package/dist/api/event-service/event-service.api.js +12 -12
  177. package/dist/api/launch-child-conversation-client-tool.cjs +47 -0
  178. package/dist/api/launch-child-conversation-client-tool.cjs.map +1 -0
  179. package/dist/api/launch-child-conversation-client-tool.d.ts +3 -0
  180. package/dist/api/launch-child-conversation-client-tool.js +93 -0
  181. package/dist/api/launch-child-conversation-client-tool.js.map +1 -0
  182. package/dist/api/open-hands.types.d.ts +1 -1
  183. package/dist/api/workspace-upload-path.cjs +1 -1
  184. package/dist/api/workspace-upload-path.js +8 -8
  185. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +1 -1
  186. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -1
  187. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +24 -18
  188. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -1
  189. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  190. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  191. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +5 -0
  192. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  193. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -2
  194. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  195. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +11 -7
  196. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  197. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  198. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  199. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +61 -60
  200. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  201. package/dist/components/features/chat/model-messages.cjs +1 -1
  202. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  203. package/dist/components/features/chat/model-messages.js +26 -25
  204. package/dist/components/features/chat/model-messages.js.map +1 -1
  205. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -2
  206. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  207. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +2 -8
  208. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +50 -53
  209. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  210. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs +2 -0
  211. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs.map +1 -0
  212. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.d.ts +12 -0
  213. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js +6 -0
  214. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js.map +1 -0
  215. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  216. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  217. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.d.ts +16 -1
  218. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +95 -78
  219. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  220. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs +1 -1
  221. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs.map +1 -1
  222. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js +40 -38
  223. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js.map +1 -1
  224. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +2 -0
  225. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -0
  226. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +14 -0
  227. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +167 -0
  228. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -0
  229. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +2 -0
  230. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -0
  231. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +63 -0
  232. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +66 -0
  233. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -0
  234. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs +2 -0
  235. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs.map +1 -0
  236. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.d.ts +15 -0
  237. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js +117 -0
  238. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js.map +1 -0
  239. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs +1 -1
  240. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs.map +1 -1
  241. package/dist/components/features/conversation-panel/conversation-card/no-repository.js +30 -19
  242. package/dist/components/features/conversation-panel/conversation-card/no-repository.js.map +1 -1
  243. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  244. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  245. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +7 -2
  246. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +146 -104
  247. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  248. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  249. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  250. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +20 -0
  251. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +53 -27
  252. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  253. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  254. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  255. package/dist/components/features/conversation-panel/conversation-panel.js +226 -213
  256. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  257. package/dist/components/features/settings/agent-canvas-update-card.cjs +1 -1
  258. package/dist/components/features/settings/agent-canvas-update-card.cjs.map +1 -1
  259. package/dist/components/features/settings/agent-canvas-update-card.d.ts +10 -5
  260. package/dist/components/features/settings/agent-canvas-update-card.js +223 -149
  261. package/dist/components/features/settings/agent-canvas-update-card.js.map +1 -1
  262. package/dist/components/features/settings/agent-canvas-version-modal.cjs +2 -0
  263. package/dist/components/features/settings/agent-canvas-version-modal.cjs.map +1 -0
  264. package/dist/components/features/settings/agent-canvas-version-modal.d.ts +11 -0
  265. package/dist/components/features/settings/agent-canvas-version-modal.js +166 -0
  266. package/dist/components/features/settings/agent-canvas-version-modal.js.map +1 -0
  267. package/dist/components/features/settings/agent-canvas-version-tile.cjs +2 -0
  268. package/dist/components/features/settings/agent-canvas-version-tile.cjs.map +1 -0
  269. package/dist/components/features/settings/agent-canvas-version-tile.d.ts +13 -0
  270. package/dist/components/features/settings/agent-canvas-version-tile.js +60 -0
  271. package/dist/components/features/settings/agent-canvas-version-tile.js.map +1 -0
  272. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  273. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -0
  274. package/dist/components/features/settings/settings-desktop-sidebar.cjs +1 -1
  275. package/dist/components/features/settings/settings-desktop-sidebar.cjs.map +1 -1
  276. package/dist/components/features/settings/settings-desktop-sidebar.js +1 -1
  277. package/dist/components/features/settings/settings-desktop-sidebar.js.map +1 -1
  278. package/dist/components/features/settings/settings-mobile-drawer.cjs +1 -1
  279. package/dist/components/features/settings/settings-mobile-drawer.cjs.map +1 -1
  280. package/dist/components/features/settings/settings-mobile-drawer.js +1 -1
  281. package/dist/components/features/settings/settings-mobile-drawer.js.map +1 -1
  282. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  283. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  284. package/dist/components/features/sidebar/sidebar-rail-body.js +109 -108
  285. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  286. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  287. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  288. package/dist/components/features/skills/extensions-navigation.js +9 -9
  289. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  290. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  291. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  292. package/dist/components/shared/modals/settings/model-selector.js +154 -98
  293. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  294. package/dist/config/defaults.cjs +1 -1
  295. package/dist/config/defaults.cjs.map +1 -1
  296. package/dist/config/defaults.js +1 -1
  297. package/dist/config/defaults.js.map +1 -1
  298. package/dist/constants/child-conversation.cjs +2 -0
  299. package/dist/constants/child-conversation.cjs.map +1 -0
  300. package/dist/constants/child-conversation.d.ts +29 -0
  301. package/dist/constants/child-conversation.js +6 -0
  302. package/dist/constants/child-conversation.js.map +1 -0
  303. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  304. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  305. package/dist/contexts/conversation-websocket-context.js +189 -188
  306. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  307. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  308. package/dist/hooks/chat/use-model-interceptor.js +6 -6
  309. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  310. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  311. package/dist/hooks/chat/use-slash-command.js +61 -60
  312. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  313. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  314. package/dist/hooks/mutation/use-create-conversation.js +6 -6
  315. package/dist/i18n/declaration.cjs +1 -1
  316. package/dist/i18n/declaration.cjs.map +1 -1
  317. package/dist/i18n/declaration.d.ts +38 -1
  318. package/dist/i18n/declaration.js +1 -1
  319. package/dist/i18n/declaration.js.map +1 -1
  320. package/dist/i18n/translation.cjs +2 -2
  321. package/dist/i18n/translation.cjs.map +1 -1
  322. package/dist/i18n/translation.js +644 -15
  323. package/dist/i18n/translation.js.map +1 -1
  324. package/dist/icons/docker.cjs +2 -0
  325. package/dist/icons/docker.cjs.map +1 -0
  326. package/dist/icons/docker.js +19 -0
  327. package/dist/icons/docker.js.map +1 -0
  328. package/dist/icons/npm.cjs +2 -0
  329. package/dist/icons/npm.cjs.map +1 -0
  330. package/dist/icons/npm.js +19 -0
  331. package/dist/icons/npm.js.map +1 -0
  332. package/dist/locales/ar/openhands.json +39 -2
  333. package/dist/locales/ca/openhands.json +39 -2
  334. package/dist/locales/de/openhands.json +39 -2
  335. package/dist/locales/en/openhands.json +39 -2
  336. package/dist/locales/es/openhands.json +39 -2
  337. package/dist/locales/fr/openhands.json +39 -2
  338. package/dist/locales/it/openhands.json +39 -2
  339. package/dist/locales/ja/openhands.json +39 -2
  340. package/dist/locales/ko-KR/openhands.json +39 -2
  341. package/dist/locales/no/openhands.json +39 -2
  342. package/dist/locales/pt/openhands.json +39 -2
  343. package/dist/locales/tr/openhands.json +39 -2
  344. package/dist/locales/uk/openhands.json +39 -2
  345. package/dist/locales/zh-CN/openhands.json +39 -2
  346. package/dist/locales/zh-TW/openhands.json +39 -2
  347. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  348. package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -1
  349. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs +2 -0
  350. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs.map +1 -0
  351. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +16 -0
  352. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +1 -0
  353. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs +2 -0
  354. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs.map +1 -0
  355. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js +27 -0
  356. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js.map +1 -0
  357. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs +2 -0
  358. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs.map +1 -0
  359. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js +21 -0
  360. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js.map +1 -0
  361. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs +2 -0
  362. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs.map +1 -0
  363. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js +23 -0
  364. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js.map +1 -0
  365. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs +2 -0
  366. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs.map +1 -0
  367. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js +43 -0
  368. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js.map +1 -0
  369. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs +2 -0
  370. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs.map +1 -0
  371. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js +25 -0
  372. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js.map +1 -0
  373. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs +2 -0
  374. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs.map +1 -0
  375. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +9 -0
  376. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
  377. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs +2 -0
  378. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs.map +1 -0
  379. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js +27 -0
  380. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js.map +1 -0
  381. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs +2 -0
  382. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs.map +1 -0
  383. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js +25 -0
  384. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js.map +1 -0
  385. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs +2 -0
  386. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs.map +1 -0
  387. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js +30 -0
  388. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js.map +1 -0
  389. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs +2 -0
  390. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs.map +1 -0
  391. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js +35 -0
  392. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js.map +1 -0
  393. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs +2 -0
  394. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs.map +1 -0
  395. package/dist/node_modules/lucide-react/dist/esm/icons/house.js +12 -0
  396. package/dist/node_modules/lucide-react/dist/esm/icons/house.js.map +1 -0
  397. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs +2 -0
  398. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs.map +1 -0
  399. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js +33 -0
  400. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js.map +1 -0
  401. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs +2 -0
  402. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs.map +1 -0
  403. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js +15 -0
  404. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js.map +1 -0
  405. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs +2 -0
  406. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs.map +1 -0
  407. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js +19 -0
  408. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js.map +1 -0
  409. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs +2 -0
  410. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs.map +1 -0
  411. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js +22 -0
  412. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js.map +1 -0
  413. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs +2 -0
  414. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs.map +1 -0
  415. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js +23 -0
  416. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js.map +1 -0
  417. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs +2 -0
  418. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs.map +1 -0
  419. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js +12 -0
  420. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js.map +1 -0
  421. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs +2 -0
  422. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs.map +1 -0
  423. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js +23 -0
  424. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js.map +1 -0
  425. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs +2 -0
  426. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs.map +1 -0
  427. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js +27 -0
  428. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js.map +1 -0
  429. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs +2 -0
  430. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs.map +1 -0
  431. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js +23 -0
  432. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js.map +1 -0
  433. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs +2 -0
  434. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs.map +1 -0
  435. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js +21 -0
  436. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js.map +1 -0
  437. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs +2 -0
  438. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs.map +1 -0
  439. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js +43 -0
  440. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js.map +1 -0
  441. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs +2 -0
  442. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs.map +1 -0
  443. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js +19 -0
  444. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js.map +1 -0
  445. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs +2 -0
  446. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs.map +1 -0
  447. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js +27 -0
  448. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js.map +1 -0
  449. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs +2 -0
  450. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.map +1 -0
  451. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js +9 -0
  452. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js.map +1 -0
  453. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs +2 -0
  454. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs.map +1 -0
  455. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +9 -0
  456. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
  457. package/dist/package.cjs +1 -1
  458. package/dist/package.cjs.map +1 -1
  459. package/dist/package.js +6 -3
  460. package/dist/package.js.map +1 -1
  461. package/dist/routes/app-settings.cjs +1 -1
  462. package/dist/routes/app-settings.cjs.map +1 -1
  463. package/dist/routes/app-settings.js +94 -93
  464. package/dist/routes/app-settings.js.map +1 -1
  465. package/dist/routes/llm-settings.cjs +1 -1
  466. package/dist/routes/llm-settings.cjs.map +1 -1
  467. package/dist/routes/llm-settings.js +131 -119
  468. package/dist/routes/llm-settings.js.map +1 -1
  469. package/dist/services/child-conversation-launch.cjs +2 -0
  470. package/dist/services/child-conversation-launch.cjs.map +1 -0
  471. package/dist/services/child-conversation-launch.d.ts +41 -0
  472. package/dist/services/child-conversation-launch.js +182 -0
  473. package/dist/services/child-conversation-launch.js.map +1 -0
  474. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  475. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  476. package/dist/stores/conversation-panel-preferences-store.d.ts +5 -1
  477. package/dist/stores/conversation-panel-preferences-store.js +8 -2
  478. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  479. package/dist/types/agent-server/core/base/action.d.ts +17 -1
  480. package/dist/types/agent-server/core/base/base.d.ts +2 -1
  481. package/dist/types/agent-server/type-guards.cjs +1 -1
  482. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  483. package/dist/types/agent-server/type-guards.d.ts +8 -1
  484. package/dist/types/agent-server/type-guards.js +4 -3
  485. package/dist/types/agent-server/type-guards.js.map +1 -1
  486. package/dist/types/automation.d.ts +14 -0
  487. package/dist/utils/custom-toast-handlers.cjs +1 -1
  488. package/dist/utils/custom-toast-handlers.cjs.map +1 -1
  489. package/dist/utils/custom-toast-handlers.js +18 -1
  490. package/dist/utils/custom-toast-handlers.js.map +1 -1
  491. package/dist/utils/format-model-name.cjs +1 -1
  492. package/dist/utils/format-model-name.cjs.map +1 -1
  493. package/dist/utils/format-model-name.d.ts +11 -0
  494. package/dist/utils/format-model-name.js +11 -3
  495. package/dist/utils/format-model-name.js.map +1 -1
  496. package/package.json +6 -3
  497. package/scripts/brand-dev-electron.mjs +244 -0
  498. package/scripts/check-translation-completeness.cjs +4 -0
  499. package/scripts/generate-icons.mjs +109 -0
  500. package/build/assets/agent-server-conversation-service.api-km_8sOVf.js +0 -41
  501. package/build/assets/agent-settings-nmO-KSXr.js +0 -1
  502. package/build/assets/app-settings-9ok42bV6.js +0 -1
  503. package/build/assets/command-menu-CA3IjGNc.js +0 -1
  504. package/build/assets/conversation-B6t6EiVp.js +0 -1
  505. package/build/assets/conversation-panel-B6t6EiVp.js +0 -1
  506. package/build/assets/copy-DaHuDtG4.js +0 -1
  507. package/build/assets/git-repo-dropdown-TzOuG5Ef.js +0 -1
  508. package/build/assets/home-OEx0XtfP.js +0 -1
  509. package/build/assets/index-home-OEx0XtfP.js +0 -1
  510. package/build/assets/install-server-modal-DnjZrJUy.js +0 -1
  511. package/build/assets/list-filter-C86CBRDE.js +0 -1
  512. package/build/assets/llm-not-configured-banner-DrBrhfN0.js +0 -27
  513. package/build/assets/llm-settings-CRsLqxgu.js +0 -1
  514. package/build/assets/llm-settings-RBm_3kNm.js +0 -1
  515. package/build/assets/manifest-c352d453.js +0 -1
  516. package/build/assets/map-provider-CXU6issd.js +0 -1
  517. package/build/assets/markdown-renderer-lsvsp7jn.js +0 -8
  518. package/build/assets/mcp-DD4hPTRE.js +0 -9
  519. package/build/assets/messages-Dt77e0qi.js +0 -40
  520. package/build/assets/recommended-automations-launcher-6xmbf7lh.js +0 -1
  521. package/build/assets/root-BeuHFY2s.css +0 -1
  522. package/build/assets/root-layout-Dl_2CDoq.js +0 -3
  523. package/build/assets/settings-Co-M5bK9.js +0 -1
  524. package/build/assets/sidebar-store-B04sX8aP.js +0 -1
  525. package/build/assets/skills-settings-DnbIu2eO.js +0 -2
  526. package/build/assets/use-settings-nav-items-y-Oyc93G.js +0 -16
  527. package/build/assets/utils-BX9XJ0IE.js +0 -1
  528. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs +0 -2
  529. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs.map +0 -1
  530. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -9
  531. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
@@ -0,0 +1,167 @@
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 { cn as n } from "../../../../utils/utils.js";
4
+ import { CONVERSATION_CARD_META_CHIP_CLASSNAME as r, CONVERSATION_CARD_META_CHIP_ICON_CLASSNAME as i, CONVERSATION_CARD_META_CHIP_ICON_SLOT_CLASSNAME as a } from "./conversation-card-meta-chip.js";
5
+ import { computeVisibleTagChipCount as o, formatConversationTagTooltip as s, getConversationTagLabel as c, truncateTagChipValue as l } from "./conversation-tag-display.js";
6
+ import { getConversationTagIcon as u } from "./conversation-tag-icons.js";
7
+ import d from "react";
8
+ import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
9
+ import { createPortal as h } from "react-dom";
10
+ //#region src/components/features/conversation-panel/conversation-card/conversation-tag-chips.tsx
11
+ function g({ icon: e, keyName: t, testId: n }) {
12
+ return /* @__PURE__ */ p("span", {
13
+ className: a,
14
+ "aria-hidden": !0,
15
+ children: /* @__PURE__ */ p(e, {
16
+ "data-testid": n,
17
+ "data-tag-key": t,
18
+ "aria-hidden": !0,
19
+ className: i
20
+ })
21
+ });
22
+ }
23
+ function _({ icon: e, keyName: t, value: n, iconTestId: r }) {
24
+ return /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(g, {
25
+ icon: e,
26
+ keyName: t,
27
+ testId: r
28
+ }), /* @__PURE__ */ p("span", {
29
+ className: "truncate leading-4",
30
+ children: l(n)
31
+ })] });
32
+ }
33
+ function v({ tags: i }) {
34
+ let { t: a } = e("openhands"), l = d.useRef(null), f = d.useRef(null), v = d.useRef(null), y = d.useRef(null), [b, x] = d.useState(i.length), [S, C] = d.useState(!1), [w, T] = d.useState(null), E = d.useCallback(() => {
35
+ let e = l.current, t = f.current;
36
+ !e || !t || x(o(Array.from(t.children).map((e) => e.offsetWidth), e.clientWidth));
37
+ }, []), D = d.useCallback(() => {
38
+ let e = v.current;
39
+ if (!e) return;
40
+ let t = e.getBoundingClientRect(), n = t.left;
41
+ n + 256 > window.innerWidth - 8 && (n = Math.max(8, window.innerWidth - 8 - 256)), T({
42
+ top: t.bottom + 4,
43
+ left: n
44
+ });
45
+ }, []), O = i.map(([e, t]) => `${e}=${t}`).join(""), k = d.useRef(null);
46
+ if (d.useLayoutEffect(() => {
47
+ k.current !== O && (k.current = O, C(!1), E());
48
+ }, [O, E]), d.useEffect(() => {
49
+ let e = l.current;
50
+ if (!e || typeof ResizeObserver > "u") return;
51
+ let t = new ResizeObserver(() => E());
52
+ return t.observe(e), () => t.disconnect();
53
+ }, [E]), d.useLayoutEffect(() => {
54
+ if (!S) {
55
+ T(null);
56
+ return;
57
+ }
58
+ return D(), window.addEventListener("resize", D), window.addEventListener("scroll", D, !0), () => {
59
+ window.removeEventListener("resize", D), window.removeEventListener("scroll", D, !0);
60
+ };
61
+ }, [S, D]), d.useEffect(() => {
62
+ if (!S) return;
63
+ let e = (e) => {
64
+ let t = e.target;
65
+ v.current?.contains(t) || y.current?.contains(t) || C(!1);
66
+ }, t = (e) => {
67
+ e.key === "Escape" && C(!1);
68
+ };
69
+ return document.addEventListener("mousedown", e), document.addEventListener("keydown", t), () => {
70
+ document.removeEventListener("mousedown", e), document.removeEventListener("keydown", t);
71
+ };
72
+ }, [S]), i.length === 0) return null;
73
+ let A = Math.max(0, i.length - b), j = i.slice(0, b), M = i.slice(b), N = (e) => {
74
+ e.stopPropagation();
75
+ };
76
+ return /* @__PURE__ */ m("div", {
77
+ "data-testid": "conversation-card-tag-chips",
78
+ className: "relative min-w-0 w-full",
79
+ children: [
80
+ /* @__PURE__ */ p("div", {
81
+ ref: f,
82
+ "aria-hidden": !0,
83
+ className: "pointer-events-none fixed top-0 -left-[10000px] z-[-1] flex flex-nowrap items-center gap-1 opacity-0",
84
+ children: i.map(([e, t]) => /* @__PURE__ */ p("span", {
85
+ className: r,
86
+ children: /* @__PURE__ */ p(_, {
87
+ icon: u(e, t),
88
+ keyName: e,
89
+ value: t
90
+ })
91
+ }, e))
92
+ }),
93
+ /* @__PURE__ */ m("div", {
94
+ ref: l,
95
+ "data-testid": "conversation-card-tag-row",
96
+ className: "flex w-full min-w-0 max-w-full flex-nowrap items-center gap-1 overflow-hidden",
97
+ children: [j.map(([e, t]) => /* @__PURE__ */ p("span", {
98
+ "data-testid": "conversation-card-tag-chip",
99
+ title: s(e, t, a),
100
+ className: r,
101
+ children: /* @__PURE__ */ p(_, {
102
+ icon: u(e, t),
103
+ keyName: e,
104
+ value: t,
105
+ iconTestId: "conversation-card-tag-chip-icon"
106
+ })
107
+ }, e)), A > 0 ? /* @__PURE__ */ m("button", {
108
+ ref: v,
109
+ type: "button",
110
+ "data-testid": "conversation-card-tag-overflow",
111
+ "aria-expanded": S,
112
+ "aria-haspopup": "dialog",
113
+ "aria-label": a(t.CONVERSATION$TAGS_OVERFLOW_ARIA, { count: A }),
114
+ onMouseDown: N,
115
+ onClick: (e) => {
116
+ e.preventDefault(), e.stopPropagation(), C((e) => !e);
117
+ },
118
+ className: n(r, "shrink-0 self-center hover:bg-[var(--oh-interactive-hover)] hover:text-[var(--foreground)]"),
119
+ children: [/* @__PURE__ */ p("span", {
120
+ className: "inline-flex h-4 w-0 shrink-0",
121
+ "aria-hidden": !0
122
+ }), /* @__PURE__ */ p("span", {
123
+ className: "leading-4",
124
+ children: `+${A}`
125
+ })]
126
+ }) : null]
127
+ }),
128
+ S && w && typeof document < "u" && h(/* @__PURE__ */ p("div", {
129
+ ref: y,
130
+ role: "dialog",
131
+ "data-testid": "conversation-card-tag-overflow-popover",
132
+ className: n("z-[9999] min-w-[10rem] max-w-[16rem]", "rounded-md border border-[var(--oh-border-subtle)]", "bg-[var(--oh-surface)] p-2 shadow-lg"),
133
+ style: {
134
+ position: "fixed",
135
+ top: w.top,
136
+ left: w.left
137
+ },
138
+ onMouseDown: N,
139
+ onClick: (e) => {
140
+ e.preventDefault(), e.stopPropagation();
141
+ },
142
+ children: /* @__PURE__ */ p("dl", {
143
+ className: "m-0 flex flex-col gap-1",
144
+ children: M.map(([e, t]) => /* @__PURE__ */ m("div", {
145
+ "data-testid": "conversation-card-tag-overflow-row",
146
+ className: "grid grid-cols-[minmax(0,auto)_minmax(0,1fr)] gap-x-2 text-[10px] leading-4",
147
+ children: [/* @__PURE__ */ m("dt", {
148
+ className: "m-0 inline-flex min-w-0 items-center gap-1 whitespace-normal break-words text-[var(--oh-muted)]",
149
+ children: [/* @__PURE__ */ p(g, { icon: u(e, t) }), /* @__PURE__ */ p("span", {
150
+ className: "min-w-0 whitespace-normal break-words leading-4",
151
+ children: c(e, a)
152
+ })]
153
+ }), /* @__PURE__ */ p("dd", {
154
+ className: "m-0 whitespace-normal break-words text-left leading-4 text-[var(--foreground)]",
155
+ title: t,
156
+ children: t
157
+ })]
158
+ }, e))
159
+ })
160
+ }), document.body)
161
+ ]
162
+ });
163
+ }
164
+ //#endregion
165
+ export { v as ConversationTagChips };
166
+
167
+ //# sourceMappingURL=conversation-tag-chips.js.map
@@ -0,0 +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"}
@@ -0,0 +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;
2
+ //# sourceMappingURL=conversation-tag-display.cjs.map
@@ -0,0 +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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Display helpers for conversation tag chips. Pure (no React) so fit/truncate
3
+ * behavior can be unit-tested without laying out the sidebar card.
4
+ */
5
+ import { I18nKey } from "#/i18n/declaration";
6
+ /** Max characters shown on a chip before hard truncation with an ellipsis. */
7
+ export declare const TAG_CHIP_VALUE_MAX_LENGTH = 14;
8
+ /** Horizontal gap between chips (matches Tailwind ``gap-1`` = 4px). */
9
+ export declare const TAG_CHIP_GAP_PX = 4;
10
+ /**
11
+ * Reserved width for the ``+N`` overflow control when deciding how many chips
12
+ * fit on one row. Slightly generous so the button never wraps under a chip.
13
+ */
14
+ export declare const TAG_CHIP_OVERFLOW_WIDTH_PX = 36;
15
+ /** Known tag keys that already have a dedicated hovercard label. */
16
+ export type ConversationTagLabelKind = "git" | "repo" | "branch" | "workspace" | "app_mode" | "work_tools" | "work_wsid" | "other";
17
+ /**
18
+ * Map a server tag key to a hovercard label kind. ``archiveworkspacepath`` is
19
+ * treated as "workspace" — the sandbox working directory for the conversation.
20
+ * ACM / Work stamps (``Appmode``, ``Worktools``, ``Workwsid``) get dedicated
21
+ * kinds so chips and hovercards show friendly labels instead of the wire key.
22
+ *
23
+ * ``origin`` / ``source`` deliberately stay "other" (humanized to "Origin" /
24
+ * "Source"): they name where a conversation came from — Slack, an API call, an
25
+ * automation — which is not a git fact. Only ``git_provider`` is "Git".
26
+ */
27
+ export declare function getConversationTagLabelKind(key: string): ConversationTagLabelKind;
28
+ /**
29
+ * Soften unknown snake_case / kebab-case keys for tooltips and overflow rows
30
+ * (``selected_branch`` is mapped above; this covers free-form keys like
31
+ * ``env`` → ``Env``).
32
+ */
33
+ export declare function humanizeConversationTagKey(key: string): string;
34
+ /**
35
+ * Localized label for a tag key (chip tooltip, overflow popover, hovercard).
36
+ * Known keys use the preview copy; everything else is humanized.
37
+ */
38
+ export declare function getConversationTagLabel(key: string, t: (key: I18nKey) => string): string;
39
+ /** ``Branch: main`` — used by chip ``title`` tooltips. */
40
+ export declare function formatConversationTagTooltip(key: string, value: string, t: (key: I18nKey) => string): string;
41
+ /**
42
+ * Hard-truncate a tag value for the chip label. The full ``key: value`` string
43
+ * stays available via tooltip / overflow popover.
44
+ *
45
+ * Measures and slices by code point rather than UTF-16 code unit: values
46
+ * stamped by Slack / Discord automations carry emoji, and cutting between the
47
+ * halves of a surrogate pair leaves a lone surrogate that browsers draw as a
48
+ * replacement glyph.
49
+ */
50
+ export declare function truncateTagChipValue(value: string, maxLength?: number): string;
51
+ /**
52
+ * How many chips fit in ``containerWidth`` while keeping a single nowrap row
53
+ * and reserving space for a ``+N`` overflow control when any chips would hide.
54
+ *
55
+ * Returns ``widths.length`` when ``containerWidth <= 0`` (not laid out yet /
56
+ * jsdom) so callers can show every chip until a real measurement arrives.
57
+ * Returns ``0`` when the row is too narrow for even one chip + overflow — the
58
+ * UI then shows only the ``+N`` control with the full list in the popover.
59
+ */
60
+ export declare function computeVisibleTagChipCount(widths: number[], containerWidth: number, options?: {
61
+ gapPx?: number;
62
+ overflowWidthPx?: number;
63
+ }): number;
@@ -0,0 +1,66 @@
1
+ import { I18nKey as e } from "../../../../i18n/declaration.js";
2
+ function t(e) {
3
+ switch (e.trim().toLowerCase()) {
4
+ case "git_provider": return "git";
5
+ case "repo_name":
6
+ case "repo":
7
+ case "repository": return "repo";
8
+ case "selected_branch":
9
+ case "branch": return "branch";
10
+ case "archiveworkspacepath":
11
+ case "workspace":
12
+ case "working_dir": return "workspace";
13
+ case "appmode":
14
+ case "app_mode":
15
+ case "mode": return "app_mode";
16
+ case "worktools":
17
+ case "work_tools":
18
+ case "tools": return "work_tools";
19
+ case "workwsid":
20
+ case "work_wsid":
21
+ case "wsid":
22
+ case "workspace_id": return "work_wsid";
23
+ default: return "other";
24
+ }
25
+ }
26
+ function n(e) {
27
+ let t = e.trim();
28
+ if (!t) return t;
29
+ let n = t.replace(/[_-]+/g, " ").replace(/\s+/g, " ");
30
+ return n.charAt(0).toUpperCase() + n.slice(1);
31
+ }
32
+ function r(r, i) {
33
+ switch (t(r)) {
34
+ case "git": return i(e.CONVERSATION_PANEL$PREVIEW_GIT);
35
+ case "repo": return i(e.CONVERSATION_PANEL$PREVIEW_REPO);
36
+ case "branch": return i(e.CONVERSATION_PANEL$PREVIEW_BRANCH);
37
+ case "workspace": return i(e.CONVERSATION_PANEL$PREVIEW_WORKSPACE);
38
+ case "app_mode": return i(e.CONVERSATION_PANEL$PREVIEW_APP_MODE);
39
+ case "work_tools": return i(e.CONVERSATION_PANEL$PREVIEW_WORK_TOOLS);
40
+ case "work_wsid": return i(e.CONVERSATION_PANEL$PREVIEW_WORK_WSID);
41
+ default: return n(r);
42
+ }
43
+ }
44
+ function i(e, t, n) {
45
+ return `${r(e, n)}: ${t}`;
46
+ }
47
+ function a(e, t = 14) {
48
+ let n = Array.from(e);
49
+ return n.length <= t ? e : t <= 1 ? "…" : `${n.slice(0, t - 1).join("")}…`;
50
+ }
51
+ function o(e, t, n = {}) {
52
+ let r = n.gapPx ?? 4, i = n.overflowWidthPx ?? 36;
53
+ if (e.length === 0) return 0;
54
+ if (t <= 0) return e.length;
55
+ let a = 0;
56
+ for (let n = 0; n < e.length; n += 1) {
57
+ let o = e[n], s = n > 0 ? r : 0, c = e.length - n - 1 > 0 ? i + r : 0;
58
+ if (a + s + o + c > t) return n;
59
+ a += s + o;
60
+ }
61
+ return e.length;
62
+ }
63
+ //#endregion
64
+ export { o as computeVisibleTagChipCount, i as formatConversationTagTooltip, r as getConversationTagLabel, a as truncateTagChipValue };
65
+
66
+ //# sourceMappingURL=conversation-tag-display.js.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../node_modules/lucide-react/dist/esm/icons/bot.cjs"),t=require("../../../../node_modules/lucide-react/dist/esm/icons/briefcase.cjs"),n=require("../../../../node_modules/lucide-react/dist/esm/icons/building-2.cjs"),r=require("../../../../node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs"),i=require("../../../../node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs"),a=require("../../../../node_modules/lucide-react/dist/esm/icons/earth.cjs"),o=require("../../../../node_modules/lucide-react/dist/esm/icons/flag.cjs"),s=require("../../../../node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs"),c=require("../../../../node_modules/lucide-react/dist/esm/icons/folder-key.cjs"),l=require("../../../../node_modules/lucide-react/dist/esm/icons/folder.cjs"),u=require("../../../../node_modules/lucide-react/dist/esm/icons/git-branch.cjs"),d=require("../../../../node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs"),f=require("../../../../node_modules/lucide-react/dist/esm/icons/hash.cjs"),p=require("../../../../node_modules/lucide-react/dist/esm/icons/house.cjs"),m=require("../../../../node_modules/lucide-react/dist/esm/icons/id-card.cjs"),h=require("../../../../node_modules/lucide-react/dist/esm/icons/key-round.cjs"),g=require("../../../../node_modules/lucide-react/dist/esm/icons/layers.cjs"),_=require("../../../../node_modules/lucide-react/dist/esm/icons/link-2.cjs"),v=require("../../../../node_modules/lucide-react/dist/esm/icons/mails.cjs"),y=require("../../../../node_modules/lucide-react/dist/esm/icons/messages-square.cjs"),b=require("../../../../node_modules/lucide-react/dist/esm/icons/plug.cjs"),x=require("../../../../node_modules/lucide-react/dist/esm/icons/square-kanban.cjs"),S=require("../../../../node_modules/lucide-react/dist/esm/icons/tag.cjs"),C=require("../../../../node_modules/lucide-react/dist/esm/icons/ticket.cjs"),w=require("../../../../node_modules/lucide-react/dist/esm/icons/users-round.cjs"),T=require("../../../../node_modules/lucide-react/dist/esm/icons/waypoints.cjs"),E=require("../../../../node_modules/lucide-react/dist/esm/icons/webhook.cjs"),D=require("../../../../node_modules/lucide-react/dist/esm/icons/wrench.cjs"),O=require("../../../../node_modules/lucide-react/dist/esm/icons/zap.cjs"),k=require("../../../../node_modules/react-icons/fa6/index.cjs"),A=require("../../../../icons/slack.cjs");var j=new Set([`origin`,`source`,`git_provider`]),M=new Set([`appmode`,`app_mode`,`mode`]),N={origin:T.Waypoints,source:_.Link2,git_provider:k.FaGithub,owner:r.CircleUserRound,user:r.CircleUserRound,author:r.CircleUserRound,assignee:r.CircleUserRound,env:i.CloudCog,environment:i.CloudCog,repo:s.FolderGit2,repository:s.FolderGit2,repo_name:s.FolderGit2,branch:u.GitBranch,selected_branch:u.GitBranch,archiveworkspacepath:l.Folder,workspace:l.Folder,working_dir:l.Folder,team:w.UsersRound,org:n.Building2,organization:n.Building2,channel:f.Hash,email:v.Mails,automation:O.Zap,webhook:E.Webhook,agent:e.Bot,project:x.SquareKanban,ticket:C.Ticket,issue:C.Ticket,pr:d.GitPullRequest,pull_request:d.GitPullRequest,priority:o.Flag,status:m.IdCard,id:h.KeyRound,integration:b.Plug,appmode:g.Layers,app_mode:g.Layers,mode:g.Layers,worktools:D.Wrench,work_tools:D.Wrench,tools:D.Wrench,workwsid:c.FolderKey,work_wsid:c.FolderKey,wsid:c.FolderKey,workspace_id:c.FolderKey},P={slack:A.default,discord:y.MessagesSquare,github:k.FaGithub,gitlab:k.FaGitlab,bitbucket:k.FaBitbucket,bitbucket_data_center:k.FaBitbucket,azure_devops:u.GitBranch,email:v.Mails,mail:v.Mails,api:b.Plug,webhook:E.Webhook,automation:O.Zap,review:d.GitPullRequest,linear:x.SquareKanban,web:a.Earth,ui:a.Earth,canvas:a.Earth},F={work:t.Briefcase,personal:p.House,home:p.House,private:p.House};function I(e,t){let n=e.trim().toLowerCase(),r=t.trim().toLowerCase();return j.has(n)?P[r]??N[n]??S.Tag:M.has(n)?F[r]??N[n]??g.Layers:N[n]??S.Tag}exports.getConversationTagIcon=I;
2
+ //# sourceMappingURL=conversation-tag-icons.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-tag-icons.cjs","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-icons.ts"],"sourcesContent":["import type { ComponentType, SVGProps } from \"react\";\nimport {\n Bot,\n Briefcase,\n Building2,\n CircleUserRound,\n CloudCog,\n Flag,\n Folder,\n FolderGit2,\n FolderKey,\n GitBranch,\n GitPullRequest,\n Globe2,\n Hash,\n House,\n IdCard,\n KeyRound,\n Layers,\n Link2,\n Mails,\n MessagesSquare,\n Plug,\n SquareKanban,\n Tag,\n Ticket,\n UsersRound,\n Waypoints,\n Webhook,\n Wrench,\n Zap,\n type LucideIcon,\n} from \"lucide-react\";\nimport { FaBitbucket, FaGithub, FaGitlab } from \"react-icons/fa6\";\nimport type { IconType } from \"react-icons/lib\";\nimport SlackIcon from \"#/icons/slack.svg?react\";\n\n/**\n * Any icon renderable inside a tag chip / overflow row. Lucide, react-icons,\n * and local SVG React components all work as long as they accept ``className``\n * and inherit ``currentColor`` for the muted chip text.\n */\nexport type ConversationTagIcon =\n | LucideIcon\n | IconType\n | ComponentType<SVGProps<SVGSVGElement>>;\n\n/**\n * Tag keys whose value names a git host / chat source — resolve the icon from\n * the value (e.g. ``git_provider: github`` → GitHub mark) instead of the key.\n */\nconst SOURCE_VALUE_DRIVEN_TAG_KEYS = new Set([\n \"origin\",\n \"source\",\n \"git_provider\",\n]);\n\n/**\n * App-mode keys resolve from the mode value (``work`` → briefcase) when known,\n * otherwise fall back to {@link Layers}.\n */\nconst APP_MODE_TAG_KEYS = new Set([\"appmode\", \"app_mode\", \"mode\"]);\n\n/**\n * Icons for well-known conversation tag keys. Unknown keys fall back to\n * {@link Tag}. Value-driven keys additionally resolve via the value maps below.\n */\nconst KEY_ICONS: Record<string, ConversationTagIcon> = {\n origin: Waypoints,\n source: Link2,\n git_provider: FaGithub,\n owner: CircleUserRound,\n user: CircleUserRound,\n author: CircleUserRound,\n assignee: CircleUserRound,\n env: CloudCog,\n environment: CloudCog,\n repo: FolderGit2,\n repository: FolderGit2,\n repo_name: FolderGit2,\n branch: GitBranch,\n selected_branch: GitBranch,\n archiveworkspacepath: Folder,\n workspace: Folder,\n working_dir: Folder,\n team: UsersRound,\n org: Building2,\n organization: Building2,\n channel: Hash,\n email: Mails,\n automation: Zap,\n webhook: Webhook,\n agent: Bot,\n project: SquareKanban,\n ticket: Ticket,\n issue: Ticket,\n pr: GitPullRequest,\n pull_request: GitPullRequest,\n priority: Flag,\n status: IdCard,\n id: KeyRound,\n integration: Plug,\n appmode: Layers,\n app_mode: Layers,\n mode: Layers,\n worktools: Wrench,\n work_tools: Wrench,\n tools: Wrench,\n workwsid: FolderKey,\n work_wsid: FolderKey,\n wsid: FolderKey,\n workspace_id: FolderKey,\n};\n\n/**\n * Value-specific icons for source / provider stamps (``origin``,\n * ``git_provider``, …), keyed by the lowercase stamp value.\n */\nconst SOURCE_VALUE_ICONS: Record<string, ConversationTagIcon> = {\n slack: SlackIcon,\n discord: MessagesSquare,\n github: FaGithub,\n gitlab: FaGitlab,\n bitbucket: FaBitbucket,\n bitbucket_data_center: FaBitbucket,\n azure_devops: GitBranch,\n email: Mails,\n mail: Mails,\n api: Plug,\n webhook: Webhook,\n automation: Zap,\n review: GitPullRequest,\n linear: SquareKanban,\n web: Globe2,\n ui: Globe2,\n canvas: Globe2,\n};\n\n/**\n * Value-specific icons for app-mode stamps (``Appmode: work`` → briefcase).\n */\nconst APP_MODE_VALUE_ICONS: Record<string, ConversationTagIcon> = {\n work: Briefcase,\n personal: House,\n home: House,\n private: House,\n};\n\n/**\n * Pick an icon that matches a conversation tag. Prefer value-specific icons\n * for source/provider and app-mode keys; otherwise map by key; finally fall\n * back to ``Tag``.\n */\nexport function getConversationTagIcon(\n key: string,\n value: string,\n): ConversationTagIcon {\n const normalizedKey = key.trim().toLowerCase();\n const normalizedValue = value.trim().toLowerCase();\n\n if (SOURCE_VALUE_DRIVEN_TAG_KEYS.has(normalizedKey)) {\n return (\n SOURCE_VALUE_ICONS[normalizedValue] ?? KEY_ICONS[normalizedKey] ?? Tag\n );\n }\n\n if (APP_MODE_TAG_KEYS.has(normalizedKey)) {\n return (\n APP_MODE_VALUE_ICONS[normalizedValue] ??\n KEY_ICONS[normalizedKey] ??\n Layers\n );\n }\n\n return KEY_ICONS[normalizedKey] ?? Tag;\n}\n"],"mappings":"s5EAmDA,IAAM,EAA+B,IAAI,IAAI,CAC3C,SACA,SACA,cACF,CAAC,EAMK,EAAoB,IAAI,IAAI,CAAC,UAAW,WAAY,MAAM,CAAC,EAM3D,EAAiD,CACrD,OAAQ,EAAA,UACR,OAAQ,EAAA,MACR,aAAc,EAAA,SACd,MAAO,EAAA,gBACP,KAAM,EAAA,gBACN,OAAQ,EAAA,gBACR,SAAU,EAAA,gBACV,IAAK,EAAA,SACL,YAAa,EAAA,SACb,KAAM,EAAA,WACN,WAAY,EAAA,WACZ,UAAW,EAAA,WACX,OAAQ,EAAA,UACR,gBAAiB,EAAA,UACjB,qBAAsB,EAAA,OACtB,UAAW,EAAA,OACX,YAAa,EAAA,OACb,KAAM,EAAA,WACN,IAAK,EAAA,UACL,aAAc,EAAA,UACd,QAAS,EAAA,KACT,MAAO,EAAA,MACP,WAAY,EAAA,IACZ,QAAS,EAAA,QACT,MAAO,EAAA,IACP,QAAS,EAAA,aACT,OAAQ,EAAA,OACR,MAAO,EAAA,OACP,GAAI,EAAA,eACJ,aAAc,EAAA,eACd,SAAU,EAAA,KACV,OAAQ,EAAA,OACR,GAAI,EAAA,SACJ,YAAa,EAAA,KACb,QAAS,EAAA,OACT,SAAU,EAAA,OACV,KAAM,EAAA,OACN,UAAW,EAAA,OACX,WAAY,EAAA,OACZ,MAAO,EAAA,OACP,SAAU,EAAA,UACV,UAAW,EAAA,UACX,KAAM,EAAA,UACN,aAAc,EAAA,SAChB,EAMM,EAA0D,CAC9D,MAAO,EAAA,QACP,QAAS,EAAA,eACT,OAAQ,EAAA,SACR,OAAQ,EAAA,SACR,UAAW,EAAA,YACX,sBAAuB,EAAA,YACvB,aAAc,EAAA,UACd,MAAO,EAAA,MACP,KAAM,EAAA,MACN,IAAK,EAAA,KACL,QAAS,EAAA,QACT,WAAY,EAAA,IACZ,OAAQ,EAAA,eACR,OAAQ,EAAA,aACR,IAAK,EAAA,MACL,GAAI,EAAA,MACJ,OAAQ,EAAA,KACV,EAKM,EAA4D,CAChE,KAAM,EAAA,UACN,SAAU,EAAA,MACV,KAAM,EAAA,MACN,QAAS,EAAA,KACX,EAOA,SAAgB,EACd,EACA,EACqB,CACrB,IAAM,EAAgB,EAAI,KAAK,EAAE,YAAY,EACvC,EAAkB,EAAM,KAAK,EAAE,YAAY,EAgBjD,OAdI,EAA6B,IAAI,CAAa,EAE9C,EAAmB,IAAoB,EAAU,IAAkB,EAAA,IAInE,EAAkB,IAAI,CAAa,EAEnC,EAAqB,IACrB,EAAU,IACV,EAAA,OAIG,EAAU,IAAkB,EAAA,GACrC"}
@@ -0,0 +1,15 @@
1
+ import type { ComponentType, SVGProps } from "react";
2
+ import { type LucideIcon } from "lucide-react";
3
+ import type { IconType } from "react-icons/lib";
4
+ /**
5
+ * Any icon renderable inside a tag chip / overflow row. Lucide, react-icons,
6
+ * and local SVG React components all work as long as they accept ``className``
7
+ * and inherit ``currentColor`` for the muted chip text.
8
+ */
9
+ export type ConversationTagIcon = LucideIcon | IconType | ComponentType<SVGProps<SVGSVGElement>>;
10
+ /**
11
+ * Pick an icon that matches a conversation tag. Prefer value-specific icons
12
+ * for source/provider and app-mode keys; otherwise map by key; finally fall
13
+ * back to ``Tag``.
14
+ */
15
+ export declare function getConversationTagIcon(key: string, value: string): ConversationTagIcon;
@@ -0,0 +1,117 @@
1
+ import { Bot as e } from "../../../../node_modules/lucide-react/dist/esm/icons/bot.js";
2
+ import { Briefcase as t } from "../../../../node_modules/lucide-react/dist/esm/icons/briefcase.js";
3
+ import { Building2 as n } from "../../../../node_modules/lucide-react/dist/esm/icons/building-2.js";
4
+ import { CircleUserRound as r } from "../../../../node_modules/lucide-react/dist/esm/icons/circle-user-round.js";
5
+ import { CloudCog as i } from "../../../../node_modules/lucide-react/dist/esm/icons/cloud-cog.js";
6
+ import { Earth as a } from "../../../../node_modules/lucide-react/dist/esm/icons/earth.js";
7
+ import { Flag as o } from "../../../../node_modules/lucide-react/dist/esm/icons/flag.js";
8
+ import { FolderGit2 as s } from "../../../../node_modules/lucide-react/dist/esm/icons/folder-git-2.js";
9
+ import { FolderKey as c } from "../../../../node_modules/lucide-react/dist/esm/icons/folder-key.js";
10
+ import { Folder as l } from "../../../../node_modules/lucide-react/dist/esm/icons/folder.js";
11
+ import { GitBranch as u } from "../../../../node_modules/lucide-react/dist/esm/icons/git-branch.js";
12
+ import { GitPullRequest as d } from "../../../../node_modules/lucide-react/dist/esm/icons/git-pull-request.js";
13
+ import { Hash as f } from "../../../../node_modules/lucide-react/dist/esm/icons/hash.js";
14
+ import { House as p } from "../../../../node_modules/lucide-react/dist/esm/icons/house.js";
15
+ import { IdCard as m } from "../../../../node_modules/lucide-react/dist/esm/icons/id-card.js";
16
+ import { KeyRound as h } from "../../../../node_modules/lucide-react/dist/esm/icons/key-round.js";
17
+ import { Layers as g } from "../../../../node_modules/lucide-react/dist/esm/icons/layers.js";
18
+ import { Link2 as _ } from "../../../../node_modules/lucide-react/dist/esm/icons/link-2.js";
19
+ import { Mails as v } from "../../../../node_modules/lucide-react/dist/esm/icons/mails.js";
20
+ import { MessagesSquare as y } from "../../../../node_modules/lucide-react/dist/esm/icons/messages-square.js";
21
+ import { Plug as b } from "../../../../node_modules/lucide-react/dist/esm/icons/plug.js";
22
+ import { SquareKanban as x } from "../../../../node_modules/lucide-react/dist/esm/icons/square-kanban.js";
23
+ import { Tag as S } from "../../../../node_modules/lucide-react/dist/esm/icons/tag.js";
24
+ import { Ticket as C } from "../../../../node_modules/lucide-react/dist/esm/icons/ticket.js";
25
+ import { UsersRound as w } from "../../../../node_modules/lucide-react/dist/esm/icons/users-round.js";
26
+ import { Waypoints as T } from "../../../../node_modules/lucide-react/dist/esm/icons/waypoints.js";
27
+ import { Webhook as E } from "../../../../node_modules/lucide-react/dist/esm/icons/webhook.js";
28
+ import { Wrench as D } from "../../../../node_modules/lucide-react/dist/esm/icons/wrench.js";
29
+ import { Zap as O } from "../../../../node_modules/lucide-react/dist/esm/icons/zap.js";
30
+ import { FaBitbucket as k, FaGithub as A, FaGitlab as j } from "../../../../node_modules/react-icons/fa6/index.js";
31
+ import M from "../../../../icons/slack.js";
32
+ //#region src/components/features/conversation-panel/conversation-card/conversation-tag-icons.ts
33
+ var N = new Set([
34
+ "origin",
35
+ "source",
36
+ "git_provider"
37
+ ]), P = new Set([
38
+ "appmode",
39
+ "app_mode",
40
+ "mode"
41
+ ]), F = {
42
+ origin: T,
43
+ source: _,
44
+ git_provider: A,
45
+ owner: r,
46
+ user: r,
47
+ author: r,
48
+ assignee: r,
49
+ env: i,
50
+ environment: i,
51
+ repo: s,
52
+ repository: s,
53
+ repo_name: s,
54
+ branch: u,
55
+ selected_branch: u,
56
+ archiveworkspacepath: l,
57
+ workspace: l,
58
+ working_dir: l,
59
+ team: w,
60
+ org: n,
61
+ organization: n,
62
+ channel: f,
63
+ email: v,
64
+ automation: O,
65
+ webhook: E,
66
+ agent: e,
67
+ project: x,
68
+ ticket: C,
69
+ issue: C,
70
+ pr: d,
71
+ pull_request: d,
72
+ priority: o,
73
+ status: m,
74
+ id: h,
75
+ integration: b,
76
+ appmode: g,
77
+ app_mode: g,
78
+ mode: g,
79
+ worktools: D,
80
+ work_tools: D,
81
+ tools: D,
82
+ workwsid: c,
83
+ work_wsid: c,
84
+ wsid: c,
85
+ workspace_id: c
86
+ }, I = {
87
+ slack: M,
88
+ discord: y,
89
+ github: A,
90
+ gitlab: j,
91
+ bitbucket: k,
92
+ bitbucket_data_center: k,
93
+ azure_devops: u,
94
+ email: v,
95
+ mail: v,
96
+ api: b,
97
+ webhook: E,
98
+ automation: O,
99
+ review: d,
100
+ linear: x,
101
+ web: a,
102
+ ui: a,
103
+ canvas: a
104
+ }, L = {
105
+ work: t,
106
+ personal: p,
107
+ home: p,
108
+ private: p
109
+ };
110
+ function R(e, t) {
111
+ let n = e.trim().toLowerCase(), r = t.trim().toLowerCase();
112
+ return N.has(n) ? I[r] ?? F[n] ?? S : P.has(n) ? L[r] ?? F[n] ?? g : F[n] ?? S;
113
+ }
114
+ //#endregion
115
+ export { R as getConversationTagIcon };
116
+
117
+ //# sourceMappingURL=conversation-tag-icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-tag-icons.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-icons.ts"],"sourcesContent":["import type { ComponentType, SVGProps } from \"react\";\nimport {\n Bot,\n Briefcase,\n Building2,\n CircleUserRound,\n CloudCog,\n Flag,\n Folder,\n FolderGit2,\n FolderKey,\n GitBranch,\n GitPullRequest,\n Globe2,\n Hash,\n House,\n IdCard,\n KeyRound,\n Layers,\n Link2,\n Mails,\n MessagesSquare,\n Plug,\n SquareKanban,\n Tag,\n Ticket,\n UsersRound,\n Waypoints,\n Webhook,\n Wrench,\n Zap,\n type LucideIcon,\n} from \"lucide-react\";\nimport { FaBitbucket, FaGithub, FaGitlab } from \"react-icons/fa6\";\nimport type { IconType } from \"react-icons/lib\";\nimport SlackIcon from \"#/icons/slack.svg?react\";\n\n/**\n * Any icon renderable inside a tag chip / overflow row. Lucide, react-icons,\n * and local SVG React components all work as long as they accept ``className``\n * and inherit ``currentColor`` for the muted chip text.\n */\nexport type ConversationTagIcon =\n | LucideIcon\n | IconType\n | ComponentType<SVGProps<SVGSVGElement>>;\n\n/**\n * Tag keys whose value names a git host / chat source — resolve the icon from\n * the value (e.g. ``git_provider: github`` → GitHub mark) instead of the key.\n */\nconst SOURCE_VALUE_DRIVEN_TAG_KEYS = new Set([\n \"origin\",\n \"source\",\n \"git_provider\",\n]);\n\n/**\n * App-mode keys resolve from the mode value (``work`` → briefcase) when known,\n * otherwise fall back to {@link Layers}.\n */\nconst APP_MODE_TAG_KEYS = new Set([\"appmode\", \"app_mode\", \"mode\"]);\n\n/**\n * Icons for well-known conversation tag keys. Unknown keys fall back to\n * {@link Tag}. Value-driven keys additionally resolve via the value maps below.\n */\nconst KEY_ICONS: Record<string, ConversationTagIcon> = {\n origin: Waypoints,\n source: Link2,\n git_provider: FaGithub,\n owner: CircleUserRound,\n user: CircleUserRound,\n author: CircleUserRound,\n assignee: CircleUserRound,\n env: CloudCog,\n environment: CloudCog,\n repo: FolderGit2,\n repository: FolderGit2,\n repo_name: FolderGit2,\n branch: GitBranch,\n selected_branch: GitBranch,\n archiveworkspacepath: Folder,\n workspace: Folder,\n working_dir: Folder,\n team: UsersRound,\n org: Building2,\n organization: Building2,\n channel: Hash,\n email: Mails,\n automation: Zap,\n webhook: Webhook,\n agent: Bot,\n project: SquareKanban,\n ticket: Ticket,\n issue: Ticket,\n pr: GitPullRequest,\n pull_request: GitPullRequest,\n priority: Flag,\n status: IdCard,\n id: KeyRound,\n integration: Plug,\n appmode: Layers,\n app_mode: Layers,\n mode: Layers,\n worktools: Wrench,\n work_tools: Wrench,\n tools: Wrench,\n workwsid: FolderKey,\n work_wsid: FolderKey,\n wsid: FolderKey,\n workspace_id: FolderKey,\n};\n\n/**\n * Value-specific icons for source / provider stamps (``origin``,\n * ``git_provider``, …), keyed by the lowercase stamp value.\n */\nconst SOURCE_VALUE_ICONS: Record<string, ConversationTagIcon> = {\n slack: SlackIcon,\n discord: MessagesSquare,\n github: FaGithub,\n gitlab: FaGitlab,\n bitbucket: FaBitbucket,\n bitbucket_data_center: FaBitbucket,\n azure_devops: GitBranch,\n email: Mails,\n mail: Mails,\n api: Plug,\n webhook: Webhook,\n automation: Zap,\n review: GitPullRequest,\n linear: SquareKanban,\n web: Globe2,\n ui: Globe2,\n canvas: Globe2,\n};\n\n/**\n * Value-specific icons for app-mode stamps (``Appmode: work`` → briefcase).\n */\nconst APP_MODE_VALUE_ICONS: Record<string, ConversationTagIcon> = {\n work: Briefcase,\n personal: House,\n home: House,\n private: House,\n};\n\n/**\n * Pick an icon that matches a conversation tag. Prefer value-specific icons\n * for source/provider and app-mode keys; otherwise map by key; finally fall\n * back to ``Tag``.\n */\nexport function getConversationTagIcon(\n key: string,\n value: string,\n): ConversationTagIcon {\n const normalizedKey = key.trim().toLowerCase();\n const normalizedValue = value.trim().toLowerCase();\n\n if (SOURCE_VALUE_DRIVEN_TAG_KEYS.has(normalizedKey)) {\n return (\n SOURCE_VALUE_ICONS[normalizedValue] ?? KEY_ICONS[normalizedKey] ?? Tag\n );\n }\n\n if (APP_MODE_TAG_KEYS.has(normalizedKey)) {\n return (\n APP_MODE_VALUE_ICONS[normalizedValue] ??\n KEY_ICONS[normalizedKey] ??\n Layers\n );\n }\n\n return KEY_ICONS[normalizedKey] ?? Tag;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,IAAM,IAA+B,IAAI,IAAI;CAC3C;CACA;CACA;AACF,CAAC,GAMK,IAAoB,IAAI,IAAI;CAAC;CAAW;CAAY;AAAM,CAAC,GAM3D,IAAiD;CACrD,QAAQ;CACR,QAAQ;CACR,cAAc;CACd,OAAO;CACP,MAAM;CACN,QAAQ;CACR,UAAU;CACV,KAAK;CACL,aAAa;CACb,MAAM;CACN,YAAY;CACZ,WAAW;CACX,QAAQ;CACR,iBAAiB;CACjB,sBAAsB;CACtB,WAAW;CACX,aAAa;CACb,MAAM;CACN,KAAK;CACL,cAAc;CACd,SAAS;CACT,OAAO;CACP,YAAY;CACZ,SAAS;CACT,OAAO;CACP,SAAS;CACT,QAAQ;CACR,OAAO;CACP,IAAI;CACJ,cAAc;CACd,UAAU;CACV,QAAQ;CACR,IAAI;CACJ,aAAa;CACb,SAAS;CACT,UAAU;CACV,MAAM;CACN,WAAW;CACX,YAAY;CACZ,OAAO;CACP,UAAU;CACV,WAAW;CACX,MAAM;CACN,cAAc;AAChB,GAMM,IAA0D;CAC9D,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,uBAAuB;CACvB,cAAc;CACd,OAAO;CACP,MAAM;CACN,KAAK;CACL,SAAS;CACT,YAAY;CACZ,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,IAAI;CACJ,QAAQ;AACV,GAKM,IAA4D;CAChE,MAAM;CACN,UAAU;CACV,MAAM;CACN,SAAS;AACX;AAOA,SAAgB,EACd,GACA,GACqB;CACrB,IAAM,IAAgB,EAAI,KAAK,EAAE,YAAY,GACvC,IAAkB,EAAM,KAAK,EAAE,YAAY;CAgBjD,OAdI,EAA6B,IAAI,CAAa,IAE9C,EAAmB,MAAoB,EAAU,MAAkB,IAInE,EAAkB,IAAI,CAAa,IAEnC,EAAqB,MACrB,EAAU,MACV,IAIG,EAAU,MAAkB;AACrC"}
@@ -1,2 +1,2 @@
1
- require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../../i18n/declaration.cjs"),n=require("../../../../utils/path-utils.cjs"),r=require("../../../../icons/repo-forked.cjs");let i=require("react/jsx-runtime");function a({workspaceWorkingDir:a}){let{t:o}=e.useTranslation(`openhands`),s=a?n.getPathBasename(a).trim():``;return s?(0,i.jsx)(`span`,{className:`truncate min-w-0 text-xs text-[var(--oh-muted)] flex-1`,title:a??void 0,children:s}):(0,i.jsxs)(`div`,{className:`flex items-center gap-1 text-xs text-[var(--oh-muted)] flex-1 min-w-0 overflow-hidden`,children:[(0,i.jsx)(r.default,{width:14,height:14,className:`text-[var(--oh-muted)]`}),(0,i.jsx)(`span`,{className:`truncate min-w-0`,children:o(t.I18nKey.COMMON$NO_REPOSITORY)})]})}exports.NoRepository=a;
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../../i18n/declaration.cjs"),n=require("../../../../node_modules/lucide-react/dist/esm/icons/folder.cjs"),r=require("../../../../utils/path-utils.cjs"),i=require("../../../../icons/repo-forked.cjs"),a=require("./conversation-card-meta-chip.cjs");let o=require("react/jsx-runtime");function s({workspaceWorkingDir:s}){let{t:c}=e.useTranslation(`openhands`),l=s?r.getPathBasename(s).trim():``;return l?(0,o.jsxs)(`span`,{"data-testid":`conversation-card-workspace-folder`,className:a.CONVERSATION_CARD_META_CHIP_CLASSNAME,title:s??void 0,children:[(0,o.jsx)(`span`,{className:a.CONVERSATION_CARD_META_CHIP_ICON_SLOT_CLASSNAME,"aria-hidden":!0,children:(0,o.jsx)(n.Folder,{className:a.CONVERSATION_CARD_META_CHIP_ICON_CLASSNAME})}),(0,o.jsx)(`span`,{className:`truncate leading-4`,children:l})]}):(0,o.jsxs)(`span`,{"data-testid":`conversation-card-no-repository`,className:a.CONVERSATION_CARD_META_CHIP_CLASSNAME,children:[(0,o.jsx)(`span`,{className:a.CONVERSATION_CARD_META_CHIP_ICON_SLOT_CLASSNAME,"aria-hidden":!0,children:(0,o.jsx)(i.default,{className:a.CONVERSATION_CARD_META_CHIP_ICON_CLASSNAME})}),(0,o.jsx)(`span`,{className:`truncate leading-4`,children:c(t.I18nKey.COMMON$NO_REPOSITORY)})]})}exports.NoRepository=s;
2
2
  //# sourceMappingURL=no-repository.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"no-repository.cjs","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/no-repository.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport RepoForkedIcon from \"#/icons/repo-forked.svg?react\";\nimport { getPathBasename } from \"#/utils/path-utils\";\n\ninterface NoRepositoryProps {\n workspaceWorkingDir?: string | null;\n}\n\nexport function NoRepository({ workspaceWorkingDir }: NoRepositoryProps) {\n const { t } = useTranslation(\"openhands\");\n\n const folderName = workspaceWorkingDir\n ? getPathBasename(workspaceWorkingDir).trim()\n : \"\";\n\n if (folderName) {\n return (\n <span\n className=\"truncate min-w-0 text-xs text-[var(--oh-muted)] flex-1\"\n title={workspaceWorkingDir ?? undefined}\n >\n {folderName}\n </span>\n );\n }\n\n return (\n <div className=\"flex items-center gap-1 text-xs text-[var(--oh-muted)] flex-1 min-w-0 overflow-hidden\">\n <RepoForkedIcon\n width={14}\n height={14}\n className=\"text-[var(--oh-muted)]\"\n />\n <span className=\"truncate min-w-0\">\n {t(I18nKey.COMMON$NO_REPOSITORY)}\n </span>\n </div>\n );\n}\n"],"mappings":"yTASA,SAAgB,EAAa,CAAE,uBAA0C,CACvE,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAElC,EAAa,EACf,EAAA,gBAAgB,CAAmB,EAAE,KAAK,EAC1C,GAaJ,OAXI,GAEA,EAAA,EAAA,KAAC,OAAD,CACE,UAAU,yDACV,MAAO,GAAuB,IAAA,YAE7B,CACG,CAAA,GAKR,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,iGAAf,EACE,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,MAAO,GACP,OAAQ,GACR,UAAU,wBACX,CAAA,GACD,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,4BACb,EAAE,EAAA,QAAQ,oBAAoB,CAC3B,CAAA,CACH,GAET"}
1
+ {"version":3,"file":"no-repository.cjs","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/no-repository.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { Folder } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport RepoForkedIcon from \"#/icons/repo-forked.svg?react\";\nimport { getPathBasename } from \"#/utils/path-utils\";\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 NoRepositoryProps {\n workspaceWorkingDir?: string | null;\n}\n\nexport function NoRepository({ workspaceWorkingDir }: NoRepositoryProps) {\n const { t } = useTranslation(\"openhands\");\n\n const folderName = workspaceWorkingDir\n ? getPathBasename(workspaceWorkingDir).trim()\n : \"\";\n\n if (folderName) {\n return (\n <span\n data-testid=\"conversation-card-workspace-folder\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n title={workspaceWorkingDir ?? undefined}\n >\n <span\n className={CONVERSATION_CARD_META_CHIP_ICON_SLOT_CLASSNAME}\n aria-hidden\n >\n <Folder className={CONVERSATION_CARD_META_CHIP_ICON_CLASSNAME} />\n </span>\n <span className=\"truncate leading-4\">{folderName}</span>\n </span>\n );\n }\n\n return (\n <span\n data-testid=\"conversation-card-no-repository\"\n className={CONVERSATION_CARD_META_CHIP_CLASSNAME}\n >\n <span\n className={CONVERSATION_CARD_META_CHIP_ICON_SLOT_CLASSNAME}\n aria-hidden\n >\n <RepoForkedIcon\n className={CONVERSATION_CARD_META_CHIP_ICON_CLASSNAME}\n />\n </span>\n <span className=\"truncate leading-4\">\n {t(I18nKey.COMMON$NO_REPOSITORY)}\n </span>\n </span>\n );\n}\n"],"mappings":"qbAeA,SAAgB,EAAa,CAAE,uBAA0C,CACvE,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAElC,EAAa,EACf,EAAA,gBAAgB,CAAmB,EAAE,KAAK,EAC1C,GAoBJ,OAlBI,GAEA,EAAA,EAAA,MAAC,OAAD,CACE,cAAY,qCACZ,UAAW,EAAA,sCACX,MAAO,GAAuB,IAAA,YAHhC,EAKE,EAAA,EAAA,KAAC,OAAD,CACE,UAAW,EAAA,gDACX,cAAA,aAEA,EAAA,EAAA,KAAC,EAAA,OAAD,CAAQ,UAAW,EAAA,0CAA6C,CAAA,CAC5D,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,8BAAsB,CAAiB,CAAA,CACnD,KAKR,EAAA,EAAA,MAAC,OAAD,CACE,cAAY,kCACZ,UAAW,EAAA,+CAFb,EAIE,EAAA,EAAA,KAAC,OAAD,CACE,UAAW,EAAA,gDACX,cAAA,aAEA,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,UAAW,EAAA,0CACZ,CAAA,CACG,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,8BACb,EAAE,EAAA,QAAQ,oBAAoB,CAC3B,CAAA,CACF,GAEV"}