@openhands/agent-canvas 1.17.0 → 1.18.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 (507) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-DrjNsPOH.js → acp-providers-DcY_mKYa.js} +1 -1
  4. package/build/assets/active-backend-context-BnH4-L8h.js +2 -0
  5. package/build/assets/{agent-context-settings-CJUrcBut.js → agent-context-settings-D3peZkjX.js} +1 -1
  6. package/build/assets/{agent-profiles-service.api-Biieml2L.js → agent-profiles-service.api-DkeZaqIl.js} +1 -1
  7. package/build/assets/agent-profiles-settings-7yMWYjGF.js +1 -0
  8. package/build/assets/agent-server-client-options-EHB23gyx.js +1 -0
  9. package/build/assets/agent-server-config-C_x8Otd9.js +1 -0
  10. package/build/assets/agent-server-conversation-service.api-jiCopc2E.js +88 -0
  11. package/build/assets/{agent-settings-CpY3zObk.js → agent-settings-BF8hM6wb.js} +1 -1
  12. package/build/assets/agent-settings-YPutBAeR.js +1 -0
  13. package/build/assets/alert-banner-eYyqvHL3.js +1 -0
  14. package/build/assets/{api-error-message-Ve79qDcN.js → api-error-message-BXo0lCI5.js} +1 -1
  15. package/build/assets/api-key-entry-screen-CCBvBD8u.js +1 -0
  16. package/build/assets/app-settings-BtYDs-Be.js +1 -0
  17. package/build/assets/automation-detail-BxXhb_m2.js +3 -0
  18. package/build/assets/{automation-export-DxY47m3T.js → automation-export-BJsfi7n2.js} +1 -1
  19. package/build/assets/automation-git-sync-B7o_Nbl-.js +1 -0
  20. package/build/assets/automation-setup-route-qaJ6lLCf.js +3 -0
  21. package/build/assets/{automation-templates-4C4PM8K7.js → automation-templates-Bb98r-kx.js} +1 -1
  22. package/build/assets/automations-list-DEPVNud3.js +1 -0
  23. package/build/assets/{back-nav-button-B8tH0BEp.js → back-nav-button-B2yBiVMB.js} +1 -1
  24. package/build/assets/backend-form-modal-DxisQV_6.js +1 -0
  25. package/build/assets/backend-synced-settings-badge-DLEp6cq7.js +1 -0
  26. package/build/assets/badge-ehL-kgeO.js +1 -0
  27. package/build/assets/{base-modal-DTULovNc.js → base-modal-C1a0TsSx.js} +1 -1
  28. package/build/assets/{bot-CLMxGFaq.js → bot-ByolqPEr.js} +1 -1
  29. package/build/assets/{brand-button-DxPO4Lf8.js → brand-button-CUMfjb99.js} +1 -1
  30. package/build/assets/{browser-C-_qBasq.js → browser-SE24Tk8g.js} +6 -6
  31. package/build/assets/browser-tab-HjJxHA0V.js +1 -0
  32. package/build/assets/canvas-extension-page-BsUGBb1T.js +1 -0
  33. package/build/assets/canvas-extensions-C9Tm6s_E.js +1 -0
  34. package/build/assets/{canvas-extensions-runtime-DdnkgJXV.js → canvas-extensions-runtime-B8kxM4rO.js} +1 -1
  35. package/build/assets/{chat-send-button-B3SFSIg5.js → chat-send-button-CGvc2wpE.js} +1 -1
  36. package/build/assets/check-Bo8s5Ylg.js +1 -0
  37. package/build/assets/chevron-down-Cr6Fn_wS.js +1 -0
  38. package/build/assets/chevron-right-CfdfRn-8.js +1 -0
  39. package/build/assets/circle-check-5pH3qCji.js +1 -0
  40. package/build/assets/circle-plus-check-toggle-BDX_ctNs.js +1 -0
  41. package/build/assets/{cloud-funnel-analytics-BQanUEEC.js → cloud-funnel-analytics-D5uJ_4JE.js} +1 -1
  42. package/build/assets/{cog-VBlRo6iw.js → cog-CAEugqtV.js} +1 -1
  43. package/build/assets/command-menu-CQxs4mtX.js +1 -0
  44. package/build/assets/commits-tab-D0xgjipP.js +1 -0
  45. package/build/assets/{condenser-settings-eVKFMvap.js → condenser-settings-D63NJRBT.js} +1 -1
  46. package/build/assets/confirmation-modal-78sd9Vny.js +1 -0
  47. package/build/assets/{context-menu-list-item-DDROe12Z.js → context-menu-list-item-Cm7-7Y-7.js} +1 -1
  48. package/build/assets/{conversation-BnjJSFf5.js → conversation-B_nweu5p.js} +8 -8
  49. package/build/assets/conversation-edjzrv5w.js +1 -0
  50. package/build/assets/conversation-panel-edjzrv5w.js +1 -0
  51. package/build/assets/conversation-state-store-9D_3P7q4.js +1 -0
  52. package/build/assets/conversation-store-DC-JlJuq.js +6 -0
  53. package/build/assets/{conversation-tab-empty-state-DKlzAz5c.js → conversation-tab-empty-state-B3dpJXX0.js} +1 -1
  54. package/build/assets/copy-to-clipboard-button-B1ljgNxO.js +1 -0
  55. package/build/assets/device-verify-D5QRIS_x.js +1 -0
  56. package/build/assets/{dropdown-classes-B9kJVDIk.js → dropdown-classes-BGvOvW2_.js} +1 -1
  57. package/build/assets/edit-automation-modal-D_JWSmxT.js +1 -0
  58. package/build/assets/empty-state-FK_s1B60.js +1 -0
  59. package/build/assets/{entry.client-Ds8LVp-E.js → entry.client-BMafTpjO.js} +2 -2
  60. package/build/assets/enum-filter-dropdown-UNaom12H.js +1 -0
  61. package/build/assets/environment-switch-overlay-COibRUA-.js +1 -0
  62. package/build/assets/error-state-Cf8LRuuY.js +1 -0
  63. package/build/assets/extensions-hub-C_6ahIua.js +1 -0
  64. package/build/assets/extensions-navigation-C5GfpzFe.js +1 -0
  65. package/build/assets/{external-link-DQtv7eTh.js → external-link-Bd7Tga-1.js} +1 -1
  66. package/build/assets/files-tab-D5PPIWI1.js +1 -0
  67. package/build/assets/{form-control-classes-B-z85REi.js → form-control-classes-Dbq-7YP_.js} +1 -1
  68. package/build/assets/format-model-name-Dfh9Udrx.js +1 -0
  69. package/build/assets/get-git-path-jU2zjqIB.js +1 -0
  70. package/build/assets/git-repo-dropdown-BoDDWXfX.js +1 -0
  71. package/build/assets/git-repo-dropdown-uxlFw2gn.js +1 -0
  72. package/build/assets/highlighted-source-view-C7pAXrT0.js +1 -0
  73. package/build/assets/home-BM5_Wz_R.js +1 -0
  74. package/build/assets/home-Ivfm7KC4.js +1 -0
  75. package/build/assets/home-automation-run-tooltip-B1N2uO9p.js +1 -0
  76. package/build/assets/home-store-DCbei3DX.js +1 -0
  77. package/build/assets/hooks-service-Dnmhqc0Z.js +1 -0
  78. package/build/assets/index-home-td9BN2T3.js +1 -0
  79. package/build/assets/info-BcajzHn1.js +1 -0
  80. package/build/assets/install-server-modal-B81I-5OE.js +1 -0
  81. package/build/assets/kebab-menu-item-content-SCJBwZnp.js +1 -0
  82. package/build/assets/{key-CfXbJa8w.js → key-O84CMFHb.js} +1 -1
  83. package/build/assets/launch-ZLxI4opd.js +1 -0
  84. package/build/assets/list-filter-B8PQk3RA.js +1 -0
  85. package/build/assets/{list-todo-ByXMdY4W.js → list-todo-Caa8E1X_.js} +1 -1
  86. package/build/assets/llm-not-configured-banner-Dh_ajcM8.js +27 -0
  87. package/build/assets/llm-settings-CODhjQzy.js +1 -0
  88. package/build/assets/llm-settings-CZaXYgtw.js +1 -0
  89. package/build/assets/{llm-subscription-service-aDNBQ7Gq.js → llm-subscription-service-CgIDc38n.js} +1 -1
  90. package/build/assets/loader-circle-BxJgk73D.js +1 -0
  91. package/build/assets/{loading-spinner-DfHI77BA.js → loading-spinner-BeLV0IXf.js} +1 -1
  92. package/build/assets/manage-backends-modal-cMXqCb-B.js +1 -0
  93. package/build/assets/manifest-bfeccb98.js +1 -0
  94. package/build/assets/manifest-subpage-layout-CVZgVKoY.js +1 -0
  95. package/build/assets/{map-provider-DXvssjw9.js → map-provider-iRs80q_6.js} +1 -1
  96. package/build/assets/markdown-renderer-DyFl9-mL.js +8 -0
  97. package/build/assets/mcp-CraxoXQv.js +1 -0
  98. package/build/assets/{mcp-marketplace-utils-Cn_NIMWM.js → mcp-marketplace-utils-C7PYr293.js} +1 -1
  99. package/build/assets/mcp-page-CteH_K0N.js +9 -0
  100. package/build/assets/messages-Bk1xhbU2.js +41 -0
  101. package/build/assets/{modal-body-DJw4xBki.js → modal-body-C24WsdFb.js} +1 -1
  102. package/build/assets/{modal-classes-Dg0ngBPO.js → modal-classes-B0b9eiL8.js} +1 -1
  103. package/build/assets/modal-close-button-DfqfB2Nj.js +1 -0
  104. package/build/assets/{mouse-pointer-click-DEhsSUpu.js → mouse-pointer-click-BXlRN92t.js} +1 -1
  105. package/build/assets/onboarding-DXFBRqEy.js +1 -0
  106. package/build/assets/onboarding-modal-BT3Gx_sZ.js +1 -0
  107. package/build/assets/{organization-service.api-Cyg1Tn03.js → organization-service.api-B5CvmnYQ.js} +1 -1
  108. package/build/assets/{pencil-D5c47kyN.js → pencil-q-ihqDYv.js} +1 -1
  109. package/build/assets/{pin-C7vMagvf.js → pin-BdroVQdN.js} +1 -1
  110. package/build/assets/planner-tab-CstoOlAB.js +1 -0
  111. package/build/assets/{plug-CeaqeF6u.js → plug-7ACOEbMs.js} +1 -1
  112. package/build/assets/{plugins-management-service-Bh_pBuf-.js → plugins-management-service-5rqVPEGN.js} +1 -1
  113. package/build/assets/plus-C2e21TFC.js +1 -0
  114. package/build/assets/{profiles-service.api-BbOK0EkF.js → profiles-service.api-D1XKMgr0.js} +1 -1
  115. package/build/assets/providers-XmZ9HM4Q.js +1 -0
  116. package/build/assets/proxy-XP6U1Dhv.js +1 -0
  117. package/build/assets/{puzzle-DdAqbUrb.js → puzzle-LJYnuxKe.js} +1 -1
  118. package/build/assets/react-BX7IV650.js +1 -0
  119. package/build/assets/recommended-automations-launcher-DEHRKIAg.js +1 -0
  120. package/build/assets/{refresh-cw-DEQdPCpH.js → refresh-cw-BtdC3T8P.js} +1 -1
  121. package/build/assets/root-CM6IZHlg.css +1 -0
  122. package/build/assets/root-DdFkodKW.js +2 -0
  123. package/build/assets/root-layout-DUquNZTU.js +2 -0
  124. package/build/assets/schema-field-Y3F8JvXd.js +1 -0
  125. package/build/assets/sdk-section-page-CNZTLwH9.js +1 -0
  126. package/build/assets/secret-form-9-BoGA40.js +1 -0
  127. package/build/assets/{secrets-service-Cr8g8xuv.js → secrets-service-BOIsfD9j.js} +1 -1
  128. package/build/assets/secrets-settings-CBJgFr42.js +1 -0
  129. package/build/assets/settings-D4hdToD4.js +1 -0
  130. package/build/assets/settings-dropdown-input-DBvsZ7-Q.js +1 -0
  131. package/build/assets/settings-index-DeQphyBK.js +1 -0
  132. package/build/assets/settings-input-dVuzapBA.js +1 -0
  133. package/build/assets/{settings-list-classes-Ds4jPBHK.js → settings-list-classes-DhAPuXm6.js} +1 -1
  134. package/build/assets/settings-modal-tHiJ8iYV.js +1 -0
  135. package/build/assets/settings-nav-GAQjW1a-.js +16 -0
  136. package/build/assets/{settings-service.api-9_xdv_mh.js → settings-service.api-C1vZH9Vh.js} +1 -1
  137. package/build/assets/settings-switch-DDd1cQ8t.js +1 -0
  138. package/build/assets/{settings-utils-8GIIgOQL.js → settings-utils-BTaaRhLZ.js} +1 -1
  139. package/build/assets/shared-conversation-Cyg7m7ns.js +1 -0
  140. package/build/assets/{shield-check-DO7wa_eu.js → shield-check-C3Rl0NF8.js} +1 -1
  141. package/build/assets/{sidebar-layout-EPfWxk11.js → sidebar-layout-DH0E-5KW.js} +1 -1
  142. package/build/assets/sidebar-mobile-menu-toggle-CQ4iky__.js +1 -0
  143. package/build/assets/{sidebar-nav-link-_t4_Ef-9.js → sidebar-nav-link-oLQiKUBu.js} +1 -1
  144. package/build/assets/{sidebar-onboarding-checklist-storage-DbDX-Wvj.js → sidebar-onboarding-checklist-storage-TfvNNnnr.js} +1 -1
  145. package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
  146. package/build/assets/skill-card-pill-row-DfjIfj0K.js +1 -0
  147. package/build/assets/{skill-filter-BBeZ4JEP.js → skill-filter-DsNLmn76.js} +2 -2
  148. package/build/assets/{skill-icon-badge-BDhQ-tQ0.js → skill-icon-badge-0MK_68Nc.js} +1 -1
  149. package/build/assets/skill-scope-BE-H9TSZ.js +1 -0
  150. package/build/assets/skills-plugins-vzSdxSk_.js +1 -0
  151. package/build/assets/skills-settings-BiPOH9H9.js +1 -0
  152. package/build/assets/{styled-tooltip-Pd22BIvr.js → styled-tooltip-CejG0rqv.js} +1 -1
  153. package/build/assets/task-list-tab-OkZSqnTp.js +1 -0
  154. package/build/assets/{terminal-onXx0_Qz.js → terminal-Dph60VFZ.js} +1 -1
  155. package/build/assets/{toggle-switch-lwQtxDcm.js → toggle-switch-B2uXaAUS.js} +1 -1
  156. package/build/assets/{trash-2-ZhKuTLiz.js → trash-2-Bb40zQzs.js} +1 -1
  157. package/build/assets/trash-Ckh7yCaB.js +1 -0
  158. package/build/assets/{triangle-alert-BajLPpQg.js → triangle-alert-DEdu-b_L.js} +1 -1
  159. package/build/assets/{typography-HLLg_FAn.js → typography-DgcLGdHk.js} +1 -1
  160. package/build/assets/usage-tab-MCmNRAnR.js +1 -0
  161. package/build/assets/use-acp-credential-form-ychoGqjC.js +1 -0
  162. package/build/assets/{use-activate-agent-profile-BLKML6vQ.js → use-activate-agent-profile-8L8Xdghy.js} +1 -1
  163. package/build/assets/use-agent-profiles-Bi8hSkze.js +1 -0
  164. package/build/assets/{use-automation-health-BZkQNEA8.js → use-automation-health-U99vvHxx.js} +1 -1
  165. package/build/assets/{use-automation-permissions-B_RpvL-s.js → use-automation-permissions-Buus0R6h.js} +1 -1
  166. package/build/assets/{use-automations-Cg0PDIZr.js → use-automations-Bq5hVuv0.js} +1 -1
  167. package/build/assets/{use-can-manage-org-profiles-BbN6KfDr.js → use-can-manage-org-profiles-MzIeEV8F.js} +1 -1
  168. package/build/assets/{use-canvas-extensions-CFUpHat6.js → use-canvas-extensions-Ca9KoVEm.js} +1 -1
  169. package/build/assets/{use-cloud-current-user-id-Dk0rjr63.js → use-cloud-current-user-id-B4ZLUZSa.js} +1 -1
  170. package/build/assets/{use-config-DpafU_QP.js → use-config-l5tkDHyD.js} +1 -1
  171. package/build/assets/{use-create-conversation-1YgmAHt-.js → use-create-conversation-i_PdFdIs.js} +1 -1
  172. package/build/assets/use-create-secret-CjWq0J4O.js +1 -0
  173. package/build/assets/use-free-models-gCsJ5BV0.js +1 -0
  174. package/build/assets/{use-get-secrets-CQ4b0qK8.js → use-get-secrets-CMTuWEp_.js} +1 -1
  175. package/build/assets/use-is-authed-A2Yinlt0.js +1 -0
  176. package/build/assets/{use-launch-skill-in-chat-DeYa1tFM.js → use-launch-skill-in-chat-QbXDhiHr.js} +1 -1
  177. package/build/assets/use-llm-configured-Dl4zg8ht.js +1 -0
  178. package/build/assets/use-llm-profiles-SWsuFmFu.js +1 -0
  179. package/build/assets/{use-manifest-capabilities-AOWGcu0j.js → use-manifest-capabilities-CdqYfUAC.js} +1 -1
  180. package/build/assets/{use-onboarding-completion-CoINurkm.js → use-onboarding-completion-Xl63ZvzQ.js} +1 -1
  181. package/build/assets/{use-pinned-home-route-D6krwXjy.js → use-pinned-home-route-BXDIUaxQ.js} +1 -1
  182. package/build/assets/{use-plugins-marketplace-mLsIDhBv.js → use-plugins-marketplace-BIIaPiaB.js} +1 -1
  183. package/build/assets/use-save-agent-profile-D-ZHHE94.js +1 -0
  184. package/build/assets/{use-save-settings-3U5K9-8x.js → use-save-settings-Dapkf4cC.js} +1 -1
  185. package/build/assets/{use-settings-Dn00UISA.js → use-settings-C2KKQKVC.js} +1 -1
  186. package/build/assets/use-settings-nav-items-TOc0Rsfd.js +1 -0
  187. package/build/assets/{use-tracking-B9prBsrq.js → use-tracking-j4uo9VEW.js} +1 -1
  188. package/build/assets/{use-user-conversation-ZWlXtbZb.js → use-user-conversation-5UFqMoO4.js} +1 -1
  189. package/build/assets/{useInfiniteQuery-BzrRqjLg.js → useInfiniteQuery-CtSRG7uW.js} +1 -1
  190. package/build/assets/{useMutation-CJuK90oc.js → useMutation-Cszf8mKy.js} +1 -1
  191. package/build/assets/useQueries-pUohFMSP.js +1 -0
  192. package/build/assets/useQuery-DAAacS7O.js +1 -0
  193. package/build/assets/useTranslation-CCgUjPJF.js +1 -0
  194. package/build/assets/utils-BgLSZdyy.js +1 -0
  195. package/build/assets/{vendor~conversation-panel~conversation-4eJ0tml3.js → vendor~conversation-panel~conversation-C22sJuWZ.js} +1 -1
  196. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BXXGJNDU.js +185 -0
  197. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-40UR63Gt.js +1 -0
  198. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js → vendor~index-home~home~conversation-panel~conversation-UTl7gUo9.js} +1 -1
  199. package/build/assets/{vendor~root-layout-n8XCEXG8.js → vendor~root-layout-CcdIqs-C.js} +1 -1
  200. package/build/assets/{vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js → vendor~root-layout~conversation-panel~conversation-C3EBV3kp.js} +1 -1
  201. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BCe0JJVy.js +1 -0
  202. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BGGbPcYh.js} +1 -1
  203. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js} +1 -1
  204. package/build/assets/{verification-settings-u2POabjH.js → verification-settings-DdBpaVPz.js} +1 -1
  205. package/build/assets/{wrench-CkgI4rxA.js → wrench-B8Wg_nbp.js} +1 -1
  206. package/build/assets/{x-By6qCmtY.js → x-CX8lVGwm.js} +1 -1
  207. package/build/index.html +4 -4
  208. package/build/locales/ar/openhands.json +6 -2
  209. package/build/locales/ca/openhands.json +6 -2
  210. package/build/locales/de/openhands.json +6 -2
  211. package/build/locales/en/openhands.json +6 -2
  212. package/build/locales/es/openhands.json +6 -2
  213. package/build/locales/fr/openhands.json +6 -2
  214. package/build/locales/it/openhands.json +6 -2
  215. package/build/locales/ja/openhands.json +6 -2
  216. package/build/locales/ko-KR/openhands.json +6 -2
  217. package/build/locales/no/openhands.json +6 -2
  218. package/build/locales/pt/openhands.json +6 -2
  219. package/build/locales/tr/openhands.json +6 -2
  220. package/build/locales/uk/openhands.json +6 -2
  221. package/build/locales/zh-CN/openhands.json +6 -2
  222. package/build/locales/zh-TW/openhands.json +6 -2
  223. package/config/defaults.json +1 -1
  224. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  225. package/dist/api/cloud/organization-service.api.d.ts +9 -1
  226. package/dist/api/cloud/organization-service.api.js.map +1 -1
  227. package/dist/api/config-service/config-service.api.cjs +1 -1
  228. package/dist/api/config-service/config-service.api.cjs.map +1 -1
  229. package/dist/api/config-service/config-service.api.js +6 -2
  230. package/dist/api/config-service/config-service.api.js.map +1 -1
  231. package/dist/api/config-service/config-service.types.d.ts +13 -0
  232. package/dist/components/features/automations/automation-card.cjs +1 -1
  233. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  234. package/dist/components/features/automations/automation-card.js +39 -38
  235. package/dist/components/features/automations/automation-card.js.map +1 -1
  236. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  237. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  238. package/dist/components/features/automations/automation-list-row.js +73 -72
  239. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  240. package/dist/components/features/automations/build-automation-menu-items.cjs +1 -1
  241. package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -1
  242. package/dist/components/features/automations/build-automation-menu-items.d.ts +3 -1
  243. package/dist/components/features/automations/build-automation-menu-items.js +12 -11
  244. package/dist/components/features/automations/build-automation-menu-items.js.map +1 -1
  245. package/dist/components/features/automations/detail/configuration-section.d.ts +7 -1
  246. package/dist/components/features/automations/detail/detail-header.d.ts +8 -5
  247. package/dist/components/features/backends/backend-selector.cjs +1 -1
  248. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  249. package/dist/components/features/backends/backend-selector.js +112 -112
  250. package/dist/components/features/backends/backend-selector.js.map +1 -1
  251. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  252. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  253. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +62 -61
  254. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  255. package/dist/components/features/chat/model-messages.cjs +1 -1
  256. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  257. package/dist/components/features/chat/model-messages.js +27 -26
  258. package/dist/components/features/chat/model-messages.js.map +1 -1
  259. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  260. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  261. package/dist/components/features/conversation-panel/budget-display.d.ts +1 -2
  262. package/dist/components/features/conversation-panel/budget-display.js +12 -19
  263. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  264. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  265. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  266. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +45 -44
  267. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  268. package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +1 -2
  269. package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +0 -1
  270. package/dist/components/features/images/image-lightbox.cjs +2 -0
  271. package/dist/components/features/images/image-lightbox.cjs.map +1 -0
  272. package/dist/components/features/images/image-lightbox.d.ts +11 -0
  273. package/dist/components/features/images/image-lightbox.js +37 -0
  274. package/dist/components/features/images/image-lightbox.js.map +1 -0
  275. package/dist/components/features/images/image-preview.cjs +1 -1
  276. package/dist/components/features/images/image-preview.cjs.map +1 -1
  277. package/dist/components/features/images/image-preview.d.ts +2 -1
  278. package/dist/components/features/images/image-preview.js +33 -13
  279. package/dist/components/features/images/image-preview.js.map +1 -1
  280. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +3 -4
  281. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  282. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  283. package/dist/components/features/settings/cloud-settings-link.d.ts +3 -1
  284. package/dist/components/features/settings/cloud-settings-link.js +22 -21
  285. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  286. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  287. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -1
  288. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  289. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -1
  290. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  291. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  292. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +2 -1
  293. package/dist/components/features/sidebar/sidebar-rail-body.js +143 -142
  294. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  295. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  296. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  297. package/dist/components/features/sidebar/sidebar.js +28 -27
  298. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  299. package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
  300. package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
  301. package/dist/components/providers/agent-server-ui-providers.js +33 -29
  302. package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
  303. package/dist/components/shared/buttons/remove-button.cjs +1 -1
  304. package/dist/components/shared/buttons/remove-button.cjs.map +1 -1
  305. package/dist/components/shared/buttons/remove-button.d.ts +2 -1
  306. package/dist/components/shared/buttons/remove-button.js +2 -1
  307. package/dist/components/shared/buttons/remove-button.js.map +1 -1
  308. package/dist/components/shared/free-models-note.cjs +2 -0
  309. package/dist/components/shared/free-models-note.cjs.map +1 -0
  310. package/dist/components/shared/free-models-note.d.ts +3 -0
  311. package/dist/components/shared/free-models-note.js +20 -0
  312. package/dist/components/shared/free-models-note.js.map +1 -0
  313. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  314. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  315. package/dist/components/shared/modals/settings/model-selector.js +102 -112
  316. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  317. package/dist/config/defaults.cjs +1 -1
  318. package/dist/config/defaults.cjs.map +1 -1
  319. package/dist/config/defaults.js +1 -1
  320. package/dist/config/defaults.js.map +1 -1
  321. package/dist/constants/acp-providers.cjs.map +1 -1
  322. package/dist/constants/acp-providers.d.ts +12 -0
  323. package/dist/constants/acp-providers.js.map +1 -1
  324. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  325. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  326. package/dist/hooks/chat/use-slash-command.js +63 -62
  327. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  328. package/dist/hooks/query/use-free-models.cjs +2 -0
  329. package/dist/hooks/query/use-free-models.cjs.map +1 -0
  330. package/dist/hooks/query/use-free-models.d.ts +23 -0
  331. package/dist/hooks/query/use-free-models.js +67 -0
  332. package/dist/hooks/query/use-free-models.js.map +1 -0
  333. package/dist/hooks/query/use-local-git-info.cjs.map +1 -1
  334. package/dist/hooks/query/use-local-git-info.js.map +1 -1
  335. package/dist/hooks/query/use-provider-models.cjs +1 -1
  336. package/dist/hooks/query/use-provider-models.cjs.map +1 -1
  337. package/dist/hooks/query/use-provider-models.js +34 -25
  338. package/dist/hooks/query/use-provider-models.js.map +1 -1
  339. package/dist/hooks/query/use-search-providers.cjs +1 -1
  340. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  341. package/dist/hooks/query/use-search-providers.js +31 -19
  342. package/dist/hooks/query/use-search-providers.js.map +1 -1
  343. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  344. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  345. package/dist/hooks/use-home-automation-actions.d.ts +1 -2
  346. package/dist/hooks/use-home-automation-actions.js +0 -1
  347. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  348. package/dist/i18n/declaration.cjs +1 -1
  349. package/dist/i18n/declaration.cjs.map +1 -1
  350. package/dist/i18n/declaration.d.ts +6 -2
  351. package/dist/i18n/declaration.js +1 -1
  352. package/dist/i18n/declaration.js.map +1 -1
  353. package/dist/i18n/translation.cjs +2 -2
  354. package/dist/i18n/translation.cjs.map +1 -1
  355. package/dist/i18n/translation.js +85 -17
  356. package/dist/i18n/translation.js.map +1 -1
  357. package/dist/locales/ar/openhands.json +6 -2
  358. package/dist/locales/ca/openhands.json +6 -2
  359. package/dist/locales/de/openhands.json +6 -2
  360. package/dist/locales/en/openhands.json +6 -2
  361. package/dist/locales/es/openhands.json +6 -2
  362. package/dist/locales/fr/openhands.json +6 -2
  363. package/dist/locales/it/openhands.json +6 -2
  364. package/dist/locales/ja/openhands.json +6 -2
  365. package/dist/locales/ko-KR/openhands.json +6 -2
  366. package/dist/locales/no/openhands.json +6 -2
  367. package/dist/locales/pt/openhands.json +6 -2
  368. package/dist/locales/tr/openhands.json +6 -2
  369. package/dist/locales/uk/openhands.json +6 -2
  370. package/dist/locales/zh-CN/openhands.json +6 -2
  371. package/dist/locales/zh-TW/openhands.json +6 -2
  372. package/dist/package.cjs +1 -1
  373. package/dist/package.cjs.map +1 -1
  374. package/dist/package.js +1 -1
  375. package/dist/package.js.map +1 -1
  376. package/dist/routes/app-settings.cjs +1 -1
  377. package/dist/routes/app-settings.cjs.map +1 -1
  378. package/dist/routes/app-settings.js +52 -47
  379. package/dist/routes/app-settings.js.map +1 -1
  380. package/dist/routes/llm-settings.cjs +1 -1
  381. package/dist/routes/llm-settings.cjs.map +1 -1
  382. package/dist/routes/llm-settings.js +137 -145
  383. package/dist/routes/llm-settings.js.map +1 -1
  384. package/dist/stores/free-models-store.cjs +2 -0
  385. package/dist/stores/free-models-store.cjs.map +1 -0
  386. package/dist/stores/free-models-store.d.ts +30 -0
  387. package/dist/stores/free-models-store.js +22 -0
  388. package/dist/stores/free-models-store.js.map +1 -0
  389. package/dist/utils/format-model-name.cjs +1 -1
  390. package/dist/utils/format-model-name.cjs.map +1 -1
  391. package/dist/utils/format-model-name.d.ts +27 -6
  392. package/dist/utils/format-model-name.js +14 -6
  393. package/dist/utils/format-model-name.js.map +1 -1
  394. package/package.json +1 -1
  395. package/build/assets/active-backend-context-rZiLJRUc.js +0 -2
  396. package/build/assets/agent-profiles-settings-x6RvPsq7.js +0 -1
  397. package/build/assets/agent-server-client-options-BikiNwTa.js +0 -1
  398. package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +0 -88
  399. package/build/assets/agent-settings-BJyovpJ_.js +0 -1
  400. package/build/assets/alert-banner-vARz1idS.js +0 -1
  401. package/build/assets/api-key-entry-screen-CsMuBhoP.js +0 -1
  402. package/build/assets/app-settings-BaJ7nfHt.js +0 -1
  403. package/build/assets/automation-detail-CVoGDrKq.js +0 -3
  404. package/build/assets/automation-git-sync-CRMP9Bbm.js +0 -1
  405. package/build/assets/automation-setup-route-072beLz1.js +0 -3
  406. package/build/assets/automations-list-xuqTSQL4.js +0 -1
  407. package/build/assets/backend-form-modal-0aJmWdsa.js +0 -1
  408. package/build/assets/backend-synced-settings-badge-B7rKWBir.js +0 -1
  409. package/build/assets/badge-CcGx2TaV.js +0 -1
  410. package/build/assets/browser-tab-DZanIw5m.js +0 -1
  411. package/build/assets/canvas-extension-page-o_cWgE9B.js +0 -1
  412. package/build/assets/canvas-extensions-DSgNlCha.js +0 -1
  413. package/build/assets/check-fDEfgSzj.js +0 -1
  414. package/build/assets/chevron-down-CFrWHqu8.js +0 -1
  415. package/build/assets/chevron-right-C5roOrJu.js +0 -1
  416. package/build/assets/circle-check-ClTzJTdb.js +0 -1
  417. package/build/assets/circle-plus-check-toggle-Fr-h-mbL.js +0 -1
  418. package/build/assets/command-menu-BT3Ia5Ru.js +0 -1
  419. package/build/assets/commits-tab-2jhtaohl.js +0 -1
  420. package/build/assets/confirmation-modal-gIFHeZt6.js +0 -1
  421. package/build/assets/conversation-DZ578rOX.js +0 -1
  422. package/build/assets/conversation-panel-DZ578rOX.js +0 -1
  423. package/build/assets/conversation-state-store-D1_G_9I-.js +0 -1
  424. package/build/assets/conversation-store-DVVfkCsk.js +0 -6
  425. package/build/assets/copy-to-clipboard-button-B3w0X7WH.js +0 -1
  426. package/build/assets/device-verify-BfkCzyFB.js +0 -1
  427. package/build/assets/edit-automation-modal-BwhJ39JT.js +0 -1
  428. package/build/assets/empty-state-RZz0OfnY.js +0 -1
  429. package/build/assets/enum-filter-dropdown-C4pW0ORd.js +0 -1
  430. package/build/assets/environment-switch-overlay-P2ZAuzov.js +0 -1
  431. package/build/assets/error-state-B_5cgNPJ.js +0 -1
  432. package/build/assets/extensions-hub-DsaUr4ca.js +0 -1
  433. package/build/assets/extensions-navigation-CRMZd-FE.js +0 -1
  434. package/build/assets/files-tab-CCgAcVdc.js +0 -1
  435. package/build/assets/format-model-name-CasAP3nd.js +0 -1
  436. package/build/assets/get-git-path-EHrSDxTM.js +0 -1
  437. package/build/assets/git-repo-dropdown-D2WEQ97X.js +0 -1
  438. package/build/assets/git-repo-dropdown-DVeCUUXG.js +0 -1
  439. package/build/assets/highlighted-source-view-DjHO3SdW.js +0 -1
  440. package/build/assets/home-BorS_vdS.js +0 -1
  441. package/build/assets/home-aIMbHw5M.js +0 -1
  442. package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +0 -1
  443. package/build/assets/home-store-DyXz0w6d.js +0 -1
  444. package/build/assets/hooks-service-C6dpRtZM.js +0 -1
  445. package/build/assets/index-home-zKFuKK2B.js +0 -1
  446. package/build/assets/info-CTIdjttz.js +0 -1
  447. package/build/assets/install-server-modal-DUiZMc8u.js +0 -1
  448. package/build/assets/kebab-menu-item-content-mm04SBD3.js +0 -1
  449. package/build/assets/launch-BSIf9KEg.js +0 -1
  450. package/build/assets/list-filter-CNpqTWVY.js +0 -1
  451. package/build/assets/llm-not-configured-banner-z_QRSeV0.js +0 -27
  452. package/build/assets/llm-settings-B-5AHMiX.js +0 -1
  453. package/build/assets/llm-settings-B3SjHDmA.js +0 -1
  454. package/build/assets/loader-circle-Dex47vVW.js +0 -1
  455. package/build/assets/manage-backends-modal-q1NdFisr.js +0 -1
  456. package/build/assets/manifest-8920b615.js +0 -1
  457. package/build/assets/manifest-subpage-layout-BQQy5ipR.js +0 -1
  458. package/build/assets/markdown-renderer-rivLvYh-.js +0 -8
  459. package/build/assets/mcp-CEXDhQWn.js +0 -1
  460. package/build/assets/mcp-page-LGYIICMG.js +0 -9
  461. package/build/assets/messages-DUSeANAh.js +0 -41
  462. package/build/assets/modal-close-button-B9j4nasm.js +0 -1
  463. package/build/assets/onboarding-BjFebfs5.js +0 -1
  464. package/build/assets/onboarding-modal-DDTjOpyd.js +0 -1
  465. package/build/assets/planner-tab-D8f2Y3rn.js +0 -1
  466. package/build/assets/plus-B3wvU06-.js +0 -1
  467. package/build/assets/providers-2gIIkz2N.js +0 -1
  468. package/build/assets/proxy-CBgMd2zf.js +0 -1
  469. package/build/assets/recommended-automations-launcher-YLAQTp4s.js +0 -1
  470. package/build/assets/root-Bye_XmEL.js +0 -2
  471. package/build/assets/root-Cnwwzgo0.css +0 -1
  472. package/build/assets/root-layout-CSAwxBGM.js +0 -2
  473. package/build/assets/schema-field-CK0xYNbO.js +0 -1
  474. package/build/assets/sdk-section-page-Da73Rs_o.js +0 -1
  475. package/build/assets/secret-form-CB2VwYYg.js +0 -1
  476. package/build/assets/secrets-settings-Bh0udeKv.js +0 -1
  477. package/build/assets/settings-DmyIgRxO.js +0 -1
  478. package/build/assets/settings-dropdown-input-DVpyD87C.js +0 -1
  479. package/build/assets/settings-index-BSJUFmjE.js +0 -1
  480. package/build/assets/settings-input-C0dd8Utu.js +0 -1
  481. package/build/assets/settings-modal-yStgEh2o.js +0 -1
  482. package/build/assets/settings-switch-B78Khmyz.js +0 -1
  483. package/build/assets/shared-conversation-DM96X4KV.js +0 -1
  484. package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +0 -1
  485. package/build/assets/sidebar-store-CSDFK0W5.js +0 -1
  486. package/build/assets/skill-card-pill-row-989y15jV.js +0 -1
  487. package/build/assets/skill-scope-Dz3kPH3P.js +0 -1
  488. package/build/assets/skills-plugins-e3CYGdUJ.js +0 -1
  489. package/build/assets/skills-settings-3e-FuHw_.js +0 -1
  490. package/build/assets/task-list-tab-3Jg8ywch.js +0 -1
  491. package/build/assets/trash-B6OIe4yX.js +0 -1
  492. package/build/assets/usage-tab-Cm-9j3UK.js +0 -1
  493. package/build/assets/use-acp-credential-form-BARcvjYE.js +0 -1
  494. package/build/assets/use-agent-profiles-1P91KSXz.js +0 -1
  495. package/build/assets/use-create-secret-D8p9ybQj.js +0 -1
  496. package/build/assets/use-is-authed-BRPjCRKM.js +0 -1
  497. package/build/assets/use-llm-configured-DGm8FiRR.js +0 -1
  498. package/build/assets/use-llm-profiles-BTTtpW4z.js +0 -1
  499. package/build/assets/use-save-agent-profile-CxyO9YG-.js +0 -1
  500. package/build/assets/use-settings-nav-items-vrjxTqcu.js +0 -16
  501. package/build/assets/useQueries-CykmpT-a.js +0 -1
  502. package/build/assets/useQuery-S6j94er1.js +0 -1
  503. package/build/assets/utils-BOco8mxR.js +0 -1
  504. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +0 -185
  505. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js +0 -1
  506. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js +0 -1
  507. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +0 -1
@@ -693,6 +693,7 @@
693
693
  "SETTINGS$RESET": "Impostazioni ripristinate",
694
694
  "SETTINGS$API_KEYS": "Chiavi API",
695
695
  "SETTINGS$API_KEYS_DESCRIPTION": "Le chiavi API ti consentono di autenticarti con l'API OpenHands in modo programmatico. Mantieni le tue chiavi API al sicuro; chiunque abbia la tua chiave API può accedere al tuo account. Per ulteriori informazioni su come utilizzare l'API, consulta la nostra <a>documentazione API</a>.",
696
+ "SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "Modelli OpenHands gratuiti: {{ids}}. Gli endpoint di altri provider con nomi di modello simili potrebbero richiedere una fatturazione separata.",
696
697
  "SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "Puoi trovare la tua OpenHands Provider LLM Key nella",
697
698
  "SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
698
699
  "SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "sezione di OpenHands Cloud -",
@@ -875,6 +876,7 @@
875
876
  "AUTOMATIONS$DETAIL$PLUGINS": "Plugin",
876
877
  "AUTOMATIONS$DETAIL$PROMPT": "Prompt",
877
878
  "AUTOMATIONS$DETAIL$REPOSITORIES": "Repository",
879
+ "AUTOMATIONS$DETAIL$RUNS_AS": "L'automazione viene eseguita come",
878
880
  "AUTOMATIONS$DETAIL$SCHEDULE": "Pianificazione",
879
881
  "AUTOMATIONS$DETAIL$SUCCESSFUL": "Riuscito",
880
882
  "AUTOMATIONS$DETAIL$TRIGGER": "Trigger",
@@ -1147,7 +1149,6 @@
1147
1149
  "CONVERSATION$TOTAL_COST": "Costo totale",
1148
1150
  "CONVERSATION$BUDGET": "Budget",
1149
1151
  "CONVERSATION$BUDGET_USAGE": "% utilizzato",
1150
- "CONVERSATION$NO_BUDGET_LIMIT": "Nessun limite di budget",
1151
1152
  "CONVERSATION$INPUT": "Input",
1152
1153
  "CONVERSATION$OUTPUT": "Output",
1153
1154
  "CONVERSATION$TOTAL": "Totale",
@@ -2451,5 +2452,8 @@
2451
2452
  "SETTINGS$PROVIDER_CONNECTION_PROVIDER": "Provider",
2452
2453
  "SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "Lascia vuoto per mantenere la chiave attuale.",
2453
2454
  "SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "Connessione provider",
2454
- "SETTINGS$PROVIDER_CONNECTION_UPDATED": "Connessione \"{{name}}\" aggiornata"
2455
+ "SETTINGS$PROVIDER_CONNECTION_UPDATED": "Connessione \"{{name}}\" aggiornata",
2456
+ "BUTTON$VIEW_FULL_SIZE_IMAGE": "Visualizza immagine a dimensione originale",
2457
+ "BUTTON$REMOVE_IMAGE": "Rimuovi immagine",
2458
+ "IMAGE$FULL_SIZE_PREVIEW": "Anteprima dell'immagine a dimensione originale"
2455
2459
  }
@@ -693,6 +693,7 @@
693
693
  "SETTINGS$RESET": "設定がリセットされました",
694
694
  "SETTINGS$API_KEYS": "APIキー",
695
695
  "SETTINGS$API_KEYS_DESCRIPTION": "APIキーを使用すると、OpenHands APIにプログラムで認証できます。APIキーは安全に保管してください。APIキーを持っている人は誰でもあなたのアカウントにアクセスできます。APIの使用方法の詳細については、<a>APIドキュメント</a>をご覧ください。",
696
+ "SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "無料の OpenHands モデル: {{ids}}。同じようなモデル名を持つ他のプロバイダーのエンドポイントでは、別途料金が発生する場合があります。",
696
697
  "SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "OpenHands Provider LLM Key は",
697
698
  "SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
698
699
  "SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "セクションで確認できます -",
@@ -875,6 +876,7 @@
875
876
  "AUTOMATIONS$DETAIL$PLUGINS": "プラグイン",
876
877
  "AUTOMATIONS$DETAIL$PROMPT": "プロンプト",
877
878
  "AUTOMATIONS$DETAIL$REPOSITORIES": "リポジトリ",
879
+ "AUTOMATIONS$DETAIL$RUNS_AS": "自動化の実行ユーザー",
878
880
  "AUTOMATIONS$DETAIL$SCHEDULE": "スケジュール",
879
881
  "AUTOMATIONS$DETAIL$SUCCESSFUL": "成功",
880
882
  "AUTOMATIONS$DETAIL$TRIGGER": "トリガー",
@@ -1147,7 +1149,6 @@
1147
1149
  "CONVERSATION$TOTAL_COST": "合計コスト",
1148
1150
  "CONVERSATION$BUDGET": "予算",
1149
1151
  "CONVERSATION$BUDGET_USAGE": "% 使用済み",
1150
- "CONVERSATION$NO_BUDGET_LIMIT": "予算制限なし",
1151
1152
  "CONVERSATION$INPUT": "入力",
1152
1153
  "CONVERSATION$OUTPUT": "出力",
1153
1154
  "CONVERSATION$TOTAL": "合計",
@@ -2451,5 +2452,8 @@
2451
2452
  "SETTINGS$PROVIDER_CONNECTION_PROVIDER": "プロバイダー",
2452
2453
  "SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "現在のキーを保持するには空白のままにします。",
2453
2454
  "SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "プロバイダー接続",
2454
- "SETTINGS$PROVIDER_CONNECTION_UPDATED": "接続「{{name}}」を更新しました"
2455
+ "SETTINGS$PROVIDER_CONNECTION_UPDATED": "接続「{{name}}」を更新しました",
2456
+ "BUTTON$VIEW_FULL_SIZE_IMAGE": "フルサイズの画像を表示",
2457
+ "BUTTON$REMOVE_IMAGE": "画像を削除",
2458
+ "IMAGE$FULL_SIZE_PREVIEW": "フルサイズの画像プレビュー"
2455
2459
  }
@@ -693,6 +693,7 @@
693
693
  "SETTINGS$RESET": "설정이 초기화되었습니다",
694
694
  "SETTINGS$API_KEYS": "API 키",
695
695
  "SETTINGS$API_KEYS_DESCRIPTION": "API 키를 사용하면 OpenHands API에 프로그래밍 방식으로 인증할 수 있습니다. API 키를 안전하게 보관하세요. API 키가 있는 사람은 누구나 귀하의 계정에 액세스할 수 있습니다. API 사용 방법에 대한 자세한 내용은 <a>API 문서</a>를 참조하세요.",
696
+ "SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "무료 OpenHands 모델: {{ids}}. 이름이 비슷한 다른 제공업체의 모델 엔드포인트에는 별도 요금이 부과될 수 있습니다.",
696
697
  "SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "OpenHands Provider LLM Key는",
697
698
  "SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
698
699
  "SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "섹션에서 찾을 수 있습니다 -",
@@ -875,6 +876,7 @@
875
876
  "AUTOMATIONS$DETAIL$PLUGINS": "플러그인",
876
877
  "AUTOMATIONS$DETAIL$PROMPT": "프롬프트",
877
878
  "AUTOMATIONS$DETAIL$REPOSITORIES": "저장소",
879
+ "AUTOMATIONS$DETAIL$RUNS_AS": "자동화 실행 계정",
878
880
  "AUTOMATIONS$DETAIL$SCHEDULE": "일정",
879
881
  "AUTOMATIONS$DETAIL$SUCCESSFUL": "성공",
880
882
  "AUTOMATIONS$DETAIL$TRIGGER": "트리거",
@@ -1147,7 +1149,6 @@
1147
1149
  "CONVERSATION$TOTAL_COST": "총 비용",
1148
1150
  "CONVERSATION$BUDGET": "예산",
1149
1151
  "CONVERSATION$BUDGET_USAGE": "% 사용됨",
1150
- "CONVERSATION$NO_BUDGET_LIMIT": "예산 제한 없음",
1151
1152
  "CONVERSATION$INPUT": "입력",
1152
1153
  "CONVERSATION$OUTPUT": "출력",
1153
1154
  "CONVERSATION$TOTAL": "총계",
@@ -2451,5 +2452,8 @@
2451
2452
  "SETTINGS$PROVIDER_CONNECTION_PROVIDER": "공급자",
2452
2453
  "SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "현재 키를 유지하려면 비워 두세요.",
2453
2454
  "SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "공급자 연결",
2454
- "SETTINGS$PROVIDER_CONNECTION_UPDATED": "\"{{name}}\" 연결이 업데이트되었습니다"
2455
+ "SETTINGS$PROVIDER_CONNECTION_UPDATED": "\"{{name}}\" 연결이 업데이트되었습니다",
2456
+ "BUTTON$VIEW_FULL_SIZE_IMAGE": "원본 크기 이미지 보기",
2457
+ "BUTTON$REMOVE_IMAGE": "이미지 제거",
2458
+ "IMAGE$FULL_SIZE_PREVIEW": "원본 크기 이미지 미리보기"
2455
2459
  }
@@ -693,6 +693,7 @@
693
693
  "SETTINGS$RESET": "Innstillinger tilbakestilt",
694
694
  "SETTINGS$API_KEYS": "API-nøkler",
695
695
  "SETTINGS$API_KEYS_DESCRIPTION": "API-nøkler lar deg autentisere med OpenHands API programmatisk. Hold API-nøklene dine sikre; alle med API-nøkkelen din kan få tilgang til kontoen din. For mer informasjon om hvordan du bruker API-et, se vår <a>API-dokumentasjon</a>.",
696
+ "SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "Gratis OpenHands-modeller: {{ids}}. Endepunkter hos andre leverandører med lignende modellnavn kan kreve separat betaling.",
696
697
  "SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "Du kan finne din OpenHands Provider LLM Key i",
697
698
  "SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
698
699
  "SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "-seksjonen i OpenHands Cloud -",
@@ -875,6 +876,7 @@
875
876
  "AUTOMATIONS$DETAIL$PLUGINS": "Plugins",
876
877
  "AUTOMATIONS$DETAIL$PROMPT": "Ledetekst",
877
878
  "AUTOMATIONS$DETAIL$REPOSITORIES": "Repositorier",
879
+ "AUTOMATIONS$DETAIL$RUNS_AS": "Automatiseringen kjører som",
878
880
  "AUTOMATIONS$DETAIL$SCHEDULE": "Tidsplan",
879
881
  "AUTOMATIONS$DETAIL$SUCCESSFUL": "Vellykket",
880
882
  "AUTOMATIONS$DETAIL$TRIGGER": "Utløser",
@@ -1147,7 +1149,6 @@
1147
1149
  "CONVERSATION$TOTAL_COST": "Total kostnad",
1148
1150
  "CONVERSATION$BUDGET": "Budsjett",
1149
1151
  "CONVERSATION$BUDGET_USAGE": "% brukt",
1150
- "CONVERSATION$NO_BUDGET_LIMIT": "Ingen budsjettgrense",
1151
1152
  "CONVERSATION$INPUT": "Inndata",
1152
1153
  "CONVERSATION$OUTPUT": "Utdata",
1153
1154
  "CONVERSATION$TOTAL": "Totalt",
@@ -2451,5 +2452,8 @@
2451
2452
  "SETTINGS$PROVIDER_CONNECTION_PROVIDER": "Leverandør",
2452
2453
  "SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "La stå tom for å beholde gjeldende nøkkel.",
2453
2454
  "SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "Leverandørtilkobling",
2454
- "SETTINGS$PROVIDER_CONNECTION_UPDATED": "Tilkoblingen «{{name}}» ble oppdatert"
2455
+ "SETTINGS$PROVIDER_CONNECTION_UPDATED": "Tilkoblingen «{{name}}» ble oppdatert",
2456
+ "BUTTON$VIEW_FULL_SIZE_IMAGE": "Vis bildet i full størrelse",
2457
+ "BUTTON$REMOVE_IMAGE": "Fjern bilde",
2458
+ "IMAGE$FULL_SIZE_PREVIEW": "Forhåndsvisning av bilde i full størrelse"
2455
2459
  }
@@ -693,6 +693,7 @@
693
693
  "SETTINGS$RESET": "Configurações redefinidas",
694
694
  "SETTINGS$API_KEYS": "Chaves API",
695
695
  "SETTINGS$API_KEYS_DESCRIPTION": "As chaves de API permitem que você se autentique com a API OpenHands programaticamente. Mantenha suas chaves de API seguras; qualquer pessoa com sua chave de API pode acessar sua conta. Para obter mais informações sobre como usar a API, consulte nossa <a>documentação da API</a>.",
696
+ "SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "Modelos OpenHands gratuitos: {{ids}}. Endpoints de outros provedores com nomes de modelo semelhantes podem exigir cobrança separada.",
696
697
  "SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "Você pode encontrar sua OpenHands Provider LLM Key na",
697
698
  "SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
698
699
  "SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "seção do OpenHands Cloud -",
@@ -875,6 +876,7 @@
875
876
  "AUTOMATIONS$DETAIL$PLUGINS": "Plugins",
876
877
  "AUTOMATIONS$DETAIL$PROMPT": "Prompt",
877
878
  "AUTOMATIONS$DETAIL$REPOSITORIES": "Repositórios",
879
+ "AUTOMATIONS$DETAIL$RUNS_AS": "A automação é executada como",
878
880
  "AUTOMATIONS$DETAIL$SCHEDULE": "Agendamento",
879
881
  "AUTOMATIONS$DETAIL$SUCCESSFUL": "Bem-sucedido",
880
882
  "AUTOMATIONS$DETAIL$TRIGGER": "Acionador",
@@ -1147,7 +1149,6 @@
1147
1149
  "CONVERSATION$TOTAL_COST": "Custo total",
1148
1150
  "CONVERSATION$BUDGET": "Orçamento",
1149
1151
  "CONVERSATION$BUDGET_USAGE": "% utilizado",
1150
- "CONVERSATION$NO_BUDGET_LIMIT": "Sem limite de orçamento",
1151
1152
  "CONVERSATION$INPUT": "Entrada",
1152
1153
  "CONVERSATION$OUTPUT": "Saída",
1153
1154
  "CONVERSATION$TOTAL": "Total",
@@ -2451,5 +2452,8 @@
2451
2452
  "SETTINGS$PROVIDER_CONNECTION_PROVIDER": "Provedor",
2452
2453
  "SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "Deixe em branco para manter a chave atual.",
2453
2454
  "SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "Conexão de provedor",
2454
- "SETTINGS$PROVIDER_CONNECTION_UPDATED": "Conexão \"{{name}}\" atualizada"
2455
+ "SETTINGS$PROVIDER_CONNECTION_UPDATED": "Conexão \"{{name}}\" atualizada",
2456
+ "BUTTON$VIEW_FULL_SIZE_IMAGE": "Ver imagem em tamanho original",
2457
+ "BUTTON$REMOVE_IMAGE": "Remover imagem",
2458
+ "IMAGE$FULL_SIZE_PREVIEW": "Pré-visualização da imagem em tamanho original"
2455
2459
  }
@@ -693,6 +693,7 @@
693
693
  "SETTINGS$RESET": "Ayarlar sıfırlandı",
694
694
  "SETTINGS$API_KEYS": "API Anahtarları",
695
695
  "SETTINGS$API_KEYS_DESCRIPTION": "API anahtarları, OpenHands API ile programlı olarak kimlik doğrulamanıza olanak tanır. API anahtarlarınızı güvende tutun; API anahtarınıza sahip olan herkes hesabınıza erişebilir. API'nin nasıl kullanılacağı hakkında daha fazla bilgi için <a>API belgelerimize</a> bakın.",
696
+ "SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "Ücretsiz OpenHands modelleri: {{ids}}. Benzer model adlarına sahip diğer sağlayıcı uç noktaları ayrı ücretlendirme gerektirebilir.",
696
697
  "SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "OpenHands Provider LLM Key'inizi",
697
698
  "SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
698
699
  "SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "OpenHands Cloud'un bölümünde bulabilirsiniz -",
@@ -875,6 +876,7 @@
875
876
  "AUTOMATIONS$DETAIL$PLUGINS": "Eklentiler",
876
877
  "AUTOMATIONS$DETAIL$PROMPT": "İstem",
877
878
  "AUTOMATIONS$DETAIL$REPOSITORIES": "Depolar",
879
+ "AUTOMATIONS$DETAIL$RUNS_AS": "Otomasyon şu kimlikle çalışır",
878
880
  "AUTOMATIONS$DETAIL$SCHEDULE": "Zamanlama",
879
881
  "AUTOMATIONS$DETAIL$SUCCESSFUL": "Başarılı",
880
882
  "AUTOMATIONS$DETAIL$TRIGGER": "Tetikleyici",
@@ -1147,7 +1149,6 @@
1147
1149
  "CONVERSATION$TOTAL_COST": "Toplam Maliyet",
1148
1150
  "CONVERSATION$BUDGET": "Bütçe",
1149
1151
  "CONVERSATION$BUDGET_USAGE": "% kullanıldı",
1150
- "CONVERSATION$NO_BUDGET_LIMIT": "Bütçe limiti yok",
1151
1152
  "CONVERSATION$INPUT": "Giriş",
1152
1153
  "CONVERSATION$OUTPUT": "Çıkış",
1153
1154
  "CONVERSATION$TOTAL": "Toplam",
@@ -2451,5 +2452,8 @@
2451
2452
  "SETTINGS$PROVIDER_CONNECTION_PROVIDER": "Sağlayıcı",
2452
2453
  "SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "Mevcut anahtarı korumak için boş bırakın.",
2453
2454
  "SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "Sağlayıcı bağlantısı",
2454
- "SETTINGS$PROVIDER_CONNECTION_UPDATED": "\"{{name}}\" bağlantısı güncellendi"
2455
+ "SETTINGS$PROVIDER_CONNECTION_UPDATED": "\"{{name}}\" bağlantısı güncellendi",
2456
+ "BUTTON$VIEW_FULL_SIZE_IMAGE": "Görseli tam boyutta görüntüle",
2457
+ "BUTTON$REMOVE_IMAGE": "Görseli kaldır",
2458
+ "IMAGE$FULL_SIZE_PREVIEW": "Tam boyutlu görsel önizlemesi"
2455
2459
  }
@@ -693,6 +693,7 @@
693
693
  "SETTINGS$RESET": "Скидання налаштувань",
694
694
  "SETTINGS$API_KEYS": "API ключі",
695
695
  "SETTINGS$API_KEYS_DESCRIPTION": "Ключі API дозволяють вам програмно автентифікуватися за допомогою API OpenHands. Зберігайте свої ключі API в безпеці; будь-хто, хто має ваш ключ API, може отримати доступ до вашого облікового запису. Для отримання додаткової інформації про використання API, перегляньте нашу <a>документацію API</a>.",
696
+ "SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "Безкоштовні моделі OpenHands: {{ids}}. Кінцеві точки інших постачальників зі схожими назвами моделей можуть потребувати окремої оплати.",
696
697
  "SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "Ви можете знайти свій OpenHands Provider LLM Key у",
697
698
  "SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
698
699
  "SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "розділі OpenHands Cloud -",
@@ -875,6 +876,7 @@
875
876
  "AUTOMATIONS$DETAIL$PLUGINS": "Плагіни",
876
877
  "AUTOMATIONS$DETAIL$PROMPT": "Запит",
877
878
  "AUTOMATIONS$DETAIL$REPOSITORIES": "Репозиторії",
879
+ "AUTOMATIONS$DETAIL$RUNS_AS": "Автоматизація виконується від імені",
878
880
  "AUTOMATIONS$DETAIL$SCHEDULE": "Розклад",
879
881
  "AUTOMATIONS$DETAIL$SUCCESSFUL": "Успішно",
880
882
  "AUTOMATIONS$DETAIL$TRIGGER": "Тригер",
@@ -1147,7 +1149,6 @@
1147
1149
  "CONVERSATION$TOTAL_COST": "Загальна вартість",
1148
1150
  "CONVERSATION$BUDGET": "Бюджет",
1149
1151
  "CONVERSATION$BUDGET_USAGE": "% використано",
1150
- "CONVERSATION$NO_BUDGET_LIMIT": "Без обмеження бюджету",
1151
1152
  "CONVERSATION$INPUT": "Вхідні дані",
1152
1153
  "CONVERSATION$OUTPUT": "Результат",
1153
1154
  "CONVERSATION$TOTAL": "Всього",
@@ -2451,5 +2452,8 @@
2451
2452
  "SETTINGS$PROVIDER_CONNECTION_PROVIDER": "Постачальник",
2452
2453
  "SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "Залиште порожнім, щоб зберегти поточний ключ.",
2453
2454
  "SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "Підключення постачальника",
2454
- "SETTINGS$PROVIDER_CONNECTION_UPDATED": "Підключення \"{{name}}\" оновлено"
2455
+ "SETTINGS$PROVIDER_CONNECTION_UPDATED": "Підключення \"{{name}}\" оновлено",
2456
+ "BUTTON$VIEW_FULL_SIZE_IMAGE": "Переглянути зображення в повному розмірі",
2457
+ "BUTTON$REMOVE_IMAGE": "Видалити зображення",
2458
+ "IMAGE$FULL_SIZE_PREVIEW": "Попередній перегляд зображення в повному розмірі"
2455
2459
  }
@@ -693,6 +693,7 @@
693
693
  "SETTINGS$RESET": "设置已重置",
694
694
  "SETTINGS$API_KEYS": "API密钥",
695
695
  "SETTINGS$API_KEYS_DESCRIPTION": "API密钥允许您以编程方式验证OpenHands API。请确保您的API密钥安全;任何拥有您API密钥的人都可以访问您的账户。有关如何使用API的更多信息,请参阅我们的<a>API文档</a>。",
696
+ "SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "免费的 OpenHands 模型:{{ids}}。其他提供商中名称相似的模型端点可能需要单独付费。",
696
697
  "SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "您可以在",
697
698
  "SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
698
699
  "SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "部分中找到您的 OpenHands Provider LLM Key -",
@@ -875,6 +876,7 @@
875
876
  "AUTOMATIONS$DETAIL$PLUGINS": "插件",
876
877
  "AUTOMATIONS$DETAIL$PROMPT": "提示",
877
878
  "AUTOMATIONS$DETAIL$REPOSITORIES": "仓库",
879
+ "AUTOMATIONS$DETAIL$RUNS_AS": "自动化运行身份",
878
880
  "AUTOMATIONS$DETAIL$SCHEDULE": "计划",
879
881
  "AUTOMATIONS$DETAIL$SUCCESSFUL": "成功",
880
882
  "AUTOMATIONS$DETAIL$TRIGGER": "触发器",
@@ -1147,7 +1149,6 @@
1147
1149
  "CONVERSATION$TOTAL_COST": "总成本",
1148
1150
  "CONVERSATION$BUDGET": "预算",
1149
1151
  "CONVERSATION$BUDGET_USAGE": "% 已使用",
1150
- "CONVERSATION$NO_BUDGET_LIMIT": "无预算限制",
1151
1152
  "CONVERSATION$INPUT": "输入",
1152
1153
  "CONVERSATION$OUTPUT": "输出",
1153
1154
  "CONVERSATION$TOTAL": "总计",
@@ -2451,5 +2452,8 @@
2451
2452
  "SETTINGS$PROVIDER_CONNECTION_PROVIDER": "提供商",
2452
2453
  "SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "留空以保留当前密钥。",
2453
2454
  "SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "提供商连接",
2454
- "SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新连接“{{name}}”"
2455
+ "SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新连接“{{name}}”",
2456
+ "BUTTON$VIEW_FULL_SIZE_IMAGE": "查看原始尺寸图片",
2457
+ "BUTTON$REMOVE_IMAGE": "移除图片",
2458
+ "IMAGE$FULL_SIZE_PREVIEW": "原始尺寸图片预览"
2455
2459
  }
@@ -693,6 +693,7 @@
693
693
  "SETTINGS$RESET": "設置已重置",
694
694
  "SETTINGS$API_KEYS": "API金鑰",
695
695
  "SETTINGS$API_KEYS_DESCRIPTION": "API密鑰允許您以編程方式驗證OpenHands API。請確保您的API密鑰安全;任何擁有您API密鑰的人都可以訪問您的賬戶。有關如何使用API的更多信息,請參閱我們的<a>API文檔</a>。",
696
+ "SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "免費的 OpenHands 模型:{{ids}}。其他供應商中名稱相似的模型端點可能需要另外付費。",
696
697
  "SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "您可以在",
697
698
  "SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
698
699
  "SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "區塊中找到您的 OpenHands Provider LLM Key -",
@@ -875,6 +876,7 @@
875
876
  "AUTOMATIONS$DETAIL$PLUGINS": "外掛",
876
877
  "AUTOMATIONS$DETAIL$PROMPT": "提示",
877
878
  "AUTOMATIONS$DETAIL$REPOSITORIES": "存放庫",
879
+ "AUTOMATIONS$DETAIL$RUNS_AS": "自動化執行身分",
878
880
  "AUTOMATIONS$DETAIL$SCHEDULE": "排程",
879
881
  "AUTOMATIONS$DETAIL$SUCCESSFUL": "成功",
880
882
  "AUTOMATIONS$DETAIL$TRIGGER": "觸發器",
@@ -1147,7 +1149,6 @@
1147
1149
  "CONVERSATION$TOTAL_COST": "總成本",
1148
1150
  "CONVERSATION$BUDGET": "預算",
1149
1151
  "CONVERSATION$BUDGET_USAGE": "% 已使用",
1150
- "CONVERSATION$NO_BUDGET_LIMIT": "無預算限制",
1151
1152
  "CONVERSATION$INPUT": "輸入",
1152
1153
  "CONVERSATION$OUTPUT": "輸出",
1153
1154
  "CONVERSATION$TOTAL": "總計",
@@ -2451,5 +2452,8 @@
2451
2452
  "SETTINGS$PROVIDER_CONNECTION_PROVIDER": "提供者",
2452
2453
  "SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "留空以保留目前的金鑰。",
2453
2454
  "SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "提供者連線",
2454
- "SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新連線「{{name}}」"
2455
+ "SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新連線「{{name}}」",
2456
+ "BUTTON$VIEW_FULL_SIZE_IMAGE": "檢視原始尺寸圖片",
2457
+ "BUTTON$REMOVE_IMAGE": "移除圖片",
2458
+ "IMAGE$FULL_SIZE_PREVIEW": "原始尺寸圖片預覽"
2455
2459
  }
@@ -2,7 +2,7 @@
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
4
  "agentServer": "1.46.0",
5
- "agentCanvas": "1.17.0",
5
+ "agentCanvas": "1.18.0",
6
6
  "automation": "1.11.1"
7
7
  },
8
8
  "compatibility": {
@@ -1 +1 @@
1
- {"version":3,"file":"organization-service.api.cjs","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import { HttpError } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Calls the cloud API directly with the backend's bearer token.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (e instanceof HttpError && e.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n *\n * `role` is the caller's role in the org (`owner` | `admin` | `member`, or\n * `null` if the upstream omits it). `permissions` is the server-defined\n * permission set for that role (e.g. `edit_org_settings`); it is `null` on\n * older app-servers that don't return it, so callers fall back to the role.\n * See `useCanManageOrgProfiles`.\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{\n orgId: string;\n userId: string;\n role: string | null;\n permissions?: string[] | null;\n}> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{\n org_id: string;\n user_id: string;\n role?: string;\n permissions?: string[];\n }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n role: data?.role ?? null,\n // `null` when the field is absent (older app-server) so callers can fall\n // back to a role check; a present array is the server's source of truth.\n permissions: Array.isArray(data?.permissions) ? data.permissions : null,\n };\n}\n"],"mappings":"oSAeA,SAAS,EACP,EACqB,CACrB,MAAO,CACL,MAAO,GAAM,OAAS,CAAC,EACvB,aAAc,GAAM,gBAAkB,IACxC,CACF,CAEA,SAAS,EAAe,EAA4B,CAClD,GAAI,EAAS,OAAO,EACpB,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAClC,GAAI,EAAO,OAAS,QAClB,MAAU,MACR,4EACF,EAEF,OAAO,CACT,CASA,eAAsB,EACpB,EAC8B,CAO9B,OAAO,EAAgB,MALJ,EAAA,eAA2C,CAC5D,QAFa,EAAe,CAEnB,EACT,OAAQ,MACR,KAAM,oBACR,CAAC,CAC0B,CAC7B,CAaA,eAAsB,EACpB,EACyD,CACzD,IAAM,EAAS,EAAe,CAAO,EACrC,GAAI,CAMF,MAAO,CAAE,OAAO,MALG,EAAA,eAAoC,CACrD,QAAS,EACT,OAAQ,MACR,KAAM,mBACR,CAAC,IACqB,QAAU,KAAM,YAAa,EAAM,CAC3D,OAAS,EAAG,CACV,GAAI,aAAa,EAAA,WAAa,EAAE,SAAW,IACzC,MAAO,CAAE,MAAO,KAAM,YAAa,EAAK,EAE1C,MAAM,CACR,CACF,CAeA,eAAsB,EACpB,EACA,EAMC,CAED,IAAM,EAAO,MAAM,EAAA,eAKhB,CACD,QAPa,EAAe,CAOnB,EACT,OAAQ,MACR,KAAM,sBAAsB,mBAAmB,CAAK,EAAE,IACxD,CAAC,EACD,MAAO,CACL,MAAO,GAAM,QAAU,EACvB,OAAQ,GAAM,SAAW,GACzB,KAAM,GAAM,MAAQ,KAGpB,YAAa,MAAM,QAAQ,GAAM,WAAW,EAAI,EAAK,YAAc,IACrE,CACF"}
1
+ {"version":3,"file":"organization-service.api.cjs","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import { HttpError } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationMember,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Calls the cloud API directly with the backend's bearer token.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (e instanceof HttpError && e.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n *\n * `role` is the caller's role in the org (`owner` | `admin` | `member`, or\n * `null` if the upstream omits it). `permissions` is the server-defined\n * permission set for that role (e.g. `edit_org_settings`); it is `null` on\n * older app-servers that don't return it, so callers fall back to the role.\n * See `useCanManageOrgProfiles`.\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{\n orgId: string;\n userId: string;\n role: string | null;\n permissions?: string[] | null;\n}> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{\n org_id: string;\n user_id: string;\n role?: string;\n permissions?: string[];\n }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n role: data?.role ?? null,\n // `null` when the field is absent (older app-server) so callers can fall\n // back to a role check; a present array is the server's source of truth.\n permissions: Array.isArray(data?.permissions) ? data.permissions : null,\n };\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/members/{userId}`: one member of\n * `orgId` by user id. Any org member may read it (same permission as the\n * members list). The upstream responds 404 when `userId` is not (or no\n * longer) a member of the org, and older app-servers that predate the route\n * 404 as well, so callers should treat a failure as \"identity unresolved\".\n */\nexport async function getCloudOrganizationMember(\n orgId: string,\n userId: string,\n backend?: Backend,\n): Promise<CloudOrganizationMember> {\n const target = resolveBackend(backend);\n return callCloudProxy<CloudOrganizationMember>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/members/${encodeURIComponent(userId)}`,\n });\n}\n"],"mappings":"oSAgBA,SAAS,EACP,EACqB,CACrB,MAAO,CACL,MAAO,GAAM,OAAS,CAAC,EACvB,aAAc,GAAM,gBAAkB,IACxC,CACF,CAEA,SAAS,EAAe,EAA4B,CAClD,GAAI,EAAS,OAAO,EACpB,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAClC,GAAI,EAAO,OAAS,QAClB,MAAU,MACR,4EACF,EAEF,OAAO,CACT,CASA,eAAsB,EACpB,EAC8B,CAO9B,OAAO,EAAgB,MALJ,EAAA,eAA2C,CAC5D,QAFa,EAAe,CAEnB,EACT,OAAQ,MACR,KAAM,oBACR,CAAC,CAC0B,CAC7B,CAaA,eAAsB,EACpB,EACyD,CACzD,IAAM,EAAS,EAAe,CAAO,EACrC,GAAI,CAMF,MAAO,CAAE,OAAO,MALG,EAAA,eAAoC,CACrD,QAAS,EACT,OAAQ,MACR,KAAM,mBACR,CAAC,IACqB,QAAU,KAAM,YAAa,EAAM,CAC3D,OAAS,EAAG,CACV,GAAI,aAAa,EAAA,WAAa,EAAE,SAAW,IACzC,MAAO,CAAE,MAAO,KAAM,YAAa,EAAK,EAE1C,MAAM,CACR,CACF,CAeA,eAAsB,EACpB,EACA,EAMC,CAED,IAAM,EAAO,MAAM,EAAA,eAKhB,CACD,QAPa,EAAe,CAOnB,EACT,OAAQ,MACR,KAAM,sBAAsB,mBAAmB,CAAK,EAAE,IACxD,CAAC,EACD,MAAO,CACL,MAAO,GAAM,QAAU,EACvB,OAAQ,GAAM,SAAW,GACzB,KAAM,GAAM,MAAQ,KAGpB,YAAa,MAAM,QAAQ,GAAM,WAAW,EAAI,EAAK,YAAc,IACrE,CACF"}
@@ -1,5 +1,5 @@
1
1
  import type { Backend } from "../backend-registry/types";
2
- import type { CloudOrganization } from "./types";
2
+ import type { CloudOrganization, CloudOrganizationMember } from "./types";
3
3
  interface OrganizationsResult {
4
4
  items: CloudOrganization[];
5
5
  currentOrgId: string | null;
@@ -46,4 +46,12 @@ export declare function getCloudOrganizationMe(orgId: string, backend?: Backend)
46
46
  role: string | null;
47
47
  permissions?: string[] | null;
48
48
  }>;
49
+ /**
50
+ * Fetch `GET /api/organizations/{orgId}/members/{userId}`: one member of
51
+ * `orgId` by user id. Any org member may read it (same permission as the
52
+ * members list). The upstream responds 404 when `userId` is not (or no
53
+ * longer) a member of the org, and older app-servers that predate the route
54
+ * 404 as well, so callers should treat a failure as "identity unresolved".
55
+ */
56
+ export declare function getCloudOrganizationMember(orgId: string, userId: string, backend?: Backend): Promise<CloudOrganizationMember>;
49
57
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"organization-service.api.js","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import { HttpError } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Calls the cloud API directly with the backend's bearer token.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (e instanceof HttpError && e.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n *\n * `role` is the caller's role in the org (`owner` | `admin` | `member`, or\n * `null` if the upstream omits it). `permissions` is the server-defined\n * permission set for that role (e.g. `edit_org_settings`); it is `null` on\n * older app-servers that don't return it, so callers fall back to the role.\n * See `useCanManageOrgProfiles`.\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{\n orgId: string;\n userId: string;\n role: string | null;\n permissions?: string[] | null;\n}> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{\n org_id: string;\n user_id: string;\n role?: string;\n permissions?: string[];\n }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n role: data?.role ?? null,\n // `null` when the field is absent (older app-server) so callers can fall\n // back to a role check; a present array is the server's source of truth.\n permissions: Array.isArray(data?.permissions) ? data.permissions : null,\n };\n}\n"],"mappings":";;;;;AAeA,SAAS,EACP,GACqB;CACrB,OAAO;EACL,OAAO,GAAM,SAAS,CAAC;EACvB,cAAc,GAAM,kBAAkB;CACxC;AACF;AAEA,SAAS,EAAe,GAA4B;CAClD,IAAI,GAAS,OAAO;CACpB,IAAM,IAAS,EAAiB,EAAE;CAClC,IAAI,EAAO,SAAS,SAClB,MAAU,MACR,4EACF;CAEF,OAAO;AACT;AASA,eAAsB,EACpB,GAC8B;CAO9B,OAAO,EAAgB,MALJ,EAA2C;EAC5D,SAFa,EAAe,CAEnB;EACT,QAAQ;EACR,MAAM;CACR,CAAC,CAC0B;AAC7B;AAaA,eAAsB,EACpB,GACyD;CACzD,IAAM,IAAS,EAAe,CAAO;CACrC,IAAI;EAMF,OAAO;GAAE,QAAO,MALG,EAAoC;IACrD,SAAS;IACT,QAAQ;IACR,MAAM;GACR,CAAC,IACqB,UAAU;GAAM,aAAa;EAAM;CAC3D,SAAS,GAAG;EACV,IAAI,aAAa,KAAa,EAAE,WAAW,KACzC,OAAO;GAAE,OAAO;GAAM,aAAa;EAAK;EAE1C,MAAM;CACR;AACF;AAeA,eAAsB,EACpB,GACA,GAMC;CAED,IAAM,IAAO,MAAM,EAKhB;EACD,SAPa,EAAe,CAOnB;EACT,QAAQ;EACR,MAAM,sBAAsB,mBAAmB,CAAK,EAAE;CACxD,CAAC;CACD,OAAO;EACL,OAAO,GAAM,UAAU;EACvB,QAAQ,GAAM,WAAW;EACzB,MAAM,GAAM,QAAQ;EAGpB,aAAa,MAAM,QAAQ,GAAM,WAAW,IAAI,EAAK,cAAc;CACrE;AACF"}
1
+ {"version":3,"file":"organization-service.api.js","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import { HttpError } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationMember,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Calls the cloud API directly with the backend's bearer token.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (e instanceof HttpError && e.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n *\n * `role` is the caller's role in the org (`owner` | `admin` | `member`, or\n * `null` if the upstream omits it). `permissions` is the server-defined\n * permission set for that role (e.g. `edit_org_settings`); it is `null` on\n * older app-servers that don't return it, so callers fall back to the role.\n * See `useCanManageOrgProfiles`.\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{\n orgId: string;\n userId: string;\n role: string | null;\n permissions?: string[] | null;\n}> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{\n org_id: string;\n user_id: string;\n role?: string;\n permissions?: string[];\n }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n role: data?.role ?? null,\n // `null` when the field is absent (older app-server) so callers can fall\n // back to a role check; a present array is the server's source of truth.\n permissions: Array.isArray(data?.permissions) ? data.permissions : null,\n };\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/members/{userId}`: one member of\n * `orgId` by user id. Any org member may read it (same permission as the\n * members list). The upstream responds 404 when `userId` is not (or no\n * longer) a member of the org, and older app-servers that predate the route\n * 404 as well, so callers should treat a failure as \"identity unresolved\".\n */\nexport async function getCloudOrganizationMember(\n orgId: string,\n userId: string,\n backend?: Backend,\n): Promise<CloudOrganizationMember> {\n const target = resolveBackend(backend);\n return callCloudProxy<CloudOrganizationMember>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/members/${encodeURIComponent(userId)}`,\n });\n}\n"],"mappings":";;;;;AAgBA,SAAS,EACP,GACqB;CACrB,OAAO;EACL,OAAO,GAAM,SAAS,CAAC;EACvB,cAAc,GAAM,kBAAkB;CACxC;AACF;AAEA,SAAS,EAAe,GAA4B;CAClD,IAAI,GAAS,OAAO;CACpB,IAAM,IAAS,EAAiB,EAAE;CAClC,IAAI,EAAO,SAAS,SAClB,MAAU,MACR,4EACF;CAEF,OAAO;AACT;AASA,eAAsB,EACpB,GAC8B;CAO9B,OAAO,EAAgB,MALJ,EAA2C;EAC5D,SAFa,EAAe,CAEnB;EACT,QAAQ;EACR,MAAM;CACR,CAAC,CAC0B;AAC7B;AAaA,eAAsB,EACpB,GACyD;CACzD,IAAM,IAAS,EAAe,CAAO;CACrC,IAAI;EAMF,OAAO;GAAE,QAAO,MALG,EAAoC;IACrD,SAAS;IACT,QAAQ;IACR,MAAM;GACR,CAAC,IACqB,UAAU;GAAM,aAAa;EAAM;CAC3D,SAAS,GAAG;EACV,IAAI,aAAa,KAAa,EAAE,WAAW,KACzC,OAAO;GAAE,OAAO;GAAM,aAAa;EAAK;EAE1C,MAAM;CACR;AACF;AAeA,eAAsB,EACpB,GACA,GAMC;CAED,IAAM,IAAO,MAAM,EAKhB;EACD,SAPa,EAAe,CAOnB;EACT,QAAQ;EACR,MAAM,sBAAsB,mBAAmB,CAAK,EAAE;CACxD,CAAC;CACD,OAAO;EACL,OAAO,GAAM,UAAU;EACvB,QAAQ,GAAM,WAAW;EACzB,MAAM,GAAM,QAAQ;EAGpB,aAAa,MAAM,QAAQ,GAAM,WAAW,IAAI,EAAK,cAAc;CACrE;AACF"}
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@openhands/typescript-client/dist/client/llm-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const t=require("../backend-registry/active-store.cjs"),n=require("../agent-server-client-options.cjs"),r=require("../cloud/proxy.cjs");function i(e,t){if(!t)return e;let n=t.toLowerCase();return e.filter(e=>e.name.toLowerCase().includes(n))}function a(e,t){return t===void 0?e:e.filter(e=>e.verified===t)}function o(e,t){return!t||t<=0?e:e.slice(0,t)}function s(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!==void 0&&t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}var c=class{static async searchModels(c={},l){let u=t.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq,provider__eq:c.provider__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/models/search${e}`})}let d=new e.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getModels(),f]),h=c.provider__eq??null,g=new Set(h?m?.[h]??[]:[]),_=[...g].map(e=>({provider:h,name:e,verified:!0})),v=h?(p??[]).filter(e=>e.startsWith(`${h}/`)).map(e=>e.slice(h.length+1)).filter(e=>e.length>0&&!g.has(e)).map(e=>({provider:h,name:e,verified:!1})):[];return{items:o(a(i([..._,...v],c.query),c.verified__eq),c.limit),next_page_id:null}}static async searchProviders(c={},l){let u=t.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/providers/search${e}`})}let d=new e.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getProviders(),f]),h=new Set(Object.keys(m??{}));return{items:o(a(i([...new Set([...h,...p??[]])].map(e=>({name:e,verified:h.has(e)})),c.query),c.verified__eq),c.limit),next_page_id:null}}};exports.default=c;
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@openhands/typescript-client/dist/client/llm-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const t=require("../backend-registry/active-store.cjs"),n=require("../agent-server-client-options.cjs"),r=require("../cloud/proxy.cjs");function i(e,t){if(!t)return e;let n=t.toLowerCase();return e.filter(e=>e.name.toLowerCase().includes(n))}function a(e,t){return t===void 0?e:e.filter(e=>e.verified===t)}function o(e,t){return!t||t<=0?e:e.slice(0,t)}function s(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!==void 0&&t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}var c=class{static async searchModels(c={},l){let u=t.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq,provider__eq:c.provider__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/models/search${e}`})}let d=new e.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getModels(),f]),h=c.provider__eq??null,g=new Set(h?m?.[h]??[]:[]),_=[...g].map(e=>({provider:h,name:e,verified:!0,free:!1,default:!1})),v=h?(p??[]).filter(e=>e.startsWith(`${h}/`)).map(e=>e.slice(h.length+1)).filter(e=>e.length>0&&!g.has(e)).map(e=>({provider:h,name:e,verified:!1,free:!1,default:!1})):[];return{items:o(a(i([..._,...v],c.query),c.verified__eq),c.limit),next_page_id:null}}static async searchProviders(c={},l){let u=t.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/providers/search${e}`})}let d=new e.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getProviders(),f]),h=new Set(Object.keys(m??{}));return{items:o(a(i([...new Set([...h,...p??[]])].map(e=>({name:e,verified:h.has(e)})),c.query),c.verified__eq),c.limit),next_page_id:null}}};exports.default=c;
2
2
  //# sourceMappingURL=config-service.api.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-service.api.cjs","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":"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"}
1
+ {"version":3,"file":"config-service.api.cjs","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n // The local agent-server has no model database, so it exposes no free /\n // default metadata; both are always false here. Cloud backends embed the\n // DB-driven flags natively on each item (handled above).\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n free: false,\n default: false,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n free: false,\n default: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":"kWAaA,SAAS,EACP,EACA,EACK,CACL,GAAI,CAAC,EACH,OAAO,EAGT,IAAM,EAAkB,EAAM,YAAY,EAC1C,OAAO,EAAM,OAAQ,GACnB,EAAK,KAAK,YAAY,EAAE,SAAS,CAAe,CAClD,CACF,CAEA,SAAS,EACP,EACA,EACK,CAKL,OAJI,IAAa,IAAA,GACR,EAGF,EAAM,OAAQ,GAAS,EAAK,WAAa,CAAQ,CAC1D,CAEA,SAAS,EAAc,EAAY,EAAqB,CAKtD,MAJI,CAAC,GAAS,GAAS,EACd,EAGF,EAAM,MAAM,EAAG,CAAK,CAC7B,CAEA,SAAS,EACP,EACQ,CACR,IAAM,EAAK,IAAI,gBACf,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAM,EAC1C,IAAU,IAAA,IAAW,EAAG,IAAI,EAAK,OAAO,CAAK,CAAC,EAEpD,IAAM,EAAM,EAAG,SAAS,EACxB,OAAO,EAAM,IAAI,IAAQ,EAC3B,CAEA,IAAM,EAAN,KAAoB,CAOlB,aAAa,aACX,EAA6B,CAAC,EAC9B,EACuB,CACvB,IAAM,EAAS,EAAA,iBAAiB,EAEhC,GAAI,EAAO,QAAQ,OAAS,QAAS,CAGnC,IAAM,EAAK,EAAsB,CAC/B,QAAS,EAAO,QAChB,MAAO,EAAO,MACd,MAAO,EAAO,MACd,aAAc,EAAO,aACrB,aAAc,EAAO,YACvB,CAAC,EACD,OAAO,EAAA,eAA6B,CAClC,QAAS,EAAO,QAChB,OAAQ,MACR,KAAM,+BAA+B,GACvC,CAAC,CACH,CAEA,IAAM,EAAY,IAAI,EAAA,kBAAkB,EAAA,4BAA4B,CAAC,EAC/D,EACJ,IAAuB,IAAA,GAEnB,EAAU,kBAAkB,EAD5B,QAAQ,QAAQ,CAAkB,EAElC,CAAC,EAAQ,GAAe,MAAM,QAAQ,IAAI,CAC9C,EAAU,UAAU,EACpB,CACF,CAAC,EAEK,EAAW,EAAO,cAAgB,KAClC,EAAgB,IAAI,IACxB,EAAY,IAAc,IAAa,CAAC,EAAK,CAAC,CAChD,EAIM,EAA4B,CAAC,GAAG,CAAa,EAAE,IAAK,IAAU,CAClE,WACA,OACA,SAAU,GACV,KAAM,GACN,QAAS,EACX,EAAE,EAEI,EAA4B,GAC7B,GAAU,CAAC,GACT,OAAQ,GAAU,EAAM,WAAW,GAAG,EAAS,EAAE,CAAC,EAClD,IAAK,GAAU,EAAM,MAAM,EAAS,OAAS,CAAC,CAAC,EAC/C,OAAQ,GAAS,EAAK,OAAS,GAAK,CAAC,EAAc,IAAI,CAAI,CAAC,EAC5D,IAAK,IAAU,CACd,WACA,OACA,SAAU,GACV,KAAM,GACN,QAAS,EACX,EAAE,EACJ,CAAC,EAUL,MAAO,CAAE,MARK,EACZ,EACE,EAAc,CAAC,GAAG,EAAe,GAAG,CAAa,EAAG,EAAO,KAAK,EAChE,EAAO,YACT,EACA,EAAO,KAGA,EAAO,aAAc,IAAK,CACrC,CAQA,aAAa,gBACX,EAAgC,CAAC,EACjC,EACuB,CACvB,IAAM,EAAS,EAAA,iBAAiB,EAEhC,GAAI,EAAO,QAAQ,OAAS,QAAS,CAGnC,IAAM,EAAK,EAAsB,CAC/B,QAAS,EAAO,QAChB,MAAO,EAAO,MACd,MAAO,EAAO,MACd,aAAc,EAAO,YACvB,CAAC,EACD,OAAO,EAAA,eAA6B,CAClC,QAAS,EAAO,QAChB,OAAQ,MACR,KAAM,kCAAkC,GAC1C,CAAC,CACH,CAEA,IAAM,EAAY,IAAI,EAAA,kBAAkB,EAAA,4BAA4B,CAAC,EAC/D,EACJ,IAAuB,IAAA,GAEnB,EAAU,kBAAkB,EAD5B,QAAQ,QAAQ,CAAkB,EAElC,CAAC,EAAW,GAAe,MAAM,QAAQ,IAAI,CACjD,EAAU,aAAa,EACvB,CACF,CAAC,EAEK,EAAoB,IAAI,IAAI,OAAO,KAAK,GAAe,CAAC,CAAC,CAAC,EAehE,MAAO,CAAE,MARK,EACZ,EACE,EAPiC,CAAC,GAAG,IADvB,IAAY,CAAC,GAAG,EAAmB,GAAI,GAAa,CAAC,CAAE,CAChC,CAAK,EAAE,IAAK,IAAU,CAC7D,OACA,SAAU,EAAkB,IAAI,CAAI,CACtC,EAIkB,EAAe,EAAO,KAAK,EACzC,EAAO,YACT,EACA,EAAO,KAGA,EAAO,aAAc,IAAK,CACrC,CACF"}
@@ -41,11 +41,15 @@ var c = class {
41
41
  let d = new e(n()), f = l === void 0 ? d.getVerifiedModels() : Promise.resolve(l), [p, m] = await Promise.all([d.getModels(), f]), h = c.provider__eq ?? null, g = new Set(h ? m?.[h] ?? [] : []), _ = [...g].map((e) => ({
42
42
  provider: h,
43
43
  name: e,
44
- verified: !0
44
+ verified: !0,
45
+ free: !1,
46
+ default: !1
45
47
  })), v = h ? (p ?? []).filter((e) => e.startsWith(`${h}/`)).map((e) => e.slice(h.length + 1)).filter((e) => e.length > 0 && !g.has(e)).map((e) => ({
46
48
  provider: h,
47
49
  name: e,
48
- verified: !1
50
+ verified: !1,
51
+ free: !1,
52
+ default: !1
49
53
  })) : [];
50
54
  return {
51
55
  items: o(a(i([..._, ...v], c.query), c.verified__eq), c.limit),
@@ -1 +1 @@
1
- {"version":3,"file":"config-service.api.js","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":"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"}
1
+ {"version":3,"file":"config-service.api.js","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n // The local agent-server has no model database, so it exposes no free /\n // default metadata; both are always false here. Cloud backends embed the\n // DB-driven flags natively on each item (handled above).\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n free: false,\n default: false,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n free: false,\n default: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":"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"}
@@ -3,6 +3,19 @@ export interface LLMModel {
3
3
  provider: string | null;
4
4
  name: string;
5
5
  verified: boolean;
6
+ /**
7
+ * Whether the model is free to use on the OpenHands provider. Mirrors
8
+ * `verified`: it is populated by the backend model list (DB-driven on
9
+ * cloud) and defaults to `false` where no free metadata exists (e.g. the
10
+ * local agent-server reconstruction path, which has no model database).
11
+ */
12
+ free: boolean;
13
+ /**
14
+ * Whether this is the provider's default model. Mirrors `free`: DB-driven on
15
+ * cloud, `false` where no default metadata exists. Used to preselect the
16
+ * model on onboarding and when creating a new model for the provider.
17
+ */
18
+ default: boolean;
6
19
  }
7
20
  export interface LLMModelPage {
8
21
  items: LLMModel[];
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../utils/utils.cjs"),r=require("../../../context/navigation-context.cjs"),i=require("../../../utils/automation-catalog.cjs"),a=require("../../../node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs"),o=require("../../shared/buttons/styled-tooltip.cjs"),s=require("../../../utils/extension-module-card-classes.cjs"),c=require("../../../utils/automation-run-display.cjs"),l=require("./automation-action-button-classes.cjs"),u=require("./kebab-menu.cjs"),d=require("../../../hooks/use-automation-permissions.cjs"),f=require("../../../icons/play.cjs"),p=require("../skills/skill-card-pill-row.cjs"),m=require("../../../utils/format-relative-time.cjs"),h=require("../home/featured-automations/automation-run-health.cjs"),g=require("./build-automation-pills.cjs"),_=require("./build-automation-menu-items.cjs"),v=require("./automation-run-insights.cjs"),y=require("./automation-view-mode.cjs"),b=require("./to-latest-run-state.cjs"),x=require("./detail/run-phase.cjs"),S=require("./detail/run-status-badge.cjs"),C=require("../home/featured-automations/automation-run-activity-sparkline.cjs");let w=require("react"),T=require("react/jsx-runtime");function E({automation:E,onToggle:D,onRunNow:O,isRunPending:k=!1,onDelete:A,onExport:j,onEdit:M,insights:N}){let{navigate:P}=r.useNavigation(),{t:F,i18n:I}=e.useTranslation(`openhands`),{canManage:L}=d.useAutomationPermissions(),R=d.useIsAutomationOwner(E),z=L||R,B=E.trigger.schedule_human||E.trigger.type,V=(0,w.useMemo)(()=>g.buildAutomationMetadataPills(E,B),[E,B]),H=()=>{P?.(`/automations/${E.id}`)},U=_.buildAutomationMenuItems({automation:E,t:F,canManage:z,onRunNow:O,isRunPending:k,onView:H,onExport:j,onEdit:M,onToggle:D,onDelete:A}),W=b.toLatestRunState(N?.state),G=i.resolveAutomationImpactStatement(E,N?.state?.summary?.completedTotal??null),{latestRun:K,recentRuns:q,isLoading:J,isError:Y}=W,X=K?h.getLastRunTimestamp(K):null,Z=K?c.getAutomationRunDisplay(K):null,Q=Z?.summary??null,$=Q?h.shortenAutomationRunSummary(Q):null,ee=Q!=null&&$!=null&&h.shouldShowAutomationRunSummaryHovercard(Q,$),te=x.shouldShowRunPhase(K?.status);return(0,T.jsxs)(`div`,{role:`link`,tabIndex:0,"data-testid":`automation-card-${E.id}`,onClick:H,onKeyDown:e=>{e.key===`Enter`&&H()},className:n.cn(`group relative flex min-w-0 flex-col overflow-hidden p-4 text-left`,s.extensionModuleCardSurfaceClassName,s.extensionModuleCardInteractiveClassName),children:[(0,T.jsxs)(`header`,{className:`flex flex-col gap-1.5`,children:[(0,T.jsxs)(`div`,{className:`flex h-8 items-center justify-between gap-3`,children:[(0,T.jsx)(`h3`,{className:`min-w-0 flex-1 truncate text-sm font-semibold leading-none text-[var(--oh-foreground)]`,children:E.name}),(0,T.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5`,children:[z?(0,T.jsx)(o.StyledTooltip,{content:F(t.I18nKey.AUTOMATIONS$RUN_NOW),placement:`top`,children:(0,T.jsx)(`button`,{type:`button`,"data-testid":`automation-run-now-${E.id}`,"aria-label":F(t.I18nKey.AUTOMATIONS$RUN_NOW),"aria-busy":k,disabled:k||!E.enabled,onClick:e=>{e.stopPropagation(),O(E.id)},className:l.automationIconActionButtonClassName,children:(0,T.jsx)(f.default,{className:`size-4 shrink-0`,"aria-hidden":!0})})}):null,(0,T.jsx)(u.KebabMenu,{items:U,triggerClassName:`opacity-70 group-hover:opacity-100`})]})]}),E.prompt?(0,T.jsx)(`p`,{className:`line-clamp-2 text-xs leading-relaxed text-[var(--oh-text-secondary)]`,children:E.prompt}):null]}),V.length>0||q.length>0?(0,T.jsxs)(`div`,{className:n.cn(`mt-3 flex items-center gap-3`,V.length>0?`justify-between`:`justify-end`),children:[V.length>0?(0,T.jsx)(`div`,{className:`min-w-0 flex-1 overflow-hidden`,children:(0,T.jsx)(p.SkillCardPillRow,{pills:V,testId:`automation-pills-${E.id}`})}):null,q.length>0?(0,T.jsx)(C.AutomationRunActivitySparkline,{automationId:E.id,runs:q,testId:`automation-activity-${E.id}`}):null]}):null,N?(0,T.jsxs)(`div`,{className:y.automationCardStatusStripClassName,children:[(0,T.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-2 overflow-hidden`,children:[J?(0,T.jsx)(`div`,{className:`h-3.5 w-3/4 animate-pulse rounded bg-surface-raised motion-reduce:animate-none`,"aria-hidden":`true`}):null,!J&&Y?(0,T.jsx)(`p`,{className:`truncate text-[var(--oh-text-secondary)]`,children:F(t.I18nKey.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE)}):null,!J&&!Y&&!K?(0,T.jsx)(`p`,{className:`truncate text-[var(--oh-text-secondary)]`,children:F(t.I18nKey.AUTOMATIONS$DETAIL$NO_RUNS)}):null,K?(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(S.RunStatusBadge,{status:Z?.badgeStatus??K.status,iconOnly:!0,showLabel:!0}),te?(0,T.jsx)(x.RunPhase,{status:K.status,code:K.phase_code,label:K.phase_label,updatedAt:K.phase_updated_at}):null,$?ee&&Q?(0,T.jsx)(a.tooltip_default,{content:(0,T.jsx)(`p`,{className:`max-w-xs whitespace-pre-wrap break-words p-2 text-xs`,children:Q}),placement:`top`,closeDelay:100,disableAnimation:!1,className:`rounded-xl border border-[var(--oh-border)] bg-base-secondary p-0 text-white shadow-xl`,children:(0,T.jsx)(`span`,{className:`min-w-0 flex-1 cursor-default truncate text-[var(--oh-text-secondary)]`,children:$})}):(0,T.jsx)(`p`,{className:`min-w-0 flex-1 truncate text-[var(--oh-text-secondary)]`,children:$}):null]}):null]}),X?(0,T.jsx)(`span`,{"data-testid":`automation-last-run-${E.id}`,className:`shrink-0 text-[var(--oh-text-secondary)]`,children:m.formatRelativeTime(X,I.language,F)}):null]}):null,G?(0,T.jsx)(`p`,{"data-testid":`automation-impact-${E.id}`,className:`mt-3 truncate text-xs text-[var(--oh-text-secondary)]`,children:G}):null,N?(0,T.jsx)(`div`,{className:`mt-3`,children:(0,T.jsx)(v.AutomationRunStats,{state:N.state,copy:N.spec.stats})}):null]})}exports.AutomationCard=E;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../utils/utils.cjs"),r=require("../../../context/navigation-context.cjs"),i=require("../../../utils/automation-catalog.cjs"),a=require("../../../node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs"),o=require("../../shared/buttons/styled-tooltip.cjs"),s=require("../../../utils/extension-module-card-classes.cjs"),c=require("../../../utils/automation-run-display.cjs"),ee=require("./automation-action-button-classes.cjs"),l=require("./kebab-menu.cjs"),u=require("../../../hooks/use-automation-permissions.cjs"),d=require("../../../icons/play.cjs"),f=require("../skills/skill-card-pill-row.cjs"),p=require("../../../utils/format-relative-time.cjs"),m=require("../home/featured-automations/automation-run-health.cjs"),h=require("./build-automation-pills.cjs"),g=require("./build-automation-menu-items.cjs"),_=require("./automation-run-insights.cjs"),v=require("./automation-view-mode.cjs"),y=require("./to-latest-run-state.cjs"),b=require("./detail/run-phase.cjs"),x=require("./detail/run-status-badge.cjs"),S=require("../home/featured-automations/automation-run-activity-sparkline.cjs");let C=require("react"),w=require("react/jsx-runtime");function T({automation:T,onToggle:E,onRunNow:D,isRunPending:O=!1,onDelete:k,onExport:A,onEdit:j,insights:M}){let{navigate:N}=r.useNavigation(),{t:P,i18n:F}=e.useTranslation(`openhands`),{canManage:I}=u.useAutomationPermissions(),L=u.useIsAutomationOwner(T),R=I||L,z=T.enabled?R:L,B=T.trigger.schedule_human||T.trigger.type,V=(0,C.useMemo)(()=>h.buildAutomationMetadataPills(T,B),[T,B]),H=()=>{N?.(`/automations/${T.id}`)},U=g.buildAutomationMenuItems({automation:T,t:P,canManage:R,canToggle:z,onRunNow:D,isRunPending:O,onView:H,onExport:A,onEdit:j,onToggle:E,onDelete:k}),W=y.toLatestRunState(M?.state),G=i.resolveAutomationImpactStatement(T,M?.state?.summary?.completedTotal??null),{latestRun:K,recentRuns:q,isLoading:J,isError:Y}=W,X=K?m.getLastRunTimestamp(K):null,Z=K?c.getAutomationRunDisplay(K):null,Q=Z?.summary??null,$=Q?m.shortenAutomationRunSummary(Q):null,te=Q!=null&&$!=null&&m.shouldShowAutomationRunSummaryHovercard(Q,$),ne=b.shouldShowRunPhase(K?.status);return(0,w.jsxs)(`div`,{role:`link`,tabIndex:0,"data-testid":`automation-card-${T.id}`,onClick:H,onKeyDown:e=>{e.key===`Enter`&&H()},className:n.cn(`group relative flex min-w-0 flex-col overflow-hidden p-4 text-left`,s.extensionModuleCardSurfaceClassName,s.extensionModuleCardInteractiveClassName),children:[(0,w.jsxs)(`header`,{className:`flex flex-col gap-1.5`,children:[(0,w.jsxs)(`div`,{className:`flex h-8 items-center justify-between gap-3`,children:[(0,w.jsx)(`h3`,{className:`min-w-0 flex-1 truncate text-sm font-semibold leading-none text-[var(--oh-foreground)]`,children:T.name}),(0,w.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5`,children:[R?(0,w.jsx)(o.StyledTooltip,{content:P(t.I18nKey.AUTOMATIONS$RUN_NOW),placement:`top`,children:(0,w.jsx)(`button`,{type:`button`,"data-testid":`automation-run-now-${T.id}`,"aria-label":P(t.I18nKey.AUTOMATIONS$RUN_NOW),"aria-busy":O,disabled:O||!T.enabled,onClick:e=>{e.stopPropagation(),D(T.id)},className:ee.automationIconActionButtonClassName,children:(0,w.jsx)(d.default,{className:`size-4 shrink-0`,"aria-hidden":!0})})}):null,(0,w.jsx)(l.KebabMenu,{items:U,triggerClassName:`opacity-70 group-hover:opacity-100`})]})]}),T.prompt?(0,w.jsx)(`p`,{className:`line-clamp-2 text-xs leading-relaxed text-[var(--oh-text-secondary)]`,children:T.prompt}):null]}),V.length>0||q.length>0?(0,w.jsxs)(`div`,{className:n.cn(`mt-3 flex items-center gap-3`,V.length>0?`justify-between`:`justify-end`),children:[V.length>0?(0,w.jsx)(`div`,{className:`min-w-0 flex-1 overflow-hidden`,children:(0,w.jsx)(f.SkillCardPillRow,{pills:V,testId:`automation-pills-${T.id}`})}):null,q.length>0?(0,w.jsx)(S.AutomationRunActivitySparkline,{automationId:T.id,runs:q,testId:`automation-activity-${T.id}`}):null]}):null,M?(0,w.jsxs)(`div`,{className:v.automationCardStatusStripClassName,children:[(0,w.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-2 overflow-hidden`,children:[J?(0,w.jsx)(`div`,{className:`h-3.5 w-3/4 animate-pulse rounded bg-surface-raised motion-reduce:animate-none`,"aria-hidden":`true`}):null,!J&&Y?(0,w.jsx)(`p`,{className:`truncate text-[var(--oh-text-secondary)]`,children:P(t.I18nKey.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE)}):null,!J&&!Y&&!K?(0,w.jsx)(`p`,{className:`truncate text-[var(--oh-text-secondary)]`,children:P(t.I18nKey.AUTOMATIONS$DETAIL$NO_RUNS)}):null,K?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(x.RunStatusBadge,{status:Z?.badgeStatus??K.status,iconOnly:!0,showLabel:!0}),ne?(0,w.jsx)(b.RunPhase,{status:K.status,code:K.phase_code,label:K.phase_label,updatedAt:K.phase_updated_at}):null,$?te&&Q?(0,w.jsx)(a.tooltip_default,{content:(0,w.jsx)(`p`,{className:`max-w-xs whitespace-pre-wrap break-words p-2 text-xs`,children:Q}),placement:`top`,closeDelay:100,disableAnimation:!1,className:`rounded-xl border border-[var(--oh-border)] bg-base-secondary p-0 text-white shadow-xl`,children:(0,w.jsx)(`span`,{className:`min-w-0 flex-1 cursor-default truncate text-[var(--oh-text-secondary)]`,children:$})}):(0,w.jsx)(`p`,{className:`min-w-0 flex-1 truncate text-[var(--oh-text-secondary)]`,children:$}):null]}):null]}),X?(0,w.jsx)(`span`,{"data-testid":`automation-last-run-${T.id}`,className:`shrink-0 text-[var(--oh-text-secondary)]`,children:p.formatRelativeTime(X,F.language,P)}):null]}):null,G?(0,w.jsx)(`p`,{"data-testid":`automation-impact-${T.id}`,className:`mt-3 truncate text-xs text-[var(--oh-text-secondary)]`,children:G}):null,M?(0,w.jsx)(`div`,{className:`mt-3`,children:(0,w.jsx)(_.AutomationRunStats,{state:M.state,copy:M.spec.stats})}):null]})}exports.AutomationCard=T;
2
2
  //# sourceMappingURL=automation-card.cjs.map