@openhands/agent-canvas 1.16.0 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (956) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-CX3Lh9gj.js → acp-providers-DrjNsPOH.js} +1 -1
  4. package/build/assets/active-backend-context-rZiLJRUc.js +2 -0
  5. package/build/assets/{agent-context-settings-DSZlXrLj.js → agent-context-settings-CJUrcBut.js} +1 -1
  6. package/build/assets/agent-profiles-service.api-Biieml2L.js +1 -0
  7. package/build/assets/agent-profiles-settings-x6RvPsq7.js +1 -0
  8. package/build/assets/agent-server-client-options-BikiNwTa.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +88 -0
  10. package/build/assets/agent-settings-BJyovpJ_.js +1 -0
  11. package/build/assets/agent-settings-CpY3zObk.js +2 -0
  12. package/build/assets/{alert-banner-HP6mX-Vr.js → alert-banner-vARz1idS.js} +1 -1
  13. package/build/assets/{api-error-message-B-XdSk3b.js → api-error-message-Ve79qDcN.js} +1 -1
  14. package/build/assets/api-key-entry-screen-CsMuBhoP.js +1 -0
  15. package/build/assets/{app-settings-dbnneVaV.js → app-settings-BaJ7nfHt.js} +1 -1
  16. package/build/assets/automation-detail-CVoGDrKq.js +3 -0
  17. package/build/assets/{automation-export-D3a3of4G.js → automation-export-DxY47m3T.js} +1 -1
  18. package/build/assets/automation-git-sync-CRMP9Bbm.js +1 -0
  19. package/build/assets/automation-setup-route-072beLz1.js +3 -0
  20. package/build/assets/{automation-templates-BRppNh99.js → automation-templates-4C4PM8K7.js} +1 -1
  21. package/build/assets/automations-list-xuqTSQL4.js +1 -0
  22. package/build/assets/{back-nav-button-Cjl_hoxq.js → back-nav-button-B8tH0BEp.js} +1 -1
  23. package/build/assets/backend-form-modal-0aJmWdsa.js +1 -0
  24. package/build/assets/{backend-synced-settings-badge-DPkz30BE.js → backend-synced-settings-badge-B7rKWBir.js} +1 -1
  25. package/build/assets/{badge-BU3S0VtE.js → badge-CcGx2TaV.js} +1 -1
  26. package/build/assets/{base-modal-D_L0oEbG.js → base-modal-DTULovNc.js} +1 -1
  27. package/build/assets/bot-CLMxGFaq.js +1 -0
  28. package/build/assets/{brand-button-BAfk4wGP.js → brand-button-DxPO4Lf8.js} +1 -1
  29. package/build/assets/{browser-DSAo0tz1.js → browser-C-_qBasq.js} +2 -2
  30. package/build/assets/{browser-tab-C9vy56R5.js → browser-tab-DZanIw5m.js} +1 -1
  31. package/build/assets/{canvas-extension-page-dx1gFrfW.js → canvas-extension-page-o_cWgE9B.js} +1 -1
  32. package/build/assets/canvas-extensions-DSgNlCha.js +1 -0
  33. package/build/assets/{canvas-extensions-runtime-2_x5Ezmi.js → canvas-extensions-runtime-DdnkgJXV.js} +1 -1
  34. package/build/assets/{chat-send-button-MUQqCZCS.js → chat-send-button-B3SFSIg5.js} +1 -1
  35. package/build/assets/check-fDEfgSzj.js +1 -0
  36. package/build/assets/chevron-down-CFrWHqu8.js +1 -0
  37. package/build/assets/chevron-right-C5roOrJu.js +1 -0
  38. package/build/assets/circle-check-ClTzJTdb.js +1 -0
  39. package/build/assets/{circle-plus-check-toggle-BO_kFZt3.js → circle-plus-check-toggle-Fr-h-mbL.js} +1 -1
  40. package/build/assets/{cloud-funnel-analytics-CztBCCPp.js → cloud-funnel-analytics-BQanUEEC.js} +1 -1
  41. package/build/assets/{cog-D-MPQW6G.js → cog-VBlRo6iw.js} +1 -1
  42. package/build/assets/command-menu-BT3Ia5Ru.js +1 -0
  43. package/build/assets/commits-tab-2jhtaohl.js +1 -0
  44. package/build/assets/{condenser-settings-DmEOje-7.js → condenser-settings-eVKFMvap.js} +1 -1
  45. package/build/assets/confirmation-modal-gIFHeZt6.js +1 -0
  46. package/build/assets/{context-menu-list-item-I86vKcmM.js → context-menu-list-item-DDROe12Z.js} +1 -1
  47. package/build/assets/conversation-BnjJSFf5.js +93 -0
  48. package/build/assets/conversation-DZ578rOX.js +1 -0
  49. package/build/assets/conversation-panel-DZ578rOX.js +1 -0
  50. package/build/assets/{conversation-state-store-B0ImPLHO.js → conversation-state-store-D1_G_9I-.js} +1 -1
  51. package/build/assets/{conversation-store-Ca3ghXap.js → conversation-store-DVVfkCsk.js} +1 -1
  52. package/build/assets/{conversation-tab-empty-state-FIbh_lc8.js → conversation-tab-empty-state-DKlzAz5c.js} +1 -1
  53. package/build/assets/{copy-to-clipboard-button-Ca8iSkkA.js → copy-to-clipboard-button-B3w0X7WH.js} +1 -1
  54. package/build/assets/{device-verify-Bhn2e_Ye.js → device-verify-BfkCzyFB.js} +1 -1
  55. package/build/assets/{dropdown-classes-Bc1djN0-.js → dropdown-classes-B9kJVDIk.js} +1 -1
  56. package/build/assets/edit-automation-modal-BwhJ39JT.js +1 -0
  57. package/build/assets/empty-state-RZz0OfnY.js +1 -0
  58. package/build/assets/{entry.client-CqyPPjOq.js → entry.client-Ds8LVp-E.js} +2 -2
  59. package/build/assets/enum-filter-dropdown-C4pW0ORd.js +1 -0
  60. package/build/assets/{environment-switch-overlay-BmBRT7gv.js → environment-switch-overlay-P2ZAuzov.js} +1 -1
  61. package/build/assets/{error-state-Body8Ngd.js → error-state-B_5cgNPJ.js} +1 -1
  62. package/build/assets/extensions-hub-DsaUr4ca.js +1 -0
  63. package/build/assets/extensions-navigation-CRMZd-FE.js +1 -0
  64. package/build/assets/external-link-DQtv7eTh.js +1 -0
  65. package/build/assets/files-tab-CCgAcVdc.js +1 -0
  66. package/build/assets/{form-control-classes-Bkh5FGrD.js → form-control-classes-B-z85REi.js} +1 -1
  67. package/build/assets/get-git-path-EHrSDxTM.js +1 -0
  68. package/build/assets/git-repo-dropdown-D2WEQ97X.js +1 -0
  69. package/build/assets/{git-repo-dropdown-4ROKl2cB.js → git-repo-dropdown-DVeCUUXG.js} +1 -1
  70. package/build/assets/{highlighted-source-view-BFRxGT_Q.js → highlighted-source-view-DjHO3SdW.js} +1 -1
  71. package/build/assets/home-BorS_vdS.js +1 -0
  72. package/build/assets/home-aIMbHw5M.js +1 -0
  73. package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +1 -0
  74. package/build/assets/home-store-DyXz0w6d.js +1 -0
  75. package/build/assets/hooks-service-C6dpRtZM.js +1 -0
  76. package/build/assets/index-home-zKFuKK2B.js +1 -0
  77. package/build/assets/info-CTIdjttz.js +1 -0
  78. package/build/assets/install-server-modal-DUiZMc8u.js +1 -0
  79. package/build/assets/kebab-menu-item-content-mm04SBD3.js +1 -0
  80. package/build/assets/{key-BmVyxs-2.js → key-CfXbJa8w.js} +1 -1
  81. package/build/assets/{launch-IrTDEFCs.js → launch-BSIf9KEg.js} +1 -1
  82. package/build/assets/list-filter-CNpqTWVY.js +1 -0
  83. package/build/assets/{list-todo-apgLVjMw.js → list-todo-ByXMdY4W.js} +1 -1
  84. package/build/assets/llm-not-configured-banner-z_QRSeV0.js +27 -0
  85. package/build/assets/llm-settings-B-5AHMiX.js +1 -0
  86. package/build/assets/llm-settings-B3SjHDmA.js +1 -0
  87. package/build/assets/llm-subscription-service-aDNBQ7Gq.js +1 -0
  88. package/build/assets/loader-circle-Dex47vVW.js +1 -0
  89. package/build/assets/{loading-spinner-BY9N3pOe.js → loading-spinner-DfHI77BA.js} +1 -1
  90. package/build/assets/manage-backends-modal-q1NdFisr.js +1 -0
  91. package/build/assets/manifest-8920b615.js +1 -0
  92. package/build/assets/{manifest-subpage-layout-CAOYzrYp.js → manifest-subpage-layout-BQQy5ipR.js} +1 -1
  93. package/build/assets/{map-provider-Cu3Zgumb.js → map-provider-DXvssjw9.js} +1 -1
  94. package/build/assets/markdown-renderer-rivLvYh-.js +8 -0
  95. package/build/assets/{mcp-BTs_SXfZ.js → mcp-CEXDhQWn.js} +1 -1
  96. package/build/assets/{mcp-marketplace-utils-AIBzzHTO.js → mcp-marketplace-utils-Cn_NIMWM.js} +1 -1
  97. package/build/assets/mcp-page-LGYIICMG.js +9 -0
  98. package/build/assets/messages-DUSeANAh.js +41 -0
  99. package/build/assets/{modal-body-BxZjsju9.js → modal-body-DJw4xBki.js} +1 -1
  100. package/build/assets/{modal-classes-C8eycCwG.js → modal-classes-Dg0ngBPO.js} +1 -1
  101. package/build/assets/{modal-close-button-DDzdRvCs.js → modal-close-button-B9j4nasm.js} +1 -1
  102. package/build/assets/{mouse-pointer-click-Co2uyaPA.js → mouse-pointer-click-DEhsSUpu.js} +1 -1
  103. package/build/assets/onboarding-BjFebfs5.js +1 -0
  104. package/build/assets/onboarding-modal-DDTjOpyd.js +1 -0
  105. package/build/assets/organization-service.api-Cyg1Tn03.js +1 -0
  106. package/build/assets/pencil-D5c47kyN.js +1 -0
  107. package/build/assets/pin-C7vMagvf.js +1 -0
  108. package/build/assets/planner-tab-D8f2Y3rn.js +1 -0
  109. package/build/assets/plug-CeaqeF6u.js +1 -0
  110. package/build/assets/plugins-management-service-Bh_pBuf-.js +1 -0
  111. package/build/assets/plus-B3wvU06-.js +1 -0
  112. package/build/assets/profiles-service.api-BbOK0EkF.js +1 -0
  113. package/build/assets/{providers-BhMcY5nv.js → providers-2gIIkz2N.js} +1 -1
  114. package/build/assets/proxy-CBgMd2zf.js +1 -0
  115. package/build/assets/{puzzle-JM_QaRm0.js → puzzle-DdAqbUrb.js} +1 -1
  116. package/build/assets/recommended-automations-launcher-YLAQTp4s.js +1 -0
  117. package/build/assets/refresh-cw-DEQdPCpH.js +1 -0
  118. package/build/assets/root-Bye_XmEL.js +2 -0
  119. package/build/assets/root-Cnwwzgo0.css +1 -0
  120. package/build/assets/root-layout-CSAwxBGM.js +2 -0
  121. package/build/assets/schema-field-CK0xYNbO.js +1 -0
  122. package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
  123. package/build/assets/sdk-section-page-Da73Rs_o.js +1 -0
  124. package/build/assets/secret-form-CB2VwYYg.js +1 -0
  125. package/build/assets/secrets-service-Cr8g8xuv.js +1 -0
  126. package/build/assets/{secrets-settings-B_GpxKW2.js → secrets-settings-Bh0udeKv.js} +1 -1
  127. package/build/assets/settings-DmyIgRxO.js +1 -0
  128. package/build/assets/{settings-dropdown-input-BcwylHs2.js → settings-dropdown-input-DVpyD87C.js} +1 -1
  129. package/build/assets/settings-index-BSJUFmjE.js +1 -0
  130. package/build/assets/{settings-input-Db-1g8Ql.js → settings-input-C0dd8Utu.js} +1 -1
  131. package/build/assets/{settings-list-classes-BzeSZbF2.js → settings-list-classes-Ds4jPBHK.js} +1 -1
  132. package/build/assets/{settings-modal-DfJ3tcJQ.js → settings-modal-yStgEh2o.js} +1 -1
  133. package/build/assets/settings-service.api-9_xdv_mh.js +1 -0
  134. package/build/assets/{settings-switch-CS-dJDmA.js → settings-switch-B78Khmyz.js} +1 -1
  135. package/build/assets/{settings-utils-UYpEdPuD.js → settings-utils-8GIIgOQL.js} +1 -1
  136. package/build/assets/shared-conversation-DM96X4KV.js +1 -0
  137. package/build/assets/shield-check-DO7wa_eu.js +1 -0
  138. package/build/assets/{sidebar-layout-D6fS8-Gl.js → sidebar-layout-EPfWxk11.js} +1 -1
  139. package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +1 -0
  140. package/build/assets/{sidebar-nav-link-DQQcMf1A.js → sidebar-nav-link-_t4_Ef-9.js} +1 -1
  141. package/build/assets/{sidebar-onboarding-checklist-storage-BBkeI6Bp.js → sidebar-onboarding-checklist-storage-DbDX-Wvj.js} +1 -1
  142. package/build/assets/{sidebar-store-DGqHkVLw.js → sidebar-store-CSDFK0W5.js} +1 -1
  143. package/build/assets/{skill-card-pill-row-B27-xyig.js → skill-card-pill-row-989y15jV.js} +1 -1
  144. package/build/assets/{skill-filter-w__3UCEE.js → skill-filter-BBeZ4JEP.js} +1 -1
  145. package/build/assets/{skill-icon-badge-RQkq8wvl.js → skill-icon-badge-BDhQ-tQ0.js} +1 -1
  146. package/build/assets/skill-scope-Dz3kPH3P.js +1 -0
  147. package/build/assets/skills-plugins-e3CYGdUJ.js +1 -0
  148. package/build/assets/skills-settings-3e-FuHw_.js +1 -0
  149. package/build/assets/styled-tooltip-Pd22BIvr.js +1 -0
  150. package/build/assets/{task-list-tab-C5zcaktH.js → task-list-tab-3Jg8ywch.js} +1 -1
  151. package/build/assets/{terminal-CNElN42a.js → terminal-onXx0_Qz.js} +2 -2
  152. package/build/assets/toggle-switch-lwQtxDcm.js +1 -0
  153. package/build/assets/trash-2-ZhKuTLiz.js +1 -0
  154. package/build/assets/trash-B6OIe4yX.js +1 -0
  155. package/build/assets/triangle-alert-BajLPpQg.js +1 -0
  156. package/build/assets/{typography-v1KN0tzi.js → typography-HLLg_FAn.js} +1 -1
  157. package/build/assets/usage-tab-Cm-9j3UK.js +1 -0
  158. package/build/assets/use-acp-credential-form-BARcvjYE.js +1 -0
  159. package/build/assets/use-activate-agent-profile-BLKML6vQ.js +1 -0
  160. package/build/assets/use-agent-profiles-1P91KSXz.js +1 -0
  161. package/build/assets/{use-automation-health-E6NZi9rb.js → use-automation-health-BZkQNEA8.js} +1 -1
  162. package/build/assets/use-automation-permissions-B_RpvL-s.js +1 -0
  163. package/build/assets/{use-automations-xijQKIl9.js → use-automations-Cg0PDIZr.js} +1 -1
  164. package/build/assets/{use-can-manage-org-profiles-CrJP5262.js → use-can-manage-org-profiles-BbN6KfDr.js} +1 -1
  165. package/build/assets/use-canvas-extensions-CFUpHat6.js +1 -0
  166. package/build/assets/{use-cloud-current-user-id-CDfAHpPX.js → use-cloud-current-user-id-Dk0rjr63.js} +1 -1
  167. package/build/assets/use-config-DpafU_QP.js +1 -0
  168. package/build/assets/use-create-conversation-1YgmAHt-.js +1 -0
  169. package/build/assets/use-create-secret-D8p9ybQj.js +1 -0
  170. package/build/assets/{use-get-secrets-K3jmk-LH.js → use-get-secrets-CQ4b0qK8.js} +1 -1
  171. package/build/assets/use-is-authed-BRPjCRKM.js +1 -0
  172. package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-DeYa1tFM.js} +1 -1
  173. package/build/assets/use-llm-configured-DGm8FiRR.js +1 -0
  174. package/build/assets/use-llm-profiles-BTTtpW4z.js +1 -0
  175. package/build/assets/use-manifest-capabilities-AOWGcu0j.js +1 -0
  176. package/build/assets/use-onboarding-completion-CoINurkm.js +1 -0
  177. package/build/assets/use-pinned-home-route-D6krwXjy.js +1 -0
  178. package/build/assets/use-plugins-marketplace-mLsIDhBv.js +1 -0
  179. package/build/assets/use-save-agent-profile-CxyO9YG-.js +1 -0
  180. package/build/assets/{use-save-settings-DYqkKv7T.js → use-save-settings-3U5K9-8x.js} +1 -1
  181. package/build/assets/use-settings-Dn00UISA.js +1 -0
  182. package/build/assets/use-settings-nav-items-vrjxTqcu.js +16 -0
  183. package/build/assets/use-tracking-B9prBsrq.js +3 -0
  184. package/build/assets/{use-user-conversation-B9Gebw_g.js → use-user-conversation-ZWlXtbZb.js} +1 -1
  185. package/build/assets/{useInfiniteQuery-C926xzY4.js → useInfiniteQuery-BzrRqjLg.js} +1 -1
  186. package/build/assets/{useMutation-B-qc391N.js → useMutation-CJuK90oc.js} +1 -1
  187. package/build/assets/{useQueries-DlbhlH9I.js → useQueries-CykmpT-a.js} +1 -1
  188. package/build/assets/{useQuery-BSTgq1rl.js → useQuery-S6j94er1.js} +1 -1
  189. package/build/assets/utils-BOco8mxR.js +1 -0
  190. package/build/assets/{vendor~conversation-panel~conversation-C8Fn4XOf.js → vendor~conversation-panel~conversation-4eJ0tml3.js} +1 -1
  191. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
  192. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +185 -0
  193. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js} +1 -1
  194. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js → vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js} +1 -1
  195. package/build/assets/vendor~root-layout-n8XCEXG8.js +1 -0
  196. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js → vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js} +1 -1
  197. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js} +1 -1
  198. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js → vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js} +1 -1
  199. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
  200. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~nj1hli3r-DP9wmsjo.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +1 -1
  201. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +1 -0
  202. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js} +12 -6
  203. package/build/assets/{verification-settings-gw_q6vkL.js → verification-settings-u2POabjH.js} +1 -1
  204. package/build/assets/{wrench-CUEI1krB.js → wrench-CkgI4rxA.js} +1 -1
  205. package/build/assets/x-By6qCmtY.js +1 -0
  206. package/build/index.html +4 -4
  207. package/build/locales/ar/openhands.json +73 -20
  208. package/build/locales/ca/openhands.json +73 -20
  209. package/build/locales/de/openhands.json +73 -20
  210. package/build/locales/en/openhands.json +73 -20
  211. package/build/locales/es/openhands.json +73 -20
  212. package/build/locales/fr/openhands.json +73 -20
  213. package/build/locales/it/openhands.json +73 -20
  214. package/build/locales/ja/openhands.json +73 -20
  215. package/build/locales/ko-KR/openhands.json +73 -20
  216. package/build/locales/no/openhands.json +73 -20
  217. package/build/locales/pt/openhands.json +73 -20
  218. package/build/locales/tr/openhands.json +73 -20
  219. package/build/locales/uk/openhands.json +73 -20
  220. package/build/locales/zh-CN/openhands.json +73 -20
  221. package/build/locales/zh-TW/openhands.json +73 -20
  222. package/config/defaults.json +3 -3
  223. package/dist/api/agent-server-adapter.cjs +3 -3
  224. package/dist/api/agent-server-adapter.cjs.map +1 -1
  225. package/dist/api/agent-server-adapter.d.ts +72 -12
  226. package/dist/api/agent-server-adapter.js +234 -132
  227. package/dist/api/agent-server-adapter.js.map +1 -1
  228. package/dist/api/agent-server-config.cjs +1 -1
  229. package/dist/api/agent-server-config.cjs.map +1 -1
  230. package/dist/api/agent-server-config.d.ts +6 -0
  231. package/dist/api/agent-server-config.js +6 -3
  232. package/dist/api/agent-server-config.js.map +1 -1
  233. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  234. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  235. package/dist/api/automation-service/automation-service.api.d.ts +2 -2
  236. package/dist/api/automation-service/automation-service.api.js +7 -7
  237. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  238. package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
  239. package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
  240. package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
  241. package/dist/api/cloud/provider-connections-service.api.js +50 -0
  242. package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
  243. package/dist/api/cloud/skills-service.api.cjs +1 -1
  244. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  245. package/dist/api/cloud/skills-service.api.d.ts +10 -0
  246. package/dist/api/cloud/skills-service.api.js +11 -1
  247. package/dist/api/cloud/skills-service.api.js.map +1 -1
  248. package/dist/api/conversation-metadata-store.cjs +1 -1
  249. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  250. package/dist/api/conversation-metadata-store.d.ts +24 -0
  251. package/dist/api/conversation-metadata-store.js +10 -2
  252. package/dist/api/conversation-metadata-store.js.map +1 -1
  253. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  254. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  255. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +20 -0
  256. package/dist/api/conversation-service/agent-server-conversation-service.api.js +126 -77
  257. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  258. package/dist/api/hooks-service.cjs +2 -0
  259. package/dist/api/hooks-service.cjs.map +1 -0
  260. package/dist/api/hooks-service.d.ts +13 -0
  261. package/dist/api/hooks-service.js +20 -0
  262. package/dist/api/hooks-service.js.map +1 -0
  263. package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
  264. package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
  265. package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
  266. package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -1
  267. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  268. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  269. package/dist/api/settings-service/settings-service.api.d.ts +2 -0
  270. package/dist/api/settings-service/settings-service.api.js +18 -10
  271. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  272. package/dist/api/skills-service.cjs +1 -1
  273. package/dist/api/skills-service.cjs.map +1 -1
  274. package/dist/api/skills-service.d.ts +7 -0
  275. package/dist/api/skills-service.js +11 -8
  276. package/dist/api/skills-service.js.map +1 -1
  277. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
  278. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
  279. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
  280. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
  281. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
  282. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
  283. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  284. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  285. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  286. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
  287. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  288. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
  289. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
  290. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
  291. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js.map +1 -1
  292. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  293. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  294. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +1 -1
  295. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
  296. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  297. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  298. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  299. package/dist/components/conversation-events/chat/event-message.js +79 -70
  300. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  301. package/dist/components/conversation-events/chat/messages.cjs +1 -1
  302. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  303. package/dist/components/conversation-events/chat/messages.js +28 -27
  304. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  305. package/dist/components/features/automations/automation-card.cjs +1 -1
  306. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  307. package/dist/components/features/automations/automation-card.js +100 -94
  308. package/dist/components/features/automations/automation-card.js.map +1 -1
  309. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  310. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  311. package/dist/components/features/automations/automation-list-row.js +88 -77
  312. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  313. package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
  314. package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
  315. package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
  316. package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
  317. package/dist/components/features/automations/detail/run-status-badge.js +82 -53
  318. package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
  319. package/dist/components/features/automations/kebab-menu.cjs +1 -1
  320. package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
  321. package/dist/components/features/automations/kebab-menu.js +9 -5
  322. package/dist/components/features/automations/kebab-menu.js.map +1 -1
  323. package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
  324. package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
  325. package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
  326. package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
  327. package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
  328. package/dist/components/features/automations/recommended-automations-section.js +9 -9
  329. package/dist/components/features/backends/backend-selector.cjs +1 -1
  330. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  331. package/dist/components/features/backends/backend-selector.js +133 -122
  332. package/dist/components/features/backends/backend-selector.js.map +1 -1
  333. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  334. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  335. package/dist/components/features/backends/manage-backends-modal.js +29 -29
  336. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  337. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  338. package/dist/components/features/chat/change-agent-button.js +4 -4
  339. package/dist/components/features/chat/chat-interface.cjs +2 -2
  340. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  341. package/dist/components/features/chat/chat-interface.js +137 -137
  342. package/dist/components/features/chat/chat-interface.js.map +1 -1
  343. package/dist/components/features/chat/chat-message.cjs +1 -1
  344. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  345. package/dist/components/features/chat/chat-message.d.ts +2 -1
  346. package/dist/components/features/chat/chat-message.js +88 -79
  347. package/dist/components/features/chat/chat-message.js.map +1 -1
  348. package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
  349. package/dist/components/features/chat/components/context-window-meter.js +4 -4
  350. package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
  351. package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
  352. package/dist/components/features/chat/generic-event-message.cjs +1 -1
  353. package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
  354. package/dist/components/features/chat/generic-event-message.d.ts +2 -1
  355. package/dist/components/features/chat/generic-event-message.js +41 -22
  356. package/dist/components/features/chat/generic-event-message.js.map +1 -1
  357. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  358. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  359. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  360. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  361. package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
  362. package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
  363. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
  364. package/dist/components/features/conversation/conversation-overview-skills-panel.js +4 -4
  365. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  366. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  367. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +77 -78
  368. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  369. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  370. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  371. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +88 -88
  372. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  373. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
  374. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
  375. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
  376. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
  377. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
  378. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
  379. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
  380. package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
  381. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
  382. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
  383. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  384. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  385. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
  386. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
  387. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  388. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  389. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  390. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +2 -1
  391. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
  392. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  393. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  394. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  395. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
  396. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  397. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  398. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  399. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
  400. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
  401. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  402. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
  403. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
  404. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
  405. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
  406. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
  407. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
  408. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
  409. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
  410. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
  411. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
  412. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
  413. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
  414. package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
  415. package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
  416. package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
  417. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  418. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  419. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +37 -0
  420. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
  421. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  422. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  423. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  424. package/dist/components/features/conversation-panel/conversation-panel.js +296 -290
  425. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  426. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
  427. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
  428. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
  429. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
  430. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
  431. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
  432. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
  433. package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
  434. package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
  435. package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
  436. package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
  437. package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
  438. package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
  439. package/dist/components/features/conversation-panel/menu-row.js +27 -16
  440. package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
  441. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
  442. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
  443. package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
  444. package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
  445. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
  446. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
  447. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
  448. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
  449. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
  450. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
  451. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
  452. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
  453. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
  454. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
  455. package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
  456. package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
  457. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
  458. package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
  459. package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
  460. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
  461. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  462. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  463. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
  464. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +42 -42
  465. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  466. package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
  467. package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
  468. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  469. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  470. package/dist/components/features/settings/cloud-settings-link.js +5 -3
  471. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  472. package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
  473. package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
  474. package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
  475. package/dist/components/features/settings/integrations-settings-link.js +20 -17
  476. package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
  477. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  478. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
  479. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
  480. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  481. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
  482. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
  483. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
  484. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  485. package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
  486. package/dist/components/features/settings/secrets-settings/secret-form.cjs.map +1 -1
  487. package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
  488. package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
  489. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  490. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  491. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  492. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  493. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +3 -1
  494. package/dist/components/features/sidebar/sidebar-rail-body.js +156 -139
  495. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  496. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  497. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  498. package/dist/components/features/sidebar/sidebar.js +44 -43
  499. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  500. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
  501. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
  502. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  503. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  504. package/dist/components/features/skills/extensions-navigation.js +3 -3
  505. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  506. package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
  507. package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
  508. package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
  509. package/dist/components/shared/buttons/styled-tooltip.js +2 -1
  510. package/dist/components/shared/buttons/styled-tooltip.js.map +1 -1
  511. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  512. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  513. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +5 -1
  514. package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
  515. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  516. package/dist/components/shared/modals/confirmation-modal.cjs +1 -1
  517. package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
  518. package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
  519. package/dist/components/shared/modals/confirmation-modal.js +8 -8
  520. package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
  521. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  522. package/dist/components/shared/modals/settings/model-selector.js +27 -27
  523. package/dist/config/defaults.cjs +1 -1
  524. package/dist/config/defaults.cjs.map +1 -1
  525. package/dist/config/defaults.js +3 -3
  526. package/dist/config/defaults.js.map +1 -1
  527. package/dist/constants/settings-nav.d.ts +8 -0
  528. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  529. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  530. package/dist/contexts/conversation-websocket-context.d.ts +5 -0
  531. package/dist/contexts/conversation-websocket-context.js +194 -198
  532. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  533. package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
  534. package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
  535. package/dist/contexts/websocket-provider-wrapper.js +31 -15
  536. package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
  537. package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
  538. package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
  539. package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
  540. package/dist/hooks/chat/record-model-switch-message.js +25 -12
  541. package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
  542. package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
  543. package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
  544. package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
  545. package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
  546. package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -0
  547. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  548. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  549. package/dist/hooks/mutation/use-create-conversation.js +5 -1
  550. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  551. package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
  552. package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
  553. package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
  554. package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
  555. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  556. package/dist/hooks/mutation/use-save-settings.js +3 -3
  557. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  558. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  559. package/dist/hooks/mutation/use-switch-llm-profile.js +13 -25
  560. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  561. package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
  562. package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
  563. package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
  564. package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
  565. package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
  566. package/dist/hooks/query/query-keys.cjs +1 -1
  567. package/dist/hooks/query/query-keys.cjs.map +1 -1
  568. package/dist/hooks/query/query-keys.d.ts +6 -0
  569. package/dist/hooks/query/query-keys.js +2 -2
  570. package/dist/hooks/query/query-keys.js.map +1 -1
  571. package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
  572. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
  573. package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
  574. package/dist/hooks/query/use-automation-sdk-version.js +30 -55
  575. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
  576. package/dist/hooks/query/use-conversation-skills.cjs +1 -1
  577. package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
  578. package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
  579. package/dist/hooks/query/use-conversation-skills.js +20 -4
  580. package/dist/hooks/query/use-conversation-skills.js.map +1 -1
  581. package/dist/hooks/query/use-provider-connections.cjs +1 -1
  582. package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
  583. package/dist/hooks/query/use-provider-connections.d.ts +6 -3
  584. package/dist/hooks/query/use-provider-connections.js +7 -3
  585. package/dist/hooks/query/use-provider-connections.js.map +1 -1
  586. package/dist/hooks/query/use-sub-conversations.cjs +1 -1
  587. package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
  588. package/dist/hooks/query/use-sub-conversations.js +16 -16
  589. package/dist/hooks/query/use-sub-conversations.js.map +1 -1
  590. package/dist/hooks/use-acp-model-context.cjs +1 -1
  591. package/dist/hooks/use-acp-model-context.js +3 -3
  592. package/dist/hooks/use-agent-state.cjs +1 -1
  593. package/dist/hooks/use-agent-state.cjs.map +1 -1
  594. package/dist/hooks/use-agent-state.d.ts +17 -1
  595. package/dist/hooks/use-agent-state.js +19 -9
  596. package/dist/hooks/use-agent-state.js.map +1 -1
  597. package/dist/hooks/use-automation-permissions.cjs +2 -0
  598. package/dist/hooks/use-automation-permissions.cjs.map +1 -0
  599. package/dist/hooks/use-automation-permissions.d.ts +43 -0
  600. package/dist/hooks/use-automation-permissions.js +52 -0
  601. package/dist/hooks/use-automation-permissions.js.map +1 -0
  602. package/dist/hooks/use-chat-input-model-state.cjs +1 -1
  603. package/dist/hooks/use-chat-input-model-state.js +3 -3
  604. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  605. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  606. package/dist/hooks/use-handle-plan-click.d.ts +3 -1
  607. package/dist/hooks/use-handle-plan-click.js +85 -26
  608. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  609. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  610. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  611. package/dist/hooks/use-home-automation-actions.js +1 -0
  612. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  613. package/dist/hooks/use-llm-configured.cjs +1 -1
  614. package/dist/hooks/use-llm-configured.js +3 -3
  615. package/dist/hooks/use-manifest-preflight.d.ts +1 -1
  616. package/dist/hooks/use-unified-websocket-status.cjs +1 -1
  617. package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
  618. package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
  619. package/dist/hooks/use-unified-websocket-status.js +5 -1
  620. package/dist/hooks/use-unified-websocket-status.js.map +1 -1
  621. package/dist/i18n/declaration.cjs +1 -1
  622. package/dist/i18n/declaration.cjs.map +1 -1
  623. package/dist/i18n/declaration.d.ts +65 -12
  624. package/dist/i18n/declaration.js +1 -1
  625. package/dist/i18n/declaration.js.map +1 -1
  626. package/dist/i18n/translation.cjs +2 -2
  627. package/dist/i18n/translation.cjs.map +1 -1
  628. package/dist/i18n/translation.js +1196 -295
  629. package/dist/i18n/translation.js.map +1 -1
  630. package/dist/locales/ar/openhands.json +73 -20
  631. package/dist/locales/ca/openhands.json +73 -20
  632. package/dist/locales/de/openhands.json +73 -20
  633. package/dist/locales/en/openhands.json +73 -20
  634. package/dist/locales/es/openhands.json +73 -20
  635. package/dist/locales/fr/openhands.json +73 -20
  636. package/dist/locales/it/openhands.json +73 -20
  637. package/dist/locales/ja/openhands.json +73 -20
  638. package/dist/locales/ko-KR/openhands.json +73 -20
  639. package/dist/locales/no/openhands.json +73 -20
  640. package/dist/locales/pt/openhands.json +73 -20
  641. package/dist/locales/tr/openhands.json +73 -20
  642. package/dist/locales/uk/openhands.json +73 -20
  643. package/dist/locales/zh-CN/openhands.json +73 -20
  644. package/dist/locales/zh-TW/openhands.json +73 -20
  645. package/dist/manifests/automation-insights.cjs.map +1 -1
  646. package/dist/manifests/automation-insights.d.ts +10 -2
  647. package/dist/manifests/automation-insights.js.map +1 -1
  648. package/dist/manifests/automation-setup.cjs +1 -1
  649. package/dist/manifests/automation-setup.cjs.map +1 -1
  650. package/dist/manifests/automation-setup.d.ts +9 -16
  651. package/dist/manifests/automation-setup.js +17 -7
  652. package/dist/manifests/automation-setup.js.map +1 -1
  653. package/dist/manifests/manifest-actions.d.ts +1 -1
  654. package/dist/manifests/manifest-capabilities.d.ts +3 -1
  655. package/dist/manifests/manifest-local-validation.cjs +2 -0
  656. package/dist/manifests/manifest-local-validation.cjs.map +1 -0
  657. package/dist/manifests/manifest-local-validation.d.ts +15 -11
  658. package/dist/manifests/manifest-local-validation.js +8 -0
  659. package/dist/manifests/manifest-local-validation.js.map +1 -0
  660. package/dist/manifests/manifest-template.cjs +2 -0
  661. package/dist/manifests/manifest-template.cjs.map +1 -0
  662. package/dist/manifests/manifest-template.d.ts +4 -4
  663. package/dist/manifests/manifest-template.js +12 -0
  664. package/dist/manifests/manifest-template.js.map +1 -0
  665. package/dist/manifests/manifest-validation.cjs +1 -1
  666. package/dist/manifests/manifest-validation.cjs.map +1 -1
  667. package/dist/manifests/manifest-validation.js +106 -28
  668. package/dist/manifests/manifest-validation.js.map +1 -1
  669. package/dist/manifests/types.cjs.map +1 -1
  670. package/dist/manifests/types.d.ts +39 -4
  671. package/dist/manifests/types.js.map +1 -1
  672. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
  673. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
  674. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
  675. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
  676. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -1
  677. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
  678. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +1 -1
  679. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
  680. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -1
  681. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  682. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +1 -1
  683. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  684. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +1 -1
  685. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -1
  686. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +1 -1
  687. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -1
  688. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  689. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  690. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +22 -20
  691. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  692. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  693. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  694. package/dist/node_modules/@openhands/extensions/automations/interface.js +2 -1
  695. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  696. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +1 -1
  697. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -1
  698. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +24 -5
  699. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -1
  700. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
  701. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
  702. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
  703. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
  704. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
  705. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
  706. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
  707. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
  708. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
  709. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
  710. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
  711. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
  712. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
  713. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
  714. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
  715. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
  716. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
  717. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
  718. package/dist/package.cjs +1 -1
  719. package/dist/package.cjs.map +1 -1
  720. package/dist/package.js +4 -4
  721. package/dist/package.js.map +1 -1
  722. package/dist/routes/agent-settings.d.ts +2 -0
  723. package/dist/routes/app-settings.cjs +1 -1
  724. package/dist/routes/app-settings.js +5 -5
  725. package/dist/routes/llm-settings.cjs +1 -1
  726. package/dist/routes/llm-settings.cjs.map +1 -1
  727. package/dist/routes/llm-settings.d.ts +3 -1
  728. package/dist/routes/llm-settings.js +88 -87
  729. package/dist/routes/llm-settings.js.map +1 -1
  730. package/dist/routes/planner-tab.cjs +1 -1
  731. package/dist/routes/planner-tab.cjs.map +1 -1
  732. package/dist/routes/planner-tab.js +44 -28
  733. package/dist/routes/planner-tab.js.map +1 -1
  734. package/dist/services/telemetry.cjs +1 -1
  735. package/dist/services/telemetry.cjs.map +1 -1
  736. package/dist/services/telemetry.d.ts +5 -0
  737. package/dist/services/telemetry.js +122 -115
  738. package/dist/services/telemetry.js.map +1 -1
  739. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  740. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  741. package/dist/stores/conversation-panel-preferences-store.d.ts +32 -5
  742. package/dist/stores/conversation-panel-preferences-store.js +29 -12
  743. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  744. package/dist/stores/conversation-state-store.cjs +1 -1
  745. package/dist/stores/conversation-state-store.cjs.map +1 -1
  746. package/dist/stores/conversation-state-store.d.ts +9 -3
  747. package/dist/stores/conversation-state-store.js +6 -3
  748. package/dist/stores/conversation-state-store.js.map +1 -1
  749. package/dist/stores/conversation-store.cjs +1 -1
  750. package/dist/stores/conversation-store.cjs.map +1 -1
  751. package/dist/stores/conversation-store.d.ts +2 -0
  752. package/dist/stores/conversation-store.js +3 -0
  753. package/dist/stores/conversation-store.js.map +1 -1
  754. package/dist/stores/model-store.cjs +1 -1
  755. package/dist/stores/model-store.cjs.map +1 -1
  756. package/dist/stores/model-store.d.ts +7 -0
  757. package/dist/stores/model-store.js +4 -0
  758. package/dist/stores/model-store.js.map +1 -1
  759. package/dist/types/automation.cjs.map +1 -1
  760. package/dist/types/automation.d.ts +46 -1
  761. package/dist/types/automation.js.map +1 -1
  762. package/dist/ui/context-menu.d.ts +1 -1
  763. package/dist/ui/toggle-switch.cjs +1 -1
  764. package/dist/ui/toggle-switch.cjs.map +1 -1
  765. package/dist/ui/toggle-switch.d.ts +4 -1
  766. package/dist/ui/toggle-switch.js +4 -3
  767. package/dist/ui/toggle-switch.js.map +1 -1
  768. package/dist/utils/automation-catalog.cjs +1 -1
  769. package/dist/utils/automation-catalog.cjs.map +1 -1
  770. package/dist/utils/automation-catalog.d.ts +12 -1
  771. package/dist/utils/automation-catalog.js +42 -12
  772. package/dist/utils/automation-catalog.js.map +1 -1
  773. package/dist/utils/automation-run-display.cjs +2 -0
  774. package/dist/utils/automation-run-display.cjs.map +1 -0
  775. package/dist/utils/automation-run-display.d.ts +20 -0
  776. package/dist/utils/automation-run-display.js +85 -0
  777. package/dist/utils/automation-run-display.js.map +1 -0
  778. package/dist/utils/automation-schedule.cjs +1 -1
  779. package/dist/utils/automation-schedule.cjs.map +1 -1
  780. package/dist/utils/automation-schedule.d.ts +16 -0
  781. package/dist/utils/automation-schedule.js +2 -0
  782. package/dist/utils/automation-schedule.js.map +1 -1
  783. package/dist/utils/constants.cjs +1 -1
  784. package/dist/utils/constants.cjs.map +1 -1
  785. package/dist/utils/constants.d.ts +4 -0
  786. package/dist/utils/constants.js +23 -3
  787. package/dist/utils/constants.js.map +1 -1
  788. package/dist/utils/format-event-timestamp.cjs +2 -0
  789. package/dist/utils/format-event-timestamp.cjs.map +1 -0
  790. package/dist/utils/format-event-timestamp.d.ts +1 -0
  791. package/dist/utils/format-event-timestamp.js +13 -0
  792. package/dist/utils/format-event-timestamp.js.map +1 -0
  793. package/dist/utils/git-diff-stats.cjs +2 -2
  794. package/dist/utils/git-diff-stats.cjs.map +1 -1
  795. package/dist/utils/git-diff-stats.d.ts +4 -0
  796. package/dist/utils/git-diff-stats.js +12 -2
  797. package/dist/utils/git-diff-stats.js.map +1 -1
  798. package/dist/utils/plan-file.cjs +4 -0
  799. package/dist/utils/plan-file.cjs.map +1 -0
  800. package/dist/utils/plan-file.d.ts +18 -0
  801. package/dist/utils/plan-file.js +58 -0
  802. package/dist/utils/plan-file.js.map +1 -0
  803. package/dist/utils/recommended-automation-rail.cjs +1 -1
  804. package/dist/utils/recommended-automation-rail.cjs.map +1 -1
  805. package/dist/utils/recommended-automation-rail.js +1 -0
  806. package/dist/utils/recommended-automation-rail.js.map +1 -1
  807. package/dist/utils/scroll-fade-state.cjs +1 -1
  808. package/dist/utils/scroll-fade-state.cjs.map +1 -1
  809. package/dist/utils/scroll-fade-state.d.ts +6 -0
  810. package/dist/utils/scroll-fade-state.js +8 -1
  811. package/dist/utils/scroll-fade-state.js.map +1 -1
  812. package/dist/utils/sdk-settings-schema.cjs +1 -1
  813. package/dist/utils/sdk-settings-schema.cjs.map +1 -1
  814. package/dist/utils/sdk-settings-schema.d.ts +1 -0
  815. package/dist/utils/sdk-settings-schema.js +25 -22
  816. package/dist/utils/sdk-settings-schema.js.map +1 -1
  817. package/dist/utils/utils.cjs +1 -1
  818. package/dist/utils/utils.cjs.map +1 -1
  819. package/dist/utils/utils.js +11 -11
  820. package/dist/utils/utils.js.map +1 -1
  821. package/package.json +4 -4
  822. package/scripts/check-sdk-version-sync.mjs +6 -6
  823. package/scripts/dev-safe.mjs +1 -1
  824. package/scripts/dev-with-automation.mjs +1 -1
  825. package/scripts/static-server.mjs +33 -1
  826. package/build/assets/active-backend-context-CrHTlgvN.js +0 -2
  827. package/build/assets/agent-profiles-settings-Dzgb7G9z.js +0 -1
  828. package/build/assets/agent-server-conversation-service.api-tnqNjbpE.js +0 -86
  829. package/build/assets/agent-settings-DLtsqaOs.js +0 -2
  830. package/build/assets/agent-settings-fFvR-XC2.js +0 -1
  831. package/build/assets/api-key-entry-screen-qTzrmJcr.js +0 -1
  832. package/build/assets/automation-detail-BmwlCUAB.js +0 -3
  833. package/build/assets/automation-git-sync-CprN5DcU.js +0 -1
  834. package/build/assets/automation-setup-route-C40kXjMY.js +0 -1
  835. package/build/assets/automations-list-DuNcRawl.js +0 -1
  836. package/build/assets/backend-form-modal-lhGwzXFI.js +0 -1
  837. package/build/assets/bot-dMYHVfYM.js +0 -1
  838. package/build/assets/canvas-extensions-8A-XhpgP.js +0 -1
  839. package/build/assets/check-CS0vmpQQ.js +0 -1
  840. package/build/assets/chevron-down-e1QBpjVy.js +0 -1
  841. package/build/assets/chevron-right-ZG4R5G4Q.js +0 -1
  842. package/build/assets/circle-check-DzWLNsbE.js +0 -1
  843. package/build/assets/command-menu--UIlGL72.js +0 -1
  844. package/build/assets/commits-tab-AnZwLvh-.js +0 -1
  845. package/build/assets/confirmation-modal-Dv1ktp8K.js +0 -1
  846. package/build/assets/conversation-BbGrAO4Z.js +0 -93
  847. package/build/assets/conversation-mYT6NAoj.js +0 -1
  848. package/build/assets/conversation-panel-mYT6NAoj.js +0 -1
  849. package/build/assets/edit-automation-modal-DadGbJ2u.js +0 -1
  850. package/build/assets/empty-state-BoGVDecT.js +0 -1
  851. package/build/assets/enum-filter-dropdown-Bgca129f.js +0 -1
  852. package/build/assets/extensions-hub-CcDqq_vR.js +0 -1
  853. package/build/assets/extensions-navigation-Cr4yzYk4.js +0 -1
  854. package/build/assets/external-link-DKUlnCQV.js +0 -1
  855. package/build/assets/files-tab-D4o2VyE_.js +0 -1
  856. package/build/assets/get-git-path-ChKDVHZp.js +0 -1
  857. package/build/assets/git-repo-dropdown-BkqzkMmM.js +0 -1
  858. package/build/assets/home-ChpSuepX.js +0 -1
  859. package/build/assets/home-DIsB440S.js +0 -1
  860. package/build/assets/home-automation-run-tooltip-BVNDWjAH.js +0 -1
  861. package/build/assets/home-store-CY9Ej0ux.js +0 -1
  862. package/build/assets/index-home-BdlrFIif.js +0 -1
  863. package/build/assets/info-B6RQawoW.js +0 -1
  864. package/build/assets/install-server-modal-Dpy89p4g.js +0 -1
  865. package/build/assets/kebab-menu-item-content-D8hSNGmm.js +0 -1
  866. package/build/assets/list-filter-DsEK7NFC.js +0 -1
  867. package/build/assets/llm-not-configured-banner-CIFABh3K.js +0 -27
  868. package/build/assets/llm-settings-B9juXhIa.js +0 -1
  869. package/build/assets/llm-settings-De1d5dfr.js +0 -1
  870. package/build/assets/llm-subscription-service-BpJ0ouQo.js +0 -1
  871. package/build/assets/loader-circle-CC1au6hc.js +0 -1
  872. package/build/assets/manage-backends-modal-BrPV3oB-.js +0 -1
  873. package/build/assets/manifest-80fb1c29.js +0 -1
  874. package/build/assets/markdown-renderer-BzTlxI8x.js +0 -8
  875. package/build/assets/mcp-page-BEBYqH_K.js +0 -9
  876. package/build/assets/messages-DKV9cRc2.js +0 -41
  877. package/build/assets/onboarding-DV_OXoeP.js +0 -1
  878. package/build/assets/onboarding-modal-rkyBYkeQ.js +0 -1
  879. package/build/assets/organization-service.api-DrYNkEN_.js +0 -1
  880. package/build/assets/pencil-47jAZH_V.js +0 -1
  881. package/build/assets/pin-By41Vl5J.js +0 -1
  882. package/build/assets/planner-tab-C9uZmhme.js +0 -1
  883. package/build/assets/plug-CG5HFcNG.js +0 -1
  884. package/build/assets/plugins-management-service-BMJgC3Ga.js +0 -1
  885. package/build/assets/plus-C7Slq-0I.js +0 -1
  886. package/build/assets/profiles-service.api-ChoKrL0l.js +0 -1
  887. package/build/assets/proxy-9Fe1v5na.js +0 -1
  888. package/build/assets/recommended-automations-launcher-6ABrI9Cy.js +0 -1
  889. package/build/assets/refresh-cw-3q3Frrii.js +0 -1
  890. package/build/assets/root-Dc8YmC9F.js +0 -2
  891. package/build/assets/root-VDaypvK4.css +0 -1
  892. package/build/assets/root-layout-CXkhSPYh.js +0 -2
  893. package/build/assets/schema-field-D-y9-LDb.js +0 -1
  894. package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
  895. package/build/assets/sdk-section-page-BlFiizlG.js +0 -1
  896. package/build/assets/secret-form-BB7the8W.js +0 -1
  897. package/build/assets/secrets-service-ByZVENbp.js +0 -1
  898. package/build/assets/settings-C0EWuBtA.js +0 -1
  899. package/build/assets/settings-index-5w5UW2K3.js +0 -1
  900. package/build/assets/settings-service.api-DJ1r62Zr.js +0 -1
  901. package/build/assets/shared-conversation-CA5ISEDy.js +0 -1
  902. package/build/assets/shield-check-D2aCRd16.js +0 -1
  903. package/build/assets/sidebar-mobile-menu-toggle-C_fb0Jki.js +0 -1
  904. package/build/assets/skill-scope-B42H-XOc.js +0 -1
  905. package/build/assets/skills-plugins-tgF8EiXC.js +0 -1
  906. package/build/assets/skills-settings-BgJ9PaOe.js +0 -1
  907. package/build/assets/styled-tooltip-C4jf5Fv9.js +0 -1
  908. package/build/assets/toggle-switch-ChOLXv2n.js +0 -1
  909. package/build/assets/trash-2-D7K26eDO.js +0 -1
  910. package/build/assets/trash-D-HYiVYM.js +0 -1
  911. package/build/assets/triangle-alert-CtdXWHUI.js +0 -1
  912. package/build/assets/usage-tab-CVDffLPt.js +0 -1
  913. package/build/assets/use-acp-credential-form-XIQmpX6M.js +0 -1
  914. package/build/assets/use-activate-agent-profile-BLfmvDiG.js +0 -1
  915. package/build/assets/use-agent-profiles-Bd9Bvvp1.js +0 -1
  916. package/build/assets/use-canvas-extensions-Bi693ujJ.js +0 -1
  917. package/build/assets/use-config-A9QovgXO.js +0 -1
  918. package/build/assets/use-create-conversation-Dx3l7mFZ.js +0 -1
  919. package/build/assets/use-create-secret-B9cUFWRG.js +0 -1
  920. package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
  921. package/build/assets/use-is-authed-nTBcM7dE.js +0 -1
  922. package/build/assets/use-llm-configured-BV9nZ1_j.js +0 -1
  923. package/build/assets/use-llm-profiles-BO-P4Oyo.js +0 -1
  924. package/build/assets/use-manifest-capabilities-Cw_flwEz.js +0 -1
  925. package/build/assets/use-onboarding-completion-D8U7k4Qb.js +0 -1
  926. package/build/assets/use-pinned-home-route-CckOZrmb.js +0 -1
  927. package/build/assets/use-plugins-marketplace-7i94Zu3Z.js +0 -1
  928. package/build/assets/use-save-agent-profile-BUjSsDXK.js +0 -1
  929. package/build/assets/use-settings-DSXLbvBl.js +0 -1
  930. package/build/assets/use-settings-nav-items-CwRw-CmX.js +0 -16
  931. package/build/assets/use-tracking-D53y3TH9.js +0 -3
  932. package/build/assets/utils-CN5ZfZy1.js +0 -1
  933. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js +0 -186
  934. package/build/assets/vendor~root-layout-C9Ju9DQg.js +0 -1
  935. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-cDuKr-WD.js +0 -1
  936. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js +0 -1
  937. package/build/assets/x-DJdhbdmt.js +0 -1
  938. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
  939. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
  940. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
  941. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
  942. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
  943. package/dist/hooks/query/use-skills.cjs +0 -2
  944. package/dist/hooks/query/use-skills.cjs.map +0 -1
  945. package/dist/hooks/query/use-skills.d.ts +0 -7
  946. package/dist/hooks/query/use-skills.js +0 -13
  947. package/dist/hooks/query/use-skills.js.map +0 -1
  948. package/dist/hooks/use-has-permission.cjs +0 -2
  949. package/dist/hooks/use-has-permission.cjs.map +0 -1
  950. package/dist/hooks/use-has-permission.d.ts +0 -1
  951. package/dist/hooks/use-has-permission.js +0 -8
  952. package/dist/hooks/use-has-permission.js.map +0 -1
  953. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
  954. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
  955. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
  956. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"automation-run-activity-sparkline.js","names":[],"sources":["../../../../../src/components/features/home/featured-automations/automation-run-activity-sparkline.tsx"],"sourcesContent":["import { Tooltip } from \"@heroui/react\";\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { AUTOMATION_RUN_ACTIVITY_LIMIT } from \"#/hooks/query/use-latest-automation-runs\";\nimport { isInFlightAutomationRun } from \"#/hooks/use-home-automation-actions\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { AutomationRunStatus, type AutomationRun } from \"#/types/automation\";\nimport { formatRelativeTime } from \"#/utils/format-relative-time\";\nimport { cn } from \"#/utils/utils\";\nimport { getLastRunTimestamp } from \"./automation-run-health\";\nimport {\n AUTOMATION_RUN_ACTIVITY_TRACK_PX,\n barColorClassForStatus,\n durationMsToSparklineBarHeightPx,\n formatDurationForTitle,\n getAutomationRunDurationMs,\n getAutomationRunStatusLabelKey,\n} from \"./automation-run-activity-metrics\";\n\ninterface AutomationRunActivitySparklineProps {\n automationId: string;\n /** Newest-first run list (same order as the runs API). */\n runs: readonly AutomationRun[];\n testId?: string;\n}\n\nfunction TooltipRow({\n label,\n children,\n}: {\n label: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-2 text-xs\">\n <span className=\"w-16 shrink-0 text-[var(--oh-muted)]\">{label}</span>\n <span className=\"min-w-0 flex-1 break-words text-white\">{children}</span>\n </div>\n );\n}\n\nfunction RunActivityBarTooltip({\n run,\n nowMs,\n}: {\n run: AutomationRun;\n nowMs: number;\n}) {\n const { t, i18n } = useTranslation(\"openhands\");\n const timestamp = getLastRunTimestamp(run);\n const when = timestamp\n ? formatRelativeTime(timestamp, i18n.language, t)\n : null;\n const durationMs = getAutomationRunDurationMs(run, nowMs);\n const durationLabel = formatDurationForTitle(durationMs);\n const statusLabel = t(getAutomationRunStatusLabelKey(run.status));\n const errorDetail =\n run.status === AutomationRunStatus.FAILED\n ? run.error_detail?.trim() || null\n : null;\n\n return (\n <div className=\"flex w-[220px] flex-col gap-2 p-3\">\n <div className=\"flex items-center gap-2\">\n <span\n aria-hidden=\"true\"\n className={cn(\n \"h-3 w-1.5 shrink-0 rounded-[1px]\",\n barColorClassForStatus(run.status),\n )}\n />\n <span className=\"text-sm font-medium text-white\">{statusLabel}</span>\n </div>\n\n <div className=\"flex flex-col gap-1\">\n {when ? (\n <TooltipRow label={t(I18nKey.AUTOMATIONS$DETAIL$LAST_RUN)}>\n {when}\n </TooltipRow>\n ) : null}\n {durationLabel ? (\n <TooltipRow label={t(I18nKey.FEATURED_AUTOMATIONS$RUN_DURATION)}>\n {durationLabel}\n </TooltipRow>\n ) : null}\n </div>\n\n {errorDetail ? (\n <p className=\"line-clamp-3 text-xs text-[var(--oh-status-error)]\">\n {errorDetail}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction RunActivityBar({\n automationId,\n run,\n nowMs,\n}: {\n automationId: string;\n run: AutomationRun;\n nowMs: number;\n}) {\n const { t } = useTranslation(\"openhands\");\n const durationMs = getAutomationRunDurationMs(run, nowMs);\n const statusLabel = t(getAutomationRunStatusLabelKey(run.status));\n const disableAnimation = import.meta.env.MODE === \"test\";\n const href = `/automations/${encodeURIComponent(automationId)}?run=${encodeURIComponent(run.id)}`;\n\n return (\n <Tooltip\n content={<RunActivityBarTooltip run={run} nowMs={nowMs} />}\n placement=\"top\"\n closeDelay={80}\n delay={200}\n disableAnimation={disableAnimation}\n className=\"rounded-xl border border-[var(--oh-border)] bg-base-secondary p-0 text-white shadow-xl\"\n >\n {/* Wider hit target than the 4px bar so cancelled/skipped greys are easy to inspect. */}\n <NavigationLink\n to={href}\n aria-label={statusLabel}\n className=\"group/spark-bar inline-flex h-full cursor-pointer items-end px-[2px] focus:outline-none focus-visible:ring-1 focus-visible:ring-[var(--oh-focus)]\"\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n >\n <span\n className={cn(\n \"w-1 shrink-0 origin-bottom rounded-[1px]\",\n \"transition-transform duration-100 ease-out motion-reduce:transition-none\",\n // Grow the hovered/focused bar so it reads clearly among neighbors.\n \"group-hover/spark-bar:scale-x-[1.4] group-hover/spark-bar:scale-y-[1.15]\",\n \"group-focus-visible/spark-bar:scale-x-[1.4] group-focus-visible/spark-bar:scale-y-[1.15]\",\n barColorClassForStatus(run.status),\n )}\n style={{ height: durationMsToSparklineBarHeightPx(durationMs) }}\n />\n </NavigationLink>\n </Tooltip>\n );\n}\n\n/**\n * Colored-bar sparkline of recent automation runs (oldest → newest left to\n * right). Color encodes status; height encodes run duration (log-scaled).\n * Bars link to the automation detail page focused on that run.\n */\nexport function AutomationRunActivitySparkline({\n automationId,\n runs,\n testId,\n}: AutomationRunActivitySparklineProps) {\n const { t } = useTranslation(\"openhands\");\n const hasInFlight = runs.some((run) => isInFlightAutomationRun(run));\n const [nowMs, setNowMs] = useState(() => Date.now());\n\n useEffect(() => {\n if (!hasInFlight) return undefined;\n // Tick while a run is in flight so bar height tracks elapsed time between\n // the slower runs-list polls.\n const id = window.setInterval(() => setNowMs(Date.now()), 1000);\n return () => window.clearInterval(id);\n }, [hasInFlight]);\n\n if (runs.length === 0) return null;\n\n // API is newest-first; reverse so the sparkline reads left→right as time.\n const bars = [...runs].reverse().slice(-AUTOMATION_RUN_ACTIVITY_LIMIT);\n\n return (\n <span\n data-testid={testId}\n aria-label={t(I18nKey.FEATURED_AUTOMATIONS$RUN_ACTIVITY_LABEL, {\n count: bars.length,\n })}\n className=\"inline-flex shrink-0 items-end\"\n style={{ height: AUTOMATION_RUN_ACTIVITY_TRACK_PX }}\n onMouseDown={(event) => event.preventDefault()}\n >\n {bars.map((run, index) => (\n <RunActivityBar\n key={`${run.id}-${index}`}\n automationId={automationId}\n run={run}\n nowMs={nowMs}\n />\n ))}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AA2BA,SAAS,EAAW,EAClB,UACA,eAIC;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,QAAD;GAAM,WAAU;aAAwC;EAAY,CAAA,GACpE,kBAAC,QAAD;GAAM,WAAU;GAAyC;EAAe,CAAA,CACrE;;AAET;AAEA,SAAS,EAAsB,EAC7B,QACA,YAIC;CACD,IAAM,EAAE,MAAG,YAAS,EAAe,WAAW,GACxC,IAAY,EAAoB,CAAG,GACnC,IAAO,IACT,EAAmB,GAAW,EAAK,UAAU,CAAC,IAC9C,MAEE,IAAgB,EADH,EAA2B,GAAK,CACN,CAAU,GACjD,IAAc,EAAE,EAA+B,EAAI,MAAM,CAAC,GAC1D,IACJ,EAAI,WAAW,EAAoB,UAC/B,EAAI,cAAc,KAAK,KACvB;CAEN,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,QAAD;KACE,eAAY;KACZ,WAAW,EACT,oCACA,EAAuB,EAAI,MAAM,CACnC;IACD,CAAA,GACD,kBAAC,QAAD;KAAM,WAAU;eAAkC;IAAkB,CAAA,CACjE;;GAEL,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,IACC,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,2BAA2B;eACrD;IACS,CAAA,IACV,MACH,IACC,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,iCAAiC;eAC3D;IACS,CAAA,IACV,IACD;;GAEJ,IACC,kBAAC,KAAD;IAAG,WAAU;cACV;GACA,CAAA,IACD;EACD;;AAET;AAEA,SAAS,EAAe,EACtB,iBACA,QACA,YAKC;CACD,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAa,EAA2B,GAAK,CAAK,GAClD,IAAc,EAAE,EAA+B,EAAI,MAAM,CAAC,GAE1D,IAAO,gBAAgB,mBAAmB,CAAY,EAAE,OAAO,mBAAmB,EAAI,EAAE;CAE9F,OACE,kBAAC,GAAD;EACE,SAAS,kBAAC,GAAD;GAA4B;GAAY;EAAQ,CAAA;EACzD,WAAU;EACV,YAAY;EACZ,OAAO;EACW;EAClB,WAAU;YAGV,kBAAC,GAAD;GACE,IAAI;GACJ,cAAY;GACZ,WAAU;GACV,cAAc,MAAU,EAAM,gBAAgB;GAC9C,UAAU,MAAU,EAAM,gBAAgB;aAE1C,kBAAC,QAAD;IACE,WAAW,EACT,4CACA,4EAEA,4EACA,4FACA,EAAuB,EAAI,MAAM,CACnC;IACA,OAAO,EAAE,QAAQ,EAAiC,CAAU,EAAE;GAC/D,CAAA;EACa,CAAA;CACT,CAAA;AAEb;AAOA,SAAgB,EAA+B,EAC7C,iBACA,SACA,aACsC;CACtC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAc,EAAK,MAAM,MAAQ,EAAwB,CAAG,CAAC,GAC7D,CAAC,GAAO,KAAY,QAAe,KAAK,IAAI,CAAC;CAUnD,IARA,QAAgB;EACd,IAAI,CAAC,GAAa;EAGlB,IAAM,IAAK,OAAO,kBAAkB,EAAS,KAAK,IAAI,CAAC,GAAG,GAAI;EAC9D,aAAa,OAAO,cAAc,CAAE;CACtC,GAAG,CAAC,CAAW,CAAC,GAEZ,EAAK,WAAW,GAAG,OAAO;CAG9B,IAAM,IAAO,CAAC,GAAG,CAAI,EAAE,QAAQ,EAAE,MAAM,GAA8B;CAErE,OACE,kBAAC,QAAD;EACE,eAAa;EACb,cAAY,EAAE,EAAQ,yCAAyC,EAC7D,OAAO,EAAK,OACd,CAAC;EACD,WAAU;EACV,OAAO,EAAE,QAAA,GAAyC;EAClD,cAAc,MAAU,EAAM,eAAe;YAE5C,EAAK,KAAK,GAAK,MACd,kBAAC,GAAD;GAEgB;GACT;GACE;EACR,GAJM,GAAG,EAAI,GAAG,GAAG,GAInB,CACF;CACG,CAAA;AAEV"}
1
+ {"version":3,"file":"automation-run-activity-sparkline.js","names":[],"sources":["../../../../../src/components/features/home/featured-automations/automation-run-activity-sparkline.tsx"],"sourcesContent":["import { Tooltip } from \"@heroui/react\";\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { NavigationLink } from \"#/components/shared/navigation-link\";\nimport { AUTOMATION_RUN_ACTIVITY_LIMIT } from \"#/hooks/query/use-latest-automation-runs\";\nimport { isInFlightAutomationRun } from \"#/hooks/use-home-automation-actions\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport type { AutomationRun } from \"#/types/automation\";\nimport { getAutomationRunDisplay } from \"#/utils/automation-run-display\";\nimport { formatRelativeTime } from \"#/utils/format-relative-time\";\nimport { cn } from \"#/utils/utils\";\nimport { getLastRunTimestamp } from \"./automation-run-health\";\nimport {\n AUTOMATION_RUN_ACTIVITY_TRACK_PX,\n barColorClassForStatus,\n durationMsToSparklineBarHeightPx,\n formatDurationForTitle,\n getAutomationRunDurationMs,\n getAutomationRunStatusLabelKey,\n} from \"./automation-run-activity-metrics\";\n\ninterface AutomationRunActivitySparklineProps {\n automationId: string;\n /** Newest-first run list (same order as the runs API). */\n runs: readonly AutomationRun[];\n testId?: string;\n}\n\nfunction TooltipRow({\n label,\n children,\n}: {\n label: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-2 text-xs\">\n <span className=\"w-16 shrink-0 text-[var(--oh-muted)]\">{label}</span>\n <span className=\"min-w-0 flex-1 break-words text-white\">{children}</span>\n </div>\n );\n}\n\nfunction RunActivityBarTooltip({\n run,\n nowMs,\n}: {\n run: AutomationRun;\n nowMs: number;\n}) {\n const { t, i18n } = useTranslation(\"openhands\");\n const timestamp = getLastRunTimestamp(run);\n const when = timestamp\n ? formatRelativeTime(timestamp, i18n.language, t)\n : null;\n const durationMs = getAutomationRunDurationMs(run, nowMs);\n const durationLabel = formatDurationForTitle(durationMs);\n const display = getAutomationRunDisplay(run);\n const statusLabel = t(getAutomationRunStatusLabelKey(display.badgeStatus));\n\n return (\n <div className=\"flex w-[220px] flex-col gap-2 p-3\">\n <div className=\"flex items-center gap-2\">\n <span\n aria-hidden=\"true\"\n className={cn(\n \"h-3 w-1.5 shrink-0 rounded-[1px]\",\n barColorClassForStatus(display.badgeStatus),\n )}\n />\n <span className=\"text-sm font-medium text-white\">{statusLabel}</span>\n </div>\n\n <div className=\"flex flex-col gap-1\">\n {when ? (\n <TooltipRow label={t(I18nKey.AUTOMATIONS$DETAIL$LAST_RUN)}>\n {when}\n </TooltipRow>\n ) : null}\n {durationLabel ? (\n <TooltipRow label={t(I18nKey.FEATURED_AUTOMATIONS$RUN_DURATION)}>\n {durationLabel}\n </TooltipRow>\n ) : null}\n </div>\n\n {display.summary ? (\n <p className=\"line-clamp-3 text-xs text-[var(--oh-text-secondary)]\">\n {display.summary}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction RunActivityBar({\n automationId,\n run,\n nowMs,\n}: {\n automationId: string;\n run: AutomationRun;\n nowMs: number;\n}) {\n const { t } = useTranslation(\"openhands\");\n const durationMs = getAutomationRunDurationMs(run, nowMs);\n const display = getAutomationRunDisplay(run);\n const statusLabel = t(getAutomationRunStatusLabelKey(display.badgeStatus));\n const disableAnimation = import.meta.env.MODE === \"test\";\n const href = `/automations/${encodeURIComponent(automationId)}?run=${encodeURIComponent(run.id)}`;\n\n return (\n <Tooltip\n content={<RunActivityBarTooltip run={run} nowMs={nowMs} />}\n placement=\"top\"\n closeDelay={80}\n delay={200}\n disableAnimation={disableAnimation}\n className=\"rounded-xl border border-[var(--oh-border)] bg-base-secondary p-0 text-white shadow-xl\"\n >\n {/* Wider hit target than the 4px bar so cancelled/skipped greys are easy to inspect. */}\n <NavigationLink\n to={href}\n aria-label={statusLabel}\n className=\"group/spark-bar inline-flex h-full cursor-pointer items-end px-[2px] focus:outline-none focus-visible:ring-1 focus-visible:ring-[var(--oh-focus)]\"\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n >\n <span\n className={cn(\n \"w-1 shrink-0 origin-bottom rounded-[1px]\",\n \"transition-transform duration-100 ease-out motion-reduce:transition-none\",\n // Grow the hovered/focused bar so it reads clearly among neighbors.\n \"group-hover/spark-bar:scale-x-[1.4] group-hover/spark-bar:scale-y-[1.15]\",\n \"group-focus-visible/spark-bar:scale-x-[1.4] group-focus-visible/spark-bar:scale-y-[1.15]\",\n barColorClassForStatus(display.badgeStatus),\n )}\n style={{ height: durationMsToSparklineBarHeightPx(durationMs) }}\n />\n </NavigationLink>\n </Tooltip>\n );\n}\n\n/**\n * Colored-bar sparkline of recent automation runs (oldest → newest left to\n * right). Color encodes status; height encodes run duration (log-scaled).\n * Bars link to the automation detail page focused on that run.\n */\nexport function AutomationRunActivitySparkline({\n automationId,\n runs,\n testId,\n}: AutomationRunActivitySparklineProps) {\n const { t } = useTranslation(\"openhands\");\n const hasInFlight = runs.some((run) => isInFlightAutomationRun(run));\n const [nowMs, setNowMs] = useState(() => Date.now());\n\n useEffect(() => {\n if (!hasInFlight) return undefined;\n // Tick while a run is in flight so bar height tracks elapsed time between\n // the slower runs-list polls.\n const id = window.setInterval(() => setNowMs(Date.now()), 1000);\n return () => window.clearInterval(id);\n }, [hasInFlight]);\n\n if (runs.length === 0) return null;\n\n // API is newest-first; reverse so the sparkline reads left→right as time.\n const bars = [...runs].reverse().slice(-AUTOMATION_RUN_ACTIVITY_LIMIT);\n\n return (\n <span\n data-testid={testId}\n aria-label={t(I18nKey.FEATURED_AUTOMATIONS$RUN_ACTIVITY_LABEL, {\n count: bars.length,\n })}\n className=\"inline-flex shrink-0 items-end\"\n style={{ height: AUTOMATION_RUN_ACTIVITY_TRACK_PX }}\n onMouseDown={(event) => event.preventDefault()}\n >\n {bars.map((run, index) => (\n <RunActivityBar\n key={`${run.id}-${index}`}\n automationId={automationId}\n run={run}\n nowMs={nowMs}\n />\n ))}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AA4BA,SAAS,EAAW,EAClB,UACA,eAIC;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,QAAD;GAAM,WAAU;aAAwC;EAAY,CAAA,GACpE,kBAAC,QAAD;GAAM,WAAU;GAAyC;EAAe,CAAA,CACrE;;AAET;AAEA,SAAS,EAAsB,EAC7B,QACA,YAIC;CACD,IAAM,EAAE,MAAG,YAAS,EAAe,WAAW,GACxC,IAAY,EAAoB,CAAG,GACnC,IAAO,IACT,EAAmB,GAAW,EAAK,UAAU,CAAC,IAC9C,MAEE,IAAgB,EADH,EAA2B,GAAK,CACN,CAAU,GACjD,IAAU,EAAwB,CAAG,GACrC,IAAc,EAAE,EAA+B,EAAQ,WAAW,CAAC;CAEzE,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,QAAD;KACE,eAAY;KACZ,WAAW,EACT,oCACA,EAAuB,EAAQ,WAAW,CAC5C;IACD,CAAA,GACD,kBAAC,QAAD;KAAM,WAAU;eAAkC;IAAkB,CAAA,CACjE;;GAEL,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,IACC,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,2BAA2B;eACrD;IACS,CAAA,IACV,MACH,IACC,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,iCAAiC;eAC3D;IACS,CAAA,IACV,IACD;;GAEJ,EAAQ,UACP,kBAAC,KAAD;IAAG,WAAU;cACV,EAAQ;GACR,CAAA,IACD;EACD;;AAET;AAEA,SAAS,EAAe,EACtB,iBACA,QACA,YAKC;CACD,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAa,EAA2B,GAAK,CAAK,GAClD,IAAU,EAAwB,CAAG,GACrC,IAAc,EAAE,EAA+B,EAAQ,WAAW,CAAC,GAEnE,IAAO,gBAAgB,mBAAmB,CAAY,EAAE,OAAO,mBAAmB,EAAI,EAAE;CAE9F,OACE,kBAAC,GAAD;EACE,SAAS,kBAAC,GAAD;GAA4B;GAAY;EAAQ,CAAA;EACzD,WAAU;EACV,YAAY;EACZ,OAAO;EACW;EAClB,WAAU;YAGV,kBAAC,GAAD;GACE,IAAI;GACJ,cAAY;GACZ,WAAU;GACV,cAAc,MAAU,EAAM,gBAAgB;GAC9C,UAAU,MAAU,EAAM,gBAAgB;aAE1C,kBAAC,QAAD;IACE,WAAW,EACT,4CACA,4EAEA,4EACA,4FACA,EAAuB,EAAQ,WAAW,CAC5C;IACA,OAAO,EAAE,QAAQ,EAAiC,CAAU,EAAE;GAC/D,CAAA;EACa,CAAA;CACT,CAAA;AAEb;AAOA,SAAgB,EAA+B,EAC7C,iBACA,SACA,aACsC;CACtC,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAc,EAAK,MAAM,MAAQ,EAAwB,CAAG,CAAC,GAC7D,CAAC,GAAO,KAAY,QAAe,KAAK,IAAI,CAAC;CAUnD,IARA,QAAgB;EACd,IAAI,CAAC,GAAa;EAGlB,IAAM,IAAK,OAAO,kBAAkB,EAAS,KAAK,IAAI,CAAC,GAAG,GAAI;EAC9D,aAAa,OAAO,cAAc,CAAE;CACtC,GAAG,CAAC,CAAW,CAAC,GAEZ,EAAK,WAAW,GAAG,OAAO;CAG9B,IAAM,IAAO,CAAC,GAAG,CAAI,EAAE,QAAQ,EAAE,MAAM,GAA8B;CAErE,OACE,kBAAC,QAAD;EACE,eAAa;EACb,cAAY,EAAE,EAAQ,yCAAyC,EAC7D,OAAO,EAAK,OACd,CAAC;EACD,WAAU;EACV,OAAO,EAAE,QAAA,GAAyC;EAClD,cAAc,MAAU,EAAM,eAAe;YAE5C,EAAK,KAAK,GAAK,MACd,kBAAC,GAAD;GAEgB;GACT;GACE;EACR,GAJM,GAAG,EAAI,GAAG,GAAG,GAInB,CACF;CACG,CAAA;AAEV"}
@@ -1,2 +1,2 @@
1
- require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../i18n/declaration.cjs"),t=require("../../../../types/automation.cjs"),n=require("../../../../utils/automation-schedule.cjs");function r(e){if(e.isLoading||e.isError)return`unknown`;if(!e.latestRun)return`none`;switch(e.latestRun.status){case t.AutomationRunStatus.COMPLETED:return`success`;case t.AutomationRunStatus.FAILED:return`failed`;case t.AutomationRunStatus.PENDING:case t.AutomationRunStatus.RUNNING:return`in_progress`;default:return`unknown`}}function i(t){switch(t){case`success`:return e.I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_SUCCEEDED;case`failed`:return e.I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_FAILED;case`in_progress`:return e.I18nKey.FEATURED_AUTOMATIONS$RUN_IN_PROGRESS;case`none`:return e.I18nKey.AUTOMATIONS$DETAIL$NO_RUNS;default:return e.I18nKey.FEATURED_AUTOMATIONS$STATUS_UNKNOWN}}var a={github:`GitHub`,gitlab:`GitLab`,slack:`Slack`,linear:`Linear`,jira:`Jira`};function o(e){let t=e.trim().toLowerCase();return t?a[t]??t.replace(/\b\w/g,e=>e.toUpperCase()):e}function s(e){let{trigger:t}=e;return t.type===`event`&&t.on?n.formatEventOn(t.on):null}function c(e){let{trigger:t}=e;return t.type===`event`&&t.source?.trim()||null}function l(e){let{trigger:t}=e;return t.type===`event`?null:t.schedule_human||t.schedule||t.type||null}function u(e){let{trigger:t}=e;if(t.type===`event`){let t=c(e);return[s(e)??``,t?`(${o(t)})`:``].filter(Boolean).join(` `)}return l(e)??t.type}var d=48;function f(e){let t=e.trim().replace(/\s+/g,` `);if(!t)return t;let n=t.match(/^.*?[.!?](?=\s|$)/)?.[0]??t;return n.length<=d?n:`${n.slice(0,d-1).trimEnd()}…`}function p(e,t=f(e)){return e.trim().replace(/\s+/g,` `)!==t}function m(e){let t=e.completed_at??e.started_at;if(!t)return null;let n=new Date(t).getTime();return Number.isNaN(n)||n===0?null:t}exports.deriveRunHealth=r,exports.formatTriggerSourceLabel=o,exports.getLastRunTimestamp=m,exports.getRunHealthLabelKey=i,exports.getTriggerEventLabel=s,exports.getTriggerScheduleLabel=l,exports.getTriggerSource=c,exports.getTriggerSummary=u,exports.shortenAutomationErrorDetail=f,exports.shouldShowAutomationErrorHovercard=p;
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../i18n/declaration.cjs"),t=require("../../../../types/automation.cjs"),n=require("../../../../utils/automation-run-display.cjs"),r=require("../../../../utils/automation-schedule.cjs");function i(e){if(e.isLoading||e.isError)return`unknown`;if(!e.latestRun)return`none`;switch(n.getAutomationRunDisplay(e.latestRun).badgeStatus){case t.AutomationRunStatus.COMPLETED:case`success`:return`success`;case t.AutomationRunStatus.FAILED:case`failed`:return`failed`;case`blocked`:case`partial_success`:case`unknown`:return`warning`;case t.AutomationRunStatus.PENDING:case t.AutomationRunStatus.RUNNING:return`in_progress`;default:return`unknown`}}function a(t){switch(t){case`success`:return e.I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_SUCCEEDED;case`failed`:return e.I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_FAILED;case`warning`:return e.I18nKey.AUTOMATIONS$DETAIL$NEEDS_REVIEW;case`in_progress`:return e.I18nKey.FEATURED_AUTOMATIONS$RUN_IN_PROGRESS;case`none`:return e.I18nKey.AUTOMATIONS$DETAIL$NO_RUNS;default:return e.I18nKey.FEATURED_AUTOMATIONS$STATUS_UNKNOWN}}var o={github:`GitHub`,gitlab:`GitLab`,slack:`Slack`,linear:`Linear`,jira:`Jira`};function s(e){let t=e.trim().toLowerCase();return t?o[t]??t.replace(/\b\w/g,e=>e.toUpperCase()):e}function c(e){let{trigger:t}=e;return t.type===`event`&&t.on?r.formatEventOn(t.on):null}function l(e){let{trigger:t}=e;return t.type===`event`&&t.source?.trim()||null}function u(e){let{trigger:t}=e;return t.type===`event`?null:t.schedule_human||t.schedule||t.type||null}function d(e){let{trigger:t}=e;if(t.type===`event`){let t=l(e);return[c(e)??``,t?`(${s(t)})`:``].filter(Boolean).join(` `)}return u(e)??t.type}var f=48;function p(e){let t=e.trim().replace(/\s+/g,` `);if(!t)return t;let n=t.match(/^.*?[.!?](?=\s|$)/)?.[0]??t;return n.length<=f?n:`${n.slice(0,f-1).trimEnd()}…`}function m(e,t=p(e)){return e.trim().replace(/\s+/g,` `)!==t}function h(e){let t=e.completed_at??e.started_at;if(!t)return null;let n=new Date(t).getTime();return Number.isNaN(n)||n===0?null:t}exports.deriveRunHealth=i,exports.formatTriggerSourceLabel=s,exports.getLastRunTimestamp=h,exports.getRunHealthLabelKey=a,exports.getTriggerEventLabel=c,exports.getTriggerScheduleLabel=u,exports.getTriggerSource=l,exports.getTriggerSummary=d,exports.shortenAutomationRunSummary=p,exports.shouldShowAutomationRunSummaryHovercard=m;
2
2
  //# sourceMappingURL=automation-run-health.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"automation-run-health.cjs","names":[],"sources":["../../../../../src/components/features/home/featured-automations/automation-run-health.ts"],"sourcesContent":["import type { LatestAutomationRunState } from \"#/hooks/query/use-latest-automation-runs\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n AutomationRunStatus,\n type Automation,\n type AutomationRun,\n} from \"#/types/automation\";\nimport { formatEventOn } from \"#/utils/automation-schedule\";\n\nexport type AutomationRunHealth =\n | \"success\"\n | \"failed\"\n | \"in_progress\"\n | \"none\"\n | \"unknown\";\n\nexport function deriveRunHealth(\n state: LatestAutomationRunState,\n): AutomationRunHealth {\n if (state.isLoading || state.isError) return \"unknown\";\n if (!state.latestRun) return \"none\";\n switch (state.latestRun.status) {\n case AutomationRunStatus.COMPLETED:\n return \"success\";\n case AutomationRunStatus.FAILED:\n return \"failed\";\n case AutomationRunStatus.PENDING:\n case AutomationRunStatus.RUNNING:\n return \"in_progress\";\n // CANCELLED, SKIPPED, and any status the backend adds after this enum.\n default:\n return \"unknown\";\n }\n}\n\nexport function getRunHealthLabelKey(health: AutomationRunHealth): I18nKey {\n switch (health) {\n case \"success\":\n return I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_SUCCEEDED;\n case \"failed\":\n return I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_FAILED;\n case \"in_progress\":\n return I18nKey.FEATURED_AUTOMATIONS$RUN_IN_PROGRESS;\n case \"none\":\n return I18nKey.AUTOMATIONS$DETAIL$NO_RUNS;\n default:\n return I18nKey.FEATURED_AUTOMATIONS$STATUS_UNKNOWN;\n }\n}\n\n/** Known event sources rendered with brand casing; others title-case. */\nconst TRIGGER_SOURCE_LABELS: Record<string, string> = {\n github: \"GitHub\",\n gitlab: \"GitLab\",\n slack: \"Slack\",\n linear: \"Linear\",\n jira: \"Jira\",\n};\n\nexport function formatTriggerSourceLabel(source: string): string {\n const key = source.trim().toLowerCase();\n if (!key) return source;\n return (\n TRIGGER_SOURCE_LABELS[key] ??\n key.replace(/\\b\\w/g, (char) => char.toUpperCase())\n );\n}\n\nexport function getTriggerEventLabel(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type !== \"event\") return null;\n return trigger.on ? formatEventOn(trigger.on) : null;\n}\n\nexport function getTriggerSource(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type !== \"event\") return null;\n return trigger.source?.trim() || null;\n}\n\nexport function getTriggerScheduleLabel(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type === \"event\") return null;\n return trigger.schedule_human || trigger.schedule || trigger.type || null;\n}\n\nexport function getTriggerSummary(automation: Automation): string {\n const { trigger } = automation;\n if (trigger.type === \"event\") {\n const source = getTriggerSource(automation);\n return [\n getTriggerEventLabel(automation) ?? \"\",\n source ? `(${formatTriggerSourceLabel(source)})` : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n return getTriggerScheduleLabel(automation) ?? trigger.type;\n}\n\n/** Inline status-row preview length (keeps the status area to one line). */\nconst ERROR_DETAIL_INLINE_MAX = 48;\n\n/**\n * Short preview for the pinned-card status row. Prefer the first sentence,\n * then hard-truncate so the row stays single-line.\n */\nexport function shortenAutomationErrorDetail(detail: string): string {\n const trimmed = detail.trim().replace(/\\s+/g, \" \");\n if (!trimmed) return trimmed;\n const firstSentence = trimmed.match(/^.*?[.!?](?=\\s|$)/)?.[0] ?? trimmed;\n if (firstSentence.length <= ERROR_DETAIL_INLINE_MAX) return firstSentence;\n return `${firstSentence.slice(0, ERROR_DETAIL_INLINE_MAX - 1).trimEnd()}…`;\n}\n\n/** True when the inline preview is shortened and the full message belongs in a hovercard. */\nexport function shouldShowAutomationErrorHovercard(\n detail: string,\n shortDetail: string = shortenAutomationErrorDetail(detail),\n): boolean {\n return detail.trim().replace(/\\s+/g, \" \") !== shortDetail;\n}\n\n/**\n * Timestamp to show as the run's \"last run\" moment, or null when the run\n * has no usable timestamp yet. The backend leaves started_at unset\n * (epoch/zero) while a run is PENDING and only populates it once execution\n * begins.\n */\nexport function getLastRunTimestamp(run: AutomationRun): string | null {\n const candidate = run.completed_at ?? run.started_at;\n if (!candidate) return null;\n const time = new Date(candidate).getTime();\n if (Number.isNaN(time) || time === 0) return null;\n return candidate;\n}\n"],"mappings":"+MAgBA,SAAgB,EACd,EACqB,CACrB,GAAI,EAAM,WAAa,EAAM,QAAS,MAAO,UAC7C,GAAI,CAAC,EAAM,UAAW,MAAO,OAC7B,OAAQ,EAAM,UAAU,OAAxB,CACE,KAAK,EAAA,oBAAoB,UACvB,MAAO,UACT,KAAK,EAAA,oBAAoB,OACvB,MAAO,SACT,KAAK,EAAA,oBAAoB,QACzB,KAAK,EAAA,oBAAoB,QACvB,MAAO,cAET,QACE,MAAO,SACX,CACF,CAEA,SAAgB,EAAqB,EAAsC,CACzE,OAAQ,EAAR,CACE,IAAK,UACH,OAAO,EAAA,QAAQ,wCACjB,IAAK,SACH,OAAO,EAAA,QAAQ,qCACjB,IAAK,cACH,OAAO,EAAA,QAAQ,qCACjB,IAAK,OACH,OAAO,EAAA,QAAQ,2BACjB,QACE,OAAO,EAAA,QAAQ,mCACnB,CACF,CAGA,IAAM,EAAgD,CACpD,OAAQ,SACR,OAAQ,SACR,MAAO,QACP,OAAQ,SACR,KAAM,MACR,EAEA,SAAgB,EAAyB,EAAwB,CAC/D,IAAM,EAAM,EAAO,KAAK,EAAE,YAAY,EAEtC,OADK,EAEH,EAAsB,IACtB,EAAI,QAAQ,QAAU,GAAS,EAAK,YAAY,CAAC,EAHlC,CAKnB,CAEA,SAAgB,EAAqB,EAAuC,CAC1E,GAAM,CAAE,WAAY,EAEpB,OADI,EAAQ,OAAS,SACd,EAAQ,GAAK,EAAA,cAAc,EAAQ,EAAE,EAAI,IAClD,CAEA,SAAgB,EAAiB,EAAuC,CACtE,GAAM,CAAE,WAAY,EAEpB,OADI,EAAQ,OAAS,SACd,EAAQ,QAAQ,KAAK,GADS,IAEvC,CAEA,SAAgB,EAAwB,EAAuC,CAC7E,GAAM,CAAE,WAAY,EAEpB,OADI,EAAQ,OAAS,QAAgB,KAC9B,EAAQ,gBAAkB,EAAQ,UAAY,EAAQ,MAAQ,IACvE,CAEA,SAAgB,EAAkB,EAAgC,CAChE,GAAM,CAAE,WAAY,EACpB,GAAI,EAAQ,OAAS,QAAS,CAC5B,IAAM,EAAS,EAAiB,CAAU,EAC1C,MAAO,CACL,EAAqB,CAAU,GAAK,GACpC,EAAS,IAAI,EAAyB,CAAM,EAAE,GAAK,EACrD,EACG,OAAO,OAAO,EACd,KAAK,GAAG,CACb,CACA,OAAO,EAAwB,CAAU,GAAK,EAAQ,IACxD,CAGA,IAAM,EAA0B,GAMhC,SAAgB,EAA6B,EAAwB,CACnE,IAAM,EAAU,EAAO,KAAK,EAAE,QAAQ,OAAQ,GAAG,EACjD,GAAI,CAAC,EAAS,OAAO,EACrB,IAAM,EAAgB,EAAQ,MAAM,mBAAmB,IAAI,IAAM,EAEjE,OADI,EAAc,QAAU,EAAgC,EACrD,GAAG,EAAc,MAAM,EAAG,EAA0B,CAAC,EAAE,QAAQ,EAAE,EAC1E,CAGA,SAAgB,EACd,EACA,EAAsB,EAA6B,CAAM,EAChD,CACT,OAAO,EAAO,KAAK,EAAE,QAAQ,OAAQ,GAAG,IAAM,CAChD,CAQA,SAAgB,EAAoB,EAAmC,CACrE,IAAM,EAAY,EAAI,cAAgB,EAAI,WAC1C,GAAI,CAAC,EAAW,OAAO,KACvB,IAAM,EAAO,IAAI,KAAK,CAAS,EAAE,QAAQ,EAEzC,OADI,OAAO,MAAM,CAAI,GAAK,IAAS,EAAU,KACtC,CACT"}
1
+ {"version":3,"file":"automation-run-health.cjs","names":[],"sources":["../../../../../src/components/features/home/featured-automations/automation-run-health.ts"],"sourcesContent":["import type { LatestAutomationRunState } from \"#/hooks/query/use-latest-automation-runs\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n AutomationRunStatus,\n type Automation,\n type AutomationRun,\n} from \"#/types/automation\";\nimport { getAutomationRunDisplay } from \"#/utils/automation-run-display\";\nimport { formatEventOn } from \"#/utils/automation-schedule\";\n\nexport type AutomationRunHealth =\n | \"success\"\n | \"failed\"\n | \"warning\"\n | \"in_progress\"\n | \"none\"\n | \"unknown\";\n\nexport function deriveRunHealth(\n state: LatestAutomationRunState,\n): AutomationRunHealth {\n if (state.isLoading || state.isError) return \"unknown\";\n if (!state.latestRun) return \"none\";\n const display = getAutomationRunDisplay(state.latestRun);\n switch (display.badgeStatus) {\n case AutomationRunStatus.COMPLETED:\n case \"success\":\n return \"success\";\n case AutomationRunStatus.FAILED:\n case \"failed\":\n return \"failed\";\n case \"blocked\":\n case \"partial_success\":\n case \"unknown\":\n return \"warning\";\n case AutomationRunStatus.PENDING:\n case AutomationRunStatus.RUNNING:\n return \"in_progress\";\n default:\n return \"unknown\";\n }\n}\n\nexport function getRunHealthLabelKey(health: AutomationRunHealth): I18nKey {\n switch (health) {\n case \"success\":\n return I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_SUCCEEDED;\n case \"failed\":\n return I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_FAILED;\n case \"warning\":\n return I18nKey.AUTOMATIONS$DETAIL$NEEDS_REVIEW;\n case \"in_progress\":\n return I18nKey.FEATURED_AUTOMATIONS$RUN_IN_PROGRESS;\n case \"none\":\n return I18nKey.AUTOMATIONS$DETAIL$NO_RUNS;\n default:\n return I18nKey.FEATURED_AUTOMATIONS$STATUS_UNKNOWN;\n }\n}\n\n/** Known event sources rendered with brand casing; others title-case. */\nconst TRIGGER_SOURCE_LABELS: Record<string, string> = {\n github: \"GitHub\",\n gitlab: \"GitLab\",\n slack: \"Slack\",\n linear: \"Linear\",\n jira: \"Jira\",\n};\n\nexport function formatTriggerSourceLabel(source: string): string {\n const key = source.trim().toLowerCase();\n if (!key) return source;\n return (\n TRIGGER_SOURCE_LABELS[key] ??\n key.replace(/\\b\\w/g, (char) => char.toUpperCase())\n );\n}\n\nexport function getTriggerEventLabel(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type !== \"event\") return null;\n return trigger.on ? formatEventOn(trigger.on) : null;\n}\n\nexport function getTriggerSource(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type !== \"event\") return null;\n return trigger.source?.trim() || null;\n}\n\nexport function getTriggerScheduleLabel(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type === \"event\") return null;\n return trigger.schedule_human || trigger.schedule || trigger.type || null;\n}\n\nexport function getTriggerSummary(automation: Automation): string {\n const { trigger } = automation;\n if (trigger.type === \"event\") {\n const source = getTriggerSource(automation);\n return [\n getTriggerEventLabel(automation) ?? \"\",\n source ? `(${formatTriggerSourceLabel(source)})` : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n return getTriggerScheduleLabel(automation) ?? trigger.type;\n}\n\n/** Inline status-row preview length (keeps the status area to one line). */\nconst ERROR_DETAIL_INLINE_MAX = 48;\n\n/**\n * Short preview for the pinned-card status row. Prefer the first sentence,\n * then hard-truncate so the row stays single-line.\n */\nexport function shortenAutomationRunSummary(summary: string): string {\n const trimmed = summary.trim().replace(/\\s+/g, \" \");\n if (!trimmed) return trimmed;\n const firstSentence = trimmed.match(/^.*?[.!?](?=\\s|$)/)?.[0] ?? trimmed;\n if (firstSentence.length <= ERROR_DETAIL_INLINE_MAX) return firstSentence;\n return `${firstSentence.slice(0, ERROR_DETAIL_INLINE_MAX - 1).trimEnd()}…`;\n}\n\n/** True when the inline preview is shortened and the full message belongs in a hovercard. */\nexport function shouldShowAutomationRunSummaryHovercard(\n summary: string,\n shortSummary: string = shortenAutomationRunSummary(summary),\n): boolean {\n return summary.trim().replace(/\\s+/g, \" \") !== shortSummary;\n}\n\nexport const shortenAutomationErrorDetail = shortenAutomationRunSummary;\nexport const shouldShowAutomationErrorHovercard =\n shouldShowAutomationRunSummaryHovercard;\n\n/**\n * Timestamp to show as the run's \"last run\" moment, or null when the run\n * has no usable timestamp yet. The backend leaves started_at unset\n * (epoch/zero) while a run is PENDING and only populates it once execution\n * begins.\n */\nexport function getLastRunTimestamp(run: AutomationRun): string | null {\n const candidate = run.completed_at ?? run.started_at;\n if (!candidate) return null;\n const time = new Date(candidate).getTime();\n if (Number.isNaN(time) || time === 0) return null;\n return candidate;\n}\n"],"mappings":"yQAkBA,SAAgB,EACd,EACqB,CACrB,GAAI,EAAM,WAAa,EAAM,QAAS,MAAO,UAC7C,GAAI,CAAC,EAAM,UAAW,MAAO,OAE7B,OADgB,EAAA,wBAAwB,EAAM,SACtC,EAAQ,YAAhB,CACE,KAAK,EAAA,oBAAoB,UACzB,IAAK,UACH,MAAO,UACT,KAAK,EAAA,oBAAoB,OACzB,IAAK,SACH,MAAO,SACT,IAAK,UACL,IAAK,kBACL,IAAK,UACH,MAAO,UACT,KAAK,EAAA,oBAAoB,QACzB,KAAK,EAAA,oBAAoB,QACvB,MAAO,cACT,QACE,MAAO,SACX,CACF,CAEA,SAAgB,EAAqB,EAAsC,CACzE,OAAQ,EAAR,CACE,IAAK,UACH,OAAO,EAAA,QAAQ,wCACjB,IAAK,SACH,OAAO,EAAA,QAAQ,qCACjB,IAAK,UACH,OAAO,EAAA,QAAQ,gCACjB,IAAK,cACH,OAAO,EAAA,QAAQ,qCACjB,IAAK,OACH,OAAO,EAAA,QAAQ,2BACjB,QACE,OAAO,EAAA,QAAQ,mCACnB,CACF,CAGA,IAAM,EAAgD,CACpD,OAAQ,SACR,OAAQ,SACR,MAAO,QACP,OAAQ,SACR,KAAM,MACR,EAEA,SAAgB,EAAyB,EAAwB,CAC/D,IAAM,EAAM,EAAO,KAAK,EAAE,YAAY,EAEtC,OADK,EAEH,EAAsB,IACtB,EAAI,QAAQ,QAAU,GAAS,EAAK,YAAY,CAAC,EAHlC,CAKnB,CAEA,SAAgB,EAAqB,EAAuC,CAC1E,GAAM,CAAE,WAAY,EAEpB,OADI,EAAQ,OAAS,SACd,EAAQ,GAAK,EAAA,cAAc,EAAQ,EAAE,EAAI,IAClD,CAEA,SAAgB,EAAiB,EAAuC,CACtE,GAAM,CAAE,WAAY,EAEpB,OADI,EAAQ,OAAS,SACd,EAAQ,QAAQ,KAAK,GADS,IAEvC,CAEA,SAAgB,EAAwB,EAAuC,CAC7E,GAAM,CAAE,WAAY,EAEpB,OADI,EAAQ,OAAS,QAAgB,KAC9B,EAAQ,gBAAkB,EAAQ,UAAY,EAAQ,MAAQ,IACvE,CAEA,SAAgB,EAAkB,EAAgC,CAChE,GAAM,CAAE,WAAY,EACpB,GAAI,EAAQ,OAAS,QAAS,CAC5B,IAAM,EAAS,EAAiB,CAAU,EAC1C,MAAO,CACL,EAAqB,CAAU,GAAK,GACpC,EAAS,IAAI,EAAyB,CAAM,EAAE,GAAK,EACrD,EACG,OAAO,OAAO,EACd,KAAK,GAAG,CACb,CACA,OAAO,EAAwB,CAAU,GAAK,EAAQ,IACxD,CAGA,IAAM,EAA0B,GAMhC,SAAgB,EAA4B,EAAyB,CACnE,IAAM,EAAU,EAAQ,KAAK,EAAE,QAAQ,OAAQ,GAAG,EAClD,GAAI,CAAC,EAAS,OAAO,EACrB,IAAM,EAAgB,EAAQ,MAAM,mBAAmB,IAAI,IAAM,EAEjE,OADI,EAAc,QAAU,EAAgC,EACrD,GAAG,EAAc,MAAM,EAAG,EAA0B,CAAC,EAAE,QAAQ,EAAE,EAC1E,CAGA,SAAgB,EACd,EACA,EAAuB,EAA4B,CAAO,EACjD,CACT,OAAO,EAAQ,KAAK,EAAE,QAAQ,OAAQ,GAAG,IAAM,CACjD,CAYA,SAAgB,EAAoB,EAAmC,CACrE,IAAM,EAAY,EAAI,cAAgB,EAAI,WAC1C,GAAI,CAAC,EAAW,OAAO,KACvB,IAAM,EAAO,IAAI,KAAK,CAAS,EAAE,QAAQ,EAEzC,OADI,OAAO,MAAM,CAAI,GAAK,IAAS,EAAU,KACtC,CACT"}
@@ -1,7 +1,7 @@
1
1
  import type { LatestAutomationRunState } from "#/hooks/query/use-latest-automation-runs";
2
2
  import { I18nKey } from "#/i18n/declaration";
3
3
  import { type Automation, type AutomationRun } from "#/types/automation";
4
- export type AutomationRunHealth = "success" | "failed" | "in_progress" | "none" | "unknown";
4
+ export type AutomationRunHealth = "success" | "failed" | "warning" | "in_progress" | "none" | "unknown";
5
5
  export declare function deriveRunHealth(state: LatestAutomationRunState): AutomationRunHealth;
6
6
  export declare function getRunHealthLabelKey(health: AutomationRunHealth): I18nKey;
7
7
  export declare function formatTriggerSourceLabel(source: string): string;
@@ -13,9 +13,11 @@ export declare function getTriggerSummary(automation: Automation): string;
13
13
  * Short preview for the pinned-card status row. Prefer the first sentence,
14
14
  * then hard-truncate so the row stays single-line.
15
15
  */
16
- export declare function shortenAutomationErrorDetail(detail: string): string;
16
+ export declare function shortenAutomationRunSummary(summary: string): string;
17
17
  /** True when the inline preview is shortened and the full message belongs in a hovercard. */
18
- export declare function shouldShowAutomationErrorHovercard(detail: string, shortDetail?: string): boolean;
18
+ export declare function shouldShowAutomationRunSummaryHovercard(summary: string, shortSummary?: string): boolean;
19
+ export declare const shortenAutomationErrorDetail: typeof shortenAutomationRunSummary;
20
+ export declare const shouldShowAutomationErrorHovercard: typeof shouldShowAutomationRunSummaryHovercard;
19
21
  /**
20
22
  * Timestamp to show as the run's "last run" moment, or null when the run
21
23
  * has no usable timestamp yet. The backend leaves started_at unset
@@ -1,75 +1,82 @@
1
1
  import { I18nKey as e } from "../../../../i18n/declaration.js";
2
2
  import { AutomationRunStatus as t } from "../../../../types/automation.js";
3
- import { formatEventOn as n } from "../../../../utils/automation-schedule.js";
3
+ import { getAutomationRunDisplay as n } from "../../../../utils/automation-run-display.js";
4
+ import { formatEventOn as r } from "../../../../utils/automation-schedule.js";
4
5
  //#region src/components/features/home/featured-automations/automation-run-health.ts
5
- function r(e) {
6
+ function i(e) {
6
7
  if (e.isLoading || e.isError) return "unknown";
7
8
  if (!e.latestRun) return "none";
8
- switch (e.latestRun.status) {
9
- case t.COMPLETED: return "success";
10
- case t.FAILED: return "failed";
9
+ switch (n(e.latestRun).badgeStatus) {
10
+ case t.COMPLETED:
11
+ case "success": return "success";
12
+ case t.FAILED:
13
+ case "failed": return "failed";
14
+ case "blocked":
15
+ case "partial_success":
16
+ case "unknown": return "warning";
11
17
  case t.PENDING:
12
18
  case t.RUNNING: return "in_progress";
13
19
  default: return "unknown";
14
20
  }
15
21
  }
16
- function i(t) {
22
+ function a(t) {
17
23
  switch (t) {
18
24
  case "success": return e.FEATURED_AUTOMATIONS$LAST_RUN_SUCCEEDED;
19
25
  case "failed": return e.FEATURED_AUTOMATIONS$LAST_RUN_FAILED;
26
+ case "warning": return e.AUTOMATIONS$DETAIL$NEEDS_REVIEW;
20
27
  case "in_progress": return e.FEATURED_AUTOMATIONS$RUN_IN_PROGRESS;
21
28
  case "none": return e.AUTOMATIONS$DETAIL$NO_RUNS;
22
29
  default: return e.FEATURED_AUTOMATIONS$STATUS_UNKNOWN;
23
30
  }
24
31
  }
25
- var a = {
32
+ var o = {
26
33
  github: "GitHub",
27
34
  gitlab: "GitLab",
28
35
  slack: "Slack",
29
36
  linear: "Linear",
30
37
  jira: "Jira"
31
38
  };
32
- function o(e) {
39
+ function s(e) {
33
40
  let t = e.trim().toLowerCase();
34
- return t ? a[t] ?? t.replace(/\b\w/g, (e) => e.toUpperCase()) : e;
41
+ return t ? o[t] ?? t.replace(/\b\w/g, (e) => e.toUpperCase()) : e;
35
42
  }
36
- function s(e) {
43
+ function c(e) {
37
44
  let { trigger: t } = e;
38
- return t.type === "event" && t.on ? n(t.on) : null;
45
+ return t.type === "event" && t.on ? r(t.on) : null;
39
46
  }
40
- function c(e) {
47
+ function l(e) {
41
48
  let { trigger: t } = e;
42
49
  return t.type === "event" && t.source?.trim() || null;
43
50
  }
44
- function l(e) {
51
+ function u(e) {
45
52
  let { trigger: t } = e;
46
53
  return t.type === "event" ? null : t.schedule_human || t.schedule || t.type || null;
47
54
  }
48
- function u(e) {
55
+ function d(e) {
49
56
  let { trigger: t } = e;
50
57
  if (t.type === "event") {
51
- let t = c(e);
52
- return [s(e) ?? "", t ? `(${o(t)})` : ""].filter(Boolean).join(" ");
58
+ let t = l(e);
59
+ return [c(e) ?? "", t ? `(${s(t)})` : ""].filter(Boolean).join(" ");
53
60
  }
54
- return l(e) ?? t.type;
61
+ return u(e) ?? t.type;
55
62
  }
56
- var d = 48;
57
- function f(e) {
63
+ var f = 48;
64
+ function p(e) {
58
65
  let t = e.trim().replace(/\s+/g, " ");
59
66
  if (!t) return t;
60
67
  let n = t.match(/^.*?[.!?](?=\s|$)/)?.[0] ?? t;
61
- return n.length <= d ? n : `${n.slice(0, d - 1).trimEnd()}…`;
68
+ return n.length <= f ? n : `${n.slice(0, f - 1).trimEnd()}…`;
62
69
  }
63
- function p(e, t = f(e)) {
70
+ function m(e, t = p(e)) {
64
71
  return e.trim().replace(/\s+/g, " ") !== t;
65
72
  }
66
- function m(e) {
73
+ function h(e) {
67
74
  let t = e.completed_at ?? e.started_at;
68
75
  if (!t) return null;
69
76
  let n = new Date(t).getTime();
70
77
  return Number.isNaN(n) || n === 0 ? null : t;
71
78
  }
72
79
  //#endregion
73
- export { r as deriveRunHealth, o as formatTriggerSourceLabel, m as getLastRunTimestamp, i as getRunHealthLabelKey, s as getTriggerEventLabel, l as getTriggerScheduleLabel, c as getTriggerSource, u as getTriggerSummary, f as shortenAutomationErrorDetail, p as shouldShowAutomationErrorHovercard };
80
+ export { i as deriveRunHealth, s as formatTriggerSourceLabel, h as getLastRunTimestamp, a as getRunHealthLabelKey, c as getTriggerEventLabel, u as getTriggerScheduleLabel, l as getTriggerSource, d as getTriggerSummary, p as shortenAutomationRunSummary, m as shouldShowAutomationRunSummaryHovercard };
74
81
 
75
82
  //# sourceMappingURL=automation-run-health.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"automation-run-health.js","names":[],"sources":["../../../../../src/components/features/home/featured-automations/automation-run-health.ts"],"sourcesContent":["import type { LatestAutomationRunState } from \"#/hooks/query/use-latest-automation-runs\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n AutomationRunStatus,\n type Automation,\n type AutomationRun,\n} from \"#/types/automation\";\nimport { formatEventOn } from \"#/utils/automation-schedule\";\n\nexport type AutomationRunHealth =\n | \"success\"\n | \"failed\"\n | \"in_progress\"\n | \"none\"\n | \"unknown\";\n\nexport function deriveRunHealth(\n state: LatestAutomationRunState,\n): AutomationRunHealth {\n if (state.isLoading || state.isError) return \"unknown\";\n if (!state.latestRun) return \"none\";\n switch (state.latestRun.status) {\n case AutomationRunStatus.COMPLETED:\n return \"success\";\n case AutomationRunStatus.FAILED:\n return \"failed\";\n case AutomationRunStatus.PENDING:\n case AutomationRunStatus.RUNNING:\n return \"in_progress\";\n // CANCELLED, SKIPPED, and any status the backend adds after this enum.\n default:\n return \"unknown\";\n }\n}\n\nexport function getRunHealthLabelKey(health: AutomationRunHealth): I18nKey {\n switch (health) {\n case \"success\":\n return I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_SUCCEEDED;\n case \"failed\":\n return I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_FAILED;\n case \"in_progress\":\n return I18nKey.FEATURED_AUTOMATIONS$RUN_IN_PROGRESS;\n case \"none\":\n return I18nKey.AUTOMATIONS$DETAIL$NO_RUNS;\n default:\n return I18nKey.FEATURED_AUTOMATIONS$STATUS_UNKNOWN;\n }\n}\n\n/** Known event sources rendered with brand casing; others title-case. */\nconst TRIGGER_SOURCE_LABELS: Record<string, string> = {\n github: \"GitHub\",\n gitlab: \"GitLab\",\n slack: \"Slack\",\n linear: \"Linear\",\n jira: \"Jira\",\n};\n\nexport function formatTriggerSourceLabel(source: string): string {\n const key = source.trim().toLowerCase();\n if (!key) return source;\n return (\n TRIGGER_SOURCE_LABELS[key] ??\n key.replace(/\\b\\w/g, (char) => char.toUpperCase())\n );\n}\n\nexport function getTriggerEventLabel(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type !== \"event\") return null;\n return trigger.on ? formatEventOn(trigger.on) : null;\n}\n\nexport function getTriggerSource(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type !== \"event\") return null;\n return trigger.source?.trim() || null;\n}\n\nexport function getTriggerScheduleLabel(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type === \"event\") return null;\n return trigger.schedule_human || trigger.schedule || trigger.type || null;\n}\n\nexport function getTriggerSummary(automation: Automation): string {\n const { trigger } = automation;\n if (trigger.type === \"event\") {\n const source = getTriggerSource(automation);\n return [\n getTriggerEventLabel(automation) ?? \"\",\n source ? `(${formatTriggerSourceLabel(source)})` : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n return getTriggerScheduleLabel(automation) ?? trigger.type;\n}\n\n/** Inline status-row preview length (keeps the status area to one line). */\nconst ERROR_DETAIL_INLINE_MAX = 48;\n\n/**\n * Short preview for the pinned-card status row. Prefer the first sentence,\n * then hard-truncate so the row stays single-line.\n */\nexport function shortenAutomationErrorDetail(detail: string): string {\n const trimmed = detail.trim().replace(/\\s+/g, \" \");\n if (!trimmed) return trimmed;\n const firstSentence = trimmed.match(/^.*?[.!?](?=\\s|$)/)?.[0] ?? trimmed;\n if (firstSentence.length <= ERROR_DETAIL_INLINE_MAX) return firstSentence;\n return `${firstSentence.slice(0, ERROR_DETAIL_INLINE_MAX - 1).trimEnd()}…`;\n}\n\n/** True when the inline preview is shortened and the full message belongs in a hovercard. */\nexport function shouldShowAutomationErrorHovercard(\n detail: string,\n shortDetail: string = shortenAutomationErrorDetail(detail),\n): boolean {\n return detail.trim().replace(/\\s+/g, \" \") !== shortDetail;\n}\n\n/**\n * Timestamp to show as the run's \"last run\" moment, or null when the run\n * has no usable timestamp yet. The backend leaves started_at unset\n * (epoch/zero) while a run is PENDING and only populates it once execution\n * begins.\n */\nexport function getLastRunTimestamp(run: AutomationRun): string | null {\n const candidate = run.completed_at ?? run.started_at;\n if (!candidate) return null;\n const time = new Date(candidate).getTime();\n if (Number.isNaN(time) || time === 0) return null;\n return candidate;\n}\n"],"mappings":";;;;AAgBA,SAAgB,EACd,GACqB;CACrB,IAAI,EAAM,aAAa,EAAM,SAAS,OAAO;CAC7C,IAAI,CAAC,EAAM,WAAW,OAAO;CAC7B,QAAQ,EAAM,UAAU,QAAxB;EACE,KAAK,EAAoB,WACvB,OAAO;EACT,KAAK,EAAoB,QACvB,OAAO;EACT,KAAK,EAAoB;EACzB,KAAK,EAAoB,SACvB,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAgB,EAAqB,GAAsC;CACzE,QAAQ,GAAR;EACE,KAAK,WACH,OAAO,EAAQ;EACjB,KAAK,UACH,OAAO,EAAQ;EACjB,KAAK,eACH,OAAO,EAAQ;EACjB,KAAK,QACH,OAAO,EAAQ;EACjB,SACE,OAAO,EAAQ;CACnB;AACF;AAGA,IAAM,IAAgD;CACpD,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,MAAM;AACR;AAEA,SAAgB,EAAyB,GAAwB;CAC/D,IAAM,IAAM,EAAO,KAAK,EAAE,YAAY;CAEtC,OADK,IAEH,EAAsB,MACtB,EAAI,QAAQ,UAAU,MAAS,EAAK,YAAY,CAAC,IAHlC;AAKnB;AAEA,SAAgB,EAAqB,GAAuC;CAC1E,IAAM,EAAE,eAAY;CAEpB,OADI,EAAQ,SAAS,WACd,EAAQ,KAAK,EAAc,EAAQ,EAAE,IAAI;AAClD;AAEA,SAAgB,EAAiB,GAAuC;CACtE,IAAM,EAAE,eAAY;CAEpB,OADI,EAAQ,SAAS,WACd,EAAQ,QAAQ,KAAK,KADS;AAEvC;AAEA,SAAgB,EAAwB,GAAuC;CAC7E,IAAM,EAAE,eAAY;CAEpB,OADI,EAAQ,SAAS,UAAgB,OAC9B,EAAQ,kBAAkB,EAAQ,YAAY,EAAQ,QAAQ;AACvE;AAEA,SAAgB,EAAkB,GAAgC;CAChE,IAAM,EAAE,eAAY;CACpB,IAAI,EAAQ,SAAS,SAAS;EAC5B,IAAM,IAAS,EAAiB,CAAU;EAC1C,OAAO,CACL,EAAqB,CAAU,KAAK,IACpC,IAAS,IAAI,EAAyB,CAAM,EAAE,KAAK,EACrD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;CACb;CACA,OAAO,EAAwB,CAAU,KAAK,EAAQ;AACxD;AAGA,IAAM,IAA0B;AAMhC,SAAgB,EAA6B,GAAwB;CACnE,IAAM,IAAU,EAAO,KAAK,EAAE,QAAQ,QAAQ,GAAG;CACjD,IAAI,CAAC,GAAS,OAAO;CACrB,IAAM,IAAgB,EAAQ,MAAM,mBAAmB,IAAI,MAAM;CAEjE,OADI,EAAc,UAAU,IAAgC,IACrD,GAAG,EAAc,MAAM,GAAG,IAA0B,CAAC,EAAE,QAAQ,EAAE;AAC1E;AAGA,SAAgB,EACd,GACA,IAAsB,EAA6B,CAAM,GAChD;CACT,OAAO,EAAO,KAAK,EAAE,QAAQ,QAAQ,GAAG,MAAM;AAChD;AAQA,SAAgB,EAAoB,GAAmC;CACrE,IAAM,IAAY,EAAI,gBAAgB,EAAI;CAC1C,IAAI,CAAC,GAAW,OAAO;CACvB,IAAM,IAAO,IAAI,KAAK,CAAS,EAAE,QAAQ;CAEzC,OADI,OAAO,MAAM,CAAI,KAAK,MAAS,IAAU,OACtC;AACT"}
1
+ {"version":3,"file":"automation-run-health.js","names":[],"sources":["../../../../../src/components/features/home/featured-automations/automation-run-health.ts"],"sourcesContent":["import type { LatestAutomationRunState } from \"#/hooks/query/use-latest-automation-runs\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n AutomationRunStatus,\n type Automation,\n type AutomationRun,\n} from \"#/types/automation\";\nimport { getAutomationRunDisplay } from \"#/utils/automation-run-display\";\nimport { formatEventOn } from \"#/utils/automation-schedule\";\n\nexport type AutomationRunHealth =\n | \"success\"\n | \"failed\"\n | \"warning\"\n | \"in_progress\"\n | \"none\"\n | \"unknown\";\n\nexport function deriveRunHealth(\n state: LatestAutomationRunState,\n): AutomationRunHealth {\n if (state.isLoading || state.isError) return \"unknown\";\n if (!state.latestRun) return \"none\";\n const display = getAutomationRunDisplay(state.latestRun);\n switch (display.badgeStatus) {\n case AutomationRunStatus.COMPLETED:\n case \"success\":\n return \"success\";\n case AutomationRunStatus.FAILED:\n case \"failed\":\n return \"failed\";\n case \"blocked\":\n case \"partial_success\":\n case \"unknown\":\n return \"warning\";\n case AutomationRunStatus.PENDING:\n case AutomationRunStatus.RUNNING:\n return \"in_progress\";\n default:\n return \"unknown\";\n }\n}\n\nexport function getRunHealthLabelKey(health: AutomationRunHealth): I18nKey {\n switch (health) {\n case \"success\":\n return I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_SUCCEEDED;\n case \"failed\":\n return I18nKey.FEATURED_AUTOMATIONS$LAST_RUN_FAILED;\n case \"warning\":\n return I18nKey.AUTOMATIONS$DETAIL$NEEDS_REVIEW;\n case \"in_progress\":\n return I18nKey.FEATURED_AUTOMATIONS$RUN_IN_PROGRESS;\n case \"none\":\n return I18nKey.AUTOMATIONS$DETAIL$NO_RUNS;\n default:\n return I18nKey.FEATURED_AUTOMATIONS$STATUS_UNKNOWN;\n }\n}\n\n/** Known event sources rendered with brand casing; others title-case. */\nconst TRIGGER_SOURCE_LABELS: Record<string, string> = {\n github: \"GitHub\",\n gitlab: \"GitLab\",\n slack: \"Slack\",\n linear: \"Linear\",\n jira: \"Jira\",\n};\n\nexport function formatTriggerSourceLabel(source: string): string {\n const key = source.trim().toLowerCase();\n if (!key) return source;\n return (\n TRIGGER_SOURCE_LABELS[key] ??\n key.replace(/\\b\\w/g, (char) => char.toUpperCase())\n );\n}\n\nexport function getTriggerEventLabel(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type !== \"event\") return null;\n return trigger.on ? formatEventOn(trigger.on) : null;\n}\n\nexport function getTriggerSource(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type !== \"event\") return null;\n return trigger.source?.trim() || null;\n}\n\nexport function getTriggerScheduleLabel(automation: Automation): string | null {\n const { trigger } = automation;\n if (trigger.type === \"event\") return null;\n return trigger.schedule_human || trigger.schedule || trigger.type || null;\n}\n\nexport function getTriggerSummary(automation: Automation): string {\n const { trigger } = automation;\n if (trigger.type === \"event\") {\n const source = getTriggerSource(automation);\n return [\n getTriggerEventLabel(automation) ?? \"\",\n source ? `(${formatTriggerSourceLabel(source)})` : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n return getTriggerScheduleLabel(automation) ?? trigger.type;\n}\n\n/** Inline status-row preview length (keeps the status area to one line). */\nconst ERROR_DETAIL_INLINE_MAX = 48;\n\n/**\n * Short preview for the pinned-card status row. Prefer the first sentence,\n * then hard-truncate so the row stays single-line.\n */\nexport function shortenAutomationRunSummary(summary: string): string {\n const trimmed = summary.trim().replace(/\\s+/g, \" \");\n if (!trimmed) return trimmed;\n const firstSentence = trimmed.match(/^.*?[.!?](?=\\s|$)/)?.[0] ?? trimmed;\n if (firstSentence.length <= ERROR_DETAIL_INLINE_MAX) return firstSentence;\n return `${firstSentence.slice(0, ERROR_DETAIL_INLINE_MAX - 1).trimEnd()}…`;\n}\n\n/** True when the inline preview is shortened and the full message belongs in a hovercard. */\nexport function shouldShowAutomationRunSummaryHovercard(\n summary: string,\n shortSummary: string = shortenAutomationRunSummary(summary),\n): boolean {\n return summary.trim().replace(/\\s+/g, \" \") !== shortSummary;\n}\n\nexport const shortenAutomationErrorDetail = shortenAutomationRunSummary;\nexport const shouldShowAutomationErrorHovercard =\n shouldShowAutomationRunSummaryHovercard;\n\n/**\n * Timestamp to show as the run's \"last run\" moment, or null when the run\n * has no usable timestamp yet. The backend leaves started_at unset\n * (epoch/zero) while a run is PENDING and only populates it once execution\n * begins.\n */\nexport function getLastRunTimestamp(run: AutomationRun): string | null {\n const candidate = run.completed_at ?? run.started_at;\n if (!candidate) return null;\n const time = new Date(candidate).getTime();\n if (Number.isNaN(time) || time === 0) return null;\n return candidate;\n}\n"],"mappings":";;;;;AAkBA,SAAgB,EACd,GACqB;CACrB,IAAI,EAAM,aAAa,EAAM,SAAS,OAAO;CAC7C,IAAI,CAAC,EAAM,WAAW,OAAO;CAE7B,QADgB,EAAwB,EAAM,SACtC,EAAQ,aAAhB;EACE,KAAK,EAAoB;EACzB,KAAK,WACH,OAAO;EACT,KAAK,EAAoB;EACzB,KAAK,UACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO;EACT,KAAK,EAAoB;EACzB,KAAK,EAAoB,SACvB,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAgB,EAAqB,GAAsC;CACzE,QAAQ,GAAR;EACE,KAAK,WACH,OAAO,EAAQ;EACjB,KAAK,UACH,OAAO,EAAQ;EACjB,KAAK,WACH,OAAO,EAAQ;EACjB,KAAK,eACH,OAAO,EAAQ;EACjB,KAAK,QACH,OAAO,EAAQ;EACjB,SACE,OAAO,EAAQ;CACnB;AACF;AAGA,IAAM,IAAgD;CACpD,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,MAAM;AACR;AAEA,SAAgB,EAAyB,GAAwB;CAC/D,IAAM,IAAM,EAAO,KAAK,EAAE,YAAY;CAEtC,OADK,IAEH,EAAsB,MACtB,EAAI,QAAQ,UAAU,MAAS,EAAK,YAAY,CAAC,IAHlC;AAKnB;AAEA,SAAgB,EAAqB,GAAuC;CAC1E,IAAM,EAAE,eAAY;CAEpB,OADI,EAAQ,SAAS,WACd,EAAQ,KAAK,EAAc,EAAQ,EAAE,IAAI;AAClD;AAEA,SAAgB,EAAiB,GAAuC;CACtE,IAAM,EAAE,eAAY;CAEpB,OADI,EAAQ,SAAS,WACd,EAAQ,QAAQ,KAAK,KADS;AAEvC;AAEA,SAAgB,EAAwB,GAAuC;CAC7E,IAAM,EAAE,eAAY;CAEpB,OADI,EAAQ,SAAS,UAAgB,OAC9B,EAAQ,kBAAkB,EAAQ,YAAY,EAAQ,QAAQ;AACvE;AAEA,SAAgB,EAAkB,GAAgC;CAChE,IAAM,EAAE,eAAY;CACpB,IAAI,EAAQ,SAAS,SAAS;EAC5B,IAAM,IAAS,EAAiB,CAAU;EAC1C,OAAO,CACL,EAAqB,CAAU,KAAK,IACpC,IAAS,IAAI,EAAyB,CAAM,EAAE,KAAK,EACrD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;CACb;CACA,OAAO,EAAwB,CAAU,KAAK,EAAQ;AACxD;AAGA,IAAM,IAA0B;AAMhC,SAAgB,EAA4B,GAAyB;CACnE,IAAM,IAAU,EAAQ,KAAK,EAAE,QAAQ,QAAQ,GAAG;CAClD,IAAI,CAAC,GAAS,OAAO;CACrB,IAAM,IAAgB,EAAQ,MAAM,mBAAmB,IAAI,MAAM;CAEjE,OADI,EAAc,UAAU,IAAgC,IACrD,GAAG,EAAc,MAAM,GAAG,IAA0B,CAAC,EAAE,QAAQ,EAAE;AAC1E;AAGA,SAAgB,EACd,GACA,IAAuB,EAA4B,CAAO,GACjD;CACT,OAAO,EAAQ,KAAK,EAAE,QAAQ,QAAQ,GAAG,MAAM;AACjD;AAYA,SAAgB,EAAoB,GAAmC;CACrE,IAAM,IAAY,EAAI,gBAAgB,EAAI;CAC1C,IAAI,CAAC,GAAW,OAAO;CACvB,IAAM,IAAO,IAAI,KAAK,CAAS,EAAE,QAAQ;CAEzC,OADI,OAAO,MAAM,CAAI,KAAK,MAAS,IAAU,OACtC;AACT"}
@@ -1,13 +1,14 @@
1
1
  import type { LatestAutomationRunState } from "#/hooks/query/use-latest-automation-runs";
2
2
  import { I18nKey } from "#/i18n/declaration";
3
- import { AutomationRunStatus, type Automation } from "#/types/automation";
3
+ import { type Automation } from "#/types/automation";
4
+ import { type AutomationRunBadgeStatus } from "#/utils/automation-run-display";
4
5
  /** Live home-page row/card model derived from an automation + its latest run. */
5
6
  export interface HomeAutomationActivityItem {
6
7
  id: string;
7
8
  name: string;
8
9
  triggerSummary: string;
9
10
  /** Null when the automation has never run (or the run fetch failed). */
10
- status: AutomationRunStatus | null;
11
+ status: AutomationRunBadgeStatus | null;
11
12
  /** Relative time label, or null when there is no usable timestamp. */
12
13
  whenLabel: string | null;
13
14
  conversationId: string | null;
@@ -1,2 +1,2 @@
1
- require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../../i18n/declaration.cjs"),n=require("../../../../node_modules/lucide-react/dist/esm/icons/zap.cjs"),r=require("../../../../types/automation.cjs"),i=require("../../../../utils/format-relative-time.cjs"),a=require("../../../../icons/clock.cjs"),o=require("./automation-run-health.cjs"),s=require("../../automations/detail/run-phase.cjs"),c=require("./automation-health-indicator.cjs");let l=require("react/jsx-runtime");function u(e){return e.isError?t.I18nKey.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE:o.getRunHealthLabelKey(o.deriveRunHealth(e))}function d({label:e,children:t}){return(0,l.jsxs)(`div`,{className:`flex items-start gap-2 text-xs`,children:[(0,l.jsx)(`span`,{className:`w-20 shrink-0 text-[var(--oh-muted)]`,children:e}),(0,l.jsx)(`span`,{className:`min-w-0 flex-1 break-words text-[var(--oh-foreground)]`,children:t})]})}function f({run:n}){let{t:r}=e.useTranslation(`openhands`),i=s.useRunPhase({status:n?.status,code:n?.phase_code,label:n?.phase_label,updatedAt:n?.phase_updated_at});if(!n||!s.shouldShowRunPhase(n.status)||!i)return null;let{text:a,age:o}=i;return(0,l.jsx)(d,{label:r(t.I18nKey.AUTOMATIONS$DETAIL$PHASE),children:(0,l.jsxs)(`span`,{"data-testid":`run-phase-row`,children:[a,o?(0,l.jsxs)(`span`,{className:`text-muted`,children:[` · `,o]}):null]})})}function p({automation:s,runState:p}){let{t:m,i18n:h}=e.useTranslation(`openhands`),{latestRun:g}=p,_=g?o.getLastRunTimestamp(g):null,v=s.trigger.type===`event`?n.Zap:a.default,y=o.deriveRunHealth(p);return(0,l.jsxs)(`div`,{className:`flex w-[280px] flex-col gap-3 p-3`,children:[(0,l.jsx)(`span`,{className:`break-words text-sm font-medium text-white`,children:s.name}),(0,l.jsxs)(`dl`,{className:`flex flex-col gap-1.5`,children:[(0,l.jsx)(d,{label:m(t.I18nKey.AUTOMATIONS$DETAIL$TRIGGER),children:(0,l.jsxs)(`span`,{className:`inline-flex min-w-0 items-start gap-1.5`,children:[(0,l.jsx)(v,{className:`mt-0.5 size-3 shrink-0`,"aria-hidden":`true`}),(0,l.jsx)(`span`,{className:`break-all`,children:o.getTriggerSummary(s)})]})}),(0,l.jsx)(d,{label:m(t.I18nKey.COMMON$STATUS),children:(0,l.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-1.5`,children:[(0,l.jsx)(c.AutomationHealthIndicator,{health:y}),(0,l.jsx)(`span`,{children:m(u(p))})]})}),(0,l.jsx)(f,{run:g}),_?(0,l.jsx)(d,{label:m(t.I18nKey.AUTOMATIONS$DETAIL$LAST_RUN),children:i.formatRelativeTime(_,h.language,m)}):null,g?.status===r.AutomationRunStatus.FAILED&&g.error_detail?(0,l.jsx)(d,{label:m(t.I18nKey.STATUS$ERROR),children:(0,l.jsx)(`span`,{className:`line-clamp-3 text-[var(--oh-status-error)]`,children:g.error_detail})}):null]})]})}exports.HomeAutomationRunTooltip=p,exports.getRunStatusLabelKey=u;
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../../i18n/declaration.cjs"),n=require("../../../../node_modules/lucide-react/dist/esm/icons/zap.cjs"),r=require("../../../../utils/automation-run-display.cjs"),i=require("../../../../utils/format-relative-time.cjs"),a=require("../../../../icons/clock.cjs"),o=require("./automation-run-health.cjs"),s=require("../../automations/detail/run-phase.cjs"),c=require("./automation-health-indicator.cjs");let l=require("react/jsx-runtime");function u(e){return e.isError?t.I18nKey.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE:e.latestRun?r.getAutomationRunBadgeLabelKey(r.getAutomationRunDisplay(e.latestRun).badgeStatus):o.getRunHealthLabelKey(o.deriveRunHealth(e))}function d({label:e,children:t}){return(0,l.jsxs)(`div`,{className:`flex items-start gap-2 text-xs`,children:[(0,l.jsx)(`span`,{className:`w-20 shrink-0 text-[var(--oh-muted)]`,children:e}),(0,l.jsx)(`span`,{className:`min-w-0 flex-1 break-words text-[var(--oh-foreground)]`,children:t})]})}function f({run:n}){let{t:r}=e.useTranslation(`openhands`),i=s.useRunPhase({status:n?.status,code:n?.phase_code,label:n?.phase_label,updatedAt:n?.phase_updated_at});if(!n||!s.shouldShowRunPhase(n.status)||!i)return null;let{text:a,age:o}=i;return(0,l.jsx)(d,{label:r(t.I18nKey.AUTOMATIONS$DETAIL$PHASE),children:(0,l.jsxs)(`span`,{"data-testid":`run-phase-row`,children:[a,o?(0,l.jsxs)(`span`,{className:`text-muted`,children:[` · `,o]}):null]})})}function p({automation:s,runState:p}){let{t:m,i18n:h}=e.useTranslation(`openhands`),{latestRun:g}=p,_=g?o.getLastRunTimestamp(g):null,v=s.trigger.type===`event`?n.Zap:a.default,y=o.deriveRunHealth(p),b=g?r.getAutomationRunDisplay(g):null;return(0,l.jsxs)(`div`,{className:`flex w-[280px] flex-col gap-3 p-3`,children:[(0,l.jsx)(`span`,{className:`break-words text-sm font-medium text-white`,children:s.name}),(0,l.jsxs)(`dl`,{className:`flex flex-col gap-1.5`,children:[(0,l.jsx)(d,{label:m(t.I18nKey.AUTOMATIONS$DETAIL$TRIGGER),children:(0,l.jsxs)(`span`,{className:`inline-flex min-w-0 items-start gap-1.5`,children:[(0,l.jsx)(v,{className:`mt-0.5 size-3 shrink-0`,"aria-hidden":`true`}),(0,l.jsx)(`span`,{className:`break-all`,children:o.getTriggerSummary(s)})]})}),(0,l.jsx)(d,{label:m(t.I18nKey.COMMON$STATUS),children:(0,l.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-1.5`,children:[(0,l.jsx)(c.AutomationHealthIndicator,{health:y}),(0,l.jsx)(`span`,{children:m(u(p))})]})}),(0,l.jsx)(f,{run:g}),_?(0,l.jsx)(d,{label:m(t.I18nKey.AUTOMATIONS$DETAIL$LAST_RUN),children:i.formatRelativeTime(_,h.language,m)}):null,b?.summary?(0,l.jsx)(d,{label:m(t.I18nKey.AUTOMATIONS$DETAIL$TASK_LABEL),children:(0,l.jsx)(`span`,{className:`line-clamp-3 text-[var(--oh-text-secondary)]`,children:b.summary})}):null]})]})}exports.HomeAutomationRunTooltip=p,exports.getRunStatusLabelKey=u;
2
2
  //# sourceMappingURL=home-automation-run-tooltip.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"home-automation-run-tooltip.cjs","names":[],"sources":["../../../../../src/components/features/home/featured-automations/home-automation-run-tooltip.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Zap } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LatestAutomationRunState } from \"#/hooks/query/use-latest-automation-runs\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport ClockIcon from \"#/icons/clock.svg?react\";\nimport {\n shouldShowRunPhase,\n useRunPhase,\n} from \"#/components/features/automations/detail/run-phase\";\nimport {\n AutomationRunStatus,\n type Automation,\n type AutomationRun,\n} from \"#/types/automation\";\nimport { formatRelativeTime } from \"#/utils/format-relative-time\";\nimport { AutomationHealthIndicator } from \"./automation-health-indicator\";\nimport {\n deriveRunHealth,\n getLastRunTimestamp,\n getRunHealthLabelKey,\n getTriggerSummary,\n} from \"./automation-run-health\";\n\nexport function getRunStatusLabelKey(\n runState: LatestAutomationRunState,\n): I18nKey {\n if (runState.isError) return I18nKey.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE;\n return getRunHealthLabelKey(deriveRunHealth(runState));\n}\n\nfunction PreviewRow({\n label,\n children,\n}: {\n label: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-2 text-xs\">\n <span className=\"w-20 shrink-0 text-[var(--oh-muted)]\">{label}</span>\n <span className=\"min-w-0 flex-1 break-words text-[var(--oh-foreground)]\">\n {children}\n </span>\n </div>\n );\n}\n\n/**\n * The run's phase and how long it has held it. The row that opens this\n * hovercard has to clip a long phase; here there is room to wrap, so this is\n * where the whole thing is readable — and the age is what says whether the\n * run is moving through phases or sitting in one. Only the layout differs\n * from the row's: what the phase says, and whether its age is meaningful,\n * comes from the same hook the row uses.\n */\nfunction PhaseRow({ run }: { run: AutomationRun | null }) {\n const { t } = useTranslation(\"openhands\");\n const phase = useRunPhase({\n status: run?.status,\n code: run?.phase_code,\n label: run?.phase_label,\n updatedAt: run?.phase_updated_at,\n });\n\n if (!run || !shouldShowRunPhase(run.status) || !phase) return null;\n\n const { text, age } = phase;\n\n return (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$PHASE)}>\n <span data-testid=\"run-phase-row\">\n {text}\n {age ? <span className=\"text-muted\"> · {age}</span> : null}\n </span>\n </PreviewRow>\n );\n}\n\n/**\n * Left-nav-style hovercard body for an automation's latest-run health.\n * Matches `ConversationCardPreview` layout: title + label/value rows.\n */\nexport function HomeAutomationRunTooltip({\n automation,\n runState,\n}: {\n automation: Automation;\n runState: LatestAutomationRunState;\n}) {\n const { t, i18n } = useTranslation(\"openhands\");\n const { latestRun } = runState;\n const timestamp = latestRun ? getLastRunTimestamp(latestRun) : null;\n const TriggerIcon = automation.trigger.type === \"event\" ? Zap : ClockIcon;\n const health = deriveRunHealth(runState);\n\n return (\n <div className=\"flex w-[280px] flex-col gap-3 p-3\">\n <span className=\"break-words text-sm font-medium text-white\">\n {automation.name}\n </span>\n\n <dl className=\"flex flex-col gap-1.5\">\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$TRIGGER)}>\n <span className=\"inline-flex min-w-0 items-start gap-1.5\">\n <TriggerIcon\n className=\"mt-0.5 size-3 shrink-0\"\n aria-hidden=\"true\"\n />\n <span className=\"break-all\">{getTriggerSummary(automation)}</span>\n </span>\n </PreviewRow>\n\n <PreviewRow label={t(I18nKey.COMMON$STATUS)}>\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n <AutomationHealthIndicator health={health} />\n <span>{t(getRunStatusLabelKey(runState))}</span>\n </span>\n </PreviewRow>\n\n <PhaseRow run={latestRun} />\n\n {timestamp ? (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$LAST_RUN)}>\n {formatRelativeTime(timestamp, i18n.language, t)}\n </PreviewRow>\n ) : null}\n\n {latestRun?.status === AutomationRunStatus.FAILED &&\n latestRun.error_detail ? (\n <PreviewRow label={t(I18nKey.STATUS$ERROR)}>\n <span className=\"line-clamp-3 text-[var(--oh-status-error)]\">\n {latestRun.error_detail}\n </span>\n </PreviewRow>\n ) : null}\n </dl>\n </div>\n );\n}\n"],"mappings":"ikBAwBA,SAAgB,EACd,EACS,CAET,OADI,EAAS,QAAgB,EAAA,QAAQ,wCAC9B,EAAA,qBAAqB,EAAA,gBAAgB,CAAQ,CAAC,CACvD,CAEA,SAAS,EAAW,CAClB,QACA,YAIC,CACD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gDAAwC,CAAY,CAAA,GACpE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,yDACb,UACG,CAAA,CACH,GAET,CAUA,SAAS,EAAS,CAAE,OAAsC,CACxD,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,EAAQ,EAAA,YAAY,CACxB,OAAQ,GAAK,OACb,KAAM,GAAK,WACX,MAAO,GAAK,YACZ,UAAW,GAAK,gBAClB,CAAC,EAED,GAAI,CAAC,GAAO,CAAC,EAAA,mBAAmB,EAAI,MAAM,GAAK,CAAC,EAAO,OAAO,KAE9D,GAAM,CAAE,OAAM,OAAQ,EAEtB,OACE,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,wBAAwB,YACnD,EAAA,EAAA,MAAC,OAAD,CAAM,cAAY,yBAAlB,CACG,EACA,GAAM,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,sBAAhB,CAA6B,MAAI,CAAU,IAAI,IAClD,GACI,CAAA,CAEhB,CAMA,SAAgB,EAAyB,CACvC,aACA,YAIC,CACD,GAAM,CAAE,IAAG,QAAS,EAAA,eAAe,WAAW,EACxC,CAAE,aAAc,EAChB,EAAY,EAAY,EAAA,oBAAoB,CAAS,EAAI,KACzD,EAAc,EAAW,QAAQ,OAAS,QAAU,EAAA,IAAM,EAAA,QAC1D,EAAS,EAAA,gBAAgB,CAAQ,EAEvC,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sDACb,EAAW,IACR,CAAA,GAEN,EAAA,EAAA,MAAC,KAAD,CAAI,UAAU,iCAAd,EACE,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,0BAA0B,YACrD,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,mDAAhB,EACE,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,yBACV,cAAY,MACb,CAAA,GACD,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,qBAAa,EAAA,kBAAkB,CAAU,CAAQ,CAAA,CAC7D,GACI,CAAA,GAEZ,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,aAAa,YACxC,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,oDAAhB,EACE,EAAA,EAAA,KAAC,EAAA,0BAAD,CAAmC,QAAS,CAAA,GAC5C,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAE,EAAqB,CAAQ,CAAC,CAAQ,CAAA,CAC3C,GACI,CAAA,GAEZ,EAAA,EAAA,KAAC,EAAD,CAAU,IAAK,CAAY,CAAA,EAE1B,GACC,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,2BAA2B,WACrD,EAAA,mBAAmB,EAAW,EAAK,SAAU,CAAC,CACrC,CAAA,EACV,KAEH,GAAW,SAAW,EAAA,oBAAoB,QAC3C,EAAU,cACR,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,YAAY,YACvC,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sDACb,EAAU,YACP,CAAA,CACI,CAAA,EACV,IACF,GACD,GAET"}
1
+ {"version":3,"file":"home-automation-run-tooltip.cjs","names":[],"sources":["../../../../../src/components/features/home/featured-automations/home-automation-run-tooltip.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Zap } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LatestAutomationRunState } from \"#/hooks/query/use-latest-automation-runs\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport ClockIcon from \"#/icons/clock.svg?react\";\nimport {\n shouldShowRunPhase,\n useRunPhase,\n} from \"#/components/features/automations/detail/run-phase\";\nimport type { Automation, AutomationRun } from \"#/types/automation\";\nimport {\n getAutomationRunBadgeLabelKey,\n getAutomationRunDisplay,\n} from \"#/utils/automation-run-display\";\nimport { formatRelativeTime } from \"#/utils/format-relative-time\";\nimport { AutomationHealthIndicator } from \"./automation-health-indicator\";\nimport {\n deriveRunHealth,\n getLastRunTimestamp,\n getRunHealthLabelKey,\n getTriggerSummary,\n} from \"./automation-run-health\";\n\nexport function getRunStatusLabelKey(\n runState: LatestAutomationRunState,\n): I18nKey {\n if (runState.isError) return I18nKey.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE;\n if (runState.latestRun) {\n return getAutomationRunBadgeLabelKey(\n getAutomationRunDisplay(runState.latestRun).badgeStatus,\n );\n }\n return getRunHealthLabelKey(deriveRunHealth(runState));\n}\n\nfunction PreviewRow({\n label,\n children,\n}: {\n label: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-2 text-xs\">\n <span className=\"w-20 shrink-0 text-[var(--oh-muted)]\">{label}</span>\n <span className=\"min-w-0 flex-1 break-words text-[var(--oh-foreground)]\">\n {children}\n </span>\n </div>\n );\n}\n\n/**\n * The run's phase and how long it has held it. The row that opens this\n * hovercard has to clip a long phase; here there is room to wrap, so this is\n * where the whole thing is readable — and the age is what says whether the\n * run is moving through phases or sitting in one. Only the layout differs\n * from the row's: what the phase says, and whether its age is meaningful,\n * comes from the same hook the row uses.\n */\nfunction PhaseRow({ run }: { run: AutomationRun | null }) {\n const { t } = useTranslation(\"openhands\");\n const phase = useRunPhase({\n status: run?.status,\n code: run?.phase_code,\n label: run?.phase_label,\n updatedAt: run?.phase_updated_at,\n });\n\n if (!run || !shouldShowRunPhase(run.status) || !phase) return null;\n\n const { text, age } = phase;\n\n return (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$PHASE)}>\n <span data-testid=\"run-phase-row\">\n {text}\n {age ? <span className=\"text-muted\"> · {age}</span> : null}\n </span>\n </PreviewRow>\n );\n}\n\n/**\n * Left-nav-style hovercard body for an automation's latest-run health.\n * Matches `ConversationCardPreview` layout: title + label/value rows.\n */\nexport function HomeAutomationRunTooltip({\n automation,\n runState,\n}: {\n automation: Automation;\n runState: LatestAutomationRunState;\n}) {\n const { t, i18n } = useTranslation(\"openhands\");\n const { latestRun } = runState;\n const timestamp = latestRun ? getLastRunTimestamp(latestRun) : null;\n const TriggerIcon = automation.trigger.type === \"event\" ? Zap : ClockIcon;\n const health = deriveRunHealth(runState);\n const display = latestRun ? getAutomationRunDisplay(latestRun) : null;\n\n return (\n <div className=\"flex w-[280px] flex-col gap-3 p-3\">\n <span className=\"break-words text-sm font-medium text-white\">\n {automation.name}\n </span>\n\n <dl className=\"flex flex-col gap-1.5\">\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$TRIGGER)}>\n <span className=\"inline-flex min-w-0 items-start gap-1.5\">\n <TriggerIcon\n className=\"mt-0.5 size-3 shrink-0\"\n aria-hidden=\"true\"\n />\n <span className=\"break-all\">{getTriggerSummary(automation)}</span>\n </span>\n </PreviewRow>\n\n <PreviewRow label={t(I18nKey.COMMON$STATUS)}>\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n <AutomationHealthIndicator health={health} />\n <span>{t(getRunStatusLabelKey(runState))}</span>\n </span>\n </PreviewRow>\n\n <PhaseRow run={latestRun} />\n\n {timestamp ? (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$LAST_RUN)}>\n {formatRelativeTime(timestamp, i18n.language, t)}\n </PreviewRow>\n ) : null}\n\n {display?.summary ? (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$TASK_LABEL)}>\n <span className=\"line-clamp-3 text-[var(--oh-text-secondary)]\">\n {display.summary}\n </span>\n </PreviewRow>\n ) : null}\n </dl>\n </div>\n );\n}\n"],"mappings":"6kBAwBA,SAAgB,EACd,EACS,CAOT,OANI,EAAS,QAAgB,EAAA,QAAQ,wCACjC,EAAS,UACJ,EAAA,8BACL,EAAA,wBAAwB,EAAS,SAAS,EAAE,WAC9C,EAEK,EAAA,qBAAqB,EAAA,gBAAgB,CAAQ,CAAC,CACvD,CAEA,SAAS,EAAW,CAClB,QACA,YAIC,CACD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gDAAwC,CAAY,CAAA,GACpE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,yDACb,UACG,CAAA,CACH,GAET,CAUA,SAAS,EAAS,CAAE,OAAsC,CACxD,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,EAAQ,EAAA,YAAY,CACxB,OAAQ,GAAK,OACb,KAAM,GAAK,WACX,MAAO,GAAK,YACZ,UAAW,GAAK,gBAClB,CAAC,EAED,GAAI,CAAC,GAAO,CAAC,EAAA,mBAAmB,EAAI,MAAM,GAAK,CAAC,EAAO,OAAO,KAE9D,GAAM,CAAE,OAAM,OAAQ,EAEtB,OACE,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,wBAAwB,YACnD,EAAA,EAAA,MAAC,OAAD,CAAM,cAAY,yBAAlB,CACG,EACA,GAAM,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,sBAAhB,CAA6B,MAAI,CAAU,IAAI,IAClD,GACI,CAAA,CAEhB,CAMA,SAAgB,EAAyB,CACvC,aACA,YAIC,CACD,GAAM,CAAE,IAAG,QAAS,EAAA,eAAe,WAAW,EACxC,CAAE,aAAc,EAChB,EAAY,EAAY,EAAA,oBAAoB,CAAS,EAAI,KACzD,EAAc,EAAW,QAAQ,OAAS,QAAU,EAAA,IAAM,EAAA,QAC1D,EAAS,EAAA,gBAAgB,CAAQ,EACjC,EAAU,EAAY,EAAA,wBAAwB,CAAS,EAAI,KAEjE,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sDACb,EAAW,IACR,CAAA,GAEN,EAAA,EAAA,MAAC,KAAD,CAAI,UAAU,iCAAd,EACE,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,0BAA0B,YACrD,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,mDAAhB,EACE,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,yBACV,cAAY,MACb,CAAA,GACD,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,qBAAa,EAAA,kBAAkB,CAAU,CAAQ,CAAA,CAC7D,GACI,CAAA,GAEZ,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,aAAa,YACxC,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,oDAAhB,EACE,EAAA,EAAA,KAAC,EAAA,0BAAD,CAAmC,QAAS,CAAA,GAC5C,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAE,EAAqB,CAAQ,CAAC,CAAQ,CAAA,CAC3C,GACI,CAAA,GAEZ,EAAA,EAAA,KAAC,EAAD,CAAU,IAAK,CAAY,CAAA,EAE1B,GACC,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,2BAA2B,WACrD,EAAA,mBAAmB,EAAW,EAAK,SAAU,CAAC,CACrC,CAAA,EACV,KAEH,GAAS,SACR,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAE,EAAA,QAAQ,6BAA6B,YACxD,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,wDACb,EAAQ,OACL,CAAA,CACI,CAAA,EACV,IACF,GACD,GAET"}
@@ -1,6 +1,6 @@
1
1
  import type { LatestAutomationRunState } from "#/hooks/query/use-latest-automation-runs";
2
2
  import { I18nKey } from "#/i18n/declaration";
3
- import { type Automation } from "#/types/automation";
3
+ import type { Automation } from "#/types/automation";
4
4
  export declare function getRunStatusLabelKey(runState: LatestAutomationRunState): I18nKey;
5
5
  /**
6
6
  * Left-nav-style hovercard body for an automation's latest-run health.
@@ -1,89 +1,89 @@
1
1
  import { useTranslation as e } from "../../../../node_modules/react-i18next/dist/es/useTranslation.js";
2
2
  import { I18nKey as t } from "../../../../i18n/declaration.js";
3
3
  import { Zap as n } from "../../../../node_modules/lucide-react/dist/esm/icons/zap.js";
4
- import { AutomationRunStatus as r } from "../../../../types/automation.js";
5
- import { formatRelativeTime as i } from "../../../../utils/format-relative-time.js";
6
- import a from "../../../../icons/clock.js";
7
- import { deriveRunHealth as o, getLastRunTimestamp as s, getRunHealthLabelKey as c, getTriggerSummary as l } from "./automation-run-health.js";
8
- import { shouldShowRunPhase as u, useRunPhase as d } from "../../automations/detail/run-phase.js";
9
- import { AutomationHealthIndicator as f } from "./automation-health-indicator.js";
10
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
4
+ import { getAutomationRunBadgeLabelKey as r, getAutomationRunDisplay as i } from "../../../../utils/automation-run-display.js";
5
+ import { formatRelativeTime as a } from "../../../../utils/format-relative-time.js";
6
+ import o from "../../../../icons/clock.js";
7
+ import { deriveRunHealth as s, getLastRunTimestamp as c, getRunHealthLabelKey as l, getTriggerSummary as u } from "./automation-run-health.js";
8
+ import { shouldShowRunPhase as d, useRunPhase as f } from "../../automations/detail/run-phase.js";
9
+ import { AutomationHealthIndicator as p } from "./automation-health-indicator.js";
10
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
11
11
  //#region src/components/features/home/featured-automations/home-automation-run-tooltip.tsx
12
- function h(e) {
13
- return e.isError ? t.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE : c(o(e));
12
+ function g(e) {
13
+ return e.isError ? t.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE : e.latestRun ? r(i(e.latestRun).badgeStatus) : l(s(e));
14
14
  }
15
- function g({ label: e, children: t }) {
16
- return /* @__PURE__ */ m("div", {
15
+ function _({ label: e, children: t }) {
16
+ return /* @__PURE__ */ h("div", {
17
17
  className: "flex items-start gap-2 text-xs",
18
- children: [/* @__PURE__ */ p("span", {
18
+ children: [/* @__PURE__ */ m("span", {
19
19
  className: "w-20 shrink-0 text-[var(--oh-muted)]",
20
20
  children: e
21
- }), /* @__PURE__ */ p("span", {
21
+ }), /* @__PURE__ */ m("span", {
22
22
  className: "min-w-0 flex-1 break-words text-[var(--oh-foreground)]",
23
23
  children: t
24
24
  })]
25
25
  });
26
26
  }
27
- function _({ run: n }) {
28
- let { t: r } = e("openhands"), i = d({
27
+ function v({ run: n }) {
28
+ let { t: r } = e("openhands"), i = f({
29
29
  status: n?.status,
30
30
  code: n?.phase_code,
31
31
  label: n?.phase_label,
32
32
  updatedAt: n?.phase_updated_at
33
33
  });
34
- if (!n || !u(n.status) || !i) return null;
34
+ if (!n || !d(n.status) || !i) return null;
35
35
  let { text: a, age: o } = i;
36
- return /* @__PURE__ */ p(g, {
36
+ return /* @__PURE__ */ m(_, {
37
37
  label: r(t.AUTOMATIONS$DETAIL$PHASE),
38
- children: /* @__PURE__ */ m("span", {
38
+ children: /* @__PURE__ */ h("span", {
39
39
  "data-testid": "run-phase-row",
40
- children: [a, o ? /* @__PURE__ */ m("span", {
40
+ children: [a, o ? /* @__PURE__ */ h("span", {
41
41
  className: "text-muted",
42
42
  children: [" · ", o]
43
43
  }) : null]
44
44
  })
45
45
  });
46
46
  }
47
- function v({ automation: c, runState: u }) {
48
- let { t: d, i18n: v } = e("openhands"), { latestRun: y } = u, b = y ? s(y) : null, x = c.trigger.type === "event" ? n : a, S = o(u);
49
- return /* @__PURE__ */ m("div", {
47
+ function y({ automation: r, runState: l }) {
48
+ let { t: d, i18n: f } = e("openhands"), { latestRun: y } = l, b = y ? c(y) : null, x = r.trigger.type === "event" ? n : o, S = s(l), C = y ? i(y) : null;
49
+ return /* @__PURE__ */ h("div", {
50
50
  className: "flex w-[280px] flex-col gap-3 p-3",
51
- children: [/* @__PURE__ */ p("span", {
51
+ children: [/* @__PURE__ */ m("span", {
52
52
  className: "break-words text-sm font-medium text-white",
53
- children: c.name
54
- }), /* @__PURE__ */ m("dl", {
53
+ children: r.name
54
+ }), /* @__PURE__ */ h("dl", {
55
55
  className: "flex flex-col gap-1.5",
56
56
  children: [
57
- /* @__PURE__ */ p(g, {
57
+ /* @__PURE__ */ m(_, {
58
58
  label: d(t.AUTOMATIONS$DETAIL$TRIGGER),
59
- children: /* @__PURE__ */ m("span", {
59
+ children: /* @__PURE__ */ h("span", {
60
60
  className: "inline-flex min-w-0 items-start gap-1.5",
61
- children: [/* @__PURE__ */ p(x, {
61
+ children: [/* @__PURE__ */ m(x, {
62
62
  className: "mt-0.5 size-3 shrink-0",
63
63
  "aria-hidden": "true"
64
- }), /* @__PURE__ */ p("span", {
64
+ }), /* @__PURE__ */ m("span", {
65
65
  className: "break-all",
66
- children: l(c)
66
+ children: u(r)
67
67
  })]
68
68
  })
69
69
  }),
70
- /* @__PURE__ */ p(g, {
70
+ /* @__PURE__ */ m(_, {
71
71
  label: d(t.COMMON$STATUS),
72
- children: /* @__PURE__ */ m("span", {
72
+ children: /* @__PURE__ */ h("span", {
73
73
  className: "inline-flex min-w-0 items-center gap-1.5",
74
- children: [/* @__PURE__ */ p(f, { health: S }), /* @__PURE__ */ p("span", { children: d(h(u)) })]
74
+ children: [/* @__PURE__ */ m(p, { health: S }), /* @__PURE__ */ m("span", { children: d(g(l)) })]
75
75
  })
76
76
  }),
77
- /* @__PURE__ */ p(_, { run: y }),
78
- b ? /* @__PURE__ */ p(g, {
77
+ /* @__PURE__ */ m(v, { run: y }),
78
+ b ? /* @__PURE__ */ m(_, {
79
79
  label: d(t.AUTOMATIONS$DETAIL$LAST_RUN),
80
- children: i(b, v.language, d)
80
+ children: a(b, f.language, d)
81
81
  }) : null,
82
- y?.status === r.FAILED && y.error_detail ? /* @__PURE__ */ p(g, {
83
- label: d(t.STATUS$ERROR),
84
- children: /* @__PURE__ */ p("span", {
85
- className: "line-clamp-3 text-[var(--oh-status-error)]",
86
- children: y.error_detail
82
+ C?.summary ? /* @__PURE__ */ m(_, {
83
+ label: d(t.AUTOMATIONS$DETAIL$TASK_LABEL),
84
+ children: /* @__PURE__ */ m("span", {
85
+ className: "line-clamp-3 text-[var(--oh-text-secondary)]",
86
+ children: C.summary
87
87
  })
88
88
  }) : null
89
89
  ]
@@ -91,6 +91,6 @@ function v({ automation: c, runState: u }) {
91
91
  });
92
92
  }
93
93
  //#endregion
94
- export { v as HomeAutomationRunTooltip, h as getRunStatusLabelKey };
94
+ export { y as HomeAutomationRunTooltip, g as getRunStatusLabelKey };
95
95
 
96
96
  //# sourceMappingURL=home-automation-run-tooltip.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"home-automation-run-tooltip.js","names":[],"sources":["../../../../../src/components/features/home/featured-automations/home-automation-run-tooltip.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Zap } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LatestAutomationRunState } from \"#/hooks/query/use-latest-automation-runs\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport ClockIcon from \"#/icons/clock.svg?react\";\nimport {\n shouldShowRunPhase,\n useRunPhase,\n} from \"#/components/features/automations/detail/run-phase\";\nimport {\n AutomationRunStatus,\n type Automation,\n type AutomationRun,\n} from \"#/types/automation\";\nimport { formatRelativeTime } from \"#/utils/format-relative-time\";\nimport { AutomationHealthIndicator } from \"./automation-health-indicator\";\nimport {\n deriveRunHealth,\n getLastRunTimestamp,\n getRunHealthLabelKey,\n getTriggerSummary,\n} from \"./automation-run-health\";\n\nexport function getRunStatusLabelKey(\n runState: LatestAutomationRunState,\n): I18nKey {\n if (runState.isError) return I18nKey.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE;\n return getRunHealthLabelKey(deriveRunHealth(runState));\n}\n\nfunction PreviewRow({\n label,\n children,\n}: {\n label: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-2 text-xs\">\n <span className=\"w-20 shrink-0 text-[var(--oh-muted)]\">{label}</span>\n <span className=\"min-w-0 flex-1 break-words text-[var(--oh-foreground)]\">\n {children}\n </span>\n </div>\n );\n}\n\n/**\n * The run's phase and how long it has held it. The row that opens this\n * hovercard has to clip a long phase; here there is room to wrap, so this is\n * where the whole thing is readable — and the age is what says whether the\n * run is moving through phases or sitting in one. Only the layout differs\n * from the row's: what the phase says, and whether its age is meaningful,\n * comes from the same hook the row uses.\n */\nfunction PhaseRow({ run }: { run: AutomationRun | null }) {\n const { t } = useTranslation(\"openhands\");\n const phase = useRunPhase({\n status: run?.status,\n code: run?.phase_code,\n label: run?.phase_label,\n updatedAt: run?.phase_updated_at,\n });\n\n if (!run || !shouldShowRunPhase(run.status) || !phase) return null;\n\n const { text, age } = phase;\n\n return (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$PHASE)}>\n <span data-testid=\"run-phase-row\">\n {text}\n {age ? <span className=\"text-muted\"> · {age}</span> : null}\n </span>\n </PreviewRow>\n );\n}\n\n/**\n * Left-nav-style hovercard body for an automation's latest-run health.\n * Matches `ConversationCardPreview` layout: title + label/value rows.\n */\nexport function HomeAutomationRunTooltip({\n automation,\n runState,\n}: {\n automation: Automation;\n runState: LatestAutomationRunState;\n}) {\n const { t, i18n } = useTranslation(\"openhands\");\n const { latestRun } = runState;\n const timestamp = latestRun ? getLastRunTimestamp(latestRun) : null;\n const TriggerIcon = automation.trigger.type === \"event\" ? Zap : ClockIcon;\n const health = deriveRunHealth(runState);\n\n return (\n <div className=\"flex w-[280px] flex-col gap-3 p-3\">\n <span className=\"break-words text-sm font-medium text-white\">\n {automation.name}\n </span>\n\n <dl className=\"flex flex-col gap-1.5\">\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$TRIGGER)}>\n <span className=\"inline-flex min-w-0 items-start gap-1.5\">\n <TriggerIcon\n className=\"mt-0.5 size-3 shrink-0\"\n aria-hidden=\"true\"\n />\n <span className=\"break-all\">{getTriggerSummary(automation)}</span>\n </span>\n </PreviewRow>\n\n <PreviewRow label={t(I18nKey.COMMON$STATUS)}>\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n <AutomationHealthIndicator health={health} />\n <span>{t(getRunStatusLabelKey(runState))}</span>\n </span>\n </PreviewRow>\n\n <PhaseRow run={latestRun} />\n\n {timestamp ? (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$LAST_RUN)}>\n {formatRelativeTime(timestamp, i18n.language, t)}\n </PreviewRow>\n ) : null}\n\n {latestRun?.status === AutomationRunStatus.FAILED &&\n latestRun.error_detail ? (\n <PreviewRow label={t(I18nKey.STATUS$ERROR)}>\n <span className=\"line-clamp-3 text-[var(--oh-status-error)]\">\n {latestRun.error_detail}\n </span>\n </PreviewRow>\n ) : null}\n </dl>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAwBA,SAAgB,EACd,GACS;CAET,OADI,EAAS,UAAgB,EAAQ,0CAC9B,EAAqB,EAAgB,CAAQ,CAAC;AACvD;AAEA,SAAS,EAAW,EAClB,UACA,eAIC;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,QAAD;GAAM,WAAU;aAAwC;EAAY,CAAA,GACpE,kBAAC,QAAD;GAAM,WAAU;GACb;EACG,CAAA,CACH;;AAET;AAUA,SAAS,EAAS,EAAE,UAAsC;CACxD,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAQ,EAAY;EACxB,QAAQ,GAAK;EACb,MAAM,GAAK;EACX,OAAO,GAAK;EACZ,WAAW,GAAK;CAClB,CAAC;CAED,IAAI,CAAC,KAAO,CAAC,EAAmB,EAAI,MAAM,KAAK,CAAC,GAAO,OAAO;CAE9D,IAAM,EAAE,SAAM,WAAQ;CAEtB,OACE,kBAAC,GAAD;EAAY,OAAO,EAAE,EAAQ,wBAAwB;YACnD,kBAAC,QAAD;GAAM,eAAY;aAAlB,CACG,GACA,IAAM,kBAAC,QAAD;IAAM,WAAU;cAAhB,CAA6B,OAAI,CAAU;QAAI,IAClD;;CACI,CAAA;AAEhB;AAMA,SAAgB,EAAyB,EACvC,eACA,eAIC;CACD,IAAM,EAAE,MAAG,YAAS,EAAe,WAAW,GACxC,EAAE,iBAAc,GAChB,IAAY,IAAY,EAAoB,CAAS,IAAI,MACzD,IAAc,EAAW,QAAQ,SAAS,UAAU,IAAM,GAC1D,IAAS,EAAgB,CAAQ;CAEvC,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,QAAD;GAAM,WAAU;aACb,EAAW;EACR,CAAA,GAEN,kBAAC,MAAD;GAAI,WAAU;aAAd;IACE,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,0BAA0B;eACrD,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD;OACE,WAAU;OACV,eAAY;MACb,CAAA,GACD,kBAAC,QAAD;OAAM,WAAU;iBAAa,EAAkB,CAAU;MAAQ,CAAA,CAC7D;;IACI,CAAA;IAEZ,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,aAAa;eACxC,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EAAmC,UAAS,CAAA,GAC5C,kBAAC,QAAD,EAAA,UAAO,EAAE,EAAqB,CAAQ,CAAC,EAAQ,CAAA,CAC3C;;IACI,CAAA;IAEZ,kBAAC,GAAD,EAAU,KAAK,EAAY,CAAA;IAE1B,IACC,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,2BAA2B;eACrD,EAAmB,GAAW,EAAK,UAAU,CAAC;IACrC,CAAA,IACV;IAEH,GAAW,WAAW,EAAoB,UAC3C,EAAU,eACR,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,YAAY;eACvC,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAU;KACP,CAAA;IACI,CAAA,IACV;GACF;IACD;;AAET"}
1
+ {"version":3,"file":"home-automation-run-tooltip.js","names":[],"sources":["../../../../../src/components/features/home/featured-automations/home-automation-run-tooltip.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Zap } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LatestAutomationRunState } from \"#/hooks/query/use-latest-automation-runs\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport ClockIcon from \"#/icons/clock.svg?react\";\nimport {\n shouldShowRunPhase,\n useRunPhase,\n} from \"#/components/features/automations/detail/run-phase\";\nimport type { Automation, AutomationRun } from \"#/types/automation\";\nimport {\n getAutomationRunBadgeLabelKey,\n getAutomationRunDisplay,\n} from \"#/utils/automation-run-display\";\nimport { formatRelativeTime } from \"#/utils/format-relative-time\";\nimport { AutomationHealthIndicator } from \"./automation-health-indicator\";\nimport {\n deriveRunHealth,\n getLastRunTimestamp,\n getRunHealthLabelKey,\n getTriggerSummary,\n} from \"./automation-run-health\";\n\nexport function getRunStatusLabelKey(\n runState: LatestAutomationRunState,\n): I18nKey {\n if (runState.isError) return I18nKey.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE;\n if (runState.latestRun) {\n return getAutomationRunBadgeLabelKey(\n getAutomationRunDisplay(runState.latestRun).badgeStatus,\n );\n }\n return getRunHealthLabelKey(deriveRunHealth(runState));\n}\n\nfunction PreviewRow({\n label,\n children,\n}: {\n label: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-2 text-xs\">\n <span className=\"w-20 shrink-0 text-[var(--oh-muted)]\">{label}</span>\n <span className=\"min-w-0 flex-1 break-words text-[var(--oh-foreground)]\">\n {children}\n </span>\n </div>\n );\n}\n\n/**\n * The run's phase and how long it has held it. The row that opens this\n * hovercard has to clip a long phase; here there is room to wrap, so this is\n * where the whole thing is readable — and the age is what says whether the\n * run is moving through phases or sitting in one. Only the layout differs\n * from the row's: what the phase says, and whether its age is meaningful,\n * comes from the same hook the row uses.\n */\nfunction PhaseRow({ run }: { run: AutomationRun | null }) {\n const { t } = useTranslation(\"openhands\");\n const phase = useRunPhase({\n status: run?.status,\n code: run?.phase_code,\n label: run?.phase_label,\n updatedAt: run?.phase_updated_at,\n });\n\n if (!run || !shouldShowRunPhase(run.status) || !phase) return null;\n\n const { text, age } = phase;\n\n return (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$PHASE)}>\n <span data-testid=\"run-phase-row\">\n {text}\n {age ? <span className=\"text-muted\"> · {age}</span> : null}\n </span>\n </PreviewRow>\n );\n}\n\n/**\n * Left-nav-style hovercard body for an automation's latest-run health.\n * Matches `ConversationCardPreview` layout: title + label/value rows.\n */\nexport function HomeAutomationRunTooltip({\n automation,\n runState,\n}: {\n automation: Automation;\n runState: LatestAutomationRunState;\n}) {\n const { t, i18n } = useTranslation(\"openhands\");\n const { latestRun } = runState;\n const timestamp = latestRun ? getLastRunTimestamp(latestRun) : null;\n const TriggerIcon = automation.trigger.type === \"event\" ? Zap : ClockIcon;\n const health = deriveRunHealth(runState);\n const display = latestRun ? getAutomationRunDisplay(latestRun) : null;\n\n return (\n <div className=\"flex w-[280px] flex-col gap-3 p-3\">\n <span className=\"break-words text-sm font-medium text-white\">\n {automation.name}\n </span>\n\n <dl className=\"flex flex-col gap-1.5\">\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$TRIGGER)}>\n <span className=\"inline-flex min-w-0 items-start gap-1.5\">\n <TriggerIcon\n className=\"mt-0.5 size-3 shrink-0\"\n aria-hidden=\"true\"\n />\n <span className=\"break-all\">{getTriggerSummary(automation)}</span>\n </span>\n </PreviewRow>\n\n <PreviewRow label={t(I18nKey.COMMON$STATUS)}>\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n <AutomationHealthIndicator health={health} />\n <span>{t(getRunStatusLabelKey(runState))}</span>\n </span>\n </PreviewRow>\n\n <PhaseRow run={latestRun} />\n\n {timestamp ? (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$LAST_RUN)}>\n {formatRelativeTime(timestamp, i18n.language, t)}\n </PreviewRow>\n ) : null}\n\n {display?.summary ? (\n <PreviewRow label={t(I18nKey.AUTOMATIONS$DETAIL$TASK_LABEL)}>\n <span className=\"line-clamp-3 text-[var(--oh-text-secondary)]\">\n {display.summary}\n </span>\n </PreviewRow>\n ) : null}\n </dl>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAwBA,SAAgB,EACd,GACS;CAOT,OANI,EAAS,UAAgB,EAAQ,0CACjC,EAAS,YACJ,EACL,EAAwB,EAAS,SAAS,EAAE,WAC9C,IAEK,EAAqB,EAAgB,CAAQ,CAAC;AACvD;AAEA,SAAS,EAAW,EAClB,UACA,eAIC;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,QAAD;GAAM,WAAU;aAAwC;EAAY,CAAA,GACpE,kBAAC,QAAD;GAAM,WAAU;GACb;EACG,CAAA,CACH;;AAET;AAUA,SAAS,EAAS,EAAE,UAAsC;CACxD,IAAM,EAAE,SAAM,EAAe,WAAW,GAClC,IAAQ,EAAY;EACxB,QAAQ,GAAK;EACb,MAAM,GAAK;EACX,OAAO,GAAK;EACZ,WAAW,GAAK;CAClB,CAAC;CAED,IAAI,CAAC,KAAO,CAAC,EAAmB,EAAI,MAAM,KAAK,CAAC,GAAO,OAAO;CAE9D,IAAM,EAAE,SAAM,WAAQ;CAEtB,OACE,kBAAC,GAAD;EAAY,OAAO,EAAE,EAAQ,wBAAwB;YACnD,kBAAC,QAAD;GAAM,eAAY;aAAlB,CACG,GACA,IAAM,kBAAC,QAAD;IAAM,WAAU;cAAhB,CAA6B,OAAI,CAAU;QAAI,IAClD;;CACI,CAAA;AAEhB;AAMA,SAAgB,EAAyB,EACvC,eACA,eAIC;CACD,IAAM,EAAE,MAAG,YAAS,EAAe,WAAW,GACxC,EAAE,iBAAc,GAChB,IAAY,IAAY,EAAoB,CAAS,IAAI,MACzD,IAAc,EAAW,QAAQ,SAAS,UAAU,IAAM,GAC1D,IAAS,EAAgB,CAAQ,GACjC,IAAU,IAAY,EAAwB,CAAS,IAAI;CAEjE,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,QAAD;GAAM,WAAU;aACb,EAAW;EACR,CAAA,GAEN,kBAAC,MAAD;GAAI,WAAU;aAAd;IACE,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,0BAA0B;eACrD,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD;OACE,WAAU;OACV,eAAY;MACb,CAAA,GACD,kBAAC,QAAD;OAAM,WAAU;iBAAa,EAAkB,CAAU;MAAQ,CAAA,CAC7D;;IACI,CAAA;IAEZ,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,aAAa;eACxC,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EAAmC,UAAS,CAAA,GAC5C,kBAAC,QAAD,EAAA,UAAO,EAAE,EAAqB,CAAQ,CAAC,EAAQ,CAAA,CAC3C;;IACI,CAAA;IAEZ,kBAAC,GAAD,EAAU,KAAK,EAAY,CAAA;IAE1B,IACC,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,2BAA2B;eACrD,EAAmB,GAAW,EAAK,UAAU,CAAC;IACrC,CAAA,IACV;IAEH,GAAS,UACR,kBAAC,GAAD;KAAY,OAAO,EAAE,EAAQ,6BAA6B;eACxD,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAQ;KACL,CAAA;IACI,CAAA,IACV;GACF;IACD;;AAET"}
@@ -10,6 +10,8 @@ export interface SetupFormFieldProps {
10
10
  error?: string;
11
11
  /** Declared options, or the ones the deployment supplied. */
12
12
  options: SetupFieldOption[];
13
+ /** Whether dynamic options for this field are still loading. */
14
+ isOptionsLoading?: boolean;
13
15
  /** The picked repository, kept so the picker can show what is selected. */
14
16
  repository: GitRepository | null;
15
17
  disabled: boolean;
@@ -25,4 +27,4 @@ export interface SetupFormFieldProps {
25
27
  * never translated by the host; the only host string is the format hint the
26
28
  * repository fallback below needs, because no manifest declares it.
27
29
  */
28
- export declare function SetupFormField({ name, field, value, error, options, repository, disabled, onChange, onRepositoryChange, onBlur, }: SetupFormFieldProps): import("react").JSX.Element;
30
+ export declare function SetupFormField({ name, field, value, error, options, isOptionsLoading, repository, disabled, onChange, onRepositoryChange, onBlur, }: SetupFormFieldProps): import("react").JSX.Element;
@@ -2,6 +2,8 @@ import type { SetupBlock, SetupFormValues } from "#/manifests/types";
2
2
  export interface SetupReviewStepProps {
3
3
  setup: SetupBlock;
4
4
  values: SetupFormValues;
5
+ selectedTrigger?: string | null;
6
+ selectedAction?: string | null;
5
7
  }
6
8
  /**
7
9
  * Stage 7 — the plain-language summary the user confirms.
@@ -11,4 +13,4 @@ export interface SetupReviewStepProps {
11
13
  * row per declared field, labelled the way the field was labelled, says the
12
14
  * same thing without asking every entry to restate it.
13
15
  */
14
- export declare function SetupReviewStep({ setup, values }: SetupReviewStepProps): import("react").JSX.Element;
16
+ export declare function SetupReviewStep({ setup, values, selectedTrigger, selectedAction, }: SetupReviewStepProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../node_modules/lucide-react/dist/esm/icons/cloud.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs"),i=require("../../../utils/utils.cjs"),a=require("../../../api/backend-registry/active-store.cjs"),o=require("../../../contexts/active-backend-context.cjs"),s=require("../sidebar/sidebar-layout.cjs");let c=require("react/jsx-runtime");function l(){let{t:l}=e.useTranslation(`openhands`),{active:u}=o.useActiveBackendContext(),{backend:d}=u;return a.isNoBackend(d)||d.kind!==`cloud`?null:(0,c.jsxs)(`a`,{"data-testid":`settings-cloud-link`,href:`${d.host.replace(/\/+$/,``)}/settings`,target:`_blank`,rel:`noopener noreferrer`,className:i.cn(s.sidebarNavRowClassName({collapsed:!1}),s.SIDEBAR_ROW_INTERACTIVE_CLASS.idle),children:[(0,c.jsx)(`span`,{className:s.SIDEBAR_ICON_SLOT_CLASS,children:(0,c.jsx)(n.Cloud,{className:`size-4 shrink-0`,"aria-hidden":!0})}),(0,c.jsx)(`span`,{className:i.cn(s.sidebarNavLabelClassName(!1),`flex-1`),children:l(t.I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}),(0,c.jsx)(r.ExternalLink,{className:`size-4 shrink-0 text-[var(--oh-muted)]`,"aria-hidden":!0})]})}exports.CloudSettingsLink=l;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../node_modules/lucide-react/dist/esm/icons/cloud.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/external-link.cjs"),i=require("../../../utils/utils.cjs"),a=require("../../../api/backend-registry/active-store.cjs"),o=require("../../../contexts/active-backend-context.cjs"),s=require("../sidebar/sidebar-layout.cjs");let c=require("react/jsx-runtime");function l(){let{t:l}=e.useTranslation(`openhands`),{active:u}=o.useActiveBackendContext(),{backend:d,orgId:f}=u;if(a.isNoBackend(d)||d.kind!==`cloud`)return null;let p=f?`?org=${encodeURIComponent(f)}`:``;return(0,c.jsxs)(`a`,{"data-testid":`settings-cloud-link`,href:`${d.host.replace(/\/+$/,``)}/settings${p}`,target:`_blank`,rel:`noopener noreferrer`,className:i.cn(s.sidebarNavRowClassName({collapsed:!1}),s.SIDEBAR_ROW_INTERACTIVE_CLASS.idle),children:[(0,c.jsx)(`span`,{className:s.SIDEBAR_ICON_SLOT_CLASS,children:(0,c.jsx)(n.Cloud,{className:`size-4 shrink-0`,"aria-hidden":!0})}),(0,c.jsx)(`span`,{className:i.cn(s.sidebarNavLabelClassName(!1),`flex-1`),children:l(t.I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}),(0,c.jsx)(r.ExternalLink,{className:`size-4 shrink-0 text-[var(--oh-muted)]`,"aria-hidden":!0})]})}exports.CloudSettingsLink=l;
2
2
  //# sourceMappingURL=cloud-settings-link.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-settings-link.cjs","names":[],"sources":["../../../../src/components/features/settings/cloud-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { Cloud, ExternalLink } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted settings page.\n */\nexport function CloudSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n const cloudSettingsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings`;\n\n return (\n <a\n data-testid=\"settings-cloud-link\"\n href={cloudSettingsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Cloud className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":"ojBAiBA,SAAgB,GAAoB,CAClC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAE,UAAW,EAAA,wBAAwB,EACrC,CAAE,WAAY,EAMpB,OAJI,EAAA,YAAY,CAAO,GAAK,EAAQ,OAAS,QAAgB,MAK3D,EAAA,EAAA,MAAC,IAAD,CACE,cAAY,sBACZ,KAAM,GALkB,EAAQ,KAAK,QAAQ,OAAQ,EAAE,EAAE,WAMzD,OAAO,SACP,IAAI,sBACJ,UAAW,EAAA,GACT,EAAA,uBAAuB,CAAE,UAAW,EAAM,CAAC,EAC3C,EAAA,8BAA8B,IAChC,WARF,EAUE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,kCACf,EAAA,EAAA,KAAC,EAAA,MAAD,CAAO,UAAU,kBAAkB,cAAA,EAAa,CAAA,CAC5C,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,yBAAyB,EAAK,EAAG,QAAQ,WAC1D,EAAE,EAAA,QAAQ,4BAA4B,CACnC,CAAA,GACN,EAAA,EAAA,KAAC,EAAA,aAAD,CACE,UAAU,yCACV,cAAA,EACD,CAAA,CACA,GAEP"}
1
+ {"version":3,"file":"cloud-settings-link.cjs","names":[],"sources":["../../../../src/components/features/settings/cloud-settings-link.tsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\nimport { Cloud, ExternalLink } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { cn } from \"#/utils/utils\";\nimport {\n SIDEBAR_ICON_SLOT_CLASS,\n SIDEBAR_ROW_INTERACTIVE_CLASS,\n sidebarNavLabelClassName,\n sidebarNavRowClassName,\n} from \"#/components/features/sidebar/sidebar-layout\";\n\n/**\n * Renders only for cloud backends — local backends have no equivalent\n * hosted settings page.\n */\nexport function CloudSettingsLink() {\n const { t } = useTranslation(\"openhands\");\n const { active } = useActiveBackendContext();\n const { backend, orgId } = active;\n\n if (isNoBackend(backend) || backend.kind !== \"cloud\") return null;\n\n // `org` is consumed by the cloud settings loader so the page opens on the\n // org that is active here instead of the cloud's last-used org.\n const orgQuery = orgId ? `?org=${encodeURIComponent(orgId)}` : \"\";\n const cloudSettingsUrl = `${backend.host.replace(/\\/+$/, \"\")}/settings${orgQuery}`;\n\n return (\n <a\n data-testid=\"settings-cloud-link\"\n href={cloudSettingsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n sidebarNavRowClassName({ collapsed: false }),\n SIDEBAR_ROW_INTERACTIVE_CLASS.idle,\n )}\n >\n <span className={SIDEBAR_ICON_SLOT_CLASS}>\n <Cloud className=\"size-4 shrink-0\" aria-hidden />\n </span>\n <span className={cn(sidebarNavLabelClassName(false), \"flex-1\")}>\n {t(I18nKey.SETTINGS$CLOUD_SETTINGS_LINK)}\n </span>\n <ExternalLink\n className=\"size-4 shrink-0 text-[var(--oh-muted)]\"\n aria-hidden\n />\n </a>\n );\n}\n"],"mappings":"ojBAiBA,SAAgB,GAAoB,CAClC,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAClC,CAAE,UAAW,EAAA,wBAAwB,EACrC,CAAE,UAAS,SAAU,EAE3B,GAAI,EAAA,YAAY,CAAO,GAAK,EAAQ,OAAS,QAAS,OAAO,KAI7D,IAAM,EAAW,EAAQ,QAAQ,mBAAmB,CAAK,IAAM,GAG/D,OACE,EAAA,EAAA,MAAC,IAAD,CACE,cAAY,sBACZ,KAAM,GALkB,EAAQ,KAAK,QAAQ,OAAQ,EAAE,EAAE,WAAW,IAMpE,OAAO,SACP,IAAI,sBACJ,UAAW,EAAA,GACT,EAAA,uBAAuB,CAAE,UAAW,EAAM,CAAC,EAC3C,EAAA,8BAA8B,IAChC,WARF,EAUE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,kCACf,EAAA,EAAA,KAAC,EAAA,MAAD,CAAO,UAAU,kBAAkB,cAAA,EAAa,CAAA,CAC5C,CAAA,GACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,yBAAyB,EAAK,EAAG,QAAQ,WAC1D,EAAE,EAAA,QAAQ,4BAA4B,CACnC,CAAA,GACN,EAAA,EAAA,KAAC,EAAA,aAAD,CACE,UAAU,yCACV,cAAA,EACD,CAAA,CACA,GAEP"}