@openhands/agent-canvas 1.18.0 → 1.20.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 (420) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/acp-providers-DOKcGeaV.js +1 -0
  4. package/build/assets/active-backend-context-BETEdaJl.js +2 -0
  5. package/build/assets/{agent-context-settings-D3peZkjX.js → agent-context-settings-Dir0loAn.js} +1 -1
  6. package/build/assets/{agent-profiles-service.api-DkeZaqIl.js → agent-profiles-service.api-CiMVQAIT.js} +1 -1
  7. package/build/assets/{agent-profiles-settings-7yMWYjGF.js → agent-profiles-settings-CT5owzRT.js} +1 -1
  8. package/build/assets/agent-server-conversation-service.api-BtOlitCD.js +88 -0
  9. package/build/assets/agent-settings-BnzyTgCb.js +2 -0
  10. package/build/assets/agent-settings-CeXj3xK-.js +1 -0
  11. package/build/assets/{alert-banner-eYyqvHL3.js → alert-banner-Ccx1Du6n.js} +1 -1
  12. package/build/assets/{api-key-entry-screen-CCBvBD8u.js → api-key-entry-screen-DXIuzBjY.js} +1 -1
  13. package/build/assets/{app-settings-BtYDs-Be.js → app-settings-DkIJVTKL.js} +1 -1
  14. package/build/assets/automation-detail-CF2SweVs.js +3 -0
  15. package/build/assets/automation-disabled-reason-QFtMrdOr.js +1 -0
  16. package/build/assets/{automation-export-BJsfi7n2.js → automation-export-CkvehhPF.js} +1 -1
  17. package/build/assets/{automation-git-sync-B7o_Nbl-.js → automation-git-sync-di4tBAyZ.js} +1 -1
  18. package/build/assets/automation-setup-route-FERj7WEe.js +3 -0
  19. package/build/assets/{automation-templates-Bb98r-kx.js → automation-templates-DlaCRvD-.js} +1 -1
  20. package/build/assets/automations-list-yK7ETmYP.js +1 -0
  21. package/build/assets/{back-nav-button-B2yBiVMB.js → back-nav-button-oDvIxpQ5.js} +1 -1
  22. package/build/assets/backend-form-modal-DzYf_arO.js +1 -0
  23. package/build/assets/{backend-synced-settings-badge-DLEp6cq7.js → backend-synced-settings-badge-DXDDHWX4.js} +1 -1
  24. package/build/assets/{badge-ehL-kgeO.js → badge-CDHZEVeN.js} +1 -1
  25. package/build/assets/{base-modal-C1a0TsSx.js → base-modal-CZq4kB_H.js} +1 -1
  26. package/build/assets/{brand-button-CUMfjb99.js → brand-button-CGUwj6zK.js} +1 -1
  27. package/build/assets/{browser-SE24Tk8g.js → browser-kY6jN61T.js} +2 -2
  28. package/build/assets/{browser-tab-HjJxHA0V.js → browser-tab-DFyZXsnB.js} +1 -1
  29. package/build/assets/{canvas-extension-page-BsUGBb1T.js → canvas-extension-page-DsGq1DtT.js} +1 -1
  30. package/build/assets/{canvas-extensions-C9Tm6s_E.js → canvas-extensions-Cb2Z0Hdc.js} +1 -1
  31. package/build/assets/{canvas-extensions-runtime-B8kxM4rO.js → canvas-extensions-runtime-DS6eT4nK.js} +1 -1
  32. package/build/assets/{chat-send-button-CGvc2wpE.js → chat-send-button-B6aVaD9V.js} +1 -1
  33. package/build/assets/{circle-plus-check-toggle-BDX_ctNs.js → circle-plus-check-toggle-ZOXpJ3I2.js} +1 -1
  34. package/build/assets/{cloud-funnel-analytics-D5uJ_4JE.js → cloud-funnel-analytics-BH_zxjiO.js} +1 -1
  35. package/build/assets/{cog-CAEugqtV.js → cog-DVZT1f0s.js} +1 -1
  36. package/build/assets/{command-menu-CQxs4mtX.js → command-menu-ImeHQ6c2.js} +1 -1
  37. package/build/assets/{commits-tab-D0xgjipP.js → commits-tab-B5SUF66c.js} +1 -1
  38. package/build/assets/{condenser-settings-D63NJRBT.js → condenser-settings-BlGOXEXM.js} +1 -1
  39. package/build/assets/{confirmation-modal-78sd9Vny.js → confirmation-modal-oN1EId79.js} +1 -1
  40. package/build/assets/{context-menu-list-item-Cm7-7Y-7.js → context-menu-list-item-DIm5xQg6.js} +1 -1
  41. package/build/assets/{conversation-B_nweu5p.js → conversation-9a53tdbO.js} +4 -4
  42. package/build/assets/conversation-XRsI28ZM.js +1 -0
  43. package/build/assets/conversation-panel-XRsI28ZM.js +1 -0
  44. package/build/assets/{conversation-state-store-9D_3P7q4.js → conversation-state-store-Br-eE-gg.js} +1 -1
  45. package/build/assets/{conversation-tab-empty-state-B3dpJXX0.js → conversation-tab-empty-state-BT1GrnKP.js} +1 -1
  46. package/build/assets/{copy-to-clipboard-button-B1ljgNxO.js → copy-to-clipboard-button-CvTHqY13.js} +1 -1
  47. package/build/assets/{device-verify-D5QRIS_x.js → device-verify-DX0xdNjo.js} +1 -1
  48. package/build/assets/{dropdown-classes-BGvOvW2_.js → dropdown-classes-DyyMaaXl.js} +1 -1
  49. package/build/assets/edit-automation-modal-bfD-5NIc.js +1 -0
  50. package/build/assets/empty-state-B5advKVW.js +1 -0
  51. package/build/assets/{entry.client-BMafTpjO.js → entry.client-D_2gnSyB.js} +2 -2
  52. package/build/assets/{enum-filter-dropdown-UNaom12H.js → enum-filter-dropdown-VAJp5mqh.js} +1 -1
  53. package/build/assets/{environment-switch-overlay-COibRUA-.js → environment-switch-overlay-C7x_yhEs.js} +1 -1
  54. package/build/assets/{error-state-Cf8LRuuY.js → error-state-BgYl7YeB.js} +1 -1
  55. package/build/assets/{extensions-hub-C_6ahIua.js → extensions-hub-DjhOed1I.js} +1 -1
  56. package/build/assets/{extensions-navigation-C5GfpzFe.js → extensions-navigation-Di-J2KUR.js} +1 -1
  57. package/build/assets/{files-tab-D5PPIWI1.js → files-tab-BNDp3e_x.js} +1 -1
  58. package/build/assets/{form-control-classes-Dbq-7YP_.js → form-control-classes-BVI_szaj.js} +1 -1
  59. package/build/assets/{get-git-path-jU2zjqIB.js → get-git-path-DOe6PM_a.js} +1 -1
  60. package/build/assets/git-repo-dropdown-1fZGYtYm.js +1 -0
  61. package/build/assets/{git-repo-dropdown-uxlFw2gn.js → git-repo-dropdown-DNlinQ7r.js} +1 -1
  62. package/build/assets/{highlighted-source-view-C7pAXrT0.js → highlighted-source-view-DPerL6tF.js} +1 -1
  63. package/build/assets/home-4lyLzYjG.js +1 -0
  64. package/build/assets/home-BGaB0EeK.js +1 -0
  65. package/build/assets/home-automation-run-tooltip-v5n7zXR0.js +1 -0
  66. package/build/assets/{home-store-DCbei3DX.js → home-store-roz1x6D5.js} +1 -1
  67. package/build/assets/{hooks-service-Dnmhqc0Z.js → hooks-service-tzRqtAlm.js} +1 -1
  68. package/build/assets/index-home-6Y_Y7kOo.js +1 -0
  69. package/build/assets/{install-server-modal-B81I-5OE.js → install-server-modal-DkMCfj0J.js} +1 -1
  70. package/build/assets/{key-O84CMFHb.js → key-DpfBWQbk.js} +1 -1
  71. package/build/assets/{launch-ZLxI4opd.js → launch-TrnYlJe6.js} +1 -1
  72. package/build/assets/link-external-B4gx3EeM.js +1 -0
  73. package/build/assets/llm-not-configured-banner-BdjItKQR.js +27 -0
  74. package/build/assets/{llm-settings-CODhjQzy.js → llm-settings-CUgt39uu.js} +1 -1
  75. package/build/assets/llm-settings-DEfw-fUJ.js +1 -0
  76. package/build/assets/{llm-subscription-service-CgIDc38n.js → llm-subscription-service-LGYVzyAc.js} +1 -1
  77. package/build/assets/{loading-spinner-BeLV0IXf.js → loading-spinner-BJc2J0Dw.js} +1 -1
  78. package/build/assets/{manage-backends-modal-cMXqCb-B.js → manage-backends-modal-CIjk0B2H.js} +1 -1
  79. package/build/assets/manifest-23d79467.js +1 -0
  80. package/build/assets/{manifest-subpage-layout-CVZgVKoY.js → manifest-subpage-layout-DGYRoP_8.js} +1 -1
  81. package/build/assets/{markdown-renderer-DyFl9-mL.js → markdown-renderer-DRpwRlNm.js} +1 -1
  82. package/build/assets/mcp-CoUOIGBF.js +1 -0
  83. package/build/assets/mcp-installed-servers-BW51n6PC.js +1 -0
  84. package/build/assets/mcp-marketplace-utils-BwEnDYqm.js +1 -0
  85. package/build/assets/mcp-page-hZ4aJjj_.js +9 -0
  86. package/build/assets/{messages-Bk1xhbU2.js → messages-WUb9Yh-p.js} +4 -4
  87. package/build/assets/{modal-body-C24WsdFb.js → modal-body-B_95ci1c.js} +1 -1
  88. package/build/assets/{modal-classes-B0b9eiL8.js → modal-classes-BPcBCWVj.js} +1 -1
  89. package/build/assets/{modal-close-button-DfqfB2Nj.js → modal-close-button-Cq3dma5u.js} +1 -1
  90. package/build/assets/onboarding-Cc4Av7bi.js +1 -0
  91. package/build/assets/{onboarding-modal-BT3Gx_sZ.js → onboarding-modal-DCFD4Dsa.js} +1 -1
  92. package/build/assets/{organization-service.api-B5CvmnYQ.js → organization-service.api-zhHpQU0t.js} +1 -1
  93. package/build/assets/parse-git-remote-url-BG8pcKL8.js +1 -0
  94. package/build/assets/{planner-tab-CstoOlAB.js → planner-tab-yISBVUKu.js} +1 -1
  95. package/build/assets/{plugins-management-service-5rqVPEGN.js → plugins-management-service-2oP6_tWr.js} +1 -1
  96. package/build/assets/{profiles-service.api-D1XKMgr0.js → profiles-service.api-B5thiTI3.js} +1 -1
  97. package/build/assets/{providers-XmZ9HM4Q.js → providers-Co9PsD0s.js} +1 -1
  98. package/build/assets/{proxy-XP6U1Dhv.js → proxy-BCCQUna8.js} +1 -1
  99. package/build/assets/recommended-automations-launcher-D1Do753p.js +1 -0
  100. package/build/assets/root-D1y82Lhg.js +2 -0
  101. package/build/assets/{root-layout-DUquNZTU.js → root-layout-cQTYEG2w.js} +2 -2
  102. package/build/assets/root-sEWn3ha1.css +1 -0
  103. package/build/assets/{schema-field-Y3F8JvXd.js → schema-field-DSi0d7a8.js} +1 -1
  104. package/build/assets/{sdk-section-page-CNZTLwH9.js → sdk-section-page-DCoI2dtd.js} +1 -1
  105. package/build/assets/{secret-form-9-BoGA40.js → secret-form-BDvzojzN.js} +1 -1
  106. package/build/assets/{secrets-service-BOIsfD9j.js → secrets-service-C3CNNEpY.js} +1 -1
  107. package/build/assets/{secrets-settings-CBJgFr42.js → secrets-settings-BKqfYQt5.js} +1 -1
  108. package/build/assets/{settings-D4hdToD4.js → settings-C8ZLONyx.js} +1 -1
  109. package/build/assets/{settings-dropdown-input-DBvsZ7-Q.js → settings-dropdown-input-Df_HXRk4.js} +1 -1
  110. package/build/assets/{settings-index-DeQphyBK.js → settings-index-BWvlGHg3.js} +1 -1
  111. package/build/assets/{settings-input-dVuzapBA.js → settings-input-B3i5U9GL.js} +1 -1
  112. package/build/assets/{settings-list-classes-DhAPuXm6.js → settings-list-classes-DbqcSiVW.js} +1 -1
  113. package/build/assets/{settings-modal-tHiJ8iYV.js → settings-modal-DHKJSBPL.js} +1 -1
  114. package/build/assets/{settings-nav-GAQjW1a-.js → settings-nav-BThjwLWD.js} +1 -1
  115. package/build/assets/{settings-service.api-C1vZH9Vh.js → settings-service.api-CYBTLGOd.js} +1 -1
  116. package/build/assets/{settings-switch-DDd1cQ8t.js → settings-switch-CI93Iozg.js} +1 -1
  117. package/build/assets/{shared-conversation-Cyg7m7ns.js → shared-conversation-C7OILS-U.js} +1 -1
  118. package/build/assets/{sidebar-layout-DH0E-5KW.js → sidebar-layout-Csb6Geq0.js} +1 -1
  119. package/build/assets/{sidebar-mobile-menu-toggle-CQ4iky__.js → sidebar-mobile-menu-toggle-B2xwXm4s.js} +1 -1
  120. package/build/assets/{sidebar-nav-link-oLQiKUBu.js → sidebar-nav-link-Xv7QEMVS.js} +1 -1
  121. package/build/assets/{sidebar-onboarding-checklist-storage-TfvNNnnr.js → sidebar-onboarding-checklist-storage-_zxMqHS0.js} +1 -1
  122. package/build/assets/{skill-card-pill-row-DfjIfj0K.js → skill-card-pill-row-CxOFySng.js} +1 -1
  123. package/build/assets/{skill-enablement-DXeaImBz.js → skill-enablement-BBKya60C.js} +1 -1
  124. package/build/assets/{skill-filter-DsNLmn76.js → skill-filter-BvtbD--b.js} +1 -1
  125. package/build/assets/{skill-icon-badge-0MK_68Nc.js → skill-icon-badge-CVxE42yg.js} +1 -1
  126. package/build/assets/{skill-scope-BE-H9TSZ.js → skill-scope-C0NxJnpT.js} +1 -1
  127. package/build/assets/{skills-plugins-vzSdxSk_.js → skills-plugins-BGjX4jve.js} +1 -1
  128. package/build/assets/{skills-settings-BiPOH9H9.js → skills-settings-d3ZwIjSP.js} +1 -1
  129. package/build/assets/{styled-tooltip-CejG0rqv.js → styled-tooltip-CknPQH4Y.js} +1 -1
  130. package/build/assets/{task-list-tab-OkZSqnTp.js → task-list-tab-CQisRcPh.js} +1 -1
  131. package/build/assets/{terminal-Dph60VFZ.js → terminal-Bs50gJPC.js} +1 -1
  132. package/build/assets/{toggle-switch-B2uXaAUS.js → toggle-switch-D3TBxlsc.js} +1 -1
  133. package/build/assets/trash-D1QMHInX.js +1 -0
  134. package/build/assets/{typography-DgcLGdHk.js → typography-BdAApXGl.js} +1 -1
  135. package/build/assets/{usage-tab-MCmNRAnR.js → usage-tab-ClVHAFJy.js} +1 -1
  136. package/build/assets/{use-acp-credential-form-ychoGqjC.js → use-acp-credential-form-GfqcTJl5.js} +1 -1
  137. package/build/assets/{use-activate-agent-profile-8L8Xdghy.js → use-activate-agent-profile-DO6SNPkK.js} +1 -1
  138. package/build/assets/{use-agent-profiles-Bi8hSkze.js → use-agent-profiles-YsBlt3tT.js} +1 -1
  139. package/build/assets/{use-automation-health-U99vvHxx.js → use-automation-health-CbQ9n-k7.js} +1 -1
  140. package/build/assets/{use-automation-permissions-Buus0R6h.js → use-automation-permissions-gFy-2VD0.js} +1 -1
  141. package/build/assets/{use-automations-Bq5hVuv0.js → use-automations-7_XBXHQK.js} +1 -1
  142. package/build/assets/{use-can-manage-org-profiles-MzIeEV8F.js → use-can-manage-org-profiles-Dt4YkPO7.js} +1 -1
  143. package/build/assets/{use-canvas-extensions-Ca9KoVEm.js → use-canvas-extensions-BhYQrtMK.js} +1 -1
  144. package/build/assets/{use-cloud-current-user-id-B4ZLUZSa.js → use-cloud-current-user-id-Dqw6qQUg.js} +1 -1
  145. package/build/assets/{use-config-l5tkDHyD.js → use-config-BJ_FJCjV.js} +1 -1
  146. package/build/assets/use-create-conversation-D15Px574.js +1 -0
  147. package/build/assets/use-create-secret-D_qPU88t.js +1 -0
  148. package/build/assets/{use-free-models-gCsJ5BV0.js → use-free-models-FAk2nngq.js} +1 -1
  149. package/build/assets/{use-get-secrets-CMTuWEp_.js → use-get-secrets-Pbo9jh2A.js} +1 -1
  150. package/build/assets/{use-llm-configured-Dl4zg8ht.js → use-llm-configured-DF9BYmIe.js} +1 -1
  151. package/build/assets/{use-llm-profiles-SWsuFmFu.js → use-llm-profiles-U4u1gzuk.js} +1 -1
  152. package/build/assets/use-manifest-capabilities-D81_YdAF.js +1 -0
  153. package/build/assets/{use-onboarding-completion-Xl63ZvzQ.js → use-onboarding-completion-C4W-m2Jk.js} +1 -1
  154. package/build/assets/{use-pinned-home-route-BXDIUaxQ.js → use-pinned-home-route-DByWTojw.js} +1 -1
  155. package/build/assets/{use-plugins-marketplace-BIIaPiaB.js → use-plugins-marketplace-CTRoukH0.js} +1 -1
  156. package/build/assets/{use-save-agent-profile-D-ZHHE94.js → use-save-agent-profile-xpHBxMZM.js} +1 -1
  157. package/build/assets/{use-save-settings-Dapkf4cC.js → use-save-settings-CmX41wlf.js} +1 -1
  158. package/build/assets/{use-settings-C2KKQKVC.js → use-settings-D69cw06D.js} +1 -1
  159. package/build/assets/{use-settings-nav-items-TOc0Rsfd.js → use-settings-nav-items-CVz0SnDr.js} +1 -1
  160. package/build/assets/use-tracking-BAFpgpgq.js +3 -0
  161. package/build/assets/{use-user-conversation-5UFqMoO4.js → use-user-conversation-BBDXUbOc.js} +1 -1
  162. package/build/assets/utils-CbjwNcR-.js +1 -0
  163. package/build/assets/{vendor~browser-hbU4u2Ag.js → vendor~browser-BZ-zIfb6.js} +1 -1
  164. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-DvZtOcoT.js +2 -0
  165. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js → vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-BIjRfQ4u.js} +1 -1
  166. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-BBfdJIV9.js +48 -0
  167. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-fgzdgvrL.js} +3579 -165
  168. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BqdU447s.js} +794 -227
  169. package/build/assets/{verification-settings-DdBpaVPz.js → verification-settings-BXspn27q.js} +1 -1
  170. package/build/index.html +4 -4
  171. package/build/locales/ar/openhands.json +18 -1
  172. package/build/locales/ca/openhands.json +18 -1
  173. package/build/locales/de/openhands.json +18 -1
  174. package/build/locales/en/openhands.json +18 -1
  175. package/build/locales/es/openhands.json +18 -1
  176. package/build/locales/fr/openhands.json +18 -1
  177. package/build/locales/it/openhands.json +18 -1
  178. package/build/locales/ja/openhands.json +18 -1
  179. package/build/locales/ko-KR/openhands.json +18 -1
  180. package/build/locales/no/openhands.json +18 -1
  181. package/build/locales/pt/openhands.json +18 -1
  182. package/build/locales/tr/openhands.json +18 -1
  183. package/build/locales/uk/openhands.json +18 -1
  184. package/build/locales/zh-CN/openhands.json +18 -1
  185. package/build/locales/zh-TW/openhands.json +18 -1
  186. package/config/defaults.json +3 -3
  187. package/dist/api/agent-profiles-service/profile-field-support.d.ts +2 -0
  188. package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.cjs +3 -3
  189. package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.cjs.map +1 -1
  190. package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.js +12 -16
  191. package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.js.map +1 -1
  192. package/dist/components/features/automations/agent-profile-selector.d.ts +7 -0
  193. package/dist/components/features/automations/detail/disabled-reason-banner.d.ts +16 -0
  194. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  195. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  196. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +38 -29
  197. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  198. package/dist/components/features/settings/agent-profiles/profile-scope-list.d.ts +20 -0
  199. package/dist/config/defaults.cjs +1 -1
  200. package/dist/config/defaults.cjs.map +1 -1
  201. package/dist/config/defaults.js +3 -3
  202. package/dist/config/defaults.js.map +1 -1
  203. package/dist/constants/acp-providers.cjs +1 -1
  204. package/dist/constants/acp-providers.cjs.map +1 -1
  205. package/dist/constants/acp-providers.d.ts +0 -5
  206. package/dist/constants/acp-providers.js +20 -16
  207. package/dist/constants/acp-providers.js.map +1 -1
  208. package/dist/constants/profile-scope.d.ts +21 -0
  209. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  210. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  211. package/dist/hooks/mutation/use-create-conversation.js +30 -19
  212. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  213. package/dist/hooks/mutation/use-switch-acp-model.cjs +1 -1
  214. package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
  215. package/dist/hooks/mutation/use-switch-acp-model.js +11 -12
  216. package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
  217. package/dist/hooks/query/query-keys.cjs +1 -1
  218. package/dist/hooks/query/query-keys.cjs.map +1 -1
  219. package/dist/hooks/query/query-keys.d.ts +1 -0
  220. package/dist/hooks/query/query-keys.js +10 -1
  221. package/dist/hooks/query/query-keys.js.map +1 -1
  222. package/dist/hooks/query/use-active-acp-profile-detail.cjs +1 -1
  223. package/dist/hooks/query/use-active-acp-profile-detail.cjs.map +1 -1
  224. package/dist/hooks/query/use-active-acp-profile-detail.d.ts +0 -9
  225. package/dist/hooks/query/use-active-acp-profile-detail.js +4 -13
  226. package/dist/hooks/query/use-active-acp-profile-detail.js.map +1 -1
  227. package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
  228. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
  229. package/dist/hooks/query/use-automation-sdk-version.js +3 -1
  230. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
  231. package/dist/hooks/use-drag-resize.cjs +1 -1
  232. package/dist/hooks/use-drag-resize.cjs.map +1 -1
  233. package/dist/hooks/use-drag-resize.js +8 -9
  234. package/dist/hooks/use-drag-resize.js.map +1 -1
  235. package/dist/i18n/declaration.cjs +1 -1
  236. package/dist/i18n/declaration.cjs.map +1 -1
  237. package/dist/i18n/declaration.d.ts +18 -1
  238. package/dist/i18n/declaration.js +1 -1
  239. package/dist/i18n/declaration.js.map +1 -1
  240. package/dist/i18n/translation.cjs +3 -3
  241. package/dist/i18n/translation.cjs.map +1 -1
  242. package/dist/i18n/translation.js +289 -0
  243. package/dist/i18n/translation.js.map +1 -1
  244. package/dist/locales/ar/openhands.json +18 -1
  245. package/dist/locales/ca/openhands.json +18 -1
  246. package/dist/locales/de/openhands.json +18 -1
  247. package/dist/locales/en/openhands.json +18 -1
  248. package/dist/locales/es/openhands.json +18 -1
  249. package/dist/locales/fr/openhands.json +18 -1
  250. package/dist/locales/it/openhands.json +18 -1
  251. package/dist/locales/ja/openhands.json +18 -1
  252. package/dist/locales/ko-KR/openhands.json +18 -1
  253. package/dist/locales/no/openhands.json +18 -1
  254. package/dist/locales/pt/openhands.json +18 -1
  255. package/dist/locales/tr/openhands.json +18 -1
  256. package/dist/locales/uk/openhands.json +18 -1
  257. package/dist/locales/zh-CN/openhands.json +18 -1
  258. package/dist/locales/zh-TW/openhands.json +18 -1
  259. package/dist/manifests/automation-setup.cjs.map +1 -1
  260. package/dist/manifests/automation-setup.js.map +1 -1
  261. package/dist/manifests/manifest-local-validation.cjs.map +1 -1
  262. package/dist/manifests/manifest-local-validation.js.map +1 -1
  263. package/dist/manifests/manifest-validation.cjs +1 -1
  264. package/dist/manifests/manifest-validation.cjs.map +1 -1
  265. package/dist/manifests/manifest-validation.js +2 -2
  266. package/dist/manifests/manifest-validation.js.map +1 -1
  267. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +3670 -247
  268. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -1
  269. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +26 -3
  270. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -1
  271. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +1 -1
  272. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -1
  273. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +4 -1
  274. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -1
  275. package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.cjs +2 -0
  276. package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.cjs.map +1 -0
  277. package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.js +79 -0
  278. package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.js.map +1 -0
  279. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -11
  280. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
  281. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +25 -11
  282. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
  283. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.cjs +2 -0
  284. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.cjs.map +1 -0
  285. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.js +72 -0
  286. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.js.map +1 -0
  287. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -10
  288. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  289. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +24 -11
  290. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  291. package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.cjs +12 -0
  292. package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.cjs.map +1 -0
  293. package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.js +115 -0
  294. package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.js.map +1 -0
  295. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  296. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  297. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +20 -14
  298. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  299. package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.cjs +2 -0
  300. package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.cjs.map +1 -0
  301. package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.js +73 -0
  302. package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.js.map +1 -0
  303. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  304. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  305. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +9 -7
  306. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  307. package/dist/node_modules/@openhands/extensions/skills/index.cjs +794 -227
  308. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  309. package/dist/node_modules/@openhands/extensions/skills/index.js +46 -6
  310. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  311. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs +1 -1
  312. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs.map +1 -1
  313. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js +15 -8
  314. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js.map +1 -1
  315. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs +1 -1
  316. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs.map +1 -1
  317. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js +11 -13
  318. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js.map +1 -1
  319. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs +1 -1
  320. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs.map +1 -1
  321. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js +6 -0
  322. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js.map +1 -1
  323. package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.cjs +1 -1
  324. package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.cjs.map +1 -1
  325. package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.js +9 -12
  326. package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.js.map +1 -1
  327. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
  328. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
  329. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +9 -10
  330. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
  331. package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.cjs +2 -0
  332. package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.cjs.map +1 -0
  333. package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.js +41 -0
  334. package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.js.map +1 -0
  335. package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs +1 -1
  336. package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs.map +1 -1
  337. package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js +2 -2
  338. package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js.map +1 -1
  339. package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs +1 -1
  340. package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs.map +1 -1
  341. package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.js +3 -6
  342. package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.js.map +1 -1
  343. package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
  344. package/dist/node_modules/@openhands/typescript-client/dist/clients.js +1 -2
  345. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.cjs +1 -1
  346. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.js +0 -1
  347. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  348. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  349. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +199 -61
  350. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  351. package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs +1 -1
  352. package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs.map +1 -1
  353. package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js +9 -8
  354. package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js.map +1 -1
  355. package/dist/package.cjs +1 -1
  356. package/dist/package.cjs.map +1 -1
  357. package/dist/package.js +3 -3
  358. package/dist/package.js.map +1 -1
  359. package/dist/routes/agent-settings.d.ts +11 -0
  360. package/dist/types/automation.cjs.map +1 -1
  361. package/dist/types/automation.d.ts +26 -2
  362. package/dist/types/automation.js.map +1 -1
  363. package/dist/utils/automation-disabled-reason.cjs +2 -0
  364. package/dist/utils/automation-disabled-reason.cjs.map +1 -0
  365. package/dist/utils/automation-disabled-reason.d.ts +32 -0
  366. package/dist/utils/automation-disabled-reason.js +19 -0
  367. package/dist/utils/automation-disabled-reason.js.map +1 -0
  368. package/dist/utils/parse-git-remote-url.cjs +1 -1
  369. package/dist/utils/parse-git-remote-url.cjs.map +1 -1
  370. package/dist/utils/parse-git-remote-url.d.ts +5 -1
  371. package/dist/utils/parse-git-remote-url.js +20 -13
  372. package/dist/utils/parse-git-remote-url.js.map +1 -1
  373. package/package.json +3 -3
  374. package/scripts/check-sdk-version-sync.mjs +79 -8
  375. package/scripts/dev-safe.mjs +14 -1
  376. package/scripts/docker-build.mjs +3 -0
  377. package/scripts/static-server.mjs +24 -7
  378. package/build/assets/acp-providers-DcY_mKYa.js +0 -1
  379. package/build/assets/active-backend-context-BnH4-L8h.js +0 -2
  380. package/build/assets/agent-server-conversation-service.api-jiCopc2E.js +0 -88
  381. package/build/assets/agent-settings-BF8hM6wb.js +0 -2
  382. package/build/assets/agent-settings-YPutBAeR.js +0 -1
  383. package/build/assets/automation-detail-BxXhb_m2.js +0 -3
  384. package/build/assets/automation-setup-route-qaJ6lLCf.js +0 -3
  385. package/build/assets/automations-list-DEPVNud3.js +0 -1
  386. package/build/assets/backend-form-modal-DxisQV_6.js +0 -1
  387. package/build/assets/conversation-edjzrv5w.js +0 -1
  388. package/build/assets/conversation-panel-edjzrv5w.js +0 -1
  389. package/build/assets/edit-automation-modal-D_JWSmxT.js +0 -1
  390. package/build/assets/empty-state-FK_s1B60.js +0 -1
  391. package/build/assets/git-repo-dropdown-BoDDWXfX.js +0 -1
  392. package/build/assets/home-BM5_Wz_R.js +0 -1
  393. package/build/assets/home-Ivfm7KC4.js +0 -1
  394. package/build/assets/home-automation-run-tooltip-B1N2uO9p.js +0 -1
  395. package/build/assets/index-home-td9BN2T3.js +0 -1
  396. package/build/assets/kebab-menu-item-content-SCJBwZnp.js +0 -1
  397. package/build/assets/link-external-BNZzCM1I.js +0 -1
  398. package/build/assets/llm-not-configured-banner-Dh_ajcM8.js +0 -27
  399. package/build/assets/llm-settings-CZaXYgtw.js +0 -1
  400. package/build/assets/manifest-bfeccb98.js +0 -1
  401. package/build/assets/mcp-CraxoXQv.js +0 -1
  402. package/build/assets/mcp-marketplace-utils-C7PYr293.js +0 -1
  403. package/build/assets/mcp-page-CteH_K0N.js +0 -9
  404. package/build/assets/onboarding-DXFBRqEy.js +0 -1
  405. package/build/assets/parse-git-remote-url-DpDM9bK6.js +0 -1
  406. package/build/assets/recommended-automations-launcher-DEHRKIAg.js +0 -1
  407. package/build/assets/root-CM6IZHlg.css +0 -1
  408. package/build/assets/root-DdFkodKW.js +0 -2
  409. package/build/assets/trash-Ckh7yCaB.js +0 -1
  410. package/build/assets/use-create-conversation-i_PdFdIs.js +0 -1
  411. package/build/assets/use-create-secret-CjWq0J4O.js +0 -1
  412. package/build/assets/use-manifest-capabilities-CdqYfUAC.js +0 -1
  413. package/build/assets/use-tracking-j4uo9VEW.js +0 -3
  414. package/build/assets/utils-BgLSZdyy.js +0 -1
  415. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +0 -2
  416. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js +0 -48
  417. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +0 -2
  418. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +0 -1
  419. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +0 -21
  420. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  {
2
+ "AUTOMATIONS$UNAVAILABLE_AGENT_PROFILE": "Недоступний профіль ({{id}})",
2
3
  "COMMON$PATTERN": "Шаблон:",
3
4
  "COMMON$INCLUDE": "Включити:",
4
5
  "COMMON$RESULTS": "Результати ({{count}})",
@@ -321,6 +322,13 @@
321
322
  "SETTINGS$AGENT_PAGE_DESCRIPTION": "Оберіть між вбудованим агентом OpenHands і зовнішнім підпроцесом ACP (Agent Client Protocol), як-от Claude Code, Codex або Gemini CLI.",
322
323
  "SETTINGS$AGENT_TYPE_OPENHANDS": "OpenHands",
323
324
  "SETTINGS$AGENT_TYPE_ACP": "ACP (зовнішній підпроцес)",
325
+ "SETTINGS$AGENT_PROFILE_MCP": "Сервери MCP",
326
+ "SETTINGS$AGENT_PROFILE_MCP_ALL": "Усі сервери",
327
+ "SETTINGS$AGENT_PROFILE_MCP_CHOOSE": "Вибрати сервери",
328
+ "SETTINGS$AGENT_PROFILE_MCP_ALL_HINT": "Цей агент може використовувати всі налаштовані вами сервери MCP, зокрема ті, що здатні вносити зміни.",
329
+ "SETTINGS$AGENT_PROFILE_MCP_CHOOSE_HINT": "Цей агент може використовувати лише вибрані вами сервери. Усі інші сервери MCP залишаються прихованими від нього.",
330
+ "SETTINGS$AGENT_PROFILE_MCP_NONE": "Ви ще не налаштували жодного сервера MCP.",
331
+ "SETTINGS$AGENT_PROFILE_MCP_DANGLING": "{{names}} більше не налаштовано. Якщо зберегти з цим вибором, агент не запуститься — зніміть позначку або додайте сервер знову.",
324
332
  "SETTINGS$AGENT_PRESET": "Пресет",
325
333
  "SETTINGS$AGENT_PRESET_CUSTOM": "Власний",
326
334
  "SETTINGS$AGENT_COMMAND": "Команда",
@@ -840,6 +848,9 @@
840
848
  "AUTOMATIONS$DETAIL$PHASE_PREPARING": "Підготовка",
841
849
  "AUTOMATIONS$DETAIL$PHASE_RUNNING_AGENT": "Агент виконується",
842
850
  "AUTOMATIONS$DETAIL$INACTIVE": "Неактивний",
851
+ "AUTOMATIONS$DETAIL$DISABLED_MANUAL": "Вимкнено вручну",
852
+ "AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING": "Чому призупинено",
853
+ "AUTOMATIONS$DETAIL$DISABLED_AT": "Призупинено {{time}}",
843
854
  "AUTOMATIONS$DETAIL$LAST_RUN": "Останнє виконання",
844
855
  "AUTOMATIONS$DETAIL$LOAD_MORE_RUNS": "Завантажити більше",
845
856
  "AUTOMATIONS$DETAIL$EXPORT_JSON": "Експортувати JSON",
@@ -2455,5 +2466,11 @@
2455
2466
  "SETTINGS$PROVIDER_CONNECTION_UPDATED": "Підключення \"{{name}}\" оновлено",
2456
2467
  "BUTTON$VIEW_FULL_SIZE_IMAGE": "Переглянути зображення в повному розмірі",
2457
2468
  "BUTTON$REMOVE_IMAGE": "Видалити зображення",
2458
- "IMAGE$FULL_SIZE_PREVIEW": "Попередній перегляд зображення в повному розмірі"
2469
+ "IMAGE$FULL_SIZE_PREVIEW": "Попередній перегляд зображення в повному розмірі",
2470
+ "SETTINGS$AGENT_PROFILE_SECRETS": "Секрети",
2471
+ "SETTINGS$AGENT_PROFILE_SECRETS_ALL": "Без обмежень профілю",
2472
+ "SETTINGS$AGENT_PROFILE_SECRETS_CHOOSE": "Вибрати секрети",
2473
+ "SETTINGS$AGENT_PROFILE_SECRETS_ALL_HINT": "Дозволяє секрети, передані під час запуску агента. Для автоматизацій явно виберіть секрети в цьому профілі.",
2474
+ "SETTINGS$AGENT_PROFILE_SECRETS_CHOOSE_HINT": "Цей агент може використовувати лише вибрані вами секрети — переконайтеся, що він має все потрібне. Зовнішньому агенту для входу потрібні власні облікові дані провайдера.",
2475
+ "SETTINGS$AGENT_PROFILE_SECRETS_NONE": "Ви ще не зберегли жодного секрету."
2459
2476
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "AUTOMATIONS$UNAVAILABLE_AGENT_PROFILE": "不可用的配置文件 ({{id}})",
2
3
  "COMMON$PATTERN": "模式:",
3
4
  "COMMON$INCLUDE": "包含:",
4
5
  "COMMON$RESULTS": "结果 ({{count}})",
@@ -321,6 +322,13 @@
321
322
  "SETTINGS$AGENT_PAGE_DESCRIPTION": "在内置的 OpenHands 代理和外部 ACP(Agent Client Protocol)子进程(如 Claude Code、Codex 或 Gemini CLI)之间进行选择。",
322
323
  "SETTINGS$AGENT_TYPE_OPENHANDS": "OpenHands",
323
324
  "SETTINGS$AGENT_TYPE_ACP": "ACP(外部子进程)",
325
+ "SETTINGS$AGENT_PROFILE_MCP": "MCP 服务器",
326
+ "SETTINGS$AGENT_PROFILE_MCP_ALL": "全部服务器",
327
+ "SETTINGS$AGENT_PROFILE_MCP_CHOOSE": "自选服务器",
328
+ "SETTINGS$AGENT_PROFILE_MCP_ALL_HINT": "该代理可以使用你配置的所有 MCP 服务器,其中也包括能够进行修改的服务器。",
329
+ "SETTINGS$AGENT_PROFILE_MCP_CHOOSE_HINT": "该代理只能使用你选择的服务器。其他 MCP 服务器对它不可见。",
330
+ "SETTINGS$AGENT_PROFILE_MCP_NONE": "你还没有配置任何 MCP 服务器。",
331
+ "SETTINGS$AGENT_PROFILE_MCP_DANGLING": "{{names}} 已不再配置。保持选中并保存会导致该代理无法启动——请取消选择或重新添加该服务器。",
324
332
  "SETTINGS$AGENT_PRESET": "预设",
325
333
  "SETTINGS$AGENT_PRESET_CUSTOM": "自定义",
326
334
  "SETTINGS$AGENT_COMMAND": "命令",
@@ -840,6 +848,9 @@
840
848
  "AUTOMATIONS$DETAIL$PHASE_PREPARING": "正在准备",
841
849
  "AUTOMATIONS$DETAIL$PHASE_RUNNING_AGENT": "代理运行中",
842
850
  "AUTOMATIONS$DETAIL$INACTIVE": "非活动",
851
+ "AUTOMATIONS$DETAIL$DISABLED_MANUAL": "已手动关闭",
852
+ "AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING": "暂停原因",
853
+ "AUTOMATIONS$DETAIL$DISABLED_AT": "{{time}} 暂停",
843
854
  "AUTOMATIONS$DETAIL$LAST_RUN": "上次运行",
844
855
  "AUTOMATIONS$DETAIL$LOAD_MORE_RUNS": "加载更多",
845
856
  "AUTOMATIONS$DETAIL$EXPORT_JSON": "导出 JSON",
@@ -2455,5 +2466,11 @@
2455
2466
  "SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新连接“{{name}}”",
2456
2467
  "BUTTON$VIEW_FULL_SIZE_IMAGE": "查看原始尺寸图片",
2457
2468
  "BUTTON$REMOVE_IMAGE": "移除图片",
2458
- "IMAGE$FULL_SIZE_PREVIEW": "原始尺寸图片预览"
2469
+ "IMAGE$FULL_SIZE_PREVIEW": "原始尺寸图片预览",
2470
+ "SETTINGS$AGENT_PROFILE_SECRETS": "机密",
2471
+ "SETTINGS$AGENT_PROFILE_SECRETS_ALL": "不由配置文件限制",
2472
+ "SETTINGS$AGENT_PROFILE_SECRETS_CHOOSE": "自选机密",
2473
+ "SETTINGS$AGENT_PROFILE_SECRETS_ALL_HINT": "允许使用代理启动时提供的机密。用于自动化时,请在此配置文件中明确选择机密。",
2474
+ "SETTINGS$AGENT_PROFILE_SECRETS_CHOOSE_HINT": "该代理只能使用你选择的机密,请确认它需要的都已包含。外部代理需要自身的提供方凭据才能登录。",
2475
+ "SETTINGS$AGENT_PROFILE_SECRETS_NONE": "你还没有保存任何机密。"
2459
2476
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "AUTOMATIONS$UNAVAILABLE_AGENT_PROFILE": "無法使用的設定檔 ({{id}})",
2
3
  "COMMON$PATTERN": "模式:",
3
4
  "COMMON$INCLUDE": "包含:",
4
5
  "COMMON$RESULTS": "結果 ({{count}})",
@@ -321,6 +322,13 @@
321
322
  "SETTINGS$AGENT_PAGE_DESCRIPTION": "在內建的 OpenHands 代理和外部 ACP(Agent Client Protocol)子處理程序(如 Claude Code、Codex 或 Gemini CLI)之間進行選擇。",
322
323
  "SETTINGS$AGENT_TYPE_OPENHANDS": "OpenHands",
323
324
  "SETTINGS$AGENT_TYPE_ACP": "ACP(外部子處理程序)",
325
+ "SETTINGS$AGENT_PROFILE_MCP": "MCP 伺服器",
326
+ "SETTINGS$AGENT_PROFILE_MCP_ALL": "全部伺服器",
327
+ "SETTINGS$AGENT_PROFILE_MCP_CHOOSE": "自選伺服器",
328
+ "SETTINGS$AGENT_PROFILE_MCP_ALL_HINT": "該代理可以使用你設定的所有 MCP 伺服器,其中也包括能夠進行修改的伺服器。",
329
+ "SETTINGS$AGENT_PROFILE_MCP_CHOOSE_HINT": "該代理只能使用你選擇的伺服器。其他 MCP 伺服器對它不可見。",
330
+ "SETTINGS$AGENT_PROFILE_MCP_NONE": "你還沒有設定任何 MCP 伺服器。",
331
+ "SETTINGS$AGENT_PROFILE_MCP_DANGLING": "{{names}} 已不再設定。保持選取並儲存會導致該代理無法啟動——請取消選取或重新新增該伺服器。",
324
332
  "SETTINGS$AGENT_PRESET": "預設集",
325
333
  "SETTINGS$AGENT_PRESET_CUSTOM": "自訂",
326
334
  "SETTINGS$AGENT_COMMAND": "命令",
@@ -840,6 +848,9 @@
840
848
  "AUTOMATIONS$DETAIL$PHASE_PREPARING": "正在準備",
841
849
  "AUTOMATIONS$DETAIL$PHASE_RUNNING_AGENT": "代理執行中",
842
850
  "AUTOMATIONS$DETAIL$INACTIVE": "非作用中",
851
+ "AUTOMATIONS$DETAIL$DISABLED_MANUAL": "已手動關閉",
852
+ "AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING": "暫停原因",
853
+ "AUTOMATIONS$DETAIL$DISABLED_AT": "{{time}} 暫停",
843
854
  "AUTOMATIONS$DETAIL$LAST_RUN": "上次執行",
844
855
  "AUTOMATIONS$DETAIL$LOAD_MORE_RUNS": "載入更多",
845
856
  "AUTOMATIONS$DETAIL$EXPORT_JSON": "匯出 JSON",
@@ -2455,5 +2466,11 @@
2455
2466
  "SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新連線「{{name}}」",
2456
2467
  "BUTTON$VIEW_FULL_SIZE_IMAGE": "檢視原始尺寸圖片",
2457
2468
  "BUTTON$REMOVE_IMAGE": "移除圖片",
2458
- "IMAGE$FULL_SIZE_PREVIEW": "原始尺寸圖片預覽"
2469
+ "IMAGE$FULL_SIZE_PREVIEW": "原始尺寸圖片預覽",
2470
+ "SETTINGS$AGENT_PROFILE_SECRETS": "機密",
2471
+ "SETTINGS$AGENT_PROFILE_SECRETS_ALL": "不由設定檔限制",
2472
+ "SETTINGS$AGENT_PROFILE_SECRETS_CHOOSE": "自選機密",
2473
+ "SETTINGS$AGENT_PROFILE_SECRETS_ALL_HINT": "允許使用代理啟動時提供的機密。用於自動化時,請在此設定檔中明確選擇機密。",
2474
+ "SETTINGS$AGENT_PROFILE_SECRETS_CHOOSE_HINT": "該代理只能使用你選擇的機密,請確認它需要的都已包含。外部代理需要自身的供應商憑證才能登入。",
2475
+ "SETTINGS$AGENT_PROFILE_SECRETS_NONE": "你還沒有儲存任何機密。"
2459
2476
  }
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "_comment": "Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.",
3
3
  "versions": {
4
- "agentServer": "1.46.0",
5
- "agentCanvas": "1.18.0",
6
- "automation": "1.11.1"
4
+ "agentServer": "1.49.1",
5
+ "agentCanvas": "1.20.0",
6
+ "automation": "1.13.1"
7
7
  },
8
8
  "compatibility": {
9
9
  "minimumAgentServer": "1.28.0"
@@ -24,3 +24,5 @@ export declare const MIN_AGENT_SERVER_VERSION_FOR_PROFILE_SWITCH_LLM_TOOL = "1.3
24
24
  * gets past `assertAgentServerVersionIsSupported` at boot.
25
25
  */
26
26
  export declare function agentProfileSupportsSwitchLlmTool(): boolean;
27
+ /** Only offer a scope when the serving backend advertises enforcement. */
28
+ export declare function agentProfileSupportsSecretRefs(): boolean;
@@ -1,6 +1,6 @@
1
- require("../../../../_virtual/_rolldown/runtime.cjs");var e=e=>e.filter(e=>e.type===`text`).map(e=>e.text).join(``),t=e=>{let t=[],n=/<EXTRA_INFO>([\s\S]*?)<\/EXTRA_INFO>/gi,r=n.exec(e);for(;r!==null;){let i=r[1].trim();i.length>0&&t.push(i),r=n.exec(e)}return t},n=(e,t)=>{let n=`\n\n- **${e}**`;return t&&t.trim().length>0&&(n+=`\n\n${t}`),n},r=(e,t)=>{let r=`
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");function e(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(``)}var t=e=>Array.from(e.matchAll(/<EXTRA_INFO>([\s\S]*?)<\/EXTRA_INFO>/gi),e=>e[1].trim()).filter(Boolean),n=(e,t)=>{let n=`\n\n- **${e}**`;return t&&(n+=`\n\n${t}`),n},r=(e,t)=>{let r=`
2
2
 
3
- **Triggered Skill Knowledge:**`;return e.forEach((e,i)=>{let a=i<t.length?t[i]:void 0;r+=n(e,a)}),r},i=e=>{let t=`
3
+ **Triggered Skill Knowledge:**`;return e.forEach((e,i)=>{let a=t[i];r+=n(e,a)}),r},i=e=>{let t=`
4
4
 
5
- **Extended Content:**`;return e.forEach(e=>{e.trim().length>0&&(t+=`\n\n${e}`)}),t},a=n=>!n||n.length===0?[]:t(e(n)),o=(e,t)=>{let n=a(t);return e&&e.length>0?r(e,n):n.length>0?i(n):``},s=(e,t)=>{let n=a(t);return e&&e.length>0?e.map((e,t)=>({name:e,content:t<n.length?n[t].trim():``})):n.length>0?n.filter(e=>e.trim().length>0).map((e,t)=>({name:`Extended Content ${t+1}`,content:e.trim()})):[]};exports.getSkillReadyContent=o,exports.getSkillReadyItems=s;
5
+ **Extended Content:**`;return e.forEach(e=>{t+=`\n\n${e}`}),t},a=n=>n?t(e(n)):[],o=(e,t)=>{let n=a(t);return e&&e.length>0?r(e,n):n.length>0?i(n):``},s=(e,t)=>{let n=a(t);return e&&e.length>0?e.map((e,t)=>({name:e,content:n[t]??``})):n.map((e,t)=>({name:`Extended Content ${t+1}`,content:e}))};exports.getSkillReadyContent=o,exports.getSkillReadyItems=s;
6
6
  //# sourceMappingURL=get-skill-ready-content.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-skill-ready-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts"],"sourcesContent":["import { TextContent } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Represents a single activated skill with its name and associated content.\n */\nexport interface SkillReadyItem {\n name: string;\n content: string;\n}\n\n/**\n * Extracts all text content from an array of TextContent items.\n */\nconst extractAllText = (extendedContent: TextContent[]): string =>\n extendedContent\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n\n/**\n * Extracts all <EXTRA_INFO> blocks from the given text.\n * Returns an array of content strings (without the wrapper tags).\n */\nconst extractExtraInfoBlocks = (text: string): string[] => {\n const blocks: string[] = [];\n const blockRegex = /<EXTRA_INFO>([\\s\\S]*?)<\\/EXTRA_INFO>/gi;\n let match = blockRegex.exec(text);\n\n while (match !== null) {\n const blockContent = match[1].trim();\n if (blockContent.length > 0) {\n blocks.push(blockContent);\n }\n match = blockRegex.exec(text);\n }\n\n return blocks;\n};\n\n/**\n * Formats a single skill with its corresponding content block.\n */\nconst formatSkillWithContent = (\n skill: string,\n contentBlock: string | undefined,\n): string => {\n let formatted = `\\n\\n- **${skill}**`;\n\n if (contentBlock && contentBlock.trim().length > 0) {\n formatted += `\\n\\n${contentBlock}`;\n }\n\n return formatted;\n};\n\n/**\n * Formats skills paired with their corresponding extended content blocks.\n */\nconst formatSkillKnowledge = (\n activatedSkills: string[],\n extraInfoBlocks: string[],\n): string => {\n let content = `\\n\\n**Triggered Skill Knowledge:**`;\n\n activatedSkills.forEach((skill, index) => {\n const contentBlock =\n index < extraInfoBlocks.length ? extraInfoBlocks[index] : undefined;\n content += formatSkillWithContent(skill, contentBlock);\n });\n\n return content;\n};\n\n/**\n * Formats extended content blocks when no skills are present.\n */\nconst formatExtendedContentOnly = (extraInfoBlocks: string[]): string => {\n let content = `\\n\\n**Extended Content:**`;\n\n extraInfoBlocks.forEach((block) => {\n if (block.trim().length > 0) {\n content += `\\n\\n${block}`;\n }\n });\n\n return content;\n};\n\n/**\n * Extracts EXTRA_INFO blocks from extended content.\n */\nconst getExtraInfoBlocks = (extendedContent: TextContent[]): string[] => {\n if (!extendedContent || extendedContent.length === 0) return [];\n return extractExtraInfoBlocks(extractAllText(extendedContent));\n};\n\n/**\n * Formats activated skills and extended content into markdown for display.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyContent = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): string => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return formatSkillKnowledge(activatedSkills, extraInfoBlocks);\n }\n\n if (extraInfoBlocks.length > 0) {\n return formatExtendedContentOnly(extraInfoBlocks);\n }\n\n return \"\";\n};\n\n/**\n * Returns structured skill items with their names and associated content.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyItems = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): SkillReadyItem[] => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return activatedSkills.map((skill, index) => ({\n name: skill,\n content:\n index < extraInfoBlocks.length ? extraInfoBlocks[index].trim() : \"\",\n }));\n }\n\n if (extraInfoBlocks.length > 0) {\n return extraInfoBlocks\n .filter((block) => block.trim().length > 0)\n .map((block, index) => ({\n name: `Extended Content ${index + 1}`,\n content: block.trim(),\n }));\n }\n\n return [];\n};\n"],"mappings":"sDAaA,IAAM,EAAkB,GACtB,EACG,OAAQ,GAAM,EAAE,OAAS,MAAM,EAC/B,IAAK,GAAM,EAAE,IAAI,EACjB,KAAK,EAAE,EAMN,EAA0B,GAA2B,CACzD,IAAM,EAAmB,CAAC,EACpB,EAAa,yCACf,EAAQ,EAAW,KAAK,CAAI,EAEhC,KAAO,IAAU,MAAM,CACrB,IAAM,EAAe,EAAM,GAAG,KAAK,EAC/B,EAAa,OAAS,GACxB,EAAO,KAAK,CAAY,EAE1B,EAAQ,EAAW,KAAK,CAAI,CAC9B,CAEA,OAAO,CACT,EAKM,GACJ,EACA,IACW,CACX,IAAI,EAAY,WAAW,EAAM,IAMjC,OAJI,GAAgB,EAAa,KAAK,EAAE,OAAS,IAC/C,GAAa,OAAO,KAGf,CACT,EAKM,GACJ,EACA,IACW,CACX,IAAI,EAAU;;gCAQd,OANA,EAAgB,SAAS,EAAO,IAAU,CACxC,IAAM,EACJ,EAAQ,EAAgB,OAAS,EAAgB,GAAS,IAAA,GAC5D,GAAW,EAAuB,EAAO,CAAY,CACvD,CAAC,EAEM,CACT,EAKM,EAA6B,GAAsC,CACvE,IAAI,EAAU;;uBAQd,OANA,EAAgB,QAAS,GAAU,CAC7B,EAAM,KAAK,EAAE,OAAS,IACxB,GAAW,OAAO,IAEtB,CAAC,EAEM,CACT,EAKM,EAAsB,GACtB,CAAC,GAAmB,EAAgB,SAAW,EAAU,CAAC,EACvD,EAAuB,EAAe,CAAe,CAAC,EAOlD,GACX,EACA,IACW,CACX,IAAM,EAAkB,EAAmB,CAAe,EAU1D,OARI,GAAmB,EAAgB,OAAS,EACvC,EAAqB,EAAiB,CAAe,EAG1D,EAAgB,OAAS,EACpB,EAA0B,CAAe,EAG3C,EACT,EAMa,GACX,EACA,IACqB,CACrB,IAAM,EAAkB,EAAmB,CAAe,EAmB1D,OAjBI,GAAmB,EAAgB,OAAS,EACvC,EAAgB,KAAK,EAAO,KAAW,CAC5C,KAAM,EACN,QACE,EAAQ,EAAgB,OAAS,EAAgB,GAAO,KAAK,EAAI,EACrE,EAAE,EAGA,EAAgB,OAAS,EACpB,EACJ,OAAQ,GAAU,EAAM,KAAK,EAAE,OAAS,CAAC,EACzC,KAAK,EAAO,KAAW,CACtB,KAAM,oBAAoB,EAAQ,IAClC,QAAS,EAAM,KAAK,CACtB,EAAE,EAGC,CAAC,CACV"}
1
+ {"version":3,"file":"get-skill-ready-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts"],"sourcesContent":["import { TextContent } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Represents a single activated skill with its name and associated content.\n */\nexport interface SkillReadyItem {\n name: string;\n content: string;\n}\n\n/**\n * Extracts all text content from an array of TextContent items.\n */\nfunction extractAllText(extendedContent: TextContent[]): string {\n return extendedContent\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n}\n\n/**\n * Extracts all <EXTRA_INFO> blocks from the given text.\n * Returns an array of content strings (without the wrapper tags).\n */\nconst extractExtraInfoBlocks = (text: string): string[] => {\n const blockRegex = /<EXTRA_INFO>([\\s\\S]*?)<\\/EXTRA_INFO>/gi;\n return Array.from(text.matchAll(blockRegex), (match) =>\n match[1].trim(),\n ).filter(Boolean);\n};\n\n/**\n * Formats a single skill with its corresponding content block.\n */\nconst formatSkillWithContent = (\n skill: string,\n contentBlock: string | undefined,\n): string => {\n let formatted = `\\n\\n- **${skill}**`;\n\n if (contentBlock) {\n formatted += `\\n\\n${contentBlock}`;\n }\n\n return formatted;\n};\n\n/**\n * Formats skills paired with their corresponding extended content blocks.\n */\nconst formatSkillKnowledge = (\n activatedSkills: string[],\n extraInfoBlocks: string[],\n): string => {\n let content = `\\n\\n**Triggered Skill Knowledge:**`;\n\n activatedSkills.forEach((skill, index) => {\n const contentBlock = extraInfoBlocks[index];\n content += formatSkillWithContent(skill, contentBlock);\n });\n\n return content;\n};\n\n/**\n * Formats extended content blocks when no skills are present.\n */\nconst formatExtendedContentOnly = (extraInfoBlocks: string[]): string => {\n let content = `\\n\\n**Extended Content:**`;\n\n extraInfoBlocks.forEach((block) => {\n content += `\\n\\n${block}`;\n });\n\n return content;\n};\n\n/**\n * Extracts EXTRA_INFO blocks from extended content.\n */\nconst getExtraInfoBlocks = (extendedContent?: TextContent[]): string[] => {\n if (!extendedContent) return [];\n return extractExtraInfoBlocks(extractAllText(extendedContent));\n};\n\n/**\n * Formats activated skills and extended content into markdown for display.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyContent = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): string => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return formatSkillKnowledge(activatedSkills, extraInfoBlocks);\n }\n\n if (extraInfoBlocks.length > 0) {\n return formatExtendedContentOnly(extraInfoBlocks);\n }\n\n return \"\";\n};\n\n/**\n * Returns structured skill items with their names and associated content.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyItems = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): SkillReadyItem[] => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return activatedSkills.map((skill, index) => ({\n name: skill,\n content: extraInfoBlocks[index] ?? \"\",\n }));\n }\n\n return extraInfoBlocks.map((block, index) => ({\n name: `Extended Content ${index + 1}`,\n content: block,\n }));\n};\n"],"mappings":"sDAaA,SAAS,EAAe,EAAwC,CAC9D,OAAO,EACJ,OAAQ,GAAM,EAAE,OAAS,MAAM,EAC/B,IAAK,GAAM,EAAE,IAAI,EACjB,KAAK,EAAE,CACZ,CAMA,IAAM,EAA0B,GAEvB,MAAM,KAAK,EAAK,SAAS,wCAAU,EAAI,GAC5C,EAAM,GAAG,KAAK,CAChB,EAAE,OAAO,OAAO,EAMZ,GACJ,EACA,IACW,CACX,IAAI,EAAY,WAAW,EAAM,IAMjC,OAJI,IACF,GAAa,OAAO,KAGf,CACT,EAKM,GACJ,EACA,IACW,CACX,IAAI,EAAU;;gCAOd,OALA,EAAgB,SAAS,EAAO,IAAU,CACxC,IAAM,EAAe,EAAgB,GACrC,GAAW,EAAuB,EAAO,CAAY,CACvD,CAAC,EAEM,CACT,EAKM,EAA6B,GAAsC,CACvE,IAAI,EAAU;;uBAMd,OAJA,EAAgB,QAAS,GAAU,CACjC,GAAW,OAAO,GACpB,CAAC,EAEM,CACT,EAKM,EAAsB,GACrB,EACE,EAAuB,EAAe,CAAe,CAAC,EADhC,CAAC,EAQnB,GACX,EACA,IACW,CACX,IAAM,EAAkB,EAAmB,CAAe,EAU1D,OARI,GAAmB,EAAgB,OAAS,EACvC,EAAqB,EAAiB,CAAe,EAG1D,EAAgB,OAAS,EACpB,EAA0B,CAAe,EAG3C,EACT,EAMa,GACX,EACA,IACqB,CACrB,IAAM,EAAkB,EAAmB,CAAe,EAS1D,OAPI,GAAmB,EAAgB,OAAS,EACvC,EAAgB,KAAK,EAAO,KAAW,CAC5C,KAAM,EACN,QAAS,EAAgB,IAAU,EACrC,EAAE,EAGG,EAAgB,KAAK,EAAO,KAAW,CAC5C,KAAM,oBAAoB,EAAQ,IAClC,QAAS,CACX,EAAE,CACJ"}
@@ -1,37 +1,33 @@
1
1
  //#region src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts
2
- var e = (e) => e.filter((e) => e.type === "text").map((e) => e.text).join(""), t = (e) => {
3
- let t = [], n = /<EXTRA_INFO>([\s\S]*?)<\/EXTRA_INFO>/gi, r = n.exec(e);
4
- for (; r !== null;) {
5
- let i = r[1].trim();
6
- i.length > 0 && t.push(i), r = n.exec(e);
7
- }
8
- return t;
9
- }, n = (e, t) => {
2
+ function e(e) {
3
+ return e.filter((e) => e.type === "text").map((e) => e.text).join("");
4
+ }
5
+ var t = (e) => Array.from(e.matchAll(/<EXTRA_INFO>([\s\S]*?)<\/EXTRA_INFO>/gi), (e) => e[1].trim()).filter(Boolean), n = (e, t) => {
10
6
  let n = `\n\n- **${e}**`;
11
- return t && t.trim().length > 0 && (n += `\n\n${t}`), n;
7
+ return t && (n += `\n\n${t}`), n;
12
8
  }, r = (e, t) => {
13
9
  let r = "\n\n**Triggered Skill Knowledge:**";
14
10
  return e.forEach((e, i) => {
15
- let a = i < t.length ? t[i] : void 0;
11
+ let a = t[i];
16
12
  r += n(e, a);
17
13
  }), r;
18
14
  }, i = (e) => {
19
15
  let t = "\n\n**Extended Content:**";
20
16
  return e.forEach((e) => {
21
- e.trim().length > 0 && (t += `\n\n${e}`);
17
+ t += `\n\n${e}`;
22
18
  }), t;
23
- }, a = (n) => !n || n.length === 0 ? [] : t(e(n)), o = (e, t) => {
19
+ }, a = (n) => n ? t(e(n)) : [], o = (e, t) => {
24
20
  let n = a(t);
25
21
  return e && e.length > 0 ? r(e, n) : n.length > 0 ? i(n) : "";
26
22
  }, s = (e, t) => {
27
23
  let n = a(t);
28
24
  return e && e.length > 0 ? e.map((e, t) => ({
29
25
  name: e,
30
- content: t < n.length ? n[t].trim() : ""
31
- })) : n.length > 0 ? n.filter((e) => e.trim().length > 0).map((e, t) => ({
26
+ content: n[t] ?? ""
27
+ })) : n.map((e, t) => ({
32
28
  name: `Extended Content ${t + 1}`,
33
- content: e.trim()
34
- })) : [];
29
+ content: e
30
+ }));
35
31
  };
36
32
  //#endregion
37
33
  export { o as getSkillReadyContent, s as getSkillReadyItems };
@@ -1 +1 @@
1
- {"version":3,"file":"get-skill-ready-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts"],"sourcesContent":["import { TextContent } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Represents a single activated skill with its name and associated content.\n */\nexport interface SkillReadyItem {\n name: string;\n content: string;\n}\n\n/**\n * Extracts all text content from an array of TextContent items.\n */\nconst extractAllText = (extendedContent: TextContent[]): string =>\n extendedContent\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n\n/**\n * Extracts all <EXTRA_INFO> blocks from the given text.\n * Returns an array of content strings (without the wrapper tags).\n */\nconst extractExtraInfoBlocks = (text: string): string[] => {\n const blocks: string[] = [];\n const blockRegex = /<EXTRA_INFO>([\\s\\S]*?)<\\/EXTRA_INFO>/gi;\n let match = blockRegex.exec(text);\n\n while (match !== null) {\n const blockContent = match[1].trim();\n if (blockContent.length > 0) {\n blocks.push(blockContent);\n }\n match = blockRegex.exec(text);\n }\n\n return blocks;\n};\n\n/**\n * Formats a single skill with its corresponding content block.\n */\nconst formatSkillWithContent = (\n skill: string,\n contentBlock: string | undefined,\n): string => {\n let formatted = `\\n\\n- **${skill}**`;\n\n if (contentBlock && contentBlock.trim().length > 0) {\n formatted += `\\n\\n${contentBlock}`;\n }\n\n return formatted;\n};\n\n/**\n * Formats skills paired with their corresponding extended content blocks.\n */\nconst formatSkillKnowledge = (\n activatedSkills: string[],\n extraInfoBlocks: string[],\n): string => {\n let content = `\\n\\n**Triggered Skill Knowledge:**`;\n\n activatedSkills.forEach((skill, index) => {\n const contentBlock =\n index < extraInfoBlocks.length ? extraInfoBlocks[index] : undefined;\n content += formatSkillWithContent(skill, contentBlock);\n });\n\n return content;\n};\n\n/**\n * Formats extended content blocks when no skills are present.\n */\nconst formatExtendedContentOnly = (extraInfoBlocks: string[]): string => {\n let content = `\\n\\n**Extended Content:**`;\n\n extraInfoBlocks.forEach((block) => {\n if (block.trim().length > 0) {\n content += `\\n\\n${block}`;\n }\n });\n\n return content;\n};\n\n/**\n * Extracts EXTRA_INFO blocks from extended content.\n */\nconst getExtraInfoBlocks = (extendedContent: TextContent[]): string[] => {\n if (!extendedContent || extendedContent.length === 0) return [];\n return extractExtraInfoBlocks(extractAllText(extendedContent));\n};\n\n/**\n * Formats activated skills and extended content into markdown for display.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyContent = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): string => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return formatSkillKnowledge(activatedSkills, extraInfoBlocks);\n }\n\n if (extraInfoBlocks.length > 0) {\n return formatExtendedContentOnly(extraInfoBlocks);\n }\n\n return \"\";\n};\n\n/**\n * Returns structured skill items with their names and associated content.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyItems = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): SkillReadyItem[] => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return activatedSkills.map((skill, index) => ({\n name: skill,\n content:\n index < extraInfoBlocks.length ? extraInfoBlocks[index].trim() : \"\",\n }));\n }\n\n if (extraInfoBlocks.length > 0) {\n return extraInfoBlocks\n .filter((block) => block.trim().length > 0)\n .map((block, index) => ({\n name: `Extended Content ${index + 1}`,\n content: block.trim(),\n }));\n }\n\n return [];\n};\n"],"mappings":";AAaA,IAAM,KAAkB,MACtB,EACG,QAAQ,MAAM,EAAE,SAAS,MAAM,EAC/B,KAAK,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE,GAMN,KAA0B,MAA2B;CACzD,IAAM,IAAmB,CAAC,GACpB,IAAa,0CACf,IAAQ,EAAW,KAAK,CAAI;CAEhC,OAAO,MAAU,OAAM;EACrB,IAAM,IAAe,EAAM,GAAG,KAAK;EAInC,AAHI,EAAa,SAAS,KACxB,EAAO,KAAK,CAAY,GAE1B,IAAQ,EAAW,KAAK,CAAI;CAC9B;CAEA,OAAO;AACT,GAKM,KACJ,GACA,MACW;CACX,IAAI,IAAY,WAAW,EAAM;CAMjC,OAJI,KAAgB,EAAa,KAAK,EAAE,SAAS,MAC/C,KAAa,OAAO,MAGf;AACT,GAKM,KACJ,GACA,MACW;CACX,IAAI,IAAU;CAQd,OANA,EAAgB,SAAS,GAAO,MAAU;EACxC,IAAM,IACJ,IAAQ,EAAgB,SAAS,EAAgB,KAAS,KAAA;EAC5D,KAAW,EAAuB,GAAO,CAAY;CACvD,CAAC,GAEM;AACT,GAKM,KAA6B,MAAsC;CACvE,IAAI,IAAU;CAQd,OANA,EAAgB,SAAS,MAAU;EACjC,AAAI,EAAM,KAAK,EAAE,SAAS,MACxB,KAAW,OAAO;CAEtB,CAAC,GAEM;AACT,GAKM,KAAsB,MACtB,CAAC,KAAmB,EAAgB,WAAW,IAAU,CAAC,IACvD,EAAuB,EAAe,CAAe,CAAC,GAOlD,KACX,GACA,MACW;CACX,IAAM,IAAkB,EAAmB,CAAe;CAU1D,OARI,KAAmB,EAAgB,SAAS,IACvC,EAAqB,GAAiB,CAAe,IAG1D,EAAgB,SAAS,IACpB,EAA0B,CAAe,IAG3C;AACT,GAMa,KACX,GACA,MACqB;CACrB,IAAM,IAAkB,EAAmB,CAAe;CAmB1D,OAjBI,KAAmB,EAAgB,SAAS,IACvC,EAAgB,KAAK,GAAO,OAAW;EAC5C,MAAM;EACN,SACE,IAAQ,EAAgB,SAAS,EAAgB,GAAO,KAAK,IAAI;CACrE,EAAE,IAGA,EAAgB,SAAS,IACpB,EACJ,QAAQ,MAAU,EAAM,KAAK,EAAE,SAAS,CAAC,EACzC,KAAK,GAAO,OAAW;EACtB,MAAM,oBAAoB,IAAQ;EAClC,SAAS,EAAM,KAAK;CACtB,EAAE,IAGC,CAAC;AACV"}
1
+ {"version":3,"file":"get-skill-ready-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts"],"sourcesContent":["import { TextContent } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Represents a single activated skill with its name and associated content.\n */\nexport interface SkillReadyItem {\n name: string;\n content: string;\n}\n\n/**\n * Extracts all text content from an array of TextContent items.\n */\nfunction extractAllText(extendedContent: TextContent[]): string {\n return extendedContent\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n}\n\n/**\n * Extracts all <EXTRA_INFO> blocks from the given text.\n * Returns an array of content strings (without the wrapper tags).\n */\nconst extractExtraInfoBlocks = (text: string): string[] => {\n const blockRegex = /<EXTRA_INFO>([\\s\\S]*?)<\\/EXTRA_INFO>/gi;\n return Array.from(text.matchAll(blockRegex), (match) =>\n match[1].trim(),\n ).filter(Boolean);\n};\n\n/**\n * Formats a single skill with its corresponding content block.\n */\nconst formatSkillWithContent = (\n skill: string,\n contentBlock: string | undefined,\n): string => {\n let formatted = `\\n\\n- **${skill}**`;\n\n if (contentBlock) {\n formatted += `\\n\\n${contentBlock}`;\n }\n\n return formatted;\n};\n\n/**\n * Formats skills paired with their corresponding extended content blocks.\n */\nconst formatSkillKnowledge = (\n activatedSkills: string[],\n extraInfoBlocks: string[],\n): string => {\n let content = `\\n\\n**Triggered Skill Knowledge:**`;\n\n activatedSkills.forEach((skill, index) => {\n const contentBlock = extraInfoBlocks[index];\n content += formatSkillWithContent(skill, contentBlock);\n });\n\n return content;\n};\n\n/**\n * Formats extended content blocks when no skills are present.\n */\nconst formatExtendedContentOnly = (extraInfoBlocks: string[]): string => {\n let content = `\\n\\n**Extended Content:**`;\n\n extraInfoBlocks.forEach((block) => {\n content += `\\n\\n${block}`;\n });\n\n return content;\n};\n\n/**\n * Extracts EXTRA_INFO blocks from extended content.\n */\nconst getExtraInfoBlocks = (extendedContent?: TextContent[]): string[] => {\n if (!extendedContent) return [];\n return extractExtraInfoBlocks(extractAllText(extendedContent));\n};\n\n/**\n * Formats activated skills and extended content into markdown for display.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyContent = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): string => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return formatSkillKnowledge(activatedSkills, extraInfoBlocks);\n }\n\n if (extraInfoBlocks.length > 0) {\n return formatExtendedContentOnly(extraInfoBlocks);\n }\n\n return \"\";\n};\n\n/**\n * Returns structured skill items with their names and associated content.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyItems = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): SkillReadyItem[] => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return activatedSkills.map((skill, index) => ({\n name: skill,\n content: extraInfoBlocks[index] ?? \"\",\n }));\n }\n\n return extraInfoBlocks.map((block, index) => ({\n name: `Extended Content ${index + 1}`,\n content: block,\n }));\n};\n"],"mappings":";AAaA,SAAS,EAAe,GAAwC;CAC9D,OAAO,EACJ,QAAQ,MAAM,EAAE,SAAS,MAAM,EAC/B,KAAK,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AACZ;AAMA,IAAM,KAA0B,MAEvB,MAAM,KAAK,EAAK,SAAS,wCAAU,IAAI,MAC5C,EAAM,GAAG,KAAK,CAChB,EAAE,OAAO,OAAO,GAMZ,KACJ,GACA,MACW;CACX,IAAI,IAAY,WAAW,EAAM;CAMjC,OAJI,MACF,KAAa,OAAO,MAGf;AACT,GAKM,KACJ,GACA,MACW;CACX,IAAI,IAAU;CAOd,OALA,EAAgB,SAAS,GAAO,MAAU;EACxC,IAAM,IAAe,EAAgB;EACrC,KAAW,EAAuB,GAAO,CAAY;CACvD,CAAC,GAEM;AACT,GAKM,KAA6B,MAAsC;CACvE,IAAI,IAAU;CAMd,OAJA,EAAgB,SAAS,MAAU;EACjC,KAAW,OAAO;CACpB,CAAC,GAEM;AACT,GAKM,KAAsB,MACrB,IACE,EAAuB,EAAe,CAAe,CAAC,IADhC,CAAC,GAQnB,KACX,GACA,MACW;CACX,IAAM,IAAkB,EAAmB,CAAe;CAU1D,OARI,KAAmB,EAAgB,SAAS,IACvC,EAAqB,GAAiB,CAAe,IAG1D,EAAgB,SAAS,IACpB,EAA0B,CAAe,IAG3C;AACT,GAMa,KACX,GACA,MACqB;CACrB,IAAM,IAAkB,EAAmB,CAAe;CAS1D,OAPI,KAAmB,EAAgB,SAAS,IACvC,EAAgB,KAAK,GAAO,OAAW;EAC5C,MAAM;EACN,SAAS,EAAgB,MAAU;CACrC,EAAE,IAGG,EAAgB,KAAK,GAAO,OAAW;EAC5C,MAAM,oBAAoB,IAAQ;EAClC,SAAS;CACX,EAAE;AACJ"}
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ value: string | null;
3
+ onChange: (value: string | null) => void;
4
+ }
5
+ /** One selector for automation setup and editing, backed by the profile library. */
6
+ export declare function AutomationAgentProfileSelector({ value, onChange }: Props): import("react").JSX.Element;
7
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { Automation } from "#/types/automation";
2
+ interface DisabledReasonBannerProps {
3
+ automation: Automation;
4
+ }
5
+ /**
6
+ * Surfaces the reason an inactive automation was last disabled.
7
+ *
8
+ * The automation service records `disabled_reason`/`disabled_detail`/
9
+ * `disabled_at` on every disable (manual toggle, manual delete, or automatic
10
+ * pause for failing runs) and clears them on every re-enable, so when the
11
+ * automation is inactive and carries a reason, that reason is the latest
12
+ * reason it went inactive. Shown on the automation detail page below the
13
+ * header so the user knows *why* an automation is paused, not just that it is.
14
+ */
15
+ export declare function DisabledReasonBanner({ automation, }: DisabledReasonBannerProps): import("react").JSX.Element | null;
16
+ export {};
@@ -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("../../../../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;
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"),l=require("../../../../utils/automation-disabled-reason.cjs");let u=require("react/jsx-runtime");function d(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 f({label:e,children:t}){return(0,u.jsxs)(`div`,{className:`flex items-start gap-2 text-xs`,children:[(0,u.jsx)(`span`,{className:`w-20 shrink-0 text-[var(--oh-muted)]`,children:e}),(0,u.jsx)(`span`,{className:`min-w-0 flex-1 break-words text-[var(--oh-foreground)]`,children:t})]})}function p({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,u.jsx)(f,{label:r(t.I18nKey.AUTOMATIONS$DETAIL$PHASE),children:(0,u.jsxs)(`span`,{"data-testid":`run-phase-row`,children:[a,o?(0,u.jsxs)(`span`,{className:`text-muted`,children:[` · `,o]}):null]})})}function m({automation:s,runState:m}){let{t:h,i18n:g}=e.useTranslation(`openhands`),{latestRun:_}=m,v=_?o.getLastRunTimestamp(_):null,y=s.trigger.type===`event`?n.Zap:a.default,b=o.deriveRunHealth(m),x=_?r.getAutomationRunDisplay(_):null,S=l.hasDisablementReason(s)?l.getDisablementReasonDisplay(s,h):null;return(0,u.jsxs)(`div`,{className:`flex w-[280px] flex-col gap-3 p-3`,children:[(0,u.jsx)(`span`,{className:`break-words text-sm font-medium text-white`,children:s.name}),(0,u.jsxs)(`dl`,{className:`flex flex-col gap-1.5`,children:[(0,u.jsx)(f,{label:h(t.I18nKey.AUTOMATIONS$DETAIL$TRIGGER),children:(0,u.jsxs)(`span`,{className:`inline-flex min-w-0 items-start gap-1.5`,children:[(0,u.jsx)(y,{className:`mt-0.5 size-3 shrink-0`,"aria-hidden":`true`}),(0,u.jsx)(`span`,{className:`break-all`,children:o.getTriggerSummary(s)})]})}),(0,u.jsx)(f,{label:h(t.I18nKey.COMMON$STATUS),children:(0,u.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-1.5`,children:[(0,u.jsx)(c.AutomationHealthIndicator,{health:b}),(0,u.jsx)(`span`,{children:h(d(m))})]})}),S?(0,u.jsx)(f,{label:h(t.I18nKey.AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING),children:(0,u.jsx)(`span`,{"data-testid":`automation-tooltip-disabled-reason`,className:`line-clamp-3 text-[var(--oh-text-secondary)]`,children:S.text})}):null,(0,u.jsx)(p,{run:_}),v?(0,u.jsx)(f,{label:h(t.I18nKey.AUTOMATIONS$DETAIL$LAST_RUN),children:i.formatRelativeTime(v,g.language,h)}):null,x?.summary?(0,u.jsx)(f,{label:h(t.I18nKey.AUTOMATIONS$DETAIL$TASK_LABEL),children:(0,u.jsx)(`span`,{className:`line-clamp-3 text-[var(--oh-text-secondary)]`,children:x.summary})}):null]})]})}exports.HomeAutomationRunTooltip=m,exports.getRunStatusLabelKey=d;
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 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
+ {"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\";\nimport {\n getDisablementReasonDisplay,\n hasDisablementReason,\n} from \"#/utils/automation-disabled-reason\";\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 const disabledReason = hasDisablementReason(automation)\n ? getDisablementReasonDisplay(automation, t)\n : 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 {disabledReason ? (\n <PreviewRow\n label={t(I18nKey.AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING)}\n >\n <span\n data-testid=\"automation-tooltip-disabled-reason\"\n className=\"line-clamp-3 text-[var(--oh-text-secondary)]\"\n >\n {disabledReason.text}\n </span>\n </PreviewRow>\n ) : null}\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":"2oBA4BA,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,KAC3D,EAAiB,EAAA,qBAAqB,CAAU,EAClD,EAAA,4BAA4B,EAAY,CAAC,EACzC,KAEJ,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,EAEX,GACC,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,EAAE,EAAA,QAAQ,0CAA0C,YAE3D,EAAA,EAAA,KAAC,OAAD,CACE,cAAY,qCACZ,UAAU,wDAET,EAAe,IACZ,CAAA,CACI,CAAA,EACV,MAEJ,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"}
@@ -7,24 +7,25 @@ import o from "../../../../icons/clock.js";
7
7
  import { deriveRunHealth as s, getLastRunTimestamp as c, getRunHealthLabelKey as l, getTriggerSummary as u } from "./automation-run-health.js";
8
8
  import { shouldShowRunPhase as d, useRunPhase as f } from "../../automations/detail/run-phase.js";
9
9
  import { AutomationHealthIndicator as p } from "./automation-health-indicator.js";
10
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
10
+ import { getDisablementReasonDisplay as m, hasDisablementReason as h } from "../../../../utils/automation-disabled-reason.js";
11
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
11
12
  //#region src/components/features/home/featured-automations/home-automation-run-tooltip.tsx
12
- function g(e) {
13
+ function v(e) {
13
14
  return e.isError ? t.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE : e.latestRun ? r(i(e.latestRun).badgeStatus) : l(s(e));
14
15
  }
15
- function _({ label: e, children: t }) {
16
- return /* @__PURE__ */ h("div", {
16
+ function y({ label: e, children: t }) {
17
+ return /* @__PURE__ */ _("div", {
17
18
  className: "flex items-start gap-2 text-xs",
18
- children: [/* @__PURE__ */ m("span", {
19
+ children: [/* @__PURE__ */ g("span", {
19
20
  className: "w-20 shrink-0 text-[var(--oh-muted)]",
20
21
  children: e
21
- }), /* @__PURE__ */ m("span", {
22
+ }), /* @__PURE__ */ g("span", {
22
23
  className: "min-w-0 flex-1 break-words text-[var(--oh-foreground)]",
23
24
  children: t
24
25
  })]
25
26
  });
26
27
  }
27
- function v({ run: n }) {
28
+ function b({ run: n }) {
28
29
  let { t: r } = e("openhands"), i = f({
29
30
  status: n?.status,
30
31
  code: n?.phase_code,
@@ -33,57 +34,65 @@ function v({ run: n }) {
33
34
  });
34
35
  if (!n || !d(n.status) || !i) return null;
35
36
  let { text: a, age: o } = i;
36
- return /* @__PURE__ */ m(_, {
37
+ return /* @__PURE__ */ g(y, {
37
38
  label: r(t.AUTOMATIONS$DETAIL$PHASE),
38
- children: /* @__PURE__ */ h("span", {
39
+ children: /* @__PURE__ */ _("span", {
39
40
  "data-testid": "run-phase-row",
40
- children: [a, o ? /* @__PURE__ */ h("span", {
41
+ children: [a, o ? /* @__PURE__ */ _("span", {
41
42
  className: "text-muted",
42
43
  children: [" · ", o]
43
44
  }) : null]
44
45
  })
45
46
  });
46
47
  }
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", {
48
+ function x({ automation: r, runState: l }) {
49
+ let { t: d, i18n: f } = e("openhands"), { latestRun: x } = l, S = x ? c(x) : null, C = r.trigger.type === "event" ? n : o, w = s(l), T = x ? i(x) : null, E = h(r) ? m(r, d) : null;
50
+ return /* @__PURE__ */ _("div", {
50
51
  className: "flex w-[280px] flex-col gap-3 p-3",
51
- children: [/* @__PURE__ */ m("span", {
52
+ children: [/* @__PURE__ */ g("span", {
52
53
  className: "break-words text-sm font-medium text-white",
53
54
  children: r.name
54
- }), /* @__PURE__ */ h("dl", {
55
+ }), /* @__PURE__ */ _("dl", {
55
56
  className: "flex flex-col gap-1.5",
56
57
  children: [
57
- /* @__PURE__ */ m(_, {
58
+ /* @__PURE__ */ g(y, {
58
59
  label: d(t.AUTOMATIONS$DETAIL$TRIGGER),
59
- children: /* @__PURE__ */ h("span", {
60
+ children: /* @__PURE__ */ _("span", {
60
61
  className: "inline-flex min-w-0 items-start gap-1.5",
61
- children: [/* @__PURE__ */ m(x, {
62
+ children: [/* @__PURE__ */ g(C, {
62
63
  className: "mt-0.5 size-3 shrink-0",
63
64
  "aria-hidden": "true"
64
- }), /* @__PURE__ */ m("span", {
65
+ }), /* @__PURE__ */ g("span", {
65
66
  className: "break-all",
66
67
  children: u(r)
67
68
  })]
68
69
  })
69
70
  }),
70
- /* @__PURE__ */ m(_, {
71
+ /* @__PURE__ */ g(y, {
71
72
  label: d(t.COMMON$STATUS),
72
- children: /* @__PURE__ */ h("span", {
73
+ children: /* @__PURE__ */ _("span", {
73
74
  className: "inline-flex min-w-0 items-center gap-1.5",
74
- children: [/* @__PURE__ */ m(p, { health: S }), /* @__PURE__ */ m("span", { children: d(g(l)) })]
75
+ children: [/* @__PURE__ */ g(p, { health: w }), /* @__PURE__ */ g("span", { children: d(v(l)) })]
75
76
  })
76
77
  }),
77
- /* @__PURE__ */ m(v, { run: y }),
78
- b ? /* @__PURE__ */ m(_, {
78
+ E ? /* @__PURE__ */ g(y, {
79
+ label: d(t.AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING),
80
+ children: /* @__PURE__ */ g("span", {
81
+ "data-testid": "automation-tooltip-disabled-reason",
82
+ className: "line-clamp-3 text-[var(--oh-text-secondary)]",
83
+ children: E.text
84
+ })
85
+ }) : null,
86
+ /* @__PURE__ */ g(b, { run: x }),
87
+ S ? /* @__PURE__ */ g(y, {
79
88
  label: d(t.AUTOMATIONS$DETAIL$LAST_RUN),
80
- children: a(b, f.language, d)
89
+ children: a(S, f.language, d)
81
90
  }) : null,
82
- C?.summary ? /* @__PURE__ */ m(_, {
91
+ T?.summary ? /* @__PURE__ */ g(y, {
83
92
  label: d(t.AUTOMATIONS$DETAIL$TASK_LABEL),
84
- children: /* @__PURE__ */ m("span", {
93
+ children: /* @__PURE__ */ g("span", {
85
94
  className: "line-clamp-3 text-[var(--oh-text-secondary)]",
86
- children: C.summary
95
+ children: T.summary
87
96
  })
88
97
  }) : null
89
98
  ]
@@ -91,6 +100,6 @@ function y({ automation: r, runState: l }) {
91
100
  });
92
101
  }
93
102
  //#endregion
94
- export { y as HomeAutomationRunTooltip, g as getRunStatusLabelKey };
103
+ export { x as HomeAutomationRunTooltip, v as getRunStatusLabelKey };
95
104
 
96
105
  //# 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 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"}
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\";\nimport {\n getDisablementReasonDisplay,\n hasDisablementReason,\n} from \"#/utils/automation-disabled-reason\";\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 const disabledReason = hasDisablementReason(automation)\n ? getDisablementReasonDisplay(automation, t)\n : 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 {disabledReason ? (\n <PreviewRow\n label={t(I18nKey.AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING)}\n >\n <span\n data-testid=\"automation-tooltip-disabled-reason\"\n className=\"line-clamp-3 text-[var(--oh-text-secondary)]\"\n >\n {disabledReason.text}\n </span>\n </PreviewRow>\n ) : null}\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":";;;;;;;;;;;;AA4BA,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,MAC3D,IAAiB,EAAqB,CAAU,IAClD,EAA4B,GAAY,CAAC,IACzC;CAEJ,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;IAEX,IACC,kBAAC,GAAD;KACE,OAAO,EAAE,EAAQ,0CAA0C;eAE3D,kBAAC,QAAD;MACE,eAAY;MACZ,WAAU;gBAET,EAAe;KACZ,CAAA;IACI,CAAA,IACV;IAEJ,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"}
@@ -0,0 +1,20 @@
1
+ export interface ProfileScopeItem {
2
+ name: string;
3
+ description?: string | null;
4
+ }
5
+ interface ProfileScopeListProps {
6
+ /** Prefix: the list is `<testId>-list`, each row `<testId>-<name>`. */
7
+ testId: string;
8
+ items: ProfileScopeItem[];
9
+ selected: string[];
10
+ isDisabled?: boolean;
11
+ onToggle: (name: string, checked: boolean) => void;
12
+ }
13
+ /**
14
+ * Per-item toggles for a profile scope field such as `mcp_server_refs`.
15
+ *
16
+ * Rows are keyed by the wire name — the same identifier the API takes — so an
17
+ * entry this build has no description for is still legible and selectable.
18
+ */
19
+ export declare function ProfileScopeList({ testId, items, selected, isDisabled, onToggle, }: ProfileScopeListProps): import("react").JSX.Element;
20
+ export {};
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");var e={_comment:`Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.`,versions:{agentServer:`1.46.0`,agentCanvas:`1.18.0`,automation:`1.11.1`},compatibility:{minimumAgentServer:`1.28.0`},constraints:{_comment:`Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).`,agentClientProtocol:`agent-client-protocol<0.11`},images:{agentServer:`ghcr.io/openhands/agent-server`,agentCanvas:`ghcr.io/openhands/agent-canvas`},ports:{agentServer:18e3,automation:18001,proxy:8e3,_vscodeComment:`Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.`,vscode:8001},paths:{stateSubdir:`agent-canvas`,conversations:`agent-canvas/conversations`,bashEvents:`agent-canvas/bash_events`,automationDb:`automation/automations.db`,canvasBasePath:`/canvas`,_vscodeBasePathComment:`Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.`,vscodeBasePath:`/vscode`},packages:{agentServer:`openhands-agent-server`,automation:`openhands-automation`,tools:`openhands-tools`,workspace:`openhands-workspace`},telemetry:{posthogApiKey:`phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U`,posthogHost:`https://us.i.posthog.com`}};exports.default=e;
1
+ require("../_virtual/_rolldown/runtime.cjs");var e={_comment:`Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.`,versions:{agentServer:`1.49.1`,agentCanvas:`1.20.0`,automation:`1.13.1`},compatibility:{minimumAgentServer:`1.28.0`},constraints:{_comment:`Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).`,agentClientProtocol:`agent-client-protocol<0.11`},images:{agentServer:`ghcr.io/openhands/agent-server`,agentCanvas:`ghcr.io/openhands/agent-canvas`},ports:{agentServer:18e3,automation:18001,proxy:8e3,_vscodeComment:`Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.`,vscode:8001},paths:{stateSubdir:`agent-canvas`,conversations:`agent-canvas/conversations`,bashEvents:`agent-canvas/bash_events`,automationDb:`automation/automations.db`,canvasBasePath:`/canvas`,_vscodeBasePathComment:`Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.`,vscodeBasePath:`/vscode`},packages:{agentServer:`openhands-agent-server`,automation:`openhands-automation`,tools:`openhands-tools`,workspace:`openhands-workspace`},telemetry:{posthogApiKey:`phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U`,posthogHost:`https://us.i.posthog.com`}};exports.default=e;
2
2
  //# sourceMappingURL=defaults.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.cjs","names":[],"sources":["../../config/defaults.json"],"sourcesContent":["{\n \"_comment\": \"Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.\",\n \"versions\": {\n \"agentServer\": \"1.46.0\",\n \"agentCanvas\": \"1.18.0\",\n \"automation\": \"1.11.1\"\n },\n \"compatibility\": {\n \"minimumAgentServer\": \"1.28.0\"\n },\n \"constraints\": {\n \"_comment\": \"Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).\",\n \"agentClientProtocol\": \"agent-client-protocol<0.11\"\n },\n \"images\": {\n \"agentServer\": \"ghcr.io/openhands/agent-server\",\n \"agentCanvas\": \"ghcr.io/openhands/agent-canvas\"\n },\n \"ports\": {\n \"agentServer\": 18000,\n \"automation\": 18001,\n \"proxy\": 8000,\n \"_vscodeComment\": \"Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.\",\n \"vscode\": 8001\n },\n \"paths\": {\n \"stateSubdir\": \"agent-canvas\",\n \"conversations\": \"agent-canvas/conversations\",\n \"bashEvents\": \"agent-canvas/bash_events\",\n \"automationDb\": \"automation/automations.db\",\n \"canvasBasePath\": \"/canvas\",\n \"_vscodeBasePathComment\": \"Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.\",\n \"vscodeBasePath\": \"/vscode\"\n },\n \"packages\": {\n \"agentServer\": \"openhands-agent-server\",\n \"automation\": \"openhands-automation\",\n \"tools\": \"openhands-tools\",\n \"workspace\": \"openhands-workspace\"\n },\n \"telemetry\": {\n \"posthogApiKey\": \"phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U\",\n \"posthogHost\": \"https://us.i.posthog.com\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"defaults.cjs","names":[],"sources":["../../config/defaults.json"],"sourcesContent":["{\n \"_comment\": \"Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.\",\n \"versions\": {\n \"agentServer\": \"1.49.1\",\n \"agentCanvas\": \"1.20.0\",\n \"automation\": \"1.13.1\"\n },\n \"compatibility\": {\n \"minimumAgentServer\": \"1.28.0\"\n },\n \"constraints\": {\n \"_comment\": \"Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).\",\n \"agentClientProtocol\": \"agent-client-protocol<0.11\"\n },\n \"images\": {\n \"agentServer\": \"ghcr.io/openhands/agent-server\",\n \"agentCanvas\": \"ghcr.io/openhands/agent-canvas\"\n },\n \"ports\": {\n \"agentServer\": 18000,\n \"automation\": 18001,\n \"proxy\": 8000,\n \"_vscodeComment\": \"Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.\",\n \"vscode\": 8001\n },\n \"paths\": {\n \"stateSubdir\": \"agent-canvas\",\n \"conversations\": \"agent-canvas/conversations\",\n \"bashEvents\": \"agent-canvas/bash_events\",\n \"automationDb\": \"automation/automations.db\",\n \"canvasBasePath\": \"/canvas\",\n \"_vscodeBasePathComment\": \"Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.\",\n \"vscodeBasePath\": \"/vscode\"\n },\n \"packages\": {\n \"agentServer\": \"openhands-agent-server\",\n \"automation\": \"openhands-automation\",\n \"tools\": \"openhands-tools\",\n \"workspace\": \"openhands-workspace\"\n },\n \"telemetry\": {\n \"posthogApiKey\": \"phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U\",\n \"posthogHost\": \"https://us.i.posthog.com\"\n }\n}\n"],"mappings":""}