@openhands/agent-canvas 1.0.0-beta.6 → 1.0.0-beta.8

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 (802) hide show
  1. package/README.md +24 -7
  2. package/README.windows.md +27 -0
  3. package/bin/agent-canvas.mjs +26 -3
  4. package/build/assets/{QueryClientProvider-CkGuhXg-.js → QueryClientProvider-Cnr-Yl3j.js} +1 -1
  5. package/build/assets/{Trans-Cvm_-SMi.js → Trans-4jmk54WC.js} +1 -1
  6. package/build/assets/acp-providers-BAX8OU5C.js +1 -0
  7. package/build/assets/{acp-route-guard-B2yoBZ_4.js → acp-route-guard-HPk6TV-L.js} +1 -1
  8. package/build/assets/active-backend-context-BSPE-W72.js +1 -0
  9. package/build/assets/add-backend-modal-mXKmfMI2.js +1 -0
  10. package/build/assets/agent-server-client-options-9agOSarV.js +1 -0
  11. package/build/assets/agent-server-compatibility-B7QStIcH.js +1 -0
  12. package/build/assets/agent-server-conversation-service.api-B9TUYJon.js +5 -0
  13. package/build/assets/{agent-settings-CnGSCmK8.js → agent-settings-g3F623RJ.js} +1 -1
  14. package/build/assets/{alert-banner-DtzAX654.js → alert-banner-DFnn_lC6.js} +1 -1
  15. package/build/assets/{analytics-consent-form-modal-CHZ3I37v.js → analytics-consent-form-modal-BQCNeNVt.js} +1 -1
  16. package/build/assets/api-key-entry-screen-myuWMqzW.js +1 -0
  17. package/build/assets/{app-settings-Db9ITeJH.js → app-settings-CCcX8ZEH.js} +1 -1
  18. package/build/assets/automation-detail-BDHLHSJd.js +1 -0
  19. package/build/assets/automations-list-CiNtQhq_.js +1 -0
  20. package/build/assets/back-nav-button-7dQJ2k3O.js +1 -0
  21. package/build/assets/backend-form-modal-D3bDMO3C.js +1 -0
  22. package/build/assets/{backend-synced-settings-badge-Dc6c7GT4.js → backend-synced-settings-badge-BkW5evM0.js} +1 -1
  23. package/build/assets/base-modal-C2oy2EBG.js +1 -0
  24. package/build/assets/brand-button-DJ_S16rO.js +1 -0
  25. package/build/assets/{browser-D810xUYt.js → browser-CGM-k-sH.js} +2 -2
  26. package/build/assets/browser-store-DAsixKdU.js +1 -0
  27. package/build/assets/{browser-tab-B-aIqXRl.js → browser-tab-dvSPdvkm.js} +1 -1
  28. package/build/assets/{checkmark-DL7acQA7.js → checkmark-Dus0b6jt.js} +1 -1
  29. package/build/assets/{chevron-left-small-CVWf8TI6.js → chevron-left-small-_uvG7RVM.js} +1 -1
  30. package/build/assets/{circle-plus-check-toggle-P7ZZToV4.js → circle-plus-check-toggle-DKS8MAVV.js} +1 -1
  31. package/build/assets/{close-B5LROHR3.js → close-BU5iTc66.js} +1 -1
  32. package/build/assets/code-tag-BzyqOtPD.js +1 -0
  33. package/build/assets/combobox-caret-BJC7XJsz.js +1 -0
  34. package/build/assets/{command-store-DFN_17p1.js → command-store-CE1weJy8.js} +1 -1
  35. package/build/assets/{condenser-settings-wnEKhBof.js → condenser-settings-DCTulgLO.js} +1 -1
  36. package/build/assets/{confirmation-modal-Dau3w_sa.js → confirmation-modal-B5Ca6qFE.js} +1 -1
  37. package/build/assets/context-menu-list-item-7tAcm2c3.js +1 -0
  38. package/build/assets/conversation-BKhikfYl.js +1 -0
  39. package/build/assets/conversation-DTn8jN8L.js +19 -0
  40. package/build/assets/conversation-panel-DfHR42mG.js +1 -0
  41. package/build/assets/conversation-service.api-B6CkzaKD.js +1 -0
  42. package/build/assets/conversation-state-store-D-w0uurj.js +1 -0
  43. package/build/assets/conversation-store-CC-isCnP.js +1 -0
  44. package/build/assets/{conversation-tab-empty-state-DyssnnWa.js → conversation-tab-empty-state-CStQLPVW.js} +1 -1
  45. package/build/assets/conversation-websocket-context-DShEuLjh.js +3 -0
  46. package/build/assets/{copy-DYgmUdIw.js → copy-Chg-sFu3.js} +1 -1
  47. package/build/assets/{custom-toast-handlers-C-SZFmto.js → custom-toast-handlers-ufGJ6_Rc.js} +1 -1
  48. package/build/assets/declaration-CR6HMp29.js +1 -0
  49. package/build/assets/{device-verify-DqDlphsG.js → device-verify-C6mj28zv.js} +1 -1
  50. package/build/assets/dist-DNeWJ2bh.js +1 -0
  51. package/build/assets/dropdown-classes-BsVmxlNG.js +1 -0
  52. package/build/assets/edit-automation-modal-DamwL0s0.js +1 -0
  53. package/build/assets/ellipsis-button-Vh5MvRZa.js +1 -0
  54. package/build/assets/entry.client-Cn71WM8q.js +2 -0
  55. package/build/assets/enum-filter-dropdown-5JeF2RLb.js +1 -0
  56. package/build/assets/{environment-switch-overlay-XL8yCGP6.js → environment-switch-overlay-Tf_BIfeR.js} +1 -1
  57. package/build/assets/extensions-hub-CUEmfvGy.js +1 -0
  58. package/build/assets/{extensions-navigation-BYR8Giqq.js → extensions-navigation-VQ-3umJ7.js} +1 -1
  59. package/build/assets/file-BTY6Gyy9.js +1 -0
  60. package/build/assets/files-tab-C47fQEeL.js +1 -0
  61. package/build/assets/files-tab-store-m0ARqX_E.js +1 -0
  62. package/build/assets/{folder-ZZJVGgd7.js → folder-D1T2W1cj.js} +1 -1
  63. package/build/assets/git-control-bar-branch-button-BT0aWH-o.js +27 -0
  64. package/build/assets/git-provider-icon-Pi-Cxpgv.js +1 -0
  65. package/build/assets/globe-Bzj_0oXT.js +1 -0
  66. package/build/assets/home-C3k6sFvB.js +1 -0
  67. package/build/assets/{i18n-CTohRuoO.js → i18n-DET2iOyh.js} +1 -1
  68. package/build/assets/install-server-modal-6fuq-TU6.js +1 -0
  69. package/build/assets/launch-DGghLfGx.js +1 -0
  70. package/build/assets/{lesson-plan-dH5Bj0pN.js → lesson-plan-duSsqWVs.js} +1 -1
  71. package/build/assets/link-external-DGxVm4Ps.js +1 -0
  72. package/build/assets/{llm-client-DaH1TuyR.js → llm-client-BqyLKgUN.js} +1 -1
  73. package/build/assets/llm-settings-BKraGtOu.js +1 -0
  74. package/build/assets/llm-settings-DRQTgOF1.js +1 -0
  75. package/build/assets/{loading-spinner-BPtYORNK.js → loading-spinner-5GT9q1xy.js} +1 -1
  76. package/build/assets/manage-backends-modal-CRMwyU0t.js +1 -0
  77. package/build/assets/manage-workspaces-modal-BYmGD1W7.js +1 -0
  78. package/build/assets/manifest-99b06a11.js +1 -0
  79. package/build/assets/{markdown-renderer-DMzf2i4x.js → markdown-renderer-B3IAVfv4.js} +1 -1
  80. package/build/assets/mcp-CfDRAmPn.js +9 -0
  81. package/build/assets/messages-Ba1vaw6t.js +36 -0
  82. package/build/assets/{modal-backdrop-BAbgYsqB.js → modal-backdrop-RfNCrSpK.js} +1 -1
  83. package/build/assets/{modal-body-BI6Ru2Qr.js → modal-body-aoa2fx5W.js} +1 -1
  84. package/build/assets/modal-classes-6YqcqA6y.js +1 -0
  85. package/build/assets/{modal-close-button-t1Gh3qmL.js → modal-close-button-CtWOUMmw.js} +1 -1
  86. package/build/assets/{model-selector-SM9IUz-q.js → model-selector-DcztJSxT.js} +1 -1
  87. package/build/assets/{navigation-context-D0YWpT8d.js → navigation-context-BdKYH32C.js} +1 -1
  88. package/build/assets/{navigation-link-Cn7KP3c5.js → navigation-link-U4vY9i_C.js} +1 -1
  89. package/build/assets/{openhands-logo-CnrF6LKb.js → openhands-logo-CCo0wJZX.js} +1 -1
  90. package/build/assets/{option-service.api-KvY_mZMY.js → option-service.api-CGNANEcT.js} +1 -1
  91. package/build/assets/{organization-service.api-DzYTHTYC.js → organization-service.api-BeuMC9QL.js} +1 -1
  92. package/build/assets/{path-utils-C3bQf6lJ.js → path-utils-z12iCrQO.js} +1 -1
  93. package/build/assets/{plan-components-atxXCF0R.js → plan-components-CRDMQzsS.js} +1 -1
  94. package/build/assets/{planner-tab-BlrCpv-7.js → planner-tab-Dte6Vzza.js} +1 -1
  95. package/build/assets/{profiles-client-D6IkTJof.js → profiles-client-BrqNmaDV.js} +1 -1
  96. package/build/assets/{providers-Bx6EfrzZ.js → providers-eUyo6pgr.js} +1 -1
  97. package/build/assets/proxy-BqDMnUY-.js +1 -0
  98. package/build/assets/{query-client-config-B7u9asM0.js → query-client-config-CRnGSujB.js} +1 -1
  99. package/build/assets/{recommended-automations-launcher-CgV8FyPK.js → recommended-automations-launcher-D5ADbXao.js} +3 -3
  100. package/build/assets/{root-dNntxffj.js → root-BmhaEJJ8.js} +2 -2
  101. package/build/assets/root-Z2VHU4R3.css +1 -0
  102. package/build/assets/root-layout-CNggm0d8.js +2 -0
  103. package/build/assets/{sdk-section-page-DOIKvwSL.js → sdk-section-page-CRCRY3PG.js} +1 -1
  104. package/build/assets/{sdk-settings-schema-DsUf9wu1.js → sdk-settings-schema-CLmJ9sho.js} +1 -1
  105. package/build/assets/{search-27Owlc3A.js → search-SuJctqNJ.js} +1 -1
  106. package/build/assets/secrets-service-B9AFn9OE.js +1 -0
  107. package/build/assets/secrets-settings-0UrKMS60.js +1 -0
  108. package/build/assets/{server-client-DyAQ3NZ_.js → server-client-DYv_GHPl.js} +1 -1
  109. package/build/assets/{settings-BYkVX7vW.js → settings-6t6LGW04.js} +1 -1
  110. package/build/assets/{settings-dropdown-input-BJYvGdg-.js → settings-dropdown-input-BtoovFre.js} +1 -1
  111. package/build/assets/{settings-gear-C77PgE_O.js → settings-gear-Dd8K2_8B.js} +1 -1
  112. package/build/assets/settings-index-CR6Ou73o.js +1 -0
  113. package/build/assets/{settings-input-Bn7F5C75.js → settings-input-CehsXnb3.js} +1 -1
  114. package/build/assets/settings-list-classes-E3v_f6QG.js +1 -0
  115. package/build/assets/settings-modal-T_Yk1Zfo.js +1 -0
  116. package/build/assets/{settings-section-header-context-BgZe5YkE.js → settings-section-header-context-DewwJ0-F.js} +1 -1
  117. package/build/assets/settings-service.api-DwtyDeGh.js +1 -0
  118. package/build/assets/{settings-switch-BeIKrWms.js → settings-switch-BiBuS3xa.js} +1 -1
  119. package/build/assets/{settings-utils-B6Nl07io.js → settings-utils-DY04tWG1.js} +1 -1
  120. package/build/assets/{shared-conversation-AMyqXvpk.js → shared-conversation-BzccsVej.js} +1 -1
  121. package/build/assets/sidebar-mobile-menu-toggle-DGlRg6jG.js +1 -0
  122. package/build/assets/{sidebar-nav-link-BGjiJq-4.js → sidebar-nav-link-dgVb8Fpy.js} +1 -1
  123. package/build/assets/{sidebar-store-Uy3v0AOV.js → sidebar-store-DnQAJAE5.js} +1 -1
  124. package/build/assets/{skill-card-pill-row-DF1axQCG.js → skill-card-pill-row-BW9qvhoK.js} +1 -1
  125. package/build/assets/{skills-ChIKZPK4.js → skills-0GRKX5Xj.js} +1 -1
  126. package/build/assets/{skills-plugins-CcI_19lM.js → skills-plugins-DctDrZ8Y.js} +1 -1
  127. package/build/assets/skills-settings-rvxImDj_.js +2 -0
  128. package/build/assets/{styled-tooltip-CBzrri6o.js → styled-tooltip-hdfMXPQC.js} +1 -1
  129. package/build/assets/{switch-skeleton-DnC9wLp7.js → switch-skeleton-DSKqSx2A.js} +1 -1
  130. package/build/assets/{task-list-tab-DUJn1sgz.js → task-list-tab-DT6_zfUs.js} +1 -1
  131. package/build/assets/{terminal-RmuaSdhJ.js → terminal-CPYWdo4j.js} +1 -1
  132. package/build/assets/{terminal-DgQk1Ay6.js → terminal-KldRPIRT.js} +2 -2
  133. package/build/assets/{toggle-switch-Pvyp2RAN.js → toggle-switch-T2v6sJ6l.js} +1 -1
  134. package/build/assets/{typography-gpuWmrQO.js → typography-BDgnT7Yp.js} +1 -1
  135. package/build/assets/{u-check-circle-IUIfACQQ.js → u-check-circle-DOauqQKb.js} +1 -1
  136. package/build/assets/{u-check-circle-half-C1YxB6py.js → u-check-circle-half-steSK_JB.js} +1 -1
  137. package/build/assets/{u-circuit-BmVikJHu.js → u-circuit-x3ExjBbU.js} +1 -1
  138. package/build/assets/{u-edit-CFvXHqZk.js → u-edit-BbrptMCa.js} +1 -1
  139. package/build/assets/{use-active-conversation-BEFNwnFk.js → use-active-conversation-sPgfSkql.js} +1 -1
  140. package/build/assets/use-agent-settings-schema-B66kGIi_.js +1 -0
  141. package/build/assets/{use-agent-state-Bkrd1FZq.js → use-agent-state-Dp3pD1h3.js} +1 -1
  142. package/build/assets/{use-cloud-current-user-id-CvkXFnTT.js → use-cloud-current-user-id-ClKFPjFz.js} +1 -1
  143. package/build/assets/{use-config-Co1O8-Ey.js → use-config-C9pvb0Sm.js} +1 -1
  144. package/build/assets/{use-create-conversation-CEgXpkfH.js → use-create-conversation-B-lwTnfE.js} +1 -1
  145. package/build/assets/{use-event-store-BT_gV3ut.js → use-event-store-BomO7ywK.js} +1 -1
  146. package/build/assets/{use-get-secrets-DuhdIA59.js → use-get-secrets-oyC7PFRz.js} +1 -1
  147. package/build/assets/{use-handle-plan-click-Ckkm5eIY.js → use-handle-plan-click-DP6Rs-YP.js} +1 -1
  148. package/build/assets/use-is-authed-dw2026rR.js +1 -0
  149. package/build/assets/{use-is-creating-conversation-BZ5hB_Bg.js → use-is-creating-conversation-DX2qSlfL.js} +1 -1
  150. package/build/assets/{use-launch-skill-in-chat-fNN_xGZG.js → use-launch-skill-in-chat-sQNEOLGD.js} +1 -1
  151. package/build/assets/use-llm-profiles-Bh5JqZUZ.js +1 -0
  152. package/build/assets/use-runtime-is-ready-BakOUVU-.js +1 -0
  153. package/build/assets/{use-save-settings-VUrj_QNG.js → use-save-settings-uXXkqvD7.js} +1 -1
  154. package/build/assets/use-settings-DeO7nvpM.js +1 -0
  155. package/build/assets/{use-settings-nav-items-1ZvovKSr.js → use-settings-nav-items-BGMFn25b.js} +1 -1
  156. package/build/assets/{use-skills-DAMLFjKU.js → use-skills-DWIK3l3a.js} +1 -1
  157. package/build/assets/{use-task-list-CLJbuJgM.js → use-task-list-CsT10CBb.js} +1 -1
  158. package/build/assets/{use-unified-vscode-url-DdSRw-6P.js → use-unified-vscode-url-DXPtB317.js} +1 -1
  159. package/build/assets/use-user-conversation-DJen4YIP.js +1 -0
  160. package/build/assets/{useMutation-DqrumCWD.js → useMutation-GSSKKebK.js} +1 -1
  161. package/build/assets/{useTranslation-DCOdSSMl.js → useTranslation-B6voJV4y.js} +1 -1
  162. package/build/assets/utils-DCVfKFRt.js +1 -0
  163. package/build/assets/{vendor~browser-BNjNhjFU.js → vendor~browser-BrOJLj3y.js} +1 -1
  164. package/build/assets/vendor~conversation-panel~conversation-C9o-K1hW.js +1 -0
  165. package/build/assets/vendor~conversation-panel~conversation~index-RXYdJYxU.js +1 -0
  166. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-VnmIZrq3.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-DJS-rJdI.js} +1 -1
  167. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DpAdkv8m.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-6ByzelMS.js} +1 -1
  168. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B92czPCF.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BED5W_c4.js} +1 -1
  169. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-By5W2oHN.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CCbqAFiI.js} +1 -1
  170. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BbFOrAjI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CG96FCly.js} +1 -1
  171. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-smY2r837.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-E4d6IEfI.js} +1 -1
  172. package/build/assets/{vendor~home~mcp~automations-list-Cs-TO3fK.js → vendor~home~mcp~automations-list-CZSK-lT2.js} +1 -1
  173. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-Z3nsiNNq.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CjJdFLoM.js} +1 -1
  174. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-DbfELDJu.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-m8dOii0J.js} +2 -2
  175. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-DjAjXS5J.js → vendor~root-layout~home~conversation-panel~conversation-B5WNMnt4.js} +1 -1
  176. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-CbAhtEMv.js +1 -0
  177. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-6Rm8U_Sr.js +9 -0
  178. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-BkQGKpye.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-tTR8C6m0.js} +1 -1
  179. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-Bbs7UJ5U.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-BJbu9kpL.js} +2 -2
  180. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-DTwbEEcX.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-D8soyAAx.js} +1 -1
  181. package/build/assets/{vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-CDXvdvb2.js → vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-DYXOLEck.js} +1 -1
  182. package/build/assets/{verification-settings-CsbvQcYS.js → verification-settings-C_zHuDx9.js} +1 -1
  183. package/build/assets/{vscode-tab-DjNArCgY.js → vscode-tab-DH9x7xXS.js} +1 -1
  184. package/build/assets/{waiting-for-runtime-message-CntjExbU.js → waiting-for-runtime-message-CdK3btDZ.js} +1 -1
  185. package/build/assets/{x-mark-CrpjscNc.js → x-mark-BrkSPIiT.js} +1 -1
  186. package/build/index.html +4 -4
  187. package/build/locales/ar/openhands.json +20 -2
  188. package/build/locales/ca/openhands.json +20 -2
  189. package/build/locales/de/openhands.json +20 -2
  190. package/build/locales/en/openhands.json +20 -2
  191. package/build/locales/es/openhands.json +20 -2
  192. package/build/locales/fr/openhands.json +20 -2
  193. package/build/locales/it/openhands.json +20 -2
  194. package/build/locales/ja/openhands.json +20 -2
  195. package/build/locales/ko-KR/openhands.json +20 -2
  196. package/build/locales/no/openhands.json +20 -2
  197. package/build/locales/pt/openhands.json +20 -2
  198. package/build/locales/tr/openhands.json +20 -2
  199. package/build/locales/uk/openhands.json +20 -2
  200. package/build/locales/zh-CN/openhands.json +20 -2
  201. package/build/locales/zh-TW/openhands.json +20 -2
  202. package/dist/api/acp-service/acp-service.api.d.ts +18 -0
  203. package/dist/api/agent-server-adapter.cjs +3 -3
  204. package/dist/api/agent-server-adapter.cjs.map +1 -1
  205. package/dist/api/agent-server-adapter.js +54 -55
  206. package/dist/api/agent-server-adapter.js.map +1 -1
  207. package/dist/api/agent-server-client-options.cjs +1 -1
  208. package/dist/api/agent-server-client-options.cjs.map +1 -1
  209. package/dist/api/agent-server-client-options.d.ts +4 -0
  210. package/dist/api/agent-server-client-options.js +18 -12
  211. package/dist/api/agent-server-client-options.js.map +1 -1
  212. package/dist/api/agent-server-compatibility.cjs +1 -1
  213. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  214. package/dist/api/agent-server-compatibility.d.ts +1 -1
  215. package/dist/api/agent-server-compatibility.js +30 -25
  216. package/dist/api/agent-server-compatibility.js.map +1 -1
  217. package/dist/api/agent-server-config.cjs +1 -1
  218. package/dist/api/agent-server-config.cjs.map +1 -1
  219. package/dist/api/agent-server-config.d.ts +15 -48
  220. package/dist/api/agent-server-config.js +25 -69
  221. package/dist/api/agent-server-config.js.map +1 -1
  222. package/dist/api/backend-registry/active-store.cjs +1 -1
  223. package/dist/api/backend-registry/active-store.cjs.map +1 -1
  224. package/dist/api/backend-registry/active-store.d.ts +11 -5
  225. package/dist/api/backend-registry/active-store.js +36 -27
  226. package/dist/api/backend-registry/active-store.js.map +1 -1
  227. package/dist/api/backend-registry/auth.cjs +1 -1
  228. package/dist/api/backend-registry/auth.cjs.map +1 -1
  229. package/dist/api/backend-registry/auth.js +3 -9
  230. package/dist/api/backend-registry/auth.js.map +1 -1
  231. package/dist/api/backend-registry/default-backend.cjs +1 -1
  232. package/dist/api/backend-registry/default-backend.cjs.map +1 -1
  233. package/dist/api/backend-registry/default-backend.d.ts +9 -16
  234. package/dist/api/backend-registry/default-backend.js +5 -4
  235. package/dist/api/backend-registry/default-backend.js.map +1 -1
  236. package/dist/api/backend-registry/storage.cjs +1 -1
  237. package/dist/api/backend-registry/storage.cjs.map +1 -1
  238. package/dist/api/backend-registry/storage.js +67 -34
  239. package/dist/api/backend-registry/storage.js.map +1 -1
  240. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  241. package/dist/api/cloud/conversation-service.api.d.ts +8 -13
  242. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  243. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  244. package/dist/api/cloud/organization-service.api.d.ts +1 -2
  245. package/dist/api/cloud/organization-service.api.js.map +1 -1
  246. package/dist/api/cloud/proxy.cjs +1 -1
  247. package/dist/api/cloud/proxy.cjs.map +1 -1
  248. package/dist/api/cloud/proxy.d.ts +6 -6
  249. package/dist/api/cloud/proxy.js +33 -24
  250. package/dist/api/cloud/proxy.js.map +1 -1
  251. package/dist/api/cloud/sandbox-service.api.cjs.map +1 -1
  252. package/dist/api/cloud/sandbox-service.api.d.ts +3 -3
  253. package/dist/api/cloud/sandbox-service.api.js.map +1 -1
  254. package/dist/api/cloud/secrets-service.api.cjs.map +1 -1
  255. package/dist/api/cloud/secrets-service.api.d.ts +3 -4
  256. package/dist/api/cloud/secrets-service.api.js.map +1 -1
  257. package/dist/api/cloud/settings-service.api.cjs +1 -1
  258. package/dist/api/cloud/settings-service.api.cjs.map +1 -1
  259. package/dist/api/cloud/settings-service.api.js +5 -1
  260. package/dist/api/cloud/settings-service.api.js.map +1 -1
  261. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  262. package/dist/api/cloud/skills-service.api.d.ts +5 -5
  263. package/dist/api/cloud/skills-service.api.js.map +1 -1
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  265. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  266. package/dist/api/conversation-service/agent-server-conversation-service.api.js +115 -108
  267. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  268. package/dist/api/device-flow-client.cjs +1 -1
  269. package/dist/api/device-flow-client.cjs.map +1 -1
  270. package/dist/api/device-flow-client.d.ts +3 -5
  271. package/dist/api/device-flow-client.js +55 -66
  272. package/dist/api/device-flow-client.js.map +1 -1
  273. package/dist/api/event-service/event-service.api.cjs +1 -1
  274. package/dist/api/event-service/event-service.api.cjs.map +1 -1
  275. package/dist/api/event-service/event-service.api.d.ts +3 -3
  276. package/dist/api/event-service/event-service.api.js +17 -17
  277. package/dist/api/event-service/event-service.api.js.map +1 -1
  278. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  279. package/dist/api/git-service/agent-server-git-service.api.js +11 -11
  280. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  281. package/dist/api/runtime-service/agent-server-runtime-service.js +6 -6
  282. package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.cjs +2 -2
  283. package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.js +10 -10
  284. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.cjs.map +1 -1
  285. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.d.ts +5 -5
  286. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.js.map +1 -1
  287. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +1 -1
  288. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  289. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +1 -1
  290. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  291. package/dist/components/features/automations/automation-action-button-classes.d.ts +2 -2
  292. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  293. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  294. package/dist/components/features/backends/backend-form-modal.d.ts +1 -0
  295. package/dist/components/features/backends/backend-form-modal.js +203 -140
  296. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  297. package/dist/components/features/backends/backend-selector.cjs +1 -1
  298. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  299. package/dist/components/features/backends/backend-selector.js +117 -105
  300. package/dist/components/features/backends/backend-selector.js.map +1 -1
  301. package/dist/components/features/backends/backend-status-dot.cjs +1 -1
  302. package/dist/components/features/backends/backend-status-dot.cjs.map +1 -1
  303. package/dist/components/features/backends/backend-status-dot.d.ts +1 -1
  304. package/dist/components/features/backends/backend-status-dot.js +1 -1
  305. package/dist/components/features/backends/backend-status-dot.js.map +1 -1
  306. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  307. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  308. package/dist/components/features/backends/manage-backends-modal.js +81 -70
  309. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  310. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  311. package/dist/components/features/chat/change-agent-button.cjs.map +1 -1
  312. package/dist/components/features/chat/change-agent-button.js +59 -57
  313. package/dist/components/features/chat/change-agent-button.js.map +1 -1
  314. package/dist/components/features/chat/change-agent-context-menu.cjs +1 -1
  315. package/dist/components/features/chat/change-agent-context-menu.cjs.map +1 -1
  316. package/dist/components/features/chat/change-agent-context-menu.d.ts +3 -1
  317. package/dist/components/features/chat/change-agent-context-menu.js +30 -25
  318. package/dist/components/features/chat/change-agent-context-menu.js.map +1 -1
  319. package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
  320. package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
  321. package/dist/components/features/chat/chat-add-file-button.js +39 -38
  322. package/dist/components/features/chat/chat-add-file-button.js.map +1 -1
  323. package/dist/components/features/chat/chat-message.cjs +1 -1
  324. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  325. package/dist/components/features/chat/chat-message.d.ts +2 -1
  326. package/dist/components/features/chat/chat-message.js +185 -57
  327. package/dist/components/features/chat/chat-message.js.map +1 -1
  328. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  329. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  330. package/dist/components/features/chat/components/chat-input-actions.js +113 -113
  331. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  332. package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
  333. package/dist/components/features/chat/components/chat-input-model.cjs.map +1 -1
  334. package/dist/components/features/chat/components/chat-input-model.js +52 -51
  335. package/dist/components/features/chat/components/chat-input-model.js.map +1 -1
  336. package/dist/components/features/chat/components/slash-command-menu.cjs +2 -2
  337. package/dist/components/features/chat/components/slash-command-menu.cjs.map +1 -1
  338. package/dist/components/features/chat/components/slash-command-menu.js +38 -34
  339. package/dist/components/features/chat/components/slash-command-menu.js.map +1 -1
  340. package/dist/components/features/chat/git-control-bar-pr-button.cjs +1 -1
  341. package/dist/components/features/chat/git-control-bar-pr-button.cjs.map +1 -1
  342. package/dist/components/features/chat/git-control-bar-pr-button.js +16 -15
  343. package/dist/components/features/chat/git-control-bar-pr-button.js.map +1 -1
  344. package/dist/components/features/chat/git-control-bar-pull-button.cjs +1 -1
  345. package/dist/components/features/chat/git-control-bar-pull-button.cjs.map +1 -1
  346. package/dist/components/features/chat/git-control-bar-pull-button.js +16 -15
  347. package/dist/components/features/chat/git-control-bar-pull-button.js.map +1 -1
  348. package/dist/components/features/chat/git-control-bar-push-button.cjs +1 -1
  349. package/dist/components/features/chat/git-control-bar-push-button.cjs.map +1 -1
  350. package/dist/components/features/chat/git-control-bar-push-button.js +16 -15
  351. package/dist/components/features/chat/git-control-bar-push-button.js.map +1 -1
  352. package/dist/components/features/chat/git-control-bar.cjs +1 -1
  353. package/dist/components/features/chat/git-control-bar.cjs.map +1 -1
  354. package/dist/components/features/chat/git-control-bar.js +63 -62
  355. package/dist/components/features/chat/git-control-bar.js.map +1 -1
  356. package/dist/components/features/chat/pending-user-messages.cjs +1 -1
  357. package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
  358. package/dist/components/features/chat/pending-user-messages.js +27 -23
  359. package/dist/components/features/chat/pending-user-messages.js.map +1 -1
  360. package/dist/components/features/chat/switch-profile-button.cjs +1 -1
  361. package/dist/components/features/chat/switch-profile-button.cjs.map +1 -1
  362. package/dist/components/features/chat/switch-profile-button.js +26 -25
  363. package/dist/components/features/chat/switch-profile-button.js.map +1 -1
  364. package/dist/components/features/chat/switch-profile-context-menu.cjs +1 -1
  365. package/dist/components/features/chat/switch-profile-context-menu.cjs.map +1 -1
  366. package/dist/components/features/chat/switch-profile-context-menu.js +77 -67
  367. package/dist/components/features/chat/switch-profile-context-menu.js.map +1 -1
  368. package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs +1 -1
  369. package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs.map +1 -1
  370. package/dist/components/features/context-menu/context-menu-icon-text-with-description.d.ts +2 -1
  371. package/dist/components/features/context-menu/context-menu-icon-text-with-description.js +3 -2
  372. package/dist/components/features/context-menu/context-menu-icon-text-with-description.js.map +1 -1
  373. package/dist/components/features/context-menu/context-menu-icon-text.cjs +1 -1
  374. package/dist/components/features/context-menu/context-menu-icon-text.cjs.map +1 -1
  375. package/dist/components/features/context-menu/context-menu-icon-text.d.ts +2 -1
  376. package/dist/components/features/context-menu/context-menu-icon-text.js +20 -10
  377. package/dist/components/features/context-menu/context-menu-icon-text.js.map +1 -1
  378. package/dist/components/features/context-menu/context-menu-list-item.cjs +1 -1
  379. package/dist/components/features/context-menu/context-menu-list-item.cjs.map +1 -1
  380. package/dist/components/features/context-menu/context-menu-list-item.js +10 -9
  381. package/dist/components/features/context-menu/context-menu-list-item.js.map +1 -1
  382. package/dist/components/features/controls/agent-status.cjs +1 -1
  383. package/dist/components/features/controls/agent-status.js +12 -12
  384. package/dist/components/features/controls/git-tools-submenu.cjs +1 -1
  385. package/dist/components/features/controls/git-tools-submenu.cjs.map +1 -1
  386. package/dist/components/features/controls/git-tools-submenu.js +1 -1
  387. package/dist/components/features/controls/git-tools-submenu.js.map +1 -1
  388. package/dist/components/features/controls/macros-submenu.cjs +1 -1
  389. package/dist/components/features/controls/macros-submenu.cjs.map +1 -1
  390. package/dist/components/features/controls/macros-submenu.js +1 -1
  391. package/dist/components/features/controls/macros-submenu.js.map +1 -1
  392. package/dist/components/features/controls/server-status-context-menu-icon-text.cjs +1 -1
  393. package/dist/components/features/controls/server-status-context-menu-icon-text.cjs.map +1 -1
  394. package/dist/components/features/controls/server-status-context-menu-icon-text.js +14 -15
  395. package/dist/components/features/controls/server-status-context-menu-icon-text.js.map +1 -1
  396. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  397. package/dist/components/features/controls/server-status-context-menu.js +4 -4
  398. package/dist/components/features/controls/server-status.cjs +1 -1
  399. package/dist/components/features/controls/server-status.js +7 -7
  400. package/dist/components/features/controls/tools-context-menu-icon-text.cjs +1 -1
  401. package/dist/components/features/controls/tools-context-menu-icon-text.cjs.map +1 -1
  402. package/dist/components/features/controls/tools-context-menu-icon-text.js +16 -16
  403. package/dist/components/features/controls/tools-context-menu-icon-text.js.map +1 -1
  404. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs +1 -1
  405. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs.map +1 -1
  406. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js +11 -11
  407. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js.map +1 -1
  408. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  409. package/dist/components/features/conversation/conversation-name-with-status.js +11 -11
  410. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  411. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  412. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +60 -47
  413. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  414. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
  415. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
  416. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +86 -82
  417. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
  418. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  419. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +4 -4
  420. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  421. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +9 -9
  422. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  423. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  424. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +93 -93
  425. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  426. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  427. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  428. package/dist/components/features/conversation-panel/conversation-panel.js +177 -177
  429. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  430. package/dist/components/features/conversation-panel/ellipsis-button.cjs +1 -1
  431. package/dist/components/features/conversation-panel/ellipsis-button.cjs.map +1 -1
  432. package/dist/components/features/conversation-panel/ellipsis-button.js +13 -13
  433. package/dist/components/features/conversation-panel/ellipsis-button.js.map +1 -1
  434. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
  435. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
  436. package/dist/components/features/conversation-panel/local-new-conversation-menu.js +57 -53
  437. package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
  438. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs +1 -1
  439. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs.map +1 -1
  440. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js +3 -2
  441. package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js.map +1 -1
  442. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs +1 -1
  443. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs.map +1 -1
  444. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js +11 -8
  445. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js.map +1 -1
  446. package/dist/components/features/conversation-panel/system-message-modal/tab-content.cjs.map +1 -1
  447. package/dist/components/features/conversation-panel/system-message-modal/tab-content.d.ts +2 -5
  448. package/dist/components/features/conversation-panel/system-message-modal/tab-content.js.map +1 -1
  449. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  450. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  451. package/dist/components/features/files-tab/file-content-viewer.js +45 -42
  452. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  453. package/dist/components/features/home/llm-not-configured-banner.d.ts +11 -0
  454. package/dist/components/features/home/shared/dropdown-item.cjs +1 -1
  455. package/dist/components/features/home/shared/dropdown-item.cjs.map +1 -1
  456. package/dist/components/features/home/shared/dropdown-item.js +20 -16
  457. package/dist/components/features/home/shared/dropdown-item.js.map +1 -1
  458. package/dist/components/features/home/shared/generic-dropdown-menu.cjs +1 -1
  459. package/dist/components/features/home/shared/generic-dropdown-menu.cjs.map +1 -1
  460. package/dist/components/features/home/shared/generic-dropdown-menu.js +23 -22
  461. package/dist/components/features/home/shared/generic-dropdown-menu.js.map +1 -1
  462. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
  463. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs.map +1 -1
  464. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +103 -102
  465. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js.map +1 -1
  466. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
  467. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs.map +1 -1
  468. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +68 -67
  469. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js.map +1 -1
  470. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  471. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  472. package/dist/components/features/mcp-page/custom-server-editor.js +62 -60
  473. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  474. package/dist/components/features/mcp-page/index.cjs +1 -1
  475. package/dist/components/features/mcp-page/index.d.ts +1 -0
  476. package/dist/components/features/mcp-page/index.js +1 -0
  477. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  478. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  479. package/dist/components/features/mcp-page/install-server-modal.js +141 -121
  480. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  481. package/dist/components/features/mcp-page/save-as-secret-toggle.cjs +2 -0
  482. package/dist/components/features/mcp-page/save-as-secret-toggle.cjs.map +1 -0
  483. package/dist/components/features/mcp-page/save-as-secret-toggle.d.ts +7 -0
  484. package/dist/components/features/mcp-page/save-as-secret-toggle.js +50 -0
  485. package/dist/components/features/mcp-page/save-as-secret-toggle.js.map +1 -0
  486. package/dist/components/features/onboarding/onboarding-modal.d.ts +2 -2
  487. package/dist/components/features/onboarding/steps/check-backend-step.d.ts +1 -1
  488. package/dist/components/features/onboarding/steps/choose-agent-step.d.ts +2 -1
  489. package/dist/components/features/onboarding/steps/setup-acp-secrets-step.d.ts +19 -10
  490. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  491. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.d.ts +5 -0
  492. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -0
  493. package/dist/components/features/settings/llm-profiles/profile-actions-menu.cjs +1 -1
  494. package/dist/components/features/settings/llm-profiles/profile-actions-menu.js +1 -0
  495. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  496. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  497. package/dist/components/features/skills/extensions-navigation.js +1 -1
  498. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  499. package/dist/components/shared/buttons/back-nav-button.cjs +2 -0
  500. package/dist/components/shared/buttons/back-nav-button.cjs.map +1 -0
  501. package/dist/components/shared/buttons/back-nav-button.d.ts +17 -0
  502. package/dist/components/shared/buttons/back-nav-button.js +33 -0
  503. package/dist/components/shared/buttons/back-nav-button.js.map +1 -0
  504. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  505. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +5 -5
  506. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  507. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  508. package/dist/components/shared/filters/enum-filter-dropdown.js +32 -31
  509. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  510. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  511. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  512. package/dist/components/shared/modals/confirmation-modals/base-modal.js +14 -13
  513. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  514. package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
  515. package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
  516. package/dist/components/shared/modals/settings/settings-modal.js +17 -16
  517. package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
  518. package/dist/components/shared/text-shimmer.cjs +2 -0
  519. package/dist/components/shared/text-shimmer.cjs.map +1 -0
  520. package/dist/components/shared/text-shimmer.d.ts +11 -0
  521. package/dist/components/shared/text-shimmer.js +43 -0
  522. package/dist/components/shared/text-shimmer.js.map +1 -0
  523. package/dist/constants/acp-providers.cjs +1 -1
  524. package/dist/constants/acp-providers.cjs.map +1 -1
  525. package/dist/constants/acp-providers.d.ts +16 -3
  526. package/dist/constants/acp-providers.js +0 -1
  527. package/dist/constants/acp-providers.js.map +1 -1
  528. package/dist/contexts/active-backend-context.cjs +1 -1
  529. package/dist/contexts/active-backend-context.cjs.map +1 -1
  530. package/dist/contexts/active-backend-context.js +32 -32
  531. package/dist/contexts/active-backend-context.js.map +1 -1
  532. package/dist/hooks/chat/use-chat-input-logic.cjs +1 -1
  533. package/dist/hooks/chat/use-chat-input-logic.cjs.map +1 -1
  534. package/dist/hooks/chat/use-chat-input-logic.js +13 -6
  535. package/dist/hooks/chat/use-chat-input-logic.js.map +1 -1
  536. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs +2 -0
  537. package/dist/hooks/mutation/use-save-fields-as-secrets.cjs.map +1 -0
  538. package/dist/hooks/mutation/use-save-fields-as-secrets.d.ts +9 -0
  539. package/dist/hooks/mutation/use-save-fields-as-secrets.js +24 -0
  540. package/dist/hooks/mutation/use-save-fields-as-secrets.js.map +1 -0
  541. package/dist/hooks/mutation/use-unified-start-conversation.cjs +1 -1
  542. package/dist/hooks/mutation/use-unified-start-conversation.js +8 -8
  543. package/dist/hooks/mutation/use-unified-stop-conversation.cjs +1 -1
  544. package/dist/hooks/mutation/use-unified-stop-conversation.js +15 -15
  545. package/dist/hooks/query/use-acp-auth-status.d.ts +36 -0
  546. package/dist/hooks/query/use-agent-settings-schema.cjs +1 -1
  547. package/dist/hooks/query/use-agent-settings-schema.cjs.map +1 -1
  548. package/dist/hooks/query/use-agent-settings-schema.js +26 -16
  549. package/dist/hooks/query/use-agent-settings-schema.js.map +1 -1
  550. package/dist/hooks/query/use-backends-health.cjs +1 -1
  551. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  552. package/dist/hooks/query/use-backends-health.d.ts +2 -0
  553. package/dist/hooks/query/use-backends-health.js +31 -21
  554. package/dist/hooks/query/use-backends-health.js.map +1 -1
  555. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  556. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  557. package/dist/hooks/query/use-paginated-conversations.js +15 -14
  558. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  559. package/dist/hooks/query/use-settings.cjs +1 -1
  560. package/dist/hooks/query/use-settings.cjs.map +1 -1
  561. package/dist/hooks/query/use-settings.js +65 -52
  562. package/dist/hooks/query/use-settings.js.map +1 -1
  563. package/dist/hooks/query/use-user-conversation.cjs +1 -1
  564. package/dist/hooks/query/use-user-conversation.cjs.map +1 -1
  565. package/dist/hooks/query/use-user-conversation.js +20 -11
  566. package/dist/hooks/query/use-user-conversation.js.map +1 -1
  567. package/dist/hooks/use-agent-state.cjs +1 -1
  568. package/dist/hooks/use-agent-state.js +13 -13
  569. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  570. package/dist/hooks/use-conversation-name-context-menu.js +10 -10
  571. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  572. package/dist/hooks/use-llm-configured.d.ts +25 -0
  573. package/dist/hooks/use-runtime-is-ready.cjs +1 -1
  574. package/dist/hooks/use-runtime-is-ready.js +5 -5
  575. package/dist/i18n/declaration.cjs +1 -1
  576. package/dist/i18n/declaration.cjs.map +1 -1
  577. package/dist/i18n/declaration.d.ts +19 -1
  578. package/dist/i18n/declaration.js +1 -1
  579. package/dist/i18n/declaration.js.map +1 -1
  580. package/dist/i18n/translation.cjs +3 -3
  581. package/dist/i18n/translation.cjs.map +1 -1
  582. package/dist/i18n/translation.js +321 -15
  583. package/dist/i18n/translation.js.map +1 -1
  584. package/dist/icons/stop-circle.cjs +1 -1
  585. package/dist/icons/stop-circle.cjs.map +1 -1
  586. package/dist/icons/stop-circle.js +7 -10
  587. package/dist/icons/stop-circle.js.map +1 -1
  588. package/dist/locales/ar/openhands.json +20 -2
  589. package/dist/locales/ca/openhands.json +20 -2
  590. package/dist/locales/de/openhands.json +20 -2
  591. package/dist/locales/en/openhands.json +20 -2
  592. package/dist/locales/es/openhands.json +20 -2
  593. package/dist/locales/fr/openhands.json +20 -2
  594. package/dist/locales/it/openhands.json +20 -2
  595. package/dist/locales/ja/openhands.json +20 -2
  596. package/dist/locales/ko-KR/openhands.json +20 -2
  597. package/dist/locales/no/openhands.json +20 -2
  598. package/dist/locales/pt/openhands.json +20 -2
  599. package/dist/locales/tr/openhands.json +20 -2
  600. package/dist/locales/uk/openhands.json +20 -2
  601. package/dist/locales/zh-CN/openhands.json +20 -2
  602. package/dist/locales/zh-TW/openhands.json +20 -2
  603. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs +2 -0
  604. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs.map +1 -0
  605. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
  606. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
  607. package/dist/package.cjs +1 -1
  608. package/dist/package.cjs.map +1 -1
  609. package/dist/package.js +1 -1
  610. package/dist/package.js.map +1 -1
  611. package/dist/routes/conversation.cjs +1 -1
  612. package/dist/routes/conversation.cjs.map +1 -1
  613. package/dist/routes/conversation.js +1 -1
  614. package/dist/routes/conversation.js.map +1 -1
  615. package/dist/routes/llm-settings.cjs +1 -1
  616. package/dist/routes/llm-settings.cjs.map +1 -1
  617. package/dist/routes/llm-settings.js +55 -54
  618. package/dist/routes/llm-settings.js.map +1 -1
  619. package/dist/routes/secrets-settings.cjs +1 -1
  620. package/dist/routes/secrets-settings.cjs.map +1 -1
  621. package/dist/routes/secrets-settings.js +19 -27
  622. package/dist/routes/secrets-settings.js.map +1 -1
  623. package/dist/stores/conversation-store.cjs +1 -1
  624. package/dist/stores/conversation-store.cjs.map +1 -1
  625. package/dist/stores/conversation-store.d.ts +4 -0
  626. package/dist/stores/conversation-store.js +6 -0
  627. package/dist/stores/conversation-store.js.map +1 -1
  628. package/dist/types/agent-server/core/events/acp-tool-call-event.d.ts +6 -4
  629. package/dist/types/agent-server/core/events/system-event.d.ts +5 -0
  630. package/dist/types/automation.d.ts +15 -0
  631. package/dist/types/settings.d.ts +3 -1
  632. package/dist/ui/combobox-caret.cjs +1 -1
  633. package/dist/ui/combobox-caret.cjs.map +1 -1
  634. package/dist/ui/combobox-caret.d.ts +1 -1
  635. package/dist/ui/combobox-caret.js +9 -8
  636. package/dist/ui/combobox-caret.js.map +1 -1
  637. package/dist/ui/context-menu.cjs +1 -1
  638. package/dist/ui/context-menu.cjs.map +1 -1
  639. package/dist/ui/context-menu.js +9 -8
  640. package/dist/ui/context-menu.js.map +1 -1
  641. package/dist/ui/dropdown/dropdown-menu.cjs +1 -1
  642. package/dist/ui/dropdown/dropdown-menu.cjs.map +1 -1
  643. package/dist/ui/dropdown/dropdown-menu.js +21 -17
  644. package/dist/ui/dropdown/dropdown-menu.js.map +1 -1
  645. package/dist/ui/dropdown/dropdown.cjs +1 -1
  646. package/dist/ui/dropdown/dropdown.cjs.map +1 -1
  647. package/dist/ui/dropdown/dropdown.js +2 -2
  648. package/dist/ui/dropdown/dropdown.js.map +1 -1
  649. package/dist/utils/automation-schedule.d.ts +1 -0
  650. package/dist/utils/dropdown-classes.cjs +2 -0
  651. package/dist/utils/dropdown-classes.cjs.map +1 -0
  652. package/dist/utils/dropdown-classes.d.ts +32 -0
  653. package/dist/utils/dropdown-classes.js +8 -0
  654. package/dist/utils/dropdown-classes.js.map +1 -0
  655. package/dist/utils/form-control-classes.cjs +1 -1
  656. package/dist/utils/form-control-classes.cjs.map +1 -1
  657. package/dist/utils/form-control-classes.d.ts +18 -2
  658. package/dist/utils/form-control-classes.js +4 -3
  659. package/dist/utils/form-control-classes.js.map +1 -1
  660. package/dist/utils/git-control-bar-classes.cjs +2 -0
  661. package/dist/utils/git-control-bar-classes.cjs.map +1 -0
  662. package/dist/utils/git-control-bar-classes.d.ts +4 -0
  663. package/dist/utils/git-control-bar-classes.js +14 -0
  664. package/dist/utils/git-control-bar-classes.js.map +1 -0
  665. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  666. package/dist/utils/handle-event-for-ui.d.ts +6 -3
  667. package/dist/utils/handle-event-for-ui.js.map +1 -1
  668. package/dist/utils/mobile-top-bar-icon-button-classes.cjs +1 -1
  669. package/dist/utils/mobile-top-bar-icon-button-classes.cjs.map +1 -1
  670. package/dist/utils/mobile-top-bar-icon-button-classes.js +3 -3
  671. package/dist/utils/mobile-top-bar-icon-button-classes.js.map +1 -1
  672. package/dist/utils/modal-classes.cjs +2 -0
  673. package/dist/utils/modal-classes.cjs.map +1 -0
  674. package/dist/utils/modal-classes.d.ts +8 -0
  675. package/dist/utils/modal-classes.js +7 -0
  676. package/dist/utils/modal-classes.js.map +1 -0
  677. package/dist/utils/openhands-llm.cjs +2 -0
  678. package/dist/utils/openhands-llm.cjs.map +1 -0
  679. package/dist/utils/openhands-llm.d.ts +2 -0
  680. package/dist/utils/openhands-llm.js +9 -0
  681. package/dist/utils/openhands-llm.js.map +1 -0
  682. package/dist/utils/redact-custom-secrets.cjs +2 -0
  683. package/dist/utils/redact-custom-secrets.cjs.map +1 -0
  684. package/dist/utils/redact-custom-secrets.d.ts +6 -0
  685. package/dist/utils/redact-custom-secrets.js +10 -0
  686. package/dist/utils/redact-custom-secrets.js.map +1 -0
  687. package/dist/utils/status.cjs +1 -1
  688. package/dist/utils/status.cjs.map +1 -1
  689. package/dist/utils/status.d.ts +2 -1
  690. package/dist/utils/status.js +9 -8
  691. package/dist/utils/status.js.map +1 -1
  692. package/dist/utils/system-message-adapter.cjs +1 -1
  693. package/dist/utils/system-message-adapter.cjs.map +1 -1
  694. package/dist/utils/system-message-adapter.js +10 -7
  695. package/dist/utils/system-message-adapter.js.map +1 -1
  696. package/dist/utils/utils.cjs +1 -1
  697. package/dist/utils/utils.cjs.map +1 -1
  698. package/dist/utils/utils.d.ts +2 -1
  699. package/dist/utils/utils.js +21 -20
  700. package/dist/utils/utils.js.map +1 -1
  701. package/package.json +1 -1
  702. package/scripts/dev-safe.mjs +3 -1
  703. package/scripts/dev-static.mjs +2 -2
  704. package/scripts/dev-with-automation.mjs +283 -108
  705. package/scripts/static-build.mjs +20 -19
  706. package/scripts/static-server.mjs +65 -6
  707. package/build/assets/acp-providers-CbiRekh9.js +0 -1
  708. package/build/assets/active-backend-context-cCM1vYYZ.js +0 -1
  709. package/build/assets/add-backend-modal-DIUQzMPa.js +0 -1
  710. package/build/assets/agent-server-client-options-Bc5ZorQZ.js +0 -1
  711. package/build/assets/agent-server-compatibility-BlkUsrX2.js +0 -1
  712. package/build/assets/agent-server-conversation-service.api-C2V5SlHu.js +0 -5
  713. package/build/assets/api-key-entry-screen-B2gynaCp.js +0 -1
  714. package/build/assets/automation-detail-DJvbVSYK.js +0 -1
  715. package/build/assets/automations-list-6FDbI5dc.js +0 -1
  716. package/build/assets/backend-form-modal-Dnk33xA_.js +0 -1
  717. package/build/assets/base-modal-_dYTw1ri.js +0 -1
  718. package/build/assets/brand-button-Br7f0kZJ.js +0 -1
  719. package/build/assets/browser-store-Couc4S5D.js +0 -1
  720. package/build/assets/clock-BRjCgHTc.js +0 -1
  721. package/build/assets/combobox-caret-to1O8irE.js +0 -1
  722. package/build/assets/context-menu-list-item-CWNFpuiC.js +0 -1
  723. package/build/assets/conversation-DVrKU0oz.js +0 -19
  724. package/build/assets/conversation-Dlys-D5A.js +0 -1
  725. package/build/assets/conversation-panel-iF09WjZ4.js +0 -1
  726. package/build/assets/conversation-service.api-CCfztilW.js +0 -1
  727. package/build/assets/conversation-state-store-u5jepov0.js +0 -1
  728. package/build/assets/conversation-store-Z5iMCRpc.js +0 -1
  729. package/build/assets/conversation-websocket-context-DhJhqUna.js +0 -3
  730. package/build/assets/declaration-BNMqORFE.js +0 -1
  731. package/build/assets/dist-BxBP7tFD.js +0 -1
  732. package/build/assets/edit-automation-modal-BGzR3nfZ.js +0 -1
  733. package/build/assets/ellipsis-button-ZyLMPURn.js +0 -1
  734. package/build/assets/entry.client-1VMHpktY.js +0 -2
  735. package/build/assets/enum-filter-dropdown-CEgCdu4A.js +0 -1
  736. package/build/assets/extensions-hub-C651jsVh.js +0 -1
  737. package/build/assets/files-tab-R5z0lLdY.js +0 -1
  738. package/build/assets/files-tab-store-CDyVTXNT.js +0 -1
  739. package/build/assets/git-control-bar-branch-button-COdRAYHb.js +0 -27
  740. package/build/assets/git-provider-icon-BzLbc0yC.js +0 -1
  741. package/build/assets/home-e-egNUXZ.js +0 -1
  742. package/build/assets/install-server-modal-DHlbgqVH.js +0 -1
  743. package/build/assets/launch-CshDse3e.js +0 -1
  744. package/build/assets/link-external-D2POYx4c.js +0 -1
  745. package/build/assets/llm-settings-Bql-vydt.js +0 -1
  746. package/build/assets/llm-settings-C_tal6Ds.js +0 -1
  747. package/build/assets/manage-backends-modal-l7RkKfwX.js +0 -1
  748. package/build/assets/manage-workspaces-modal-DhKF_8z3.js +0 -1
  749. package/build/assets/manifest-3bf30d69.js +0 -1
  750. package/build/assets/mcp-ByeBfdfU.js +0 -9
  751. package/build/assets/messages-D0rWot7s.js +0 -36
  752. package/build/assets/proxy-CxydCnis.js +0 -1
  753. package/build/assets/root-DHeCXo9N.css +0 -1
  754. package/build/assets/root-layout-Czo9Ma6Q.js +0 -2
  755. package/build/assets/secrets-service-BsnKFc2x.js +0 -1
  756. package/build/assets/secrets-settings-Bz_UohPJ.js +0 -1
  757. package/build/assets/settings-client-C73C7IgV.js +0 -1
  758. package/build/assets/settings-index-Dz0BmdJD.js +0 -1
  759. package/build/assets/settings-list-classes-Bf80tWtc.js +0 -1
  760. package/build/assets/settings-modal-Brzgh5Yw.js +0 -1
  761. package/build/assets/settings-service.api-CZ3uWx4v.js +0 -1
  762. package/build/assets/sidebar-mobile-menu-toggle-Do_aA9Zm.js +0 -1
  763. package/build/assets/skills-settings-DlA5hlXw.js +0 -2
  764. package/build/assets/status-hp6M6E7E.js +0 -1
  765. package/build/assets/use-agent-settings-schema-33Un7UF2.js +0 -1
  766. package/build/assets/use-is-authed-BggE5wPj.js +0 -1
  767. package/build/assets/use-llm-profiles-DDOol3gK.js +0 -1
  768. package/build/assets/use-runtime-is-ready-B7EF4BKU.js +0 -1
  769. package/build/assets/use-settings-DQIZmIov.js +0 -1
  770. package/build/assets/use-user-conversation-C6hrMMtn.js +0 -1
  771. package/build/assets/utils-i18rdUj2.js +0 -1
  772. package/build/assets/vendor~conversation-panel~conversation-a9SyrrhV.js +0 -1
  773. package/build/assets/vendor~conversation-panel~conversation~index-C23ZXO4R.js +0 -1
  774. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js +0 -1
  775. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DzIXV3Ui.js +0 -9
  776. /package/build/assets/{automation-IdgZq6ZK.js → automation-XDPAjiZi.js} +0 -0
  777. /package/build/assets/{color-themes-DSaoIL6A.js → color-themes-B9pm9c-R.js} +0 -0
  778. /package/build/assets/{common-DR1t-EeP.js → common-DqjLSBOt.js} +0 -0
  779. /package/build/assets/{conversation-local-storage-UYl-SX-r.js → conversation-local-storage-YmOVXxxW.js} +0 -0
  780. /package/build/assets/{dist-C6t0EXL7.js → dist-C3NfioQC.js} +0 -0
  781. /package/build/assets/{environment-switch-store-C4ulFJKp.js → environment-switch-store-CiurvTtK.js} +0 -0
  782. /package/build/assets/{health-store-BDC2rM-X.js → health-store-B5f0S2FY.js} +0 -0
  783. /package/build/assets/{map-provider-COBVzZYo.js → map-provider-BJ_8KZKU.js} +0 -0
  784. /package/build/assets/{middleware-BC9EwbB9.js → middleware-CfatjPYZ.js} +0 -0
  785. /package/build/assets/{objectWithoutPropertiesLoose-Du6eBn-V.js → objectWithoutPropertiesLoose-DSQKyRhw.js} +0 -0
  786. /package/build/assets/{react-Do0CT17Y.js → react-Dy05vyj5.js} +0 -0
  787. /package/build/assets/{sdk-settings-field-metadata-CBPmeqYa.js → sdk-settings-field-metadata-DQiaIBie.js} +0 -0
  788. /package/build/assets/{settings-D_H-qsRm.js → settings-DGY6n4J2.js} +0 -0
  789. /package/build/assets/{settings-like-page-layout-classes-I0BDBEoq.js → settings-like-page-layout-classes-D7YjdTd0.js} +0 -0
  790. /package/build/assets/{use-breakpoint-DbJ6FkQ-.js → use-breakpoint-DF_RiQ6s.js} +0 -0
  791. /package/build/assets/{use-click-outside-element-DffgWWoZ.js → use-click-outside-element-DhxCUyWl.js} +0 -0
  792. /package/build/assets/{v4-CNn21NXa.js → v4-khGvL7i2.js} +0 -0
  793. /package/build/assets/{vendor~browser-DDiZgqD3.js → vendor~browser-DisFGEp9.js} +0 -0
  794. /package/build/assets/{vendor~browser-tab-BgwV1mxF.js → vendor~browser-tab-BxhTtM9_.js} +0 -0
  795. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DbvX3OcM.js → vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js} +0 -0
  796. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-iOsylxCS.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-BClAMeFe.js} +0 -0
  797. /package/build/assets/{vendor~files-tab-BGKayPiK.js → vendor~files-tab-BtkpAiMX.js} +0 -0
  798. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BW6261Sb.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CyZ-3lDQ.js} +0 -0
  799. /package/build/assets/{vendor~home~mcp~automations-list-DoPfwaXj.js → vendor~home~mcp~automations-list-BgV86Sti.js} +0 -0
  800. /package/build/assets/{vendor~launch-vdeRTWFu.js → vendor~launch-BXgl67Re.js} +0 -0
  801. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-D9P8e98a.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-CLlsvdNP.js} +0 -0
  802. /package/build/assets/{vendor~terminal-DUrOWGFE.js → vendor~terminal-DZaJIY8A.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown.cjs","names":[],"sources":["../../../src/ui/dropdown/dropdown.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useCombobox } from \"downshift\";\nimport { cn } from \"#/utils/utils\";\nimport { DropdownOption } from \"./types\";\nimport { formControlShellClassName } from \"#/utils/form-control-classes\";\nimport { LoadingSpinner } from \"./loading-spinner\";\nimport { ClearButton } from \"./clear-button\";\nimport { ToggleButton } from \"./toggle-button\";\nimport { DropdownMenu } from \"./dropdown-menu\";\nimport { DropdownInput } from \"./dropdown-input\";\n\n// Equivalent to Tailwind's `sr-only`, inlined so we don't depend on the\n// utility class being preserved by the host project's CSS pipeline.\nconst visuallyHiddenStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n};\n\ninterface DropdownProps {\n options: DropdownOption[];\n emptyMessage?: string;\n clearable?: boolean;\n loading?: boolean;\n disabled?: boolean;\n placeholder?: string;\n defaultValue?: DropdownOption;\n onChange?: (item: DropdownOption | null) => void;\n testId?: string;\n className?: string;\n footer?: React.ReactNode;\n openUpward?: boolean;\n hideTrigger?: boolean;\n defaultOpen?: boolean;\n /** Open the dropdown menu on hover instead of requiring a click. */\n openOnHover?: boolean;\n /** When false, the combobox placeholder uses normal (non-italic) type. */\n italicPlaceholder?: boolean;\n /** Size the trigger to its label instead of stretching to the container width. */\n fitContent?: boolean;\n}\n\nexport function Dropdown({\n options,\n emptyMessage = \"No options\",\n clearable = false,\n loading = false,\n disabled = false,\n placeholder,\n defaultValue,\n onChange,\n testId,\n className,\n footer,\n openUpward = false,\n hideTrigger = false,\n defaultOpen = false,\n openOnHover = false,\n italicPlaceholder = true,\n fitContent = false,\n}: DropdownProps) {\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const [inputValue, setInputValue] = useState(defaultValue?.label ?? \"\");\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const filteredOptions = options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase()),\n );\n\n const {\n isOpen,\n selectedItem,\n selectItem,\n openMenu,\n closeMenu,\n getToggleButtonProps,\n getMenuProps,\n getItemProps,\n getInputProps,\n } = useCombobox({\n items: filteredOptions,\n itemToString: (item) => item?.label ?? \"\",\n inputValue,\n stateReducer: (state, actionAndChanges) =>\n actionAndChanges.type === useCombobox.stateChangeTypes.InputClick &&\n state.isOpen\n ? { ...actionAndChanges.changes, isOpen: true }\n : actionAndChanges.changes,\n initialIsOpen: defaultOpen,\n onInputValueChange: ({ inputValue: newValue }) => {\n setInputValue(newValue ?? \"\");\n setSearchTerm(newValue ?? \"\");\n },\n defaultSelectedItem: defaultValue,\n onSelectedItemChange: ({ selectedItem: newSelectedItem }) => {\n onChange?.(newSelectedItem ?? null);\n },\n onIsOpenChange: ({\n isOpen: newIsOpen,\n selectedItem: currentSelectedItem,\n }) => {\n if (newIsOpen) {\n // Clear the input on open so the user sees an empty search box\n // (with the placeholder reminding them of the current value)\n // and the full options list. Otherwise the active label would\n // appear both in the trigger AND as the highlighted menu row.\n setInputValue(\"\");\n setSearchTerm(\"\");\n } else {\n setInputValue(currentSelectedItem?.label ?? \"\");\n setSearchTerm(\"\");\n }\n },\n });\n\n const isDisabled = loading || disabled;\n\n // `selectedItem` is downshift's internal state, frozen to whatever\n // initialized it. Resolve the currently selected option against the\n // live `options` array so per-option fields like `prefix` (e.g. a\n // status indicator that re-renders on a timer) update on the trigger\n // without remounting the dropdown.\n const liveSelectedOption = selectedItem\n ? (options.find((o) => o.value === selectedItem.value) ?? selectedItem)\n : null;\n\n // Wrap getInputProps to inject a direct onChange handler that preserves\n // cursor position. Downshift's default onInputValueChange resets cursor\n // to end of input on every keystroke; reading from e.target.value keeps\n // the browser's native cursor position intact.\n const getInputPropsWithCursorFix = (props?: object) =>\n getInputProps({\n ...props,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n setSearchTerm(e.target.value);\n },\n });\n\n return (\n <div\n className={cn(\"relative\", fitContent ? \"inline-block w-auto\" : \"w-full\")}\n data-testid={testId}\n onMouseEnter={\n openOnHover\n ? () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n openMenu();\n }\n : undefined\n }\n onMouseLeave={\n openOnHover\n ? () => {\n closeTimerRef.current = setTimeout(() => closeMenu(), 150);\n }\n : undefined\n }\n >\n {!hideTrigger ? (\n <div\n className={cn(\n \"bg-tertiary border border-[var(--oh-border-input)] rounded p-2\",\n \"flex items-center gap-2\",\n fitContent ? \"w-auto\" : \"w-full\",\n formControlShellClassName,\n \"group w-full gap-2 px-3 text-[var(--oh-muted)] hover:text-white\",\n isDisabled && \"cursor-not-allowed opacity-60\",\n className,\n )}\n >\n {liveSelectedOption?.prefix ? (\n <span className=\"flex items-center shrink-0\">\n {liveSelectedOption.prefix}\n </span>\n ) : null}\n <DropdownInput\n placeholder={placeholder}\n isDisabled={isDisabled}\n getInputProps={getInputPropsWithCursorFix}\n italicPlaceholder={italicPlaceholder}\n fitContent={fitContent}\n />\n {loading && <LoadingSpinner />}\n {clearable && selectedItem && (\n <ClearButton onClear={() => selectItem(null)} />\n )}\n <ToggleButton\n isOpen={isOpen}\n isDisabled={isDisabled}\n getToggleButtonProps={getToggleButtonProps}\n />\n </div>\n ) : (\n // downshift's useCombobox always expects getInputProps() (and the\n // toggle button) to be wired up. When the trigger is hidden (e.g.\n // collapsed-sidebar popover) we still need to mount a real input\n // so it stops warning every render. Keep it visually hidden but\n // present in the DOM for accessibility.\n <>\n <input\n {...getInputPropsWithCursorFix({\n \"aria-label\": placeholder ?? \"Filter options\",\n tabIndex: -1,\n })}\n style={visuallyHiddenStyle}\n />\n <button\n type=\"button\"\n {...getToggleButtonProps({ tabIndex: -1 })}\n style={visuallyHiddenStyle}\n aria-hidden\n />\n </>\n )}\n <DropdownMenu\n isOpen={isOpen}\n filteredOptions={filteredOptions}\n selectedItem={selectedItem}\n emptyMessage={emptyMessage}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n footer={footer}\n openUpward={openUpward}\n fitContent={fitContent}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dropdown.cjs","names":[],"sources":["../../../src/ui/dropdown/dropdown.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useCombobox } from \"downshift\";\nimport { cn } from \"#/utils/utils\";\nimport { DropdownOption } from \"./types\";\nimport { dropdownTriggerShellClassName } from \"#/utils/dropdown-classes\";\nimport { LoadingSpinner } from \"./loading-spinner\";\nimport { ClearButton } from \"./clear-button\";\nimport { ToggleButton } from \"./toggle-button\";\nimport { DropdownMenu } from \"./dropdown-menu\";\nimport { DropdownInput } from \"./dropdown-input\";\n\n// Equivalent to Tailwind's `sr-only`, inlined so we don't depend on the\n// utility class being preserved by the host project's CSS pipeline.\nconst visuallyHiddenStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n};\n\ninterface DropdownProps {\n options: DropdownOption[];\n emptyMessage?: string;\n clearable?: boolean;\n loading?: boolean;\n disabled?: boolean;\n placeholder?: string;\n defaultValue?: DropdownOption;\n onChange?: (item: DropdownOption | null) => void;\n testId?: string;\n className?: string;\n footer?: React.ReactNode;\n openUpward?: boolean;\n hideTrigger?: boolean;\n defaultOpen?: boolean;\n /** Open the dropdown menu on hover instead of requiring a click. */\n openOnHover?: boolean;\n /** When false, the combobox placeholder uses normal (non-italic) type. */\n italicPlaceholder?: boolean;\n /** Size the trigger to its label instead of stretching to the container width. */\n fitContent?: boolean;\n}\n\nexport function Dropdown({\n options,\n emptyMessage = \"No options\",\n clearable = false,\n loading = false,\n disabled = false,\n placeholder,\n defaultValue,\n onChange,\n testId,\n className,\n footer,\n openUpward = false,\n hideTrigger = false,\n defaultOpen = false,\n openOnHover = false,\n italicPlaceholder = true,\n fitContent = false,\n}: DropdownProps) {\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const [inputValue, setInputValue] = useState(defaultValue?.label ?? \"\");\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const filteredOptions = options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase()),\n );\n\n const {\n isOpen,\n selectedItem,\n selectItem,\n openMenu,\n closeMenu,\n getToggleButtonProps,\n getMenuProps,\n getItemProps,\n getInputProps,\n } = useCombobox({\n items: filteredOptions,\n itemToString: (item) => item?.label ?? \"\",\n inputValue,\n stateReducer: (state, actionAndChanges) =>\n actionAndChanges.type === useCombobox.stateChangeTypes.InputClick &&\n state.isOpen\n ? { ...actionAndChanges.changes, isOpen: true }\n : actionAndChanges.changes,\n initialIsOpen: defaultOpen,\n onInputValueChange: ({ inputValue: newValue }) => {\n setInputValue(newValue ?? \"\");\n setSearchTerm(newValue ?? \"\");\n },\n defaultSelectedItem: defaultValue,\n onSelectedItemChange: ({ selectedItem: newSelectedItem }) => {\n onChange?.(newSelectedItem ?? null);\n },\n onIsOpenChange: ({\n isOpen: newIsOpen,\n selectedItem: currentSelectedItem,\n }) => {\n if (newIsOpen) {\n // Clear the input on open so the user sees an empty search box\n // (with the placeholder reminding them of the current value)\n // and the full options list. Otherwise the active label would\n // appear both in the trigger AND as the highlighted menu row.\n setInputValue(\"\");\n setSearchTerm(\"\");\n } else {\n setInputValue(currentSelectedItem?.label ?? \"\");\n setSearchTerm(\"\");\n }\n },\n });\n\n const isDisabled = loading || disabled;\n\n // `selectedItem` is downshift's internal state, frozen to whatever\n // initialized it. Resolve the currently selected option against the\n // live `options` array so per-option fields like `prefix` (e.g. a\n // status indicator that re-renders on a timer) update on the trigger\n // without remounting the dropdown.\n const liveSelectedOption = selectedItem\n ? (options.find((o) => o.value === selectedItem.value) ?? selectedItem)\n : null;\n\n // Wrap getInputProps to inject a direct onChange handler that preserves\n // cursor position. Downshift's default onInputValueChange resets cursor\n // to end of input on every keystroke; reading from e.target.value keeps\n // the browser's native cursor position intact.\n const getInputPropsWithCursorFix = (props?: object) =>\n getInputProps({\n ...props,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n setSearchTerm(e.target.value);\n },\n });\n\n return (\n <div\n className={cn(\"relative\", fitContent ? \"inline-block w-auto\" : \"w-full\")}\n data-testid={testId}\n onMouseEnter={\n openOnHover\n ? () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n openMenu();\n }\n : undefined\n }\n onMouseLeave={\n openOnHover\n ? () => {\n closeTimerRef.current = setTimeout(() => closeMenu(), 150);\n }\n : undefined\n }\n >\n {!hideTrigger ? (\n <div\n className={cn(\n dropdownTriggerShellClassName,\n fitContent ? \"w-auto\" : \"w-full\",\n isDisabled && \"cursor-not-allowed opacity-60\",\n className,\n )}\n >\n {liveSelectedOption?.prefix ? (\n <span className=\"flex items-center shrink-0\">\n {liveSelectedOption.prefix}\n </span>\n ) : null}\n <DropdownInput\n placeholder={placeholder}\n isDisabled={isDisabled}\n getInputProps={getInputPropsWithCursorFix}\n italicPlaceholder={italicPlaceholder}\n fitContent={fitContent}\n />\n {loading && <LoadingSpinner />}\n {clearable && selectedItem && (\n <ClearButton onClear={() => selectItem(null)} />\n )}\n <ToggleButton\n isOpen={isOpen}\n isDisabled={isDisabled}\n getToggleButtonProps={getToggleButtonProps}\n />\n </div>\n ) : (\n // downshift's useCombobox always expects getInputProps() (and the\n // toggle button) to be wired up. When the trigger is hidden (e.g.\n // collapsed-sidebar popover) we still need to mount a real input\n // so it stops warning every render. Keep it visually hidden but\n // present in the DOM for accessibility.\n <>\n <input\n {...getInputPropsWithCursorFix({\n \"aria-label\": placeholder ?? \"Filter options\",\n tabIndex: -1,\n })}\n style={visuallyHiddenStyle}\n />\n <button\n type=\"button\"\n {...getToggleButtonProps({ tabIndex: -1 })}\n style={visuallyHiddenStyle}\n aria-hidden\n />\n </>\n )}\n <DropdownMenu\n isOpen={isOpen}\n filteredOptions={filteredOptions}\n selectedItem={selectedItem}\n emptyMessage={emptyMessage}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n footer={footer}\n openUpward={openUpward}\n fitContent={fitContent}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { cn as e } from "../../utils/utils.js";
2
- import { formControlShellClassName as t } from "../../utils/form-control-classes.js";
2
+ import { dropdownTriggerShellClassName as t } from "../../utils/dropdown-classes.js";
3
3
  import { useCombobox as n } from "../../node_modules/downshift/dist/downshift.esm.js";
4
4
  import { LoadingSpinner as r } from "./loading-spinner.js";
5
5
  import { ClearButton as i } from "./clear-button.js";
@@ -67,7 +67,7 @@ function m({ options: m, emptyMessage: h = "No options", clearable: g = !1, load
67
67
  style: p,
68
68
  "aria-hidden": !0
69
69
  })] }) : /* @__PURE__ */ f("div", {
70
- className: e("bg-tertiary border border-[var(--oh-border-input)] rounded p-2", "flex items-center gap-2", A ? "w-auto" : "w-full", t, "group w-full gap-2 px-3 text-[var(--oh-muted)] hover:text-white", K && "cursor-not-allowed opacity-60", C),
70
+ className: e(t, A ? "w-auto" : "w-full", K && "cursor-not-allowed opacity-60", C),
71
71
  children: [
72
72
  q?.prefix ? /* @__PURE__ */ d("span", {
73
73
  className: "flex items-center shrink-0",
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown.js","names":[],"sources":["../../../src/ui/dropdown/dropdown.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useCombobox } from \"downshift\";\nimport { cn } from \"#/utils/utils\";\nimport { DropdownOption } from \"./types\";\nimport { formControlShellClassName } from \"#/utils/form-control-classes\";\nimport { LoadingSpinner } from \"./loading-spinner\";\nimport { ClearButton } from \"./clear-button\";\nimport { ToggleButton } from \"./toggle-button\";\nimport { DropdownMenu } from \"./dropdown-menu\";\nimport { DropdownInput } from \"./dropdown-input\";\n\n// Equivalent to Tailwind's `sr-only`, inlined so we don't depend on the\n// utility class being preserved by the host project's CSS pipeline.\nconst visuallyHiddenStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n};\n\ninterface DropdownProps {\n options: DropdownOption[];\n emptyMessage?: string;\n clearable?: boolean;\n loading?: boolean;\n disabled?: boolean;\n placeholder?: string;\n defaultValue?: DropdownOption;\n onChange?: (item: DropdownOption | null) => void;\n testId?: string;\n className?: string;\n footer?: React.ReactNode;\n openUpward?: boolean;\n hideTrigger?: boolean;\n defaultOpen?: boolean;\n /** Open the dropdown menu on hover instead of requiring a click. */\n openOnHover?: boolean;\n /** When false, the combobox placeholder uses normal (non-italic) type. */\n italicPlaceholder?: boolean;\n /** Size the trigger to its label instead of stretching to the container width. */\n fitContent?: boolean;\n}\n\nexport function Dropdown({\n options,\n emptyMessage = \"No options\",\n clearable = false,\n loading = false,\n disabled = false,\n placeholder,\n defaultValue,\n onChange,\n testId,\n className,\n footer,\n openUpward = false,\n hideTrigger = false,\n defaultOpen = false,\n openOnHover = false,\n italicPlaceholder = true,\n fitContent = false,\n}: DropdownProps) {\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const [inputValue, setInputValue] = useState(defaultValue?.label ?? \"\");\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const filteredOptions = options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase()),\n );\n\n const {\n isOpen,\n selectedItem,\n selectItem,\n openMenu,\n closeMenu,\n getToggleButtonProps,\n getMenuProps,\n getItemProps,\n getInputProps,\n } = useCombobox({\n items: filteredOptions,\n itemToString: (item) => item?.label ?? \"\",\n inputValue,\n stateReducer: (state, actionAndChanges) =>\n actionAndChanges.type === useCombobox.stateChangeTypes.InputClick &&\n state.isOpen\n ? { ...actionAndChanges.changes, isOpen: true }\n : actionAndChanges.changes,\n initialIsOpen: defaultOpen,\n onInputValueChange: ({ inputValue: newValue }) => {\n setInputValue(newValue ?? \"\");\n setSearchTerm(newValue ?? \"\");\n },\n defaultSelectedItem: defaultValue,\n onSelectedItemChange: ({ selectedItem: newSelectedItem }) => {\n onChange?.(newSelectedItem ?? null);\n },\n onIsOpenChange: ({\n isOpen: newIsOpen,\n selectedItem: currentSelectedItem,\n }) => {\n if (newIsOpen) {\n // Clear the input on open so the user sees an empty search box\n // (with the placeholder reminding them of the current value)\n // and the full options list. Otherwise the active label would\n // appear both in the trigger AND as the highlighted menu row.\n setInputValue(\"\");\n setSearchTerm(\"\");\n } else {\n setInputValue(currentSelectedItem?.label ?? \"\");\n setSearchTerm(\"\");\n }\n },\n });\n\n const isDisabled = loading || disabled;\n\n // `selectedItem` is downshift's internal state, frozen to whatever\n // initialized it. Resolve the currently selected option against the\n // live `options` array so per-option fields like `prefix` (e.g. a\n // status indicator that re-renders on a timer) update on the trigger\n // without remounting the dropdown.\n const liveSelectedOption = selectedItem\n ? (options.find((o) => o.value === selectedItem.value) ?? selectedItem)\n : null;\n\n // Wrap getInputProps to inject a direct onChange handler that preserves\n // cursor position. Downshift's default onInputValueChange resets cursor\n // to end of input on every keystroke; reading from e.target.value keeps\n // the browser's native cursor position intact.\n const getInputPropsWithCursorFix = (props?: object) =>\n getInputProps({\n ...props,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n setSearchTerm(e.target.value);\n },\n });\n\n return (\n <div\n className={cn(\"relative\", fitContent ? \"inline-block w-auto\" : \"w-full\")}\n data-testid={testId}\n onMouseEnter={\n openOnHover\n ? () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n openMenu();\n }\n : undefined\n }\n onMouseLeave={\n openOnHover\n ? () => {\n closeTimerRef.current = setTimeout(() => closeMenu(), 150);\n }\n : undefined\n }\n >\n {!hideTrigger ? (\n <div\n className={cn(\n \"bg-tertiary border border-[var(--oh-border-input)] rounded p-2\",\n \"flex items-center gap-2\",\n fitContent ? \"w-auto\" : \"w-full\",\n formControlShellClassName,\n \"group w-full gap-2 px-3 text-[var(--oh-muted)] hover:text-white\",\n isDisabled && \"cursor-not-allowed opacity-60\",\n className,\n )}\n >\n {liveSelectedOption?.prefix ? (\n <span className=\"flex items-center shrink-0\">\n {liveSelectedOption.prefix}\n </span>\n ) : null}\n <DropdownInput\n placeholder={placeholder}\n isDisabled={isDisabled}\n getInputProps={getInputPropsWithCursorFix}\n italicPlaceholder={italicPlaceholder}\n fitContent={fitContent}\n />\n {loading && <LoadingSpinner />}\n {clearable && selectedItem && (\n <ClearButton onClear={() => selectItem(null)} />\n )}\n <ToggleButton\n isOpen={isOpen}\n isDisabled={isDisabled}\n getToggleButtonProps={getToggleButtonProps}\n />\n </div>\n ) : (\n // downshift's useCombobox always expects getInputProps() (and the\n // toggle button) to be wired up. When the trigger is hidden (e.g.\n // collapsed-sidebar popover) we still need to mount a real input\n // so it stops warning every render. Keep it visually hidden but\n // present in the DOM for accessibility.\n <>\n <input\n {...getInputPropsWithCursorFix({\n \"aria-label\": placeholder ?? \"Filter options\",\n tabIndex: -1,\n })}\n style={visuallyHiddenStyle}\n />\n <button\n type=\"button\"\n {...getToggleButtonProps({ tabIndex: -1 })}\n style={visuallyHiddenStyle}\n aria-hidden\n />\n </>\n )}\n <DropdownMenu\n isOpen={isOpen}\n filteredOptions={filteredOptions}\n selectedItem={selectedItem}\n emptyMessage={emptyMessage}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n footer={footer}\n openUpward={openUpward}\n fitContent={fitContent}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dropdown.js","names":[],"sources":["../../../src/ui/dropdown/dropdown.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useCombobox } from \"downshift\";\nimport { cn } from \"#/utils/utils\";\nimport { DropdownOption } from \"./types\";\nimport { dropdownTriggerShellClassName } from \"#/utils/dropdown-classes\";\nimport { LoadingSpinner } from \"./loading-spinner\";\nimport { ClearButton } from \"./clear-button\";\nimport { ToggleButton } from \"./toggle-button\";\nimport { DropdownMenu } from \"./dropdown-menu\";\nimport { DropdownInput } from \"./dropdown-input\";\n\n// Equivalent to Tailwind's `sr-only`, inlined so we don't depend on the\n// utility class being preserved by the host project's CSS pipeline.\nconst visuallyHiddenStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n};\n\ninterface DropdownProps {\n options: DropdownOption[];\n emptyMessage?: string;\n clearable?: boolean;\n loading?: boolean;\n disabled?: boolean;\n placeholder?: string;\n defaultValue?: DropdownOption;\n onChange?: (item: DropdownOption | null) => void;\n testId?: string;\n className?: string;\n footer?: React.ReactNode;\n openUpward?: boolean;\n hideTrigger?: boolean;\n defaultOpen?: boolean;\n /** Open the dropdown menu on hover instead of requiring a click. */\n openOnHover?: boolean;\n /** When false, the combobox placeholder uses normal (non-italic) type. */\n italicPlaceholder?: boolean;\n /** Size the trigger to its label instead of stretching to the container width. */\n fitContent?: boolean;\n}\n\nexport function Dropdown({\n options,\n emptyMessage = \"No options\",\n clearable = false,\n loading = false,\n disabled = false,\n placeholder,\n defaultValue,\n onChange,\n testId,\n className,\n footer,\n openUpward = false,\n hideTrigger = false,\n defaultOpen = false,\n openOnHover = false,\n italicPlaceholder = true,\n fitContent = false,\n}: DropdownProps) {\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const [inputValue, setInputValue] = useState(defaultValue?.label ?? \"\");\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const filteredOptions = options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase()),\n );\n\n const {\n isOpen,\n selectedItem,\n selectItem,\n openMenu,\n closeMenu,\n getToggleButtonProps,\n getMenuProps,\n getItemProps,\n getInputProps,\n } = useCombobox({\n items: filteredOptions,\n itemToString: (item) => item?.label ?? \"\",\n inputValue,\n stateReducer: (state, actionAndChanges) =>\n actionAndChanges.type === useCombobox.stateChangeTypes.InputClick &&\n state.isOpen\n ? { ...actionAndChanges.changes, isOpen: true }\n : actionAndChanges.changes,\n initialIsOpen: defaultOpen,\n onInputValueChange: ({ inputValue: newValue }) => {\n setInputValue(newValue ?? \"\");\n setSearchTerm(newValue ?? \"\");\n },\n defaultSelectedItem: defaultValue,\n onSelectedItemChange: ({ selectedItem: newSelectedItem }) => {\n onChange?.(newSelectedItem ?? null);\n },\n onIsOpenChange: ({\n isOpen: newIsOpen,\n selectedItem: currentSelectedItem,\n }) => {\n if (newIsOpen) {\n // Clear the input on open so the user sees an empty search box\n // (with the placeholder reminding them of the current value)\n // and the full options list. Otherwise the active label would\n // appear both in the trigger AND as the highlighted menu row.\n setInputValue(\"\");\n setSearchTerm(\"\");\n } else {\n setInputValue(currentSelectedItem?.label ?? \"\");\n setSearchTerm(\"\");\n }\n },\n });\n\n const isDisabled = loading || disabled;\n\n // `selectedItem` is downshift's internal state, frozen to whatever\n // initialized it. Resolve the currently selected option against the\n // live `options` array so per-option fields like `prefix` (e.g. a\n // status indicator that re-renders on a timer) update on the trigger\n // without remounting the dropdown.\n const liveSelectedOption = selectedItem\n ? (options.find((o) => o.value === selectedItem.value) ?? selectedItem)\n : null;\n\n // Wrap getInputProps to inject a direct onChange handler that preserves\n // cursor position. Downshift's default onInputValueChange resets cursor\n // to end of input on every keystroke; reading from e.target.value keeps\n // the browser's native cursor position intact.\n const getInputPropsWithCursorFix = (props?: object) =>\n getInputProps({\n ...props,\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n setSearchTerm(e.target.value);\n },\n });\n\n return (\n <div\n className={cn(\"relative\", fitContent ? \"inline-block w-auto\" : \"w-full\")}\n data-testid={testId}\n onMouseEnter={\n openOnHover\n ? () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n openMenu();\n }\n : undefined\n }\n onMouseLeave={\n openOnHover\n ? () => {\n closeTimerRef.current = setTimeout(() => closeMenu(), 150);\n }\n : undefined\n }\n >\n {!hideTrigger ? (\n <div\n className={cn(\n dropdownTriggerShellClassName,\n fitContent ? \"w-auto\" : \"w-full\",\n isDisabled && \"cursor-not-allowed opacity-60\",\n className,\n )}\n >\n {liveSelectedOption?.prefix ? (\n <span className=\"flex items-center shrink-0\">\n {liveSelectedOption.prefix}\n </span>\n ) : null}\n <DropdownInput\n placeholder={placeholder}\n isDisabled={isDisabled}\n getInputProps={getInputPropsWithCursorFix}\n italicPlaceholder={italicPlaceholder}\n fitContent={fitContent}\n />\n {loading && <LoadingSpinner />}\n {clearable && selectedItem && (\n <ClearButton onClear={() => selectItem(null)} />\n )}\n <ToggleButton\n isOpen={isOpen}\n isDisabled={isDisabled}\n getToggleButtonProps={getToggleButtonProps}\n />\n </div>\n ) : (\n // downshift's useCombobox always expects getInputProps() (and the\n // toggle button) to be wired up. When the trigger is hidden (e.g.\n // collapsed-sidebar popover) we still need to mount a real input\n // so it stops warning every render. Keep it visually hidden but\n // present in the DOM for accessibility.\n <>\n <input\n {...getInputPropsWithCursorFix({\n \"aria-label\": placeholder ?? \"Filter options\",\n tabIndex: -1,\n })}\n style={visuallyHiddenStyle}\n />\n <button\n type=\"button\"\n {...getToggleButtonProps({ tabIndex: -1 })}\n style={visuallyHiddenStyle}\n aria-hidden\n />\n </>\n )}\n <DropdownMenu\n isOpen={isOpen}\n filteredOptions={filteredOptions}\n selectedItem={selectedItem}\n emptyMessage={emptyMessage}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n footer={footer}\n openUpward={openUpward}\n fitContent={fitContent}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -19,3 +19,4 @@ export declare function parseTimeOfDay(value: string): {
19
19
  hour: number;
20
20
  minute: number;
21
21
  } | null;
22
+ export declare function formatEventOn(on: string | string[] | undefined): string;
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./utils.cjs`),t=require(`./form-control-classes.cjs`);var n=`transition-none`,r=`gap-0.5`,i=`gap-2`,a=e.cn(`flex flex-col`,r),o=e.cn(`bg-tertiary border border-[var(--oh-border-input)] rounded p-2`,`flex items-center gap-2`,t.formControlShellClassName,n,`group w-full gap-2 px-3 text-[var(--oh-muted)] hover:text-white`),s=e.cn(`group flex w-full cursor-pointer items-center rounded px-2 py-2 text-left text-sm font-normal text-white`,i,`hover:bg-[var(--oh-interactive-hover)] disabled:cursor-not-allowed disabled:opacity-60`,n),c=e.cn(`group flex w-full cursor-pointer items-center rounded px-2 py-2 text-start text-sm font-normal`,i,`text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]`,`disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent`,n),l=e.cn(`shrink-0 text-[var(--oh-muted)] group-hover:text-white group-focus-visible:text-white`,n),u=e.cn(`flex size-4 shrink-0 items-center justify-center [&_svg]:text-current`,l),d=e.cn(`inline-flex cursor-pointer items-center gap-1.5 rounded-lg border px-3 py-2 text-sm font-medium`,`border-[var(--oh-border)] bg-base-secondary text-white`,`focus-visible:border-white/40 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white/20`,n),f=e.cn(a,`overflow-y-auto custom-scrollbar-always`,`max-h-[13.875rem]`),p=e.cn(`overflow-y-auto custom-scrollbar`,`max-h-[min(60vh,calc(100dvh-5rem))]`),m=e.cn(`group flex w-full items-center rounded-md px-2 py-2 text-sm font-normal text-white`,i,`hover:bg-[var(--oh-interactive-hover)]`,n);exports.dropdownFilterTriggerClassName=d,exports.dropdownFooterActionClassName=m,exports.dropdownInstantColorClassName=n,exports.dropdownMenuListClassName=a,exports.dropdownMenuListGapClassName=r,exports.dropdownMenuRowClassName=s,exports.dropdownMenuRowForegroundClassName=c,exports.dropdownMenuRowGapClassName=i,exports.dropdownMenuRowIconClassName=l,exports.dropdownMenuRowIconWrapperClassName=u,exports.dropdownMenuViewportScrollClassName=p,exports.dropdownTriggerShellClassName=o,exports.switchProfileMenuListScrollClassName=f;
2
+ //# sourceMappingURL=dropdown-classes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown-classes.cjs","names":[],"sources":["../../src/utils/dropdown-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport { formControlShellClassName } from \"#/utils/form-control-classes\";\n\n/** Snap hover colors instantly — no transition-colors delay on menus/dropdowns. */\nexport const dropdownInstantColorClassName = \"transition-none\";\n\n/** 2px vertical gap between rows in a dropdown/context menu list. */\nexport const dropdownMenuListGapClassName = \"gap-0.5\";\n\n/** Standard horizontal gap between a row icon and its label. */\nexport const dropdownMenuRowGapClassName = \"gap-2\";\n\n/** Flex column shell for a dropdown menu item list. */\nexport const dropdownMenuListClassName = cn(\n \"flex flex-col\",\n dropdownMenuListGapClassName,\n);\n\n/** Combobox/select trigger shell with instant hover colors. */\nexport const dropdownTriggerShellClassName = cn(\n \"bg-tertiary border border-[var(--oh-border-input)] rounded p-2\",\n \"flex items-center gap-2\",\n formControlShellClassName,\n dropdownInstantColorClassName,\n \"group w-full gap-2 px-3 text-[var(--oh-muted)] hover:text-white\",\n);\n\n/** Standard white-label menu row. */\nexport const dropdownMenuRowClassName = cn(\n \"group flex w-full cursor-pointer items-center rounded px-2 py-2 text-left text-sm font-normal text-white\",\n dropdownMenuRowGapClassName,\n \"hover:bg-[var(--oh-interactive-hover)] disabled:cursor-not-allowed disabled:opacity-60\",\n dropdownInstantColorClassName,\n);\n\n/** Menu row using foreground token (context menus). */\nexport const dropdownMenuRowForegroundClassName = cn(\n \"group flex w-full cursor-pointer items-center rounded px-2 py-2 text-start text-sm font-normal\",\n dropdownMenuRowGapClassName,\n \"text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent\",\n dropdownInstantColorClassName,\n);\n\n/** Icon inside a menu row — muted until row hover/focus. */\nexport const dropdownMenuRowIconClassName = cn(\n \"shrink-0 text-[var(--oh-muted)] group-hover:text-white group-focus-visible:text-white\",\n dropdownInstantColorClassName,\n);\n\n/** Wrapper for SVG/React icon nodes inside a menu row. */\nexport const dropdownMenuRowIconWrapperClassName = cn(\n \"flex size-4 shrink-0 items-center justify-center [&_svg]:text-current\",\n dropdownMenuRowIconClassName,\n);\n\n/** Enum/filter dropdown trigger chip. */\nexport const dropdownFilterTriggerClassName = cn(\n \"inline-flex cursor-pointer items-center gap-1.5 rounded-lg border px-3 py-2 text-sm font-medium\",\n \"border-[var(--oh-border)] bg-base-secondary text-white\",\n \"focus-visible:border-white/40 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white/20\",\n dropdownInstantColorClassName,\n);\n\n/**\n * Scroll cap for the switch-profile menu: four two-line rows\n * (p-2 + leading-5 title + gap-0.5 + leading-4 subtitle) plus list gaps.\n */\nexport const switchProfileMenuListScrollClassName = cn(\n dropdownMenuListClassName,\n \"overflow-y-auto custom-scrollbar-always\",\n \"max-h-[13.875rem]\",\n);\n\n/**\n * Tall sidebar/context menus: cap height to the viewport and scroll with the\n * custom scrollbar when content overflows (no scrollbar when everything fits).\n */\nexport const dropdownMenuViewportScrollClassName = cn(\n \"overflow-y-auto custom-scrollbar\",\n \"max-h-[min(60vh,calc(100dvh-5rem))]\",\n);\n\n/** Footer action row inside a dropdown panel. */\nexport const dropdownFooterActionClassName = cn(\n \"group flex w-full items-center rounded-md px-2 py-2 text-sm font-normal text-white\",\n dropdownMenuRowGapClassName,\n \"hover:bg-[var(--oh-interactive-hover)]\",\n dropdownInstantColorClassName,\n);\n"],"mappings":"oHAIA,IAAa,EAAgC,kBAGhC,EAA+B,UAG/B,EAA8B,QAG9B,EAA4B,EAAA,GACvC,gBACA,EACD,CAGY,EAAgC,EAAA,GAC3C,iEACA,0BACA,EAAA,0BACA,EACA,kEACD,CAGY,EAA2B,EAAA,GACtC,2GACA,EACA,yFACA,EACD,CAGY,EAAqC,EAAA,GAChD,iGACA,EACA,qEACA,gFACA,EACD,CAGY,EAA+B,EAAA,GAC1C,wFACA,EACD,CAGY,EAAsC,EAAA,GACjD,wEACA,EACD,CAGY,EAAiC,EAAA,GAC5C,kGACA,yDACA,4GACA,EACD,CAMY,EAAuC,EAAA,GAClD,EACA,0CACA,oBACD,CAMY,EAAsC,EAAA,GACjD,mCACA,sCACD,CAGY,EAAgC,EAAA,GAC3C,qFACA,EACA,yCACA,EACD"}
@@ -0,0 +1,32 @@
1
+ /** Snap hover colors instantly — no transition-colors delay on menus/dropdowns. */
2
+ export declare const dropdownInstantColorClassName = "transition-none";
3
+ /** 2px vertical gap between rows in a dropdown/context menu list. */
4
+ export declare const dropdownMenuListGapClassName = "gap-0.5";
5
+ /** Standard horizontal gap between a row icon and its label. */
6
+ export declare const dropdownMenuRowGapClassName = "gap-2";
7
+ /** Flex column shell for a dropdown menu item list. */
8
+ export declare const dropdownMenuListClassName: string;
9
+ /** Combobox/select trigger shell with instant hover colors. */
10
+ export declare const dropdownTriggerShellClassName: string;
11
+ /** Standard white-label menu row. */
12
+ export declare const dropdownMenuRowClassName: string;
13
+ /** Menu row using foreground token (context menus). */
14
+ export declare const dropdownMenuRowForegroundClassName: string;
15
+ /** Icon inside a menu row — muted until row hover/focus. */
16
+ export declare const dropdownMenuRowIconClassName: string;
17
+ /** Wrapper for SVG/React icon nodes inside a menu row. */
18
+ export declare const dropdownMenuRowIconWrapperClassName: string;
19
+ /** Enum/filter dropdown trigger chip. */
20
+ export declare const dropdownFilterTriggerClassName: string;
21
+ /**
22
+ * Scroll cap for the switch-profile menu: four two-line rows
23
+ * (p-2 + leading-5 title + gap-0.5 + leading-4 subtitle) plus list gaps.
24
+ */
25
+ export declare const switchProfileMenuListScrollClassName: string;
26
+ /**
27
+ * Tall sidebar/context menus: cap height to the viewport and scroll with the
28
+ * custom scrollbar when content overflows (no scrollbar when everything fits).
29
+ */
30
+ export declare const dropdownMenuViewportScrollClassName: string;
31
+ /** Footer action row inside a dropdown panel. */
32
+ export declare const dropdownFooterActionClassName: string;
@@ -0,0 +1,8 @@
1
+ import { cn as e } from "./utils.js";
2
+ import { formControlShellClassName as t } from "./form-control-classes.js";
3
+ //#region src/utils/dropdown-classes.ts
4
+ var n = "transition-none", r = "gap-0.5", i = "gap-2", a = e("flex flex-col", r), o = e("bg-tertiary border border-[var(--oh-border-input)] rounded p-2", "flex items-center gap-2", t, n, "group w-full gap-2 px-3 text-[var(--oh-muted)] hover:text-white"), s = e("group flex w-full cursor-pointer items-center rounded px-2 py-2 text-left text-sm font-normal text-white", i, "hover:bg-[var(--oh-interactive-hover)] disabled:cursor-not-allowed disabled:opacity-60", n), c = e("group flex w-full cursor-pointer items-center rounded px-2 py-2 text-start text-sm font-normal", i, "text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]", "disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent", n), l = e("shrink-0 text-[var(--oh-muted)] group-hover:text-white group-focus-visible:text-white", n), u = e("flex size-4 shrink-0 items-center justify-center [&_svg]:text-current", l), d = e("inline-flex cursor-pointer items-center gap-1.5 rounded-lg border px-3 py-2 text-sm font-medium", "border-[var(--oh-border)] bg-base-secondary text-white", "focus-visible:border-white/40 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white/20", n), f = e(a, "overflow-y-auto custom-scrollbar-always", "max-h-[13.875rem]"), p = e("overflow-y-auto custom-scrollbar", "max-h-[min(60vh,calc(100dvh-5rem))]"), m = e("group flex w-full items-center rounded-md px-2 py-2 text-sm font-normal text-white", i, "hover:bg-[var(--oh-interactive-hover)]", n);
5
+ //#endregion
6
+ export { d as dropdownFilterTriggerClassName, m as dropdownFooterActionClassName, n as dropdownInstantColorClassName, a as dropdownMenuListClassName, r as dropdownMenuListGapClassName, s as dropdownMenuRowClassName, c as dropdownMenuRowForegroundClassName, i as dropdownMenuRowGapClassName, l as dropdownMenuRowIconClassName, u as dropdownMenuRowIconWrapperClassName, p as dropdownMenuViewportScrollClassName, o as dropdownTriggerShellClassName, f as switchProfileMenuListScrollClassName };
7
+
8
+ //# sourceMappingURL=dropdown-classes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown-classes.js","names":[],"sources":["../../src/utils/dropdown-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport { formControlShellClassName } from \"#/utils/form-control-classes\";\n\n/** Snap hover colors instantly — no transition-colors delay on menus/dropdowns. */\nexport const dropdownInstantColorClassName = \"transition-none\";\n\n/** 2px vertical gap between rows in a dropdown/context menu list. */\nexport const dropdownMenuListGapClassName = \"gap-0.5\";\n\n/** Standard horizontal gap between a row icon and its label. */\nexport const dropdownMenuRowGapClassName = \"gap-2\";\n\n/** Flex column shell for a dropdown menu item list. */\nexport const dropdownMenuListClassName = cn(\n \"flex flex-col\",\n dropdownMenuListGapClassName,\n);\n\n/** Combobox/select trigger shell with instant hover colors. */\nexport const dropdownTriggerShellClassName = cn(\n \"bg-tertiary border border-[var(--oh-border-input)] rounded p-2\",\n \"flex items-center gap-2\",\n formControlShellClassName,\n dropdownInstantColorClassName,\n \"group w-full gap-2 px-3 text-[var(--oh-muted)] hover:text-white\",\n);\n\n/** Standard white-label menu row. */\nexport const dropdownMenuRowClassName = cn(\n \"group flex w-full cursor-pointer items-center rounded px-2 py-2 text-left text-sm font-normal text-white\",\n dropdownMenuRowGapClassName,\n \"hover:bg-[var(--oh-interactive-hover)] disabled:cursor-not-allowed disabled:opacity-60\",\n dropdownInstantColorClassName,\n);\n\n/** Menu row using foreground token (context menus). */\nexport const dropdownMenuRowForegroundClassName = cn(\n \"group flex w-full cursor-pointer items-center rounded px-2 py-2 text-start text-sm font-normal\",\n dropdownMenuRowGapClassName,\n \"text-[var(--oh-foreground)] hover:bg-[var(--oh-interactive-hover)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent\",\n dropdownInstantColorClassName,\n);\n\n/** Icon inside a menu row — muted until row hover/focus. */\nexport const dropdownMenuRowIconClassName = cn(\n \"shrink-0 text-[var(--oh-muted)] group-hover:text-white group-focus-visible:text-white\",\n dropdownInstantColorClassName,\n);\n\n/** Wrapper for SVG/React icon nodes inside a menu row. */\nexport const dropdownMenuRowIconWrapperClassName = cn(\n \"flex size-4 shrink-0 items-center justify-center [&_svg]:text-current\",\n dropdownMenuRowIconClassName,\n);\n\n/** Enum/filter dropdown trigger chip. */\nexport const dropdownFilterTriggerClassName = cn(\n \"inline-flex cursor-pointer items-center gap-1.5 rounded-lg border px-3 py-2 text-sm font-medium\",\n \"border-[var(--oh-border)] bg-base-secondary text-white\",\n \"focus-visible:border-white/40 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white/20\",\n dropdownInstantColorClassName,\n);\n\n/**\n * Scroll cap for the switch-profile menu: four two-line rows\n * (p-2 + leading-5 title + gap-0.5 + leading-4 subtitle) plus list gaps.\n */\nexport const switchProfileMenuListScrollClassName = cn(\n dropdownMenuListClassName,\n \"overflow-y-auto custom-scrollbar-always\",\n \"max-h-[13.875rem]\",\n);\n\n/**\n * Tall sidebar/context menus: cap height to the viewport and scroll with the\n * custom scrollbar when content overflows (no scrollbar when everything fits).\n */\nexport const dropdownMenuViewportScrollClassName = cn(\n \"overflow-y-auto custom-scrollbar\",\n \"max-h-[min(60vh,calc(100dvh-5rem))]\",\n);\n\n/** Footer action row inside a dropdown panel. */\nexport const dropdownFooterActionClassName = cn(\n \"group flex w-full items-center rounded-md px-2 py-2 text-sm font-normal text-white\",\n dropdownMenuRowGapClassName,\n \"hover:bg-[var(--oh-interactive-hover)]\",\n dropdownInstantColorClassName,\n);\n"],"mappings":";;;AAIA,IAAa,IAAgC,mBAGhC,IAA+B,WAG/B,IAA8B,SAG9B,IAA4B,EACvC,iBACA,EACD,EAGY,IAAgC,EAC3C,kEACA,2BACA,GACA,GACA,kEACD,EAGY,IAA2B,EACtC,4GACA,GACA,0FACA,EACD,EAGY,IAAqC,EAChD,kGACA,GACA,sEACA,iFACA,EACD,EAGY,IAA+B,EAC1C,yFACA,EACD,EAGY,IAAsC,EACjD,yEACA,EACD,EAGY,IAAiC,EAC5C,mGACA,0DACA,6GACA,EACD,EAMY,IAAuC,EAClD,GACA,2CACA,oBACD,EAMY,IAAsC,EACjD,oCACA,sCACD,EAGY,IAAgC,EAC3C,sFACA,GACA,0CACA,EACD"}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./utils.cjs`);var t=`h-9 min-h-9`,n=`rounded-lg`,r=`border border-[var(--oh-border)]`,i=`bg-base-secondary`,a=`transition-[background-color,border-color,box-shadow,opacity] duration-150 motion-reduce:transition-none`,o=`!transition-[background-color,border-color,box-shadow,opacity] !duration-150 motion-reduce:transition-none`,s=`focus:border-white/40 focus:ring-1 focus:ring-white/20 focus:outline-none`,c=`focus-within:border-white/40 focus-within:ring-1 focus-within:ring-white/20`,l=`disabled:cursor-not-allowed disabled:opacity-60`,u=e.cn(t,n,r,i,a,s,l,`w-full min-w-0 px-3 text-sm text-white placeholder:text-tertiary-alt`),d=e.cn(u,`placeholder:italic`,o),f=e.cn(n,r,i,a,s,l,`w-full min-w-0 px-3 py-2 text-sm text-white placeholder:text-tertiary-alt`),p=e.cn(t,`relative flex min-w-0 items-center`,n,r,i,a,c),m=e.cn(`min-w-0 flex-1 border-0 bg-transparent px-3 text-sm outline-none`,`placeholder:text-tertiary-alt`,`[&::-webkit-search-cancel-button]:hidden`),h=e.cn(t,`inline-flex w-fit cursor-pointer items-center justify-center gap-2 px-3`,n,a,`text-sm font-normal disabled:cursor-not-allowed disabled:opacity-30`),g=`pl-12`;e.cn(h,r,i,`shrink-0 text-white`),exports.formControlBorderClassName=r,exports.formControlButtonClassName=h,exports.formControlFieldClassName=u,exports.formControlInlineInputClassName=m,exports.formControlMultilineFieldClassName=f,exports.formControlRadiusClassName=n,exports.formControlSettingsFieldClassName=d,exports.formControlShellClassName=p,exports.formControlSurfaceClassName=i,exports.formControlSwitchDescriptionClassName=g,exports.formControlTransitionClassName=a;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./utils.cjs`);var t=`h-9 min-h-9`,n=`rounded-lg`,r=`border border-[var(--oh-border)]`,i=`bg-base-secondary`,a=`duration-75`,o=`!duration-75`,s=`motion-reduce:transition-none`,c=e.cn(`transition-[background-color,border-color,box-shadow,opacity]`,a,s),l=e.cn(`!transition-[background-color,border-color,box-shadow,opacity]`,o,s),u=e.cn(`transition-[transform] ease`,a,s),d=`hover:text-white hover:bg-white/10`,f=e.cn(`inline-flex items-center gap-1 rounded-[100px] border border-transparent px-1.5`,`text-sm font-normal leading-5 text-[var(--oh-muted)] whitespace-nowrap min-w-0 cursor-pointer`,c,d),p=e.cn(`flex items-center justify-center rounded-full text-[var(--oh-muted)] cursor-pointer`,c,d),m=`focus:border-white/40 focus:ring-1 focus:ring-white/20 focus:outline-none`,h=`focus-within:border-white/40 focus-within:ring-1 focus-within:ring-white/20`,g=`disabled:cursor-not-allowed disabled:opacity-60`,_=e.cn(t,n,r,i,c,m,g,`w-full min-w-0 px-3 text-sm text-white placeholder:text-tertiary-alt`),v=e.cn(_,`placeholder:italic`,l),y=e.cn(n,r,i,c,m,g,`w-full min-w-0 px-3 py-2 text-sm text-white placeholder:text-tertiary-alt`),b=e.cn(t,`relative flex min-w-0 items-center`,n,r,i,c,h),x=e.cn(`min-w-0 flex-1 border-0 bg-transparent px-3 text-sm outline-none`,`placeholder:text-tertiary-alt`,`[&::-webkit-search-cancel-button]:hidden`),S=e.cn(t,`inline-flex w-fit cursor-pointer items-center justify-center gap-2 px-3`,n,c,`text-sm font-normal disabled:cursor-not-allowed disabled:opacity-30`),C=`pl-12`;e.cn(S,r,i,`shrink-0 text-white`);var w=e.cn(`inline-flex items-center gap-2 self-start rounded-lg p-2`,`text-sm font-normal leading-5 text-[var(--oh-muted)] cursor-pointer`,c,`hover:bg-tertiary hover:text-white`);exports.chatInputIconButtonClassName=p,exports.chatInputPillButtonClassName=f,exports.formControlBackNavButtonClassName=w,exports.formControlBorderClassName=r,exports.formControlButtonClassName=S,exports.formControlFieldClassName=_,exports.formControlInlineInputClassName=x,exports.formControlMultilineFieldClassName=y,exports.formControlMutedHoverClassName=d,exports.formControlRadiusClassName=n,exports.formControlSettingsFieldClassName=v,exports.formControlShellClassName=b,exports.formControlSurfaceClassName=i,exports.formControlSwitchDescriptionClassName=C,exports.formControlTransformTransitionClassName=u,exports.formControlTransitionClassName=c;
2
2
  //# sourceMappingURL=form-control-classes.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-control-classes.cjs","names":[],"sources":["../../src/utils/form-control-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\n/** 36px control height — shared by fields, dropdowns, and buttons. */\nexport const formControlHeightClassName = \"h-9 min-h-9\";\n\nexport const formControlRadiusClassName = \"rounded-lg\";\n\nexport const formControlBorderClassName = \"border border-[var(--oh-border)]\";\n\nexport const formControlSurfaceClassName = \"bg-base-secondary\";\n\n/** Animate shell chrome on hover/focus; foreground color snaps instantly. */\nexport const formControlTransitionClassName =\n \"transition-[background-color,border-color,box-shadow,opacity] duration-150 motion-reduce:transition-none\";\n\n/** HeroUI input wrappers ship `transition-colors`; override so caret/text hover is instant. */\nexport const formControlHeroUiWrapperTransitionClassName =\n \"!transition-[background-color,border-color,box-shadow,opacity] !duration-150 motion-reduce:transition-none\";\n\nexport const formControlFocusClassName =\n \"focus:border-white/40 focus:ring-1 focus:ring-white/20 focus:outline-none\";\n\nexport const formControlFocusWithinClassName =\n \"focus-within:border-white/40 focus-within:ring-1 focus-within:ring-white/20\";\n\nexport const formControlDisabledClassName =\n \"disabled:cursor-not-allowed disabled:opacity-60\";\n\n/** Native text inputs and HeroUI Autocomplete wrappers. */\nexport const formControlFieldClassName = cn(\n formControlHeightClassName,\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusClassName,\n formControlDisabledClassName,\n \"w-full min-w-0 px-3 text-sm text-white placeholder:text-tertiary-alt\",\n);\n\n/** Settings screens keep italic placeholders on form controls. */\nexport const formControlSettingsFieldClassName = cn(\n formControlFieldClassName,\n \"placeholder:italic\",\n formControlHeroUiWrapperTransitionClassName,\n);\n\n/** Multiline fields share border/radius/focus styling without a fixed height. */\nexport const formControlMultilineFieldClassName = cn(\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusClassName,\n formControlDisabledClassName,\n \"w-full min-w-0 px-3 py-2 text-sm text-white placeholder:text-tertiary-alt\",\n);\n\n/** Combobox / search shell (icon + input), e.g. skills toolbar. */\nexport const formControlShellClassName = cn(\n formControlHeightClassName,\n \"relative flex min-w-0 items-center\",\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusWithinClassName,\n);\n\n/** Borderless input nested inside {@link formControlShellClassName}. */\nexport const formControlInlineInputClassName = cn(\n \"min-w-0 flex-1 border-0 bg-transparent px-3 text-sm outline-none\",\n \"placeholder:text-tertiary-alt\",\n \"[&::-webkit-search-cancel-button]:hidden\",\n);\n\n/** Primary/secondary/danger action buttons. */\nexport const formControlButtonClassName = cn(\n formControlHeightClassName,\n \"inline-flex w-fit cursor-pointer items-center justify-center gap-2 px-3\",\n formControlRadiusClassName,\n formControlTransitionClassName,\n \"text-sm font-normal disabled:cursor-not-allowed disabled:opacity-30\",\n);\n\n/** Helper text under a left-aligned {@link SettingsSwitch} (40px track + gap-2). */\nexport const formControlSwitchDescriptionClassName = \"pl-12\";\n\n/** Filter / enum dropdown triggers beside search toolbars. */\nexport const formControlFilterTriggerClassName = cn(\n formControlButtonClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n \"shrink-0 text-white\",\n);\n"],"mappings":"4EAGA,IAAa,EAA6B,cAE7B,EAA6B,aAE7B,EAA6B,mCAE7B,EAA8B,oBAG9B,EACX,2GAGW,EACX,6GAEW,EACX,4EAEW,EACX,8EAEW,EACX,kDAGW,EAA4B,EAAA,GACvC,EACA,EACA,EACA,EACA,EACA,EACA,EACA,uEACD,CAGY,EAAoC,EAAA,GAC/C,EACA,qBACA,EACD,CAGY,EAAqC,EAAA,GAChD,EACA,EACA,EACA,EACA,EACA,EACA,4EACD,CAGY,EAA4B,EAAA,GACvC,EACA,qCACA,EACA,EACA,EACA,EACA,EACD,CAGY,EAAkC,EAAA,GAC7C,mEACA,gCACA,2CACD,CAGY,EAA6B,EAAA,GACxC,EACA,0EACA,EACA,EACA,sEACD,CAGY,EAAwC,QAGJ,EAAA,GAC/C,EACA,EACA,EACA,sBACD"}
1
+ {"version":3,"file":"form-control-classes.cjs","names":[],"sources":["../../src/utils/form-control-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\n/** 36px control height — shared by fields, dropdowns, and buttons. */\nexport const formControlHeightClassName = \"h-9 min-h-9\";\n\nexport const formControlRadiusClassName = \"rounded-lg\";\n\nexport const formControlBorderClassName = \"border border-[var(--oh-border)]\";\n\nexport const formControlSurfaceClassName = \"bg-base-secondary\";\n\n/** Shared transition duration for form controls and chrome buttons. */\nexport const formControlTransitionDurationClassName = \"duration-75\";\n\nexport const formControlHeroUiTransitionDurationClassName = \"!duration-75\";\n\nexport const formControlMotionReduceClassName = \"motion-reduce:transition-none\";\n\n/** Shell properties that animate on hover/focus; foreground color snaps instantly. */\nexport const formControlTransitionPropertiesClassName =\n \"transition-[background-color,border-color,box-shadow,opacity]\";\n\n/** Animate shell chrome on hover/focus; foreground color snaps instantly. */\nexport const formControlTransitionClassName = cn(\n formControlTransitionPropertiesClassName,\n formControlTransitionDurationClassName,\n formControlMotionReduceClassName,\n);\n\n/** HeroUI input wrappers ship `transition-colors`; override so caret/text hover is instant. */\nexport const formControlHeroUiWrapperTransitionClassName = cn(\n \"!transition-[background-color,border-color,box-shadow,opacity]\",\n formControlHeroUiTransitionDurationClassName,\n formControlMotionReduceClassName,\n);\n\n/** Transform-only transitions (e.g. combobox carets). */\nexport const formControlTransformTransitionClassName = cn(\n \"transition-[transform] ease\",\n formControlTransitionDurationClassName,\n formControlMotionReduceClassName,\n);\n\n/** Muted icon/pill controls: instant foreground, fading shell on hover. */\nexport const formControlMutedHoverClassName =\n \"hover:text-white hover:bg-white/10\";\n\n/** Text/icon pill triggers in the chat input actions row. */\nexport const chatInputPillButtonClassName = cn(\n \"inline-flex items-center gap-1 rounded-[100px] border border-transparent px-1.5\",\n \"text-sm font-normal leading-5 text-[var(--oh-muted)] whitespace-nowrap min-w-0 cursor-pointer\",\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n);\n\n/** Circular icon triggers in the chat input actions row. */\nexport const chatInputIconButtonClassName = cn(\n \"flex items-center justify-center rounded-full text-[var(--oh-muted)] cursor-pointer\",\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n);\n\nexport const formControlFocusClassName =\n \"focus:border-white/40 focus:ring-1 focus:ring-white/20 focus:outline-none\";\n\nexport const formControlFocusWithinClassName =\n \"focus-within:border-white/40 focus-within:ring-1 focus-within:ring-white/20\";\n\nexport const formControlDisabledClassName =\n \"disabled:cursor-not-allowed disabled:opacity-60\";\n\n/** Native text inputs and HeroUI Autocomplete wrappers. */\nexport const formControlFieldClassName = cn(\n formControlHeightClassName,\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusClassName,\n formControlDisabledClassName,\n \"w-full min-w-0 px-3 text-sm text-white placeholder:text-tertiary-alt\",\n);\n\n/** Settings screens keep italic placeholders on form controls. */\nexport const formControlSettingsFieldClassName = cn(\n formControlFieldClassName,\n \"placeholder:italic\",\n formControlHeroUiWrapperTransitionClassName,\n);\n\n/** Multiline fields share border/radius/focus styling without a fixed height. */\nexport const formControlMultilineFieldClassName = cn(\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusClassName,\n formControlDisabledClassName,\n \"w-full min-w-0 px-3 py-2 text-sm text-white placeholder:text-tertiary-alt\",\n);\n\n/** Combobox / search shell (icon + input), e.g. skills toolbar. */\nexport const formControlShellClassName = cn(\n formControlHeightClassName,\n \"relative flex min-w-0 items-center\",\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusWithinClassName,\n);\n\n/** Borderless input nested inside {@link formControlShellClassName}. */\nexport const formControlInlineInputClassName = cn(\n \"min-w-0 flex-1 border-0 bg-transparent px-3 text-sm outline-none\",\n \"placeholder:text-tertiary-alt\",\n \"[&::-webkit-search-cancel-button]:hidden\",\n);\n\n/** Primary/secondary/danger action buttons. */\nexport const formControlButtonClassName = cn(\n formControlHeightClassName,\n \"inline-flex w-fit cursor-pointer items-center justify-center gap-2 px-3\",\n formControlRadiusClassName,\n formControlTransitionClassName,\n \"text-sm font-normal disabled:cursor-not-allowed disabled:opacity-30\",\n);\n\n/** Helper text under a left-aligned {@link SettingsSwitch} (40px track + gap-2). */\nexport const formControlSwitchDescriptionClassName = \"pl-12\";\n\n/** Filter / enum dropdown triggers beside search toolbars. */\nexport const formControlFilterTriggerClassName = cn(\n formControlButtonClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n \"shrink-0 text-white\",\n);\n\n/** Muted back navigation control with tertiary hover fill (settings sub-pages, detail views). */\nexport const formControlBackNavButtonClassName = cn(\n \"inline-flex items-center gap-2 self-start rounded-lg p-2\",\n \"text-sm font-normal leading-5 text-[var(--oh-muted)] cursor-pointer\",\n formControlTransitionClassName,\n \"hover:bg-tertiary hover:text-white\",\n);\n"],"mappings":"4EAGA,IAAa,EAA6B,cAE7B,EAA6B,aAE7B,EAA6B,mCAE7B,EAA8B,oBAG9B,EAAyC,cAEzC,EAA+C,eAE/C,EAAmC,gCAOnC,EAAiC,EAAA,GAC5C,gEACA,EACA,EACD,CAGY,EAA8C,EAAA,GACzD,iEACA,EACA,EACD,CAGY,EAA0C,EAAA,GACrD,8BACA,EACA,EACD,CAGY,EACX,qCAGW,EAA+B,EAAA,GAC1C,kFACA,gGACA,EACA,EACD,CAGY,EAA+B,EAAA,GAC1C,sFACA,EACA,EACD,CAEY,EACX,4EAEW,EACX,8EAEW,EACX,kDAGW,EAA4B,EAAA,GACvC,EACA,EACA,EACA,EACA,EACA,EACA,EACA,uEACD,CAGY,EAAoC,EAAA,GAC/C,EACA,qBACA,EACD,CAGY,EAAqC,EAAA,GAChD,EACA,EACA,EACA,EACA,EACA,EACA,4EACD,CAGY,EAA4B,EAAA,GACvC,EACA,qCACA,EACA,EACA,EACA,EACA,EACD,CAGY,EAAkC,EAAA,GAC7C,mEACA,gCACA,2CACD,CAGY,EAA6B,EAAA,GACxC,EACA,0EACA,EACA,EACA,sEACD,CAGY,EAAwC,QAGJ,EAAA,GAC/C,EACA,EACA,EACA,sBACD,CAGD,IAAa,EAAoC,EAAA,GAC/C,2DACA,sEACA,EACA,qCACD"}
@@ -3,10 +3,24 @@ export declare const formControlHeightClassName = "h-9 min-h-9";
3
3
  export declare const formControlRadiusClassName = "rounded-lg";
4
4
  export declare const formControlBorderClassName = "border border-[var(--oh-border)]";
5
5
  export declare const formControlSurfaceClassName = "bg-base-secondary";
6
+ /** Shared transition duration for form controls and chrome buttons. */
7
+ export declare const formControlTransitionDurationClassName = "duration-75";
8
+ export declare const formControlHeroUiTransitionDurationClassName = "!duration-75";
9
+ export declare const formControlMotionReduceClassName = "motion-reduce:transition-none";
10
+ /** Shell properties that animate on hover/focus; foreground color snaps instantly. */
11
+ export declare const formControlTransitionPropertiesClassName = "transition-[background-color,border-color,box-shadow,opacity]";
6
12
  /** Animate shell chrome on hover/focus; foreground color snaps instantly. */
7
- export declare const formControlTransitionClassName = "transition-[background-color,border-color,box-shadow,opacity] duration-150 motion-reduce:transition-none";
13
+ export declare const formControlTransitionClassName: string;
8
14
  /** HeroUI input wrappers ship `transition-colors`; override so caret/text hover is instant. */
9
- export declare const formControlHeroUiWrapperTransitionClassName = "!transition-[background-color,border-color,box-shadow,opacity] !duration-150 motion-reduce:transition-none";
15
+ export declare const formControlHeroUiWrapperTransitionClassName: string;
16
+ /** Transform-only transitions (e.g. combobox carets). */
17
+ export declare const formControlTransformTransitionClassName: string;
18
+ /** Muted icon/pill controls: instant foreground, fading shell on hover. */
19
+ export declare const formControlMutedHoverClassName = "hover:text-white hover:bg-white/10";
20
+ /** Text/icon pill triggers in the chat input actions row. */
21
+ export declare const chatInputPillButtonClassName: string;
22
+ /** Circular icon triggers in the chat input actions row. */
23
+ export declare const chatInputIconButtonClassName: string;
10
24
  export declare const formControlFocusClassName = "focus:border-white/40 focus:ring-1 focus:ring-white/20 focus:outline-none";
11
25
  export declare const formControlFocusWithinClassName = "focus-within:border-white/40 focus-within:ring-1 focus-within:ring-white/20";
12
26
  export declare const formControlDisabledClassName = "disabled:cursor-not-allowed disabled:opacity-60";
@@ -26,3 +40,5 @@ export declare const formControlButtonClassName: string;
26
40
  export declare const formControlSwitchDescriptionClassName = "pl-12";
27
41
  /** Filter / enum dropdown triggers beside search toolbars. */
28
42
  export declare const formControlFilterTriggerClassName: string;
43
+ /** Muted back navigation control with tertiary hover fill (settings sub-pages, detail views). */
44
+ export declare const formControlBackNavButtonClassName: string;
@@ -1,8 +1,9 @@
1
1
  import { cn as e } from "./utils.js";
2
2
  //#region src/utils/form-control-classes.ts
3
- var t = "h-9 min-h-9", n = "rounded-lg", r = "border border-[var(--oh-border)]", i = "bg-base-secondary", a = "transition-[background-color,border-color,box-shadow,opacity] duration-150 motion-reduce:transition-none", o = "!transition-[background-color,border-color,box-shadow,opacity] !duration-150 motion-reduce:transition-none", s = "focus:border-white/40 focus:ring-1 focus:ring-white/20 focus:outline-none", c = "focus-within:border-white/40 focus-within:ring-1 focus-within:ring-white/20", l = "disabled:cursor-not-allowed disabled:opacity-60", u = e(t, n, r, i, a, s, l, "w-full min-w-0 px-3 text-sm text-white placeholder:text-tertiary-alt"), d = e(u, "placeholder:italic", o), f = e(n, r, i, a, s, l, "w-full min-w-0 px-3 py-2 text-sm text-white placeholder:text-tertiary-alt"), p = e(t, "relative flex min-w-0 items-center", n, r, i, a, c), m = e("min-w-0 flex-1 border-0 bg-transparent px-3 text-sm outline-none", "placeholder:text-tertiary-alt", "[&::-webkit-search-cancel-button]:hidden"), h = e(t, "inline-flex w-fit cursor-pointer items-center justify-center gap-2 px-3", n, a, "text-sm font-normal disabled:cursor-not-allowed disabled:opacity-30"), g = "pl-12";
4
- e(h, r, i, "shrink-0 text-white");
3
+ var t = "h-9 min-h-9", n = "rounded-lg", r = "border border-[var(--oh-border)]", i = "bg-base-secondary", a = "duration-75", o = "!duration-75", s = "motion-reduce:transition-none", c = e("transition-[background-color,border-color,box-shadow,opacity]", a, s), l = e("!transition-[background-color,border-color,box-shadow,opacity]", o, s), u = e("transition-[transform] ease", a, s), d = "hover:text-white hover:bg-white/10", f = e("inline-flex items-center gap-1 rounded-[100px] border border-transparent px-1.5", "text-sm font-normal leading-5 text-[var(--oh-muted)] whitespace-nowrap min-w-0 cursor-pointer", c, d), p = e("flex items-center justify-center rounded-full text-[var(--oh-muted)] cursor-pointer", c, d), m = "focus:border-white/40 focus:ring-1 focus:ring-white/20 focus:outline-none", h = "focus-within:border-white/40 focus-within:ring-1 focus-within:ring-white/20", g = "disabled:cursor-not-allowed disabled:opacity-60", _ = e(t, n, r, i, c, m, g, "w-full min-w-0 px-3 text-sm text-white placeholder:text-tertiary-alt"), v = e(_, "placeholder:italic", l), y = e(n, r, i, c, m, g, "w-full min-w-0 px-3 py-2 text-sm text-white placeholder:text-tertiary-alt"), b = e(t, "relative flex min-w-0 items-center", n, r, i, c, h), x = e("min-w-0 flex-1 border-0 bg-transparent px-3 text-sm outline-none", "placeholder:text-tertiary-alt", "[&::-webkit-search-cancel-button]:hidden"), S = e(t, "inline-flex w-fit cursor-pointer items-center justify-center gap-2 px-3", n, c, "text-sm font-normal disabled:cursor-not-allowed disabled:opacity-30"), C = "pl-12";
4
+ e(S, r, i, "shrink-0 text-white");
5
+ var w = e("inline-flex items-center gap-2 self-start rounded-lg p-2", "text-sm font-normal leading-5 text-[var(--oh-muted)] cursor-pointer", c, "hover:bg-tertiary hover:text-white");
5
6
  //#endregion
6
- export { r as formControlBorderClassName, h as formControlButtonClassName, u as formControlFieldClassName, m as formControlInlineInputClassName, f as formControlMultilineFieldClassName, n as formControlRadiusClassName, d as formControlSettingsFieldClassName, p as formControlShellClassName, i as formControlSurfaceClassName, g as formControlSwitchDescriptionClassName, a as formControlTransitionClassName };
7
+ export { p as chatInputIconButtonClassName, f as chatInputPillButtonClassName, w as formControlBackNavButtonClassName, r as formControlBorderClassName, S as formControlButtonClassName, _ as formControlFieldClassName, x as formControlInlineInputClassName, y as formControlMultilineFieldClassName, d as formControlMutedHoverClassName, n as formControlRadiusClassName, v as formControlSettingsFieldClassName, b as formControlShellClassName, i as formControlSurfaceClassName, C as formControlSwitchDescriptionClassName, u as formControlTransformTransitionClassName, c as formControlTransitionClassName };
7
8
 
8
9
  //# sourceMappingURL=form-control-classes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-control-classes.js","names":[],"sources":["../../src/utils/form-control-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\n/** 36px control height — shared by fields, dropdowns, and buttons. */\nexport const formControlHeightClassName = \"h-9 min-h-9\";\n\nexport const formControlRadiusClassName = \"rounded-lg\";\n\nexport const formControlBorderClassName = \"border border-[var(--oh-border)]\";\n\nexport const formControlSurfaceClassName = \"bg-base-secondary\";\n\n/** Animate shell chrome on hover/focus; foreground color snaps instantly. */\nexport const formControlTransitionClassName =\n \"transition-[background-color,border-color,box-shadow,opacity] duration-150 motion-reduce:transition-none\";\n\n/** HeroUI input wrappers ship `transition-colors`; override so caret/text hover is instant. */\nexport const formControlHeroUiWrapperTransitionClassName =\n \"!transition-[background-color,border-color,box-shadow,opacity] !duration-150 motion-reduce:transition-none\";\n\nexport const formControlFocusClassName =\n \"focus:border-white/40 focus:ring-1 focus:ring-white/20 focus:outline-none\";\n\nexport const formControlFocusWithinClassName =\n \"focus-within:border-white/40 focus-within:ring-1 focus-within:ring-white/20\";\n\nexport const formControlDisabledClassName =\n \"disabled:cursor-not-allowed disabled:opacity-60\";\n\n/** Native text inputs and HeroUI Autocomplete wrappers. */\nexport const formControlFieldClassName = cn(\n formControlHeightClassName,\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusClassName,\n formControlDisabledClassName,\n \"w-full min-w-0 px-3 text-sm text-white placeholder:text-tertiary-alt\",\n);\n\n/** Settings screens keep italic placeholders on form controls. */\nexport const formControlSettingsFieldClassName = cn(\n formControlFieldClassName,\n \"placeholder:italic\",\n formControlHeroUiWrapperTransitionClassName,\n);\n\n/** Multiline fields share border/radius/focus styling without a fixed height. */\nexport const formControlMultilineFieldClassName = cn(\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusClassName,\n formControlDisabledClassName,\n \"w-full min-w-0 px-3 py-2 text-sm text-white placeholder:text-tertiary-alt\",\n);\n\n/** Combobox / search shell (icon + input), e.g. skills toolbar. */\nexport const formControlShellClassName = cn(\n formControlHeightClassName,\n \"relative flex min-w-0 items-center\",\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusWithinClassName,\n);\n\n/** Borderless input nested inside {@link formControlShellClassName}. */\nexport const formControlInlineInputClassName = cn(\n \"min-w-0 flex-1 border-0 bg-transparent px-3 text-sm outline-none\",\n \"placeholder:text-tertiary-alt\",\n \"[&::-webkit-search-cancel-button]:hidden\",\n);\n\n/** Primary/secondary/danger action buttons. */\nexport const formControlButtonClassName = cn(\n formControlHeightClassName,\n \"inline-flex w-fit cursor-pointer items-center justify-center gap-2 px-3\",\n formControlRadiusClassName,\n formControlTransitionClassName,\n \"text-sm font-normal disabled:cursor-not-allowed disabled:opacity-30\",\n);\n\n/** Helper text under a left-aligned {@link SettingsSwitch} (40px track + gap-2). */\nexport const formControlSwitchDescriptionClassName = \"pl-12\";\n\n/** Filter / enum dropdown triggers beside search toolbars. */\nexport const formControlFilterTriggerClassName = cn(\n formControlButtonClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n \"shrink-0 text-white\",\n);\n"],"mappings":";;AAGA,IAAa,IAA6B,eAE7B,IAA6B,cAE7B,IAA6B,oCAE7B,IAA8B,qBAG9B,IACX,4GAGW,IACX,8GAEW,IACX,6EAEW,IACX,+EAEW,IACX,mDAGW,IAA4B,EACvC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,uEACD,EAGY,IAAoC,EAC/C,GACA,sBACA,EACD,EAGY,IAAqC,EAChD,GACA,GACA,GACA,GACA,GACA,GACA,4EACD,EAGY,IAA4B,EACvC,GACA,sCACA,GACA,GACA,GACA,GACA,EACD,EAGY,IAAkC,EAC7C,oEACA,iCACA,2CACD,EAGY,IAA6B,EACxC,GACA,2EACA,GACA,GACA,sEACD,EAGY,IAAwC;AAGJ,EAC/C,GACA,GACA,GACA,sBACD"}
1
+ {"version":3,"file":"form-control-classes.js","names":[],"sources":["../../src/utils/form-control-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\n/** 36px control height — shared by fields, dropdowns, and buttons. */\nexport const formControlHeightClassName = \"h-9 min-h-9\";\n\nexport const formControlRadiusClassName = \"rounded-lg\";\n\nexport const formControlBorderClassName = \"border border-[var(--oh-border)]\";\n\nexport const formControlSurfaceClassName = \"bg-base-secondary\";\n\n/** Shared transition duration for form controls and chrome buttons. */\nexport const formControlTransitionDurationClassName = \"duration-75\";\n\nexport const formControlHeroUiTransitionDurationClassName = \"!duration-75\";\n\nexport const formControlMotionReduceClassName = \"motion-reduce:transition-none\";\n\n/** Shell properties that animate on hover/focus; foreground color snaps instantly. */\nexport const formControlTransitionPropertiesClassName =\n \"transition-[background-color,border-color,box-shadow,opacity]\";\n\n/** Animate shell chrome on hover/focus; foreground color snaps instantly. */\nexport const formControlTransitionClassName = cn(\n formControlTransitionPropertiesClassName,\n formControlTransitionDurationClassName,\n formControlMotionReduceClassName,\n);\n\n/** HeroUI input wrappers ship `transition-colors`; override so caret/text hover is instant. */\nexport const formControlHeroUiWrapperTransitionClassName = cn(\n \"!transition-[background-color,border-color,box-shadow,opacity]\",\n formControlHeroUiTransitionDurationClassName,\n formControlMotionReduceClassName,\n);\n\n/** Transform-only transitions (e.g. combobox carets). */\nexport const formControlTransformTransitionClassName = cn(\n \"transition-[transform] ease\",\n formControlTransitionDurationClassName,\n formControlMotionReduceClassName,\n);\n\n/** Muted icon/pill controls: instant foreground, fading shell on hover. */\nexport const formControlMutedHoverClassName =\n \"hover:text-white hover:bg-white/10\";\n\n/** Text/icon pill triggers in the chat input actions row. */\nexport const chatInputPillButtonClassName = cn(\n \"inline-flex items-center gap-1 rounded-[100px] border border-transparent px-1.5\",\n \"text-sm font-normal leading-5 text-[var(--oh-muted)] whitespace-nowrap min-w-0 cursor-pointer\",\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n);\n\n/** Circular icon triggers in the chat input actions row. */\nexport const chatInputIconButtonClassName = cn(\n \"flex items-center justify-center rounded-full text-[var(--oh-muted)] cursor-pointer\",\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n);\n\nexport const formControlFocusClassName =\n \"focus:border-white/40 focus:ring-1 focus:ring-white/20 focus:outline-none\";\n\nexport const formControlFocusWithinClassName =\n \"focus-within:border-white/40 focus-within:ring-1 focus-within:ring-white/20\";\n\nexport const formControlDisabledClassName =\n \"disabled:cursor-not-allowed disabled:opacity-60\";\n\n/** Native text inputs and HeroUI Autocomplete wrappers. */\nexport const formControlFieldClassName = cn(\n formControlHeightClassName,\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusClassName,\n formControlDisabledClassName,\n \"w-full min-w-0 px-3 text-sm text-white placeholder:text-tertiary-alt\",\n);\n\n/** Settings screens keep italic placeholders on form controls. */\nexport const formControlSettingsFieldClassName = cn(\n formControlFieldClassName,\n \"placeholder:italic\",\n formControlHeroUiWrapperTransitionClassName,\n);\n\n/** Multiline fields share border/radius/focus styling without a fixed height. */\nexport const formControlMultilineFieldClassName = cn(\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusClassName,\n formControlDisabledClassName,\n \"w-full min-w-0 px-3 py-2 text-sm text-white placeholder:text-tertiary-alt\",\n);\n\n/** Combobox / search shell (icon + input), e.g. skills toolbar. */\nexport const formControlShellClassName = cn(\n formControlHeightClassName,\n \"relative flex min-w-0 items-center\",\n formControlRadiusClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n formControlTransitionClassName,\n formControlFocusWithinClassName,\n);\n\n/** Borderless input nested inside {@link formControlShellClassName}. */\nexport const formControlInlineInputClassName = cn(\n \"min-w-0 flex-1 border-0 bg-transparent px-3 text-sm outline-none\",\n \"placeholder:text-tertiary-alt\",\n \"[&::-webkit-search-cancel-button]:hidden\",\n);\n\n/** Primary/secondary/danger action buttons. */\nexport const formControlButtonClassName = cn(\n formControlHeightClassName,\n \"inline-flex w-fit cursor-pointer items-center justify-center gap-2 px-3\",\n formControlRadiusClassName,\n formControlTransitionClassName,\n \"text-sm font-normal disabled:cursor-not-allowed disabled:opacity-30\",\n);\n\n/** Helper text under a left-aligned {@link SettingsSwitch} (40px track + gap-2). */\nexport const formControlSwitchDescriptionClassName = \"pl-12\";\n\n/** Filter / enum dropdown triggers beside search toolbars. */\nexport const formControlFilterTriggerClassName = cn(\n formControlButtonClassName,\n formControlBorderClassName,\n formControlSurfaceClassName,\n \"shrink-0 text-white\",\n);\n\n/** Muted back navigation control with tertiary hover fill (settings sub-pages, detail views). */\nexport const formControlBackNavButtonClassName = cn(\n \"inline-flex items-center gap-2 self-start rounded-lg p-2\",\n \"text-sm font-normal leading-5 text-[var(--oh-muted)] cursor-pointer\",\n formControlTransitionClassName,\n \"hover:bg-tertiary hover:text-white\",\n);\n"],"mappings":";;AAGA,IAAa,IAA6B,eAE7B,IAA6B,cAE7B,IAA6B,oCAE7B,IAA8B,qBAG9B,IAAyC,eAEzC,IAA+C,gBAE/C,IAAmC,iCAOnC,IAAiC,EAC5C,iEACA,GACA,EACD,EAGY,IAA8C,EACzD,kEACA,GACA,EACD,EAGY,IAA0C,EACrD,+BACA,GACA,EACD,EAGY,IACX,sCAGW,IAA+B,EAC1C,mFACA,iGACA,GACA,EACD,EAGY,IAA+B,EAC1C,uFACA,GACA,EACD,EAEY,IACX,6EAEW,IACX,+EAEW,IACX,mDAGW,IAA4B,EACvC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,uEACD,EAGY,IAAoC,EAC/C,GACA,sBACA,EACD,EAGY,IAAqC,EAChD,GACA,GACA,GACA,GACA,GACA,GACA,4EACD,EAGY,IAA4B,EACvC,GACA,sCACA,GACA,GACA,GACA,GACA,EACD,EAGY,IAAkC,EAC7C,oEACA,iCACA,2CACD,EAGY,IAA6B,EACxC,GACA,2EACA,GACA,GACA,sEACD,EAGY,IAAwC;AAGJ,EAC/C,GACA,GACA,GACA,sBACD;AAGD,IAAa,IAAoC,EAC/C,4DACA,uEACA,GACA,qCACD"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./utils.cjs`);var t=`flex flex-row gap-1 items-center justify-center rounded-[100px]`;function n(n){return e.cn(t,n?`bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer text-white`:`bg-[var(--oh-surface)] cursor-not-allowed opacity-50 text-[var(--oh-muted)]`)}function r(e){return e?`white`:`var(--oh-muted)`}var i=`font-normal text-sm leading-5 truncate`;exports.gitControlBarActionButtonClassName=n,exports.gitControlBarActionIconColor=r,exports.gitControlBarActionLabelClassName=i;
2
+ //# sourceMappingURL=git-control-bar-classes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-control-bar-classes.cjs","names":[],"sources":["../../src/utils/git-control-bar-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\nexport const gitControlBarActionButtonBaseClassName =\n \"flex flex-row gap-1 items-center justify-center rounded-[100px]\";\n\nexport function gitControlBarActionButtonClassName(isEnabled: boolean) {\n return cn(\n gitControlBarActionButtonBaseClassName,\n isEnabled\n ? \"bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer text-white\"\n : \"bg-[var(--oh-surface)] cursor-not-allowed opacity-50 text-[var(--oh-muted)]\",\n );\n}\n\nexport function gitControlBarActionIconColor(isEnabled: boolean) {\n return isEnabled ? \"white\" : \"var(--oh-muted)\";\n}\n\nexport const gitControlBarActionLabelClassName =\n \"font-normal text-sm leading-5 truncate\";\n"],"mappings":"4EAEA,IAAa,EACX,kEAEF,SAAgB,EAAmC,EAAoB,CACrE,OAAO,EAAA,GACL,EACA,EACI,qEACA,8EACL,CAGH,SAAgB,EAA6B,EAAoB,CAC/D,OAAO,EAAY,QAAU,kBAG/B,IAAa,EACX"}
@@ -0,0 +1,4 @@
1
+ export declare const gitControlBarActionButtonBaseClassName = "flex flex-row gap-1 items-center justify-center rounded-[100px]";
2
+ export declare function gitControlBarActionButtonClassName(isEnabled: boolean): string;
3
+ export declare function gitControlBarActionIconColor(isEnabled: boolean): "white" | "var(--oh-muted)";
4
+ export declare const gitControlBarActionLabelClassName = "font-normal text-sm leading-5 truncate";
@@ -0,0 +1,14 @@
1
+ import { cn as e } from "./utils.js";
2
+ //#region src/utils/git-control-bar-classes.ts
3
+ var t = "flex flex-row gap-1 items-center justify-center rounded-[100px]";
4
+ function n(n) {
5
+ return e(t, n ? "bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer text-white" : "bg-[var(--oh-surface)] cursor-not-allowed opacity-50 text-[var(--oh-muted)]");
6
+ }
7
+ function r(e) {
8
+ return e ? "white" : "var(--oh-muted)";
9
+ }
10
+ var i = "font-normal text-sm leading-5 truncate";
11
+ //#endregion
12
+ export { n as gitControlBarActionButtonClassName, r as gitControlBarActionIconColor, i as gitControlBarActionLabelClassName };
13
+
14
+ //# sourceMappingURL=git-control-bar-classes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-control-bar-classes.js","names":[],"sources":["../../src/utils/git-control-bar-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\nexport const gitControlBarActionButtonBaseClassName =\n \"flex flex-row gap-1 items-center justify-center rounded-[100px]\";\n\nexport function gitControlBarActionButtonClassName(isEnabled: boolean) {\n return cn(\n gitControlBarActionButtonBaseClassName,\n isEnabled\n ? \"bg-[var(--oh-surface)] hover:bg-tertiary cursor-pointer text-white\"\n : \"bg-[var(--oh-surface)] cursor-not-allowed opacity-50 text-[var(--oh-muted)]\",\n );\n}\n\nexport function gitControlBarActionIconColor(isEnabled: boolean) {\n return isEnabled ? \"white\" : \"var(--oh-muted)\";\n}\n\nexport const gitControlBarActionLabelClassName =\n \"font-normal text-sm leading-5 truncate\";\n"],"mappings":";;AAEA,IAAa,IACX;AAEF,SAAgB,EAAmC,GAAoB;AACrE,QAAO,EACL,GACA,IACI,uEACA,8EACL;;AAGH,SAAgB,EAA6B,GAAoB;AAC/D,QAAO,IAAY,UAAU;;AAG/B,IAAa,IACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"handle-event-for-ui.cjs","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isObservationEvent,\n} from \"#/types/agent-server/type-guards\";\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent dedup: multiple events share a ``tool_call_id`` as an ACP\n * tool call progresses (in_progress completed / failed). Collapse them to\n * the latest state at the original position so the card updates in place.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":"sGAeA,IAAa,GACX,EACA,IACqB,CACrB,IAAM,EAAc,CAAC,GAAG,EAAS,CAEjC,GAAI,EAAA,mBAAmB,EAAM,CAAE,CAC7B,IAAM,EAAgB,EAAY,UAC/B,GACC,EAAA,mBAAmB,EAAQ,EAC3B,EAAQ,eAAiB,EAAM,aAClC,CAMD,OALI,IAAkB,GAGpB,EAAY,KAAK,EAAM,CAFvB,EAAY,GAAiB,EAIxB,EAGT,GAAI,EAAA,mBAAmB,EAAM,CAAE,CAU7B,GAPI,EAAM,YAAY,OAAS,oBAO3B,EAAM,YAAY,OAAS,oBAC7B,OAAO,EAIT,IAAM,EAAc,EAAY,UAC7B,GAAY,EAAQ,KAAO,EAAM,UACnC,CACG,IAAgB,GAIlB,EAAY,KAAK,EAAM,CAHvB,EAAY,GAAe,OAO7B,EAAY,KAAK,EAAM,CAGzB,OAAO"}
1
+ {"version":3,"file":"handle-event-for-ui.cjs","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isObservationEvent,\n} from \"#/types/agent-server/type-guards\";\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":"sGAkBA,IAAa,GACX,EACA,IACqB,CACrB,IAAM,EAAc,CAAC,GAAG,EAAS,CAEjC,GAAI,EAAA,mBAAmB,EAAM,CAAE,CAC7B,IAAM,EAAgB,EAAY,UAC/B,GACC,EAAA,mBAAmB,EAAQ,EAC3B,EAAQ,eAAiB,EAAM,aAClC,CAMD,OALI,IAAkB,GAGpB,EAAY,KAAK,EAAM,CAFvB,EAAY,GAAiB,EAIxB,EAGT,GAAI,EAAA,mBAAmB,EAAM,CAAE,CAU7B,GAPI,EAAM,YAAY,OAAS,oBAO3B,EAAM,YAAY,OAAS,oBAC7B,OAAO,EAIT,IAAM,EAAc,EAAY,UAC7B,GAAY,EAAQ,KAAO,EAAM,UACnC,CACG,IAAgB,GAIlB,EAAY,KAAK,EAAM,CAHvB,EAAY,GAAe,OAO7B,EAAY,KAAK,EAAM,CAGzB,OAAO"}
@@ -4,8 +4,11 @@ import { OpenHandsEvent } from "#/types/agent-server/core";
4
4
  * Replaces actions with observations when they arrive (so UI shows observation instead of action)
5
5
  * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation
6
6
  *
7
- * ACPToolCallEvent dedup: multiple events share a ``tool_call_id`` as an ACP
8
- * tool call progresses (in_progress → completed / failed). Collapse them to
9
- * the latest state at the original position so the card updates in place.
7
+ * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` an
8
+ * early ``started`` event (``pending`` / ``in_progress``) and one terminal
9
+ * (completed / failed) event, the action->observation pair for a tool call.
10
+ * Replace the started entry in place with the terminal one so a single card
11
+ * updates from running to its result, exactly like an observation superseding
12
+ * its action below.
10
13
  */
11
14
  export declare const handleEventForUI: (event: OpenHandsEvent, uiEvents: OpenHandsEvent[]) => OpenHandsEvent[];
@@ -1 +1 @@
1
- {"version":3,"file":"handle-event-for-ui.js","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isObservationEvent,\n} from \"#/types/agent-server/type-guards\";\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent dedup: multiple events share a ``tool_call_id`` as an ACP\n * tool call progresses (in_progress completed / failed). Collapse them to\n * the latest state at the original position so the card updates in place.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":";;AAeA,IAAa,KACX,GACA,MACqB;CACrB,IAAM,IAAc,CAAC,GAAG,EAAS;AAEjC,KAAI,EAAmB,EAAM,EAAE;EAC7B,IAAM,IAAgB,EAAY,WAC/B,MACC,EAAmB,EAAQ,IAC3B,EAAQ,iBAAiB,EAAM,aAClC;AAMD,SALI,MAAkB,KAGpB,EAAY,KAAK,EAAM,GAFvB,EAAY,KAAiB,GAIxB;;AAGT,KAAI,EAAmB,EAAM,EAAE;AAU7B,MAPI,EAAM,YAAY,SAAS,sBAO3B,EAAM,YAAY,SAAS,oBAC7B,QAAO;EAIT,IAAM,IAAc,EAAY,WAC7B,MAAY,EAAQ,OAAO,EAAM,UACnC;AACD,EAAI,MAAgB,KAIlB,EAAY,KAAK,EAAM,GAHvB,EAAY,KAAe;OAO7B,GAAY,KAAK,EAAM;AAGzB,QAAO"}
1
+ {"version":3,"file":"handle-event-for-ui.js","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isObservationEvent,\n} from \"#/types/agent-server/type-guards\";\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":";;AAkBA,IAAa,KACX,GACA,MACqB;CACrB,IAAM,IAAc,CAAC,GAAG,EAAS;AAEjC,KAAI,EAAmB,EAAM,EAAE;EAC7B,IAAM,IAAgB,EAAY,WAC/B,MACC,EAAmB,EAAQ,IAC3B,EAAQ,iBAAiB,EAAM,aAClC;AAMD,SALI,MAAkB,KAGpB,EAAY,KAAK,EAAM,GAFvB,EAAY,KAAiB,GAIxB;;AAGT,KAAI,EAAmB,EAAM,EAAE;AAU7B,MAPI,EAAM,YAAY,SAAS,sBAO3B,EAAM,YAAY,SAAS,oBAC7B,QAAO;EAIT,IAAM,IAAc,EAAY,WAC7B,MAAY,EAAQ,OAAO,EAAM,UACnC;AACD,EAAI,MAAgB,KAIlB,EAAY,KAAK,EAAM,GAHvB,EAAY,KAAe;OAO7B,GAAY,KAAK,EAAM;AAGzB,QAAO"}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./utils.cjs`),t=require(`./form-control-classes.cjs`);var n=e.cn(`inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1`,`text-[var(--oh-muted)]`,t.formControlTransitionClassName,`hover:bg-white/10 hover:text-white`),r=`size-5 shrink-0`;exports.mobileTopBarIconButtonClassName=n,exports.mobileTopBarIconClassName=r;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./utils.cjs`),t=require(`./form-control-classes.cjs`);var n=e.cn(`inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1`,`text-[var(--oh-muted)]`,t.formControlTransitionClassName,t.formControlMutedHoverClassName),r=`size-5 shrink-0`;exports.mobileTopBarIconButtonClassName=n,exports.mobileTopBarIconClassName=r;
2
2
  //# sourceMappingURL=mobile-top-bar-icon-button-classes.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mobile-top-bar-icon-button-classes.cjs","names":[],"sources":["../../src/utils/mobile-top-bar-icon-button-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport { formControlTransitionClassName } from \"#/utils/form-control-classes\";\n\n/**\n * Shared control for icon-only buttons in mobile top bars (global nav, chat\n * header, full-screen panel chrome). Matches {@link RightPanelToggle}: `p-1`\n * with a `size-5` icon yields a 28×28px hit target.\n */\nexport const mobileTopBarIconButtonClassName = cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1\",\n \"text-[var(--oh-muted)]\",\n formControlTransitionClassName,\n \"hover:bg-white/10 hover:text-white\",\n);\n\n/** Lucide / inline SVG wrapper size aligned with `BlockDrawerLeftIcon` (`w-5 h-5`). */\nexport const mobileTopBarIconClassName = \"size-5 shrink-0\";\n"],"mappings":"oHAQA,IAAa,EAAkC,EAAA,GAC7C,iFACA,yBACA,EAAA,+BACA,qCACD,CAGY,EAA4B"}
1
+ {"version":3,"file":"mobile-top-bar-icon-button-classes.cjs","names":[],"sources":["../../src/utils/mobile-top-bar-icon-button-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport {\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n} from \"#/utils/form-control-classes\";\n\n/**\n * Shared control for icon-only buttons in mobile top bars (global nav, chat\n * header, full-screen panel chrome). Matches {@link RightPanelToggle}: `p-1`\n * with a `size-5` icon yields a 28×28px hit target.\n */\nexport const mobileTopBarIconButtonClassName = cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1\",\n \"text-[var(--oh-muted)]\",\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n);\n\n/** Lucide / inline SVG wrapper size aligned with `BlockDrawerLeftIcon` (`w-5 h-5`). */\nexport const mobileTopBarIconClassName = \"size-5 shrink-0\";\n"],"mappings":"oHAWA,IAAa,EAAkC,EAAA,GAC7C,iFACA,yBACA,EAAA,+BACA,EAAA,+BACD,CAGY,EAA4B"}
@@ -1,8 +1,8 @@
1
1
  import { cn as e } from "./utils.js";
2
- import { formControlTransitionClassName as t } from "./form-control-classes.js";
2
+ import { formControlMutedHoverClassName as t, formControlTransitionClassName as n } from "./form-control-classes.js";
3
3
  //#region src/utils/mobile-top-bar-icon-button-classes.ts
4
- var n = e("inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1", "text-[var(--oh-muted)]", t, "hover:bg-white/10 hover:text-white"), r = "size-5 shrink-0";
4
+ var r = e("inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1", "text-[var(--oh-muted)]", n, t), i = "size-5 shrink-0";
5
5
  //#endregion
6
- export { n as mobileTopBarIconButtonClassName, r as mobileTopBarIconClassName };
6
+ export { r as mobileTopBarIconButtonClassName, i as mobileTopBarIconClassName };
7
7
 
8
8
  //# sourceMappingURL=mobile-top-bar-icon-button-classes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mobile-top-bar-icon-button-classes.js","names":[],"sources":["../../src/utils/mobile-top-bar-icon-button-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport { formControlTransitionClassName } from \"#/utils/form-control-classes\";\n\n/**\n * Shared control for icon-only buttons in mobile top bars (global nav, chat\n * header, full-screen panel chrome). Matches {@link RightPanelToggle}: `p-1`\n * with a `size-5` icon yields a 28×28px hit target.\n */\nexport const mobileTopBarIconButtonClassName = cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1\",\n \"text-[var(--oh-muted)]\",\n formControlTransitionClassName,\n \"hover:bg-white/10 hover:text-white\",\n);\n\n/** Lucide / inline SVG wrapper size aligned with `BlockDrawerLeftIcon` (`w-5 h-5`). */\nexport const mobileTopBarIconClassName = \"size-5 shrink-0\";\n"],"mappings":";;;AAQA,IAAa,IAAkC,EAC7C,kFACA,0BACA,GACA,qCACD,EAGY,IAA4B"}
1
+ {"version":3,"file":"mobile-top-bar-icon-button-classes.js","names":[],"sources":["../../src/utils/mobile-top-bar-icon-button-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport {\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n} from \"#/utils/form-control-classes\";\n\n/**\n * Shared control for icon-only buttons in mobile top bars (global nav, chat\n * header, full-screen panel chrome). Matches {@link RightPanelToggle}: `p-1`\n * with a `size-5` icon yields a 28×28px hit target.\n */\nexport const mobileTopBarIconButtonClassName = cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1\",\n \"text-[var(--oh-muted)]\",\n formControlTransitionClassName,\n formControlMutedHoverClassName,\n);\n\n/** Lucide / inline SVG wrapper size aligned with `BlockDrawerLeftIcon` (`w-5 h-5`). */\nexport const mobileTopBarIconClassName = \"size-5 shrink-0\";\n"],"mappings":";;;AAWA,IAAa,IAAkC,EAC7C,kFACA,0BACA,GACA,EACD,EAGY,IAA4B"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./utils.cjs`);var t=e.cn(`text-xl leading-6 -tracking-[0.01em] font-medium text-[var(--oh-modal-title-foreground)]`),n=e.cn(`text-sm font-medium text-[var(--oh-modal-title-foreground)]`),r=e.cn(`text-lg font-medium text-[var(--oh-modal-title-foreground)]`),i=r;exports.modalTitleClassName=t,exports.modalTitleLgClassName=r,exports.modalTitleLgMediumClassName=i,exports.modalTitleSmClassName=n;
2
+ //# sourceMappingURL=modal-classes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-classes.cjs","names":[],"sources":["../../src/utils/modal-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\n/** Primary modal heading on dark overlay surfaces. */\nexport const modalTitleClassName = cn(\n \"text-xl leading-6 -tracking-[0.01em] font-medium text-[var(--oh-modal-title-foreground)]\",\n);\n\n/** Compact modal header bar title (folder browser, manage workspaces). */\nexport const modalTitleSmClassName = cn(\n \"text-sm font-medium text-[var(--oh-modal-title-foreground)]\",\n);\n\n/** Large modal title used by form-style dialogs. */\nexport const modalTitleLgClassName = cn(\n \"text-lg font-medium text-[var(--oh-modal-title-foreground)]\",\n);\n\n/** Alias of {@link modalTitleLgClassName} for historical call sites. */\nexport const modalTitleLgMediumClassName = modalTitleLgClassName;\n"],"mappings":"4EAGA,IAAa,EAAsB,EAAA,GACjC,2FACD,CAGY,EAAwB,EAAA,GACnC,8DACD,CAGY,EAAwB,EAAA,GACnC,8DACD,CAGY,EAA8B"}
@@ -0,0 +1,8 @@
1
+ /** Primary modal heading on dark overlay surfaces. */
2
+ export declare const modalTitleClassName: string;
3
+ /** Compact modal header bar title (folder browser, manage workspaces). */
4
+ export declare const modalTitleSmClassName: string;
5
+ /** Large modal title used by form-style dialogs. */
6
+ export declare const modalTitleLgClassName: string;
7
+ /** Alias of {@link modalTitleLgClassName} for historical call sites. */
8
+ export declare const modalTitleLgMediumClassName: string;
@@ -0,0 +1,7 @@
1
+ import { cn as e } from "./utils.js";
2
+ //#region src/utils/modal-classes.ts
3
+ var t = e("text-xl leading-6 -tracking-[0.01em] font-medium text-[var(--oh-modal-title-foreground)]"), n = e("text-sm font-medium text-[var(--oh-modal-title-foreground)]"), r = e("text-lg font-medium text-[var(--oh-modal-title-foreground)]"), i = r;
4
+ //#endregion
5
+ export { t as modalTitleClassName, r as modalTitleLgClassName, i as modalTitleLgMediumClassName, n as modalTitleSmClassName };
6
+
7
+ //# sourceMappingURL=modal-classes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-classes.js","names":[],"sources":["../../src/utils/modal-classes.ts"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\n/** Primary modal heading on dark overlay surfaces. */\nexport const modalTitleClassName = cn(\n \"text-xl leading-6 -tracking-[0.01em] font-medium text-[var(--oh-modal-title-foreground)]\",\n);\n\n/** Compact modal header bar title (folder browser, manage workspaces). */\nexport const modalTitleSmClassName = cn(\n \"text-sm font-medium text-[var(--oh-modal-title-foreground)]\",\n);\n\n/** Large modal title used by form-style dialogs. */\nexport const modalTitleLgClassName = cn(\n \"text-lg font-medium text-[var(--oh-modal-title-foreground)]\",\n);\n\n/** Alias of {@link modalTitleLgClassName} for historical call sites. */\nexport const modalTitleLgMediumClassName = modalTitleLgClassName;\n"],"mappings":";;AAGA,IAAa,IAAsB,EACjC,2FACD,EAGY,IAAwB,EACnC,8DACD,EAGY,IAAwB,EACnC,8DACD,EAGY,IAA8B"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);var e=`https://llm-proxy.app.all-hands.dev/`;function t(e){return typeof e==`string`&&e.startsWith(`openhands/`)}exports.OPENHANDS_LLM_PROXY_BASE_URL=e,exports.isOpenHandsProviderModel=t;
2
+ //# sourceMappingURL=openhands-llm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openhands-llm.cjs","names":[],"sources":["../../src/utils/openhands-llm.ts"],"sourcesContent":["export const OPENHANDS_LLM_PROXY_BASE_URL =\n \"https://llm-proxy.app.all-hands.dev/\";\n\nexport function isOpenHandsProviderModel(model: unknown): model is string {\n return typeof model === \"string\" && model.startsWith(\"openhands/\");\n}\n"],"mappings":"6CAAA,IAAa,EACX,uCAEF,SAAgB,EAAyB,EAAiC,CACxE,OAAO,OAAO,GAAU,UAAY,EAAM,WAAW,aAAa"}
@@ -0,0 +1,2 @@
1
+ export declare const OPENHANDS_LLM_PROXY_BASE_URL = "https://llm-proxy.app.all-hands.dev/";
2
+ export declare function isOpenHandsProviderModel(model: unknown): model is string;
@@ -0,0 +1,9 @@
1
+ //#region src/utils/openhands-llm.ts
2
+ var e = "https://llm-proxy.app.all-hands.dev/";
3
+ function t(e) {
4
+ return typeof e == "string" && e.startsWith("openhands/");
5
+ }
6
+ //#endregion
7
+ export { e as OPENHANDS_LLM_PROXY_BASE_URL, t as isOpenHandsProviderModel };
8
+
9
+ //# sourceMappingURL=openhands-llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openhands-llm.js","names":[],"sources":["../../src/utils/openhands-llm.ts"],"sourcesContent":["export const OPENHANDS_LLM_PROXY_BASE_URL =\n \"https://llm-proxy.app.all-hands.dev/\";\n\nexport function isOpenHandsProviderModel(model: unknown): model is string {\n return typeof model === \"string\" && model.startsWith(\"openhands/\");\n}\n"],"mappings":";AAAA,IAAa,IACX;AAEF,SAAgB,EAAyB,GAAiC;AACxE,QAAO,OAAO,KAAU,YAAY,EAAM,WAAW,aAAa"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);var e=`<secret-hidden>`;function t(t){let n=/(<CUSTOM_SECRETS>)([\s\S]*?)(<\/CUSTOM_SECRETS>|$)/gi,r=/^(\s*[^=:\n]+?\s*[:=]\s*)(.+?)\s*$/gm;return t.replace(n,(t,n,i,a)=>`${n}${i.replace(r,(t,n,r)=>r===e?t:`${n}${e}`)}${a}`)}exports.redactCustomSecrets=t;
2
+ //# sourceMappingURL=redact-custom-secrets.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact-custom-secrets.cjs","names":[],"sources":["../../src/utils/redact-custom-secrets.ts"],"sourcesContent":["const MASKED_PLACEHOLDER = \"<secret-hidden>\";\n\n/**\n * Defensive backstop: redact any unmasked value inside a `<CUSTOM_SECRETS>`\n * block before showing dynamic context in the UI, in case backend masking\n * regresses. Text outside the block is untouched.\n */\nexport function redactCustomSecrets(text: string): string {\n // Regexes are local: the `g` flag makes them stateful, and keeping them\n // scoped to this call avoids cross-call `lastIndex` surprises.\n\n // Closing tag is optional so a truncated block is still redacted, not leaked.\n const customSecretsBlock =\n /(<CUSTOM_SECRETS>)([\\s\\S]*?)(<\\/CUSTOM_SECRETS>|$)/gi;\n\n // `KEY: value` / `KEY=value`, capturing key + separator so only the value changes.\n const secretLine = /^(\\s*[^=:\\n]+?\\s*[:=]\\s*)(.+?)\\s*$/gm;\n\n return text.replace(\n customSecretsBlock,\n (_match, open: string, body: string, close: string) => {\n const redactedBody = body.replace(\n secretLine,\n (lineMatch, prefix: string, value: string) =>\n value === MASKED_PLACEHOLDER\n ? lineMatch\n : `${prefix}${MASKED_PLACEHOLDER}`,\n );\n return `${open}${redactedBody}${close}`;\n },\n );\n}\n"],"mappings":"6CAAA,IAAM,EAAqB,kBAO3B,SAAgB,EAAoB,EAAsB,CAKxD,IAAM,EACJ,uDAGI,EAAa,uCAEnB,OAAO,EAAK,QACV,GACC,EAAQ,EAAc,EAAc,IAQ5B,GAAG,IAPW,EAAK,QACxB,GACC,EAAW,EAAgB,IAC1B,IAAU,EACN,EACA,GAAG,IAAS,IAEH,GAAe,IAEnC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Defensive backstop: redact any unmasked value inside a `<CUSTOM_SECRETS>`
3
+ * block before showing dynamic context in the UI, in case backend masking
4
+ * regresses. Text outside the block is untouched.
5
+ */
6
+ export declare function redactCustomSecrets(text: string): string;
@@ -0,0 +1,10 @@
1
+ //#region src/utils/redact-custom-secrets.ts
2
+ var e = "<secret-hidden>";
3
+ function t(t) {
4
+ let n = /(<CUSTOM_SECRETS>)([\s\S]*?)(<\/CUSTOM_SECRETS>|$)/gi, r = /^(\s*[^=:\n]+?\s*[:=]\s*)(.+?)\s*$/gm;
5
+ return t.replace(n, (t, n, i, a) => `${n}${i.replace(r, (t, n, r) => r === e ? t : `${n}${e}`)}${a}`);
6
+ }
7
+ //#endregion
8
+ export { t as redactCustomSecrets };
9
+
10
+ //# sourceMappingURL=redact-custom-secrets.js.map