@openhands/agent-canvas 1.5.1 → 1.5.2

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 (120) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{active-backend-context-B8rMv0X9.js → active-backend-context-DHhm10VS.js} +1 -1
  4. package/build/assets/{add-backend-modal-CxC7BNEc.js → add-backend-modal-BoMkMyLB.js} +1 -1
  5. package/build/assets/{agent-profiles-settings-BJb8YXR1.js → agent-profiles-settings-CYPloKYK.js} +1 -1
  6. package/build/assets/{agent-server-compatibility-BWN-EIQn.js → agent-server-compatibility-C0MtTTwb.js} +1 -1
  7. package/build/assets/{agent-server-conversation-service.api-DSPIkMwJ.js → agent-server-conversation-service.api-lzc8dabY.js} +3 -3
  8. package/build/assets/{agent-settings-CgCnqaAA.js → agent-settings-GwiXe_6k.js} +1 -1
  9. package/build/assets/agent-settings-OdsyI2gX.js +1 -0
  10. package/build/assets/{api-key-entry-screen-iZc7n8AI.js → api-key-entry-screen-2gsoZAOK.js} +1 -1
  11. package/build/assets/{app-settings-B5zyipxJ.js → app-settings-CD9euh81.js} +1 -1
  12. package/build/assets/{automation-detail-CZsu2CoM.js → automation-detail-Bn8q0AG3.js} +1 -1
  13. package/build/assets/{automation-export-BwRX6H32.js → automation-export-Djc8Tf0M.js} +1 -1
  14. package/build/assets/{automations-list-lHAVzMoA.js → automations-list-Dtiolk1h.js} +1 -1
  15. package/build/assets/{backend-form-modal-RGcu909r.js → backend-form-modal-B8GtBA-J.js} +1 -1
  16. package/build/assets/{backend-synced-settings-badge-BSfN0AZA.js → backend-synced-settings-badge-yVh6Kf4E.js} +1 -1
  17. package/build/assets/{client-source-BZK8vRs2.js → client-source-CtQjJEy6.js} +1 -1
  18. package/build/assets/{cloud-funnel-analytics-Zcv57hfT.js → cloud-funnel-analytics-uzzLlLuj.js} +1 -1
  19. package/build/assets/{condenser-settings-BGlWn93P.js → condenser-settings-Q1rHh4Qe.js} +1 -1
  20. package/build/assets/conversation-B8d8_Upd.js +1 -0
  21. package/build/assets/{conversation-BoCYx8n2.js → conversation-Lmqm6VJC.js} +20 -20
  22. package/build/assets/conversation-panel-B8n40Swu.js +1 -0
  23. package/build/assets/{conversation-service.api-_f9GlIEi.js → conversation-service.api-D8QU-BiL.js} +1 -1
  24. package/build/assets/{entry.client-DNlPGxsu.js → entry.client-Dnnak-Hq.js} +1 -1
  25. package/build/assets/{extensions-hub-CCbLA7IM.js → extensions-hub-DqvwvpCi.js} +1 -1
  26. package/build/assets/{extensions-navigation-CPNjMNvR.js → extensions-navigation-BMc9Nluv.js} +1 -1
  27. package/build/assets/{files-tab-y4K7EXBO.js → files-tab-BAkaV4aO.js} +1 -1
  28. package/build/assets/{git-provider-icon-ITvsH4Ko.js → git-provider-icon-xvbukHaT.js} +1 -1
  29. package/build/assets/{home-BwbeOWwU.js → home-D01kSnmo.js} +1 -1
  30. package/build/assets/home-NZO2bF4N.js +1 -0
  31. package/build/assets/index-home-BsI6i0TC.js +1 -0
  32. package/build/assets/{install-server-modal-Qk1gwyI8.js → install-server-modal-BYjqoRyX.js} +1 -1
  33. package/build/assets/{launch-CAGavYl-.js → launch-DlXspDku.js} +1 -1
  34. package/build/assets/{lesson-plan-DMCPdtrf.js → lesson-plan-cNUjpdFx.js} +1 -1
  35. package/build/assets/{llm-not-configured-banner-C1ktyb3C.js → llm-not-configured-banner-DUPyoFIZ.js} +7 -7
  36. package/build/assets/{llm-settings-DFkJQr_w.js → llm-settings-Cs_iieFY.js} +1 -1
  37. package/build/assets/llm-settings-J2ke2foG.js +1 -0
  38. package/build/assets/{llm-subscription-service-Casyzgn1.js → llm-subscription-service-C0zN0-rH.js} +1 -1
  39. package/build/assets/{manage-backends-modal-CKQ46rvw.js → manage-backends-modal-nMoCZ2a0.js} +1 -1
  40. package/build/assets/{manifest-03478bbf.js → manifest-f1b46f62.js} +1 -1
  41. package/build/assets/{mcp-BapoJsDc.js → mcp-kZM-cAZw.js} +1 -1
  42. package/build/assets/{messages-CUBFMY5o.js → messages-CJAv5n4j.js} +1 -1
  43. package/build/assets/{model-selector-DJrMrFAr.js → model-selector-D51W2Q9b.js} +1 -1
  44. package/build/assets/{onboarding-6NMkdNxV.js → onboarding-Dx8n8HFr.js} +1 -1
  45. package/build/assets/{onboarding-modal-Q4AnpIdg.js → onboarding-modal-Bxuxpfdz.js} +1 -1
  46. package/build/assets/{organization-service.api-vrRNwOma.js → organization-service.api-Da2jiuBS.js} +1 -1
  47. package/build/assets/{path-utils-PNfCKQDV.js → path-utils-D53ZHUQU.js} +1 -1
  48. package/build/assets/{planner-tab-ByOw1he8.js → planner-tab-BM-pKx0z.js} +1 -1
  49. package/build/assets/{plugins-management-service-B75jyC56.js → plugins-management-service-DISfOL13.js} +1 -1
  50. package/build/assets/{profiles-service.api-BQTklD5D.js → profiles-service.api-DWetW2TL.js} +1 -1
  51. package/build/assets/{providers-DfTB2gPd.js → providers-C7lMslCi.js} +1 -1
  52. package/build/assets/{proxy-B3tCGf0X.js → proxy-G4ce0fnQ.js} +1 -1
  53. package/build/assets/{recommended-automations-launcher-Bj7PuHY1.js → recommended-automations-launcher-BWRRvMPE.js} +1 -1
  54. package/build/assets/{root-layout-DfYVlcRG.js → root-layout-ClEl-JlJ.js} +2 -2
  55. package/build/assets/{root-CDnuTToz.js → root-oT83qVlk.js} +2 -2
  56. package/build/assets/{schema-field-CUwk4wrQ.js → schema-field-CwdqUOnE.js} +1 -1
  57. package/build/assets/{sdk-section-page-DLLNrYjI.js → sdk-section-page-Cwj0T4gF.js} +1 -1
  58. package/build/assets/{secrets-service-CvyPWJhg.js → secrets-service-Ch7RH8eH.js} +1 -1
  59. package/build/assets/{secrets-settings-CHy72A5C.js → secrets-settings-Bc_pBX6F.js} +1 -1
  60. package/build/assets/{settings-index-BKDl2CQ-.js → settings-index-BzSIM1-N.js} +1 -1
  61. package/build/assets/{settings-modal-DeK11CyT.js → settings-modal-BnZ7mMu7.js} +1 -1
  62. package/build/assets/{settings-B9S8UVQr.js → settings-n9a395O0.js} +1 -1
  63. package/build/assets/{settings-service.api-DXk5TdeJ.js → settings-service.api-DPTFyRXL.js} +1 -1
  64. package/build/assets/{shared-conversation-9atDzTR4.js → shared-conversation-CIDDti9I.js} +1 -1
  65. package/build/assets/{sidebar-mobile-menu-toggle-giMMZctn.js → sidebar-mobile-menu-toggle-CTX7J4wM.js} +1 -1
  66. package/build/assets/{skills-plugins-Tropusio.js → skills-plugins-HZEbNDmX.js} +1 -1
  67. package/build/assets/{skills-settings-BvzBBCWk.js → skills-settings-BdqijFlC.js} +1 -1
  68. package/build/assets/{telemetry-C5JMEfqB.js → telemetry-SHxpVxk8.js} +1 -1
  69. package/build/assets/{terminal-DRXt2Lr4.js → terminal-BDTa1HEr.js} +1 -1
  70. package/build/assets/{use-acp-credential-form-Bm8qXdlc.js → use-acp-credential-form-DHd_Id-q.js} +1 -1
  71. package/build/assets/{use-activate-agent-profile-DlykqEfN.js → use-activate-agent-profile-BRDdSwQ0.js} +1 -1
  72. package/build/assets/{use-active-agent-profile-hI-x-UBa.js → use-active-agent-profile-BMDTXsay.js} +1 -1
  73. package/build/assets/{use-active-conversation-2qeez40F.js → use-active-conversation-BbeVgedA.js} +1 -1
  74. package/build/assets/{use-agent-profiles-0pr5bLS7.js → use-agent-profiles-Dn_S_Tkz.js} +1 -1
  75. package/build/assets/{use-agent-state-C6peDXUm.js → use-agent-state-5qM3X30V.js} +1 -1
  76. package/build/assets/{use-backends-health-CLHPitJM.js → use-backends-health-BagmAE_W.js} +1 -1
  77. package/build/assets/{use-can-manage-org-profiles-Ck_bsNbH.js → use-can-manage-org-profiles-CyYqfzeo.js} +1 -1
  78. package/build/assets/{use-cloud-current-user-id-DUCSxNjY.js → use-cloud-current-user-id-BwMX7jHW.js} +1 -1
  79. package/build/assets/{use-config-B5r8erYt.js → use-config-B39iHYFi.js} +1 -1
  80. package/build/assets/{use-create-conversation-r1JHfKO5.js → use-create-conversation-CkKUQVbP.js} +1 -1
  81. package/build/assets/{use-create-secret-Cf2N11d2.js → use-create-secret-DEgM0MXZ.js} +1 -1
  82. package/build/assets/{use-handle-plan-click-CsAW3FlH.js → use-handle-plan-click-BFcE0Xms.js} +1 -1
  83. package/build/assets/{use-llm-profiles-Dr5__SlZ.js → use-llm-profiles-CgRtnj74.js} +1 -1
  84. package/build/assets/{use-plugins-marketplace-BplU65ae.js → use-plugins-marketplace-DOJp9rlE.js} +1 -1
  85. package/build/assets/use-runtime-is-ready-ziHQvXZQ.js +1 -0
  86. package/build/assets/{use-save-agent-profile-RqUGqTv6.js → use-save-agent-profile-i4FcEP98.js} +1 -1
  87. package/build/assets/{use-save-settings-Chvzeu2s.js → use-save-settings-DiDEbIJw.js} +1 -1
  88. package/build/assets/{use-settings-CyxSlyTQ.js → use-settings-BeJap6YL.js} +1 -1
  89. package/build/assets/{use-settings-nav-items-zEkSO_Bf.js → use-settings-nav-items-D5JJjFHJ.js} +1 -1
  90. package/build/assets/{use-skills-xrVoKYrF.js → use-skills-Blpg2BqE.js} +1 -1
  91. package/build/assets/{use-tracking-D2Qg5Lpd.js → use-tracking-DFoPQUSU.js} +1 -1
  92. package/build/assets/{use-user-conversation-CnE4zhOA.js → use-user-conversation-BrN2xeQU.js} +1 -1
  93. package/build/assets/{verification-settings-CfkrXoSa.js → verification-settings-C8KzAdAX.js} +1 -1
  94. package/build/index.html +4 -4
  95. package/config/defaults.json +1 -1
  96. package/dist/config/defaults.cjs +1 -1
  97. package/dist/config/defaults.cjs.map +1 -1
  98. package/dist/config/defaults.js +1 -1
  99. package/dist/config/defaults.js.map +1 -1
  100. package/dist/hooks/query/use-task-polling.cjs +1 -1
  101. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  102. package/dist/hooks/query/use-task-polling.d.ts +19 -3
  103. package/dist/hooks/query/use-task-polling.js +36 -35
  104. package/dist/hooks/query/use-task-polling.js.map +1 -1
  105. package/dist/package.cjs +1 -1
  106. package/dist/package.cjs.map +1 -1
  107. package/dist/package.js +1 -1
  108. package/dist/package.js.map +1 -1
  109. package/dist/routes/conversation.cjs +1 -1
  110. package/dist/routes/conversation.cjs.map +1 -1
  111. package/dist/routes/conversation.js +1 -1
  112. package/dist/routes/conversation.js.map +1 -1
  113. package/package.json +1 -1
  114. package/build/assets/agent-settings-DDkSavD7.js +0 -1
  115. package/build/assets/conversation-DgHqMjnY.js +0 -1
  116. package/build/assets/conversation-panel-78Rxh_-I.js +0 -1
  117. package/build/assets/home-DKPGQ5P3.js +0 -1
  118. package/build/assets/index-home-Bko2Itv5.js +0 -1
  119. package/build/assets/llm-settings-BBsZFi9l.js +0 -1
  120. package/build/assets/use-runtime-is-ready-vCFOcLFa.js +0 -1
@@ -1 +1 @@
1
- import{a as e}from"./rolldown-runtime-BFRubm34.js";import{Ct as t,bt as n,xt as r}from"./vendor-styling-CI0PQ3ab.js";import{L as i}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~jkpzbynd-CkpBIhVe.js";import{n as a}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~e0djk9ee-Cw6LUe8p.js";import{t as o}from"./useMutation-u8UgRgDK.js";import{t as s}from"./useQuery-D5pEZbY0.js";import{t as c}from"./useTranslation-Cbf5AGg_.js";import{t as l}from"./declaration-BGsHjPEW.js";import{C as u,S as d,c as f,f as p,s as m}from"./active-backend-context-B8rMv0X9.js";import{t as h}from"./createLucideIcon-D4Tak8A1.js";import{t as g}from"./back-nav-button-DVknCcSP.js";import{t as _}from"./copy-D1YGjP-C.js";import{t as v}from"./external-link-lhdITPqq.js";import{t as y}from"./utils-DB9LsAzA.js";import{t as b}from"./brand-button-B1izLAdR.js";import{t as x}from"./loading-spinner-BcdnT0mN.js";import{i as S}from"./dropdown-classes-D3wMJlXT.js";import{t as C}from"./settings-input-BsgQWS5R.js";import{t as w}from"./settings-mQUckT0g.js";import{t as T}from"./settings-service.api-DXk5TdeJ.js";import{r as E}from"./use-settings-CyxSlyTQ.js";import{t as D}from"./profiles-service.api-BQTklD5D.js";import{a as O,d as k,n as A,p as j,r as M,t as N}from"./llm-subscription-DtsX5Lhg.js";import{t as P}from"./llm-subscription-service-Casyzgn1.js";import{t as F}from"./use-llm-profiles-Dr5__SlZ.js";import{r as I,t as L}from"./ellipsis-button-CbNnHlIq.js";import{t as R}from"./u-edit-DL5LgKon.js";import{n as z,t as B}from"./model-selector-DJrMrFAr.js";import{d as ee,g as V,l as te}from"./sdk-settings-schema-CLR01YIK.js";import{r as H}from"./schema-field-CUwk4wrQ.js";import{t as U}from"./settings-dropdown-input-Dhx9ErGd.js";import{t as ne}from"./copy-to-clipboard-button-CFzH_NOX.js";import{r as W}from"./typography-CzfoD9DY.js";import{t as re}from"./sdk-section-page-DLLNrYjI.js";import{o as G}from"./extension-module-card-classes-9V3J9J_b.js";import{a as K,i as q,n as ie,o as ae,r as J,s as Y,t as oe}from"./use-can-manage-org-profiles-Ck_bsNbH.js";import{t as se}from"./u-check-circle-BqoIxNz_.js";import{i as ce,n as le,r as ue,t as de}from"./settings-list-classes-DSJJX99U.js";import{n as fe}from"./settings-section-header-context-COMOIaxV.js";var pe=h(`text-cursor`,[[`path`,{d:`M17 22h-1a4 4 0 0 1-4-4V6a4 4 0 0 1 4-4h1`,key:`uvaxm9`}],[`path`,{d:`M7 22h1a4 4 0 0 0 4-4v-1`,key:`11xy8d`}],[`path`,{d:`M7 2h1a4 4 0 0 1 4 4v1`,key:`1uw06m`}]]);function X(){let e=a();return o({mutationFn:e=>D.activateProfile(e),onSuccess:async()=>{T.invalidateCache(),await e.invalidateQueries({queryKey:m.all}),await e.invalidateQueries({queryKey:p.personal()})},meta:{disableToast:!0}})}function me(){return o({mutationFn:P.startOpenAIDeviceLogin})}function he(){let e=a();return o({mutationFn:P.pollOpenAIDeviceLogin,onSuccess:()=>{e.invalidateQueries({queryKey:f.openaiStatus})}})}function ge(){let e=a();return o({mutationFn:P.logoutOpenAI,onSuccess:()=>{e.invalidateQueries({queryKey:f.openaiStatus})}})}function _e({enabled:e=!0}={}){return s({queryKey:f.openaiStatus,queryFn:P.getOpenAIStatus,enabled:e,retry:!1,refetchOnWindowFocus:!1,staleTime:1e3*60*5,meta:{disableToast:!0}})}var Z=e(t(),1),Q=n(),ve=5,ye=1;function be(e){let t=e.verificationUriComplete??e.verificationUri;window.open(t,`_blank`,`noopener,noreferrer`)}function xe({isDisabled:e=!1}){let{t}=c(`openhands`),n=_e(),r=me(),i=he(),a=ge(),[o,s]=Z.useState(null),[f,p]=Z.useState(!1),[m,h]=Z.useState(!1),g=Z.useRef(null),_=Z.useCallback(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null)},[]),y=()=>{o&&(navigator.clipboard.writeText(o.userCode),p(!0),setTimeout(()=>p(!1),2e3))},x=r.isPending||i.isPending||a.isPending,S=!!n.data?.connected,C=Z.useCallback(async e=>{try{return(await i.mutateAsync(e)).connected?(s(null),h(!1),u(t(l.SETTINGS$SUBSCRIPTION_CONNECTED_TOAST)),!0):(h(!0),!1)}catch{return d(t(l.SETTINGS$SUBSCRIPTION_CONNECT_ERROR)),!0}},[i,t]);return Z.useEffect(()=>{if(!o||S||e)return;let t=!1,n=Math.max(o.intervalSeconds??ve,ye),r=()=>{_(),g.current=window.setTimeout(async()=>{if(t)return;let e=await C(o.deviceCode);!t&&!e&&r()},n*1e3)};return r(),()=>{t=!0,_()}},[o,_,S,e,C]),(0,Q.jsxs)(`section`,{"data-testid":`openai-subscription-auth-card`,className:`flex flex-col gap-4 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsx)(W.H3,{children:t(l.SETTINGS$SUBSCRIPTION_CARD_TITLE)}),(0,Q.jsx)(W.Paragraph,{className:`text-tertiary-alt text-sm leading-5`,children:t(l.SETTINGS$SUBSCRIPTION_CARD_DESCRIPTION)})]}),(0,Q.jsx)(`div`,{className:`flex flex-col gap-1 text-sm`,"data-testid":`subscription-status`,children:n.isLoading?(0,Q.jsx)(`span`,{className:`text-tertiary-light`,children:t(l.SETTINGS$SUBSCRIPTION_STATUS_CHECKING)}):n.isError?(0,Q.jsx)(`span`,{className:`text-danger`,children:t(l.SETTINGS$SUBSCRIPTION_STATUS_UNAVAILABLE)}):S?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{className:`text-success`,children:t(l.SETTINGS$SUBSCRIPTION_STATUS_CONNECTED)}),n.data?.accountEmail?(0,Q.jsx)(`span`,{className:`text-tertiary-light`,children:t(l.SETTINGS$SUBSCRIPTION_ACCOUNT,{account:n.data.accountEmail})}):null]}):(0,Q.jsx)(`span`,{className:`text-warning`,children:t(l.SETTINGS$SUBSCRIPTION_STATUS_DISCONNECTED)})}),o?(0,Q.jsxs)(`div`,{"data-testid":`subscription-device-challenge`,className:`flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-sm`,children:[(0,Q.jsx)(`span`,{children:t(l.SETTINGS$SUBSCRIPTION_DEVICE_INSTRUCTIONS)}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base font-semibold text-white`,children:[(0,Q.jsx)(`span`,{"data-testid":`subscription-user-code`,className:`flex-1 select-all tracking-[0.08em]`,children:o.userCode}),(0,Q.jsx)(ne,{isHidden:!1,isDisabled:!1,onClick:y,mode:f?`copied`:`copy`})]}),(0,Q.jsxs)(`a`,{href:o.verificationUriComplete??o.verificationUri,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-sm text-[var(--oh-accent)] underline`,children:[t(l.SETTINGS$SUBSCRIPTION_OPEN_LOGIN),(0,Q.jsx)(v,{size:14,"aria-hidden":!0})]}),m?(0,Q.jsx)(`span`,{className:`text-warning`,children:t(l.SETTINGS$SUBSCRIPTION_PENDING_TOAST)}):null]}):null,(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[S?(0,Q.jsx)(b,{testId:`subscription-disconnect`,type:`button`,variant:`tertiary`,isDisabled:e||x,onClick:async()=>{try{await a.mutateAsync(),_(),s(null),h(!1),u(t(l.SETTINGS$SUBSCRIPTION_DISCONNECTED_TOAST))}catch{d(t(l.ERROR$GENERIC))}},children:t(l.SETTINGS$SUBSCRIPTION_DISCONNECT)}):(0,Q.jsx)(b,{testId:`subscription-connect`,type:`button`,variant:`primary`,isDisabled:e||x,onClick:async()=>{try{let e=await r.mutateAsync();s(e),h(!0),be(e)}catch{d(t(l.SETTINGS$SUBSCRIPTION_CONNECT_ERROR))}},children:t(l.SETTINGS$SUBSCRIPTION_CONNECT)}),o?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(b,{testId:`subscription-poll`,type:`button`,variant:`secondary`,isDisabled:e||x,onClick:async()=>{o&&(_(),C(o.deviceCode))},children:t(l.SETTINGS$SUBSCRIPTION_FINISH_SIGN_IN)}),(0,Q.jsx)(b,{testId:`subscription-cancel`,type:`button`,variant:`tertiary`,isDisabled:e||x,onClick:()=>{_(),s(null),h(!1)},children:t(l.BUTTON$CANCEL)})]}):null]})]})}var Se=e=>(0,Q.jsxs)(`svg`,{width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,...e,children:[(0,Q.jsx)(`path`,{d:`M9.9509 15.588H10.8349L16.5125 9.91042L15.6285 9.0264L10.3991 14.2681L8.00867 11.8777L7.12465 12.7617L9.9509 15.588Z`,fill:`currentColor`}),(0,Q.jsx)(`path`,{fillRule:`evenodd`,clipRule:`evenodd`,d:`M12.8521 3.29895C14.8443 3.42346 16.712 4.41954 18.0816 5.78916C19.7002 7.53231 20.5718 9.64898 20.5718 12.1392C20.5718 14.1314 19.8247 15.999 18.5796 17.6177C17.3345 19.1118 15.5914 20.2324 13.5992 20.6059C11.607 20.9794 9.61486 20.7304 7.87171 19.7343C6.12856 18.7382 4.75895 17.2441 4.01189 15.3765C3.26482 13.5088 3.14031 11.3921 3.76286 9.52447C4.38542 7.53231 5.50601 5.91367 7.24916 4.79308C8.86779 3.67248 10.86 3.17444 12.8521 3.29895ZM13.4747 19.3608C15.0933 18.9873 16.5874 18.1157 17.708 16.7461C18.7041 15.3765 19.3267 13.7578 19.2022 12.0147C19.2022 10.0225 18.4551 8.03035 17.0855 6.66073C15.8404 5.41563 14.3463 4.66857 12.6031 4.54405C10.9845 4.41954 9.24132 4.79308 7.87171 5.78916C6.50209 6.78524 5.50601 8.15486 5.00797 9.89801C4.50993 11.5166 4.50993 13.2598 5.25699 14.8784C6.00405 16.4971 7.12465 17.7422 8.61877 18.6137C10.1129 19.4853 11.856 19.7343 13.4747 19.3608Z`,fill:`currentColor`})]});function Ce({testId:e,isSet:t}){return(0,Q.jsx)(`span`,{"data-testid":e||(t?`set-indicator`:`unset-indicator`),children:(0,Q.jsx)(Se,{className:y(t?`text-success`:`text-danger`)})})}function we(){let e=a();return o({mutationFn:({name:e,newName:t})=>D.renameProfile(e,t),onSuccess:async()=>{T.invalidateCache(),await e.invalidateQueries({queryKey:m.all}),await e.invalidateQueries({queryKey:p.personal()})},meta:{disableToast:!0}})}function Te({profile:e,onClose:t}){let{t:n}=c(`openhands`),[r,i]=(0,Z.useState)(``),a=we(),o=(0,Z.useRef)(null);if((0,Z.useEffect)(()=>{i(e?.name??``)},[e?.name]),!e)return null;let s=Y(r,{isRequired:!0}),f=r===e.name,p=async()=>{if(!s){d(n(l.SETTINGS$PROFILE_NAME_RULE));return}if(f){t();return}try{await a.mutateAsync({name:e.name,newName:r}),u(n(l.SETTINGS$PROFILE_RENAMED,{name:r})),t()}catch(e){d(e instanceof Error?e.message:n(l.ERROR$GENERIC))}},m=()=>{a.isPending||t()},h=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(b,{type:`button`,variant:`tertiary`,onClick:m,isDisabled:a.isPending,children:n(l.BUTTON$CANCEL)}),(0,Q.jsx)(b,{testId:`rename-profile-submit`,type:`button`,variant:`primary`,onClick:p,isDisabled:a.isPending||!s,children:a.isPending?(0,Q.jsx)(x,{size:`small`}):n(l.BUTTON$RENAME)})]});return(0,Q.jsx)(q,{isOpen:!0,title:n(l.SETTINGS$PROFILE_RENAME_TITLE),footer:h,onClose:m,initialFocusRef:o,children:(0,Q.jsx)(`div`,{"data-testid":`rename-profile-modal`,className:`flex flex-col gap-3`,children:(0,Q.jsx)(K,{ref:o,testId:`rename-profile-input`,ruleTestId:`rename-profile-rule`,value:r,onChange:i,isRequired:!0,onKeyDown:e=>{e.key===`Enter`&&!a.isPending&&s&&p()}})})})}function Ee(){let e=a();return o({mutationFn:e=>D.deleteProfile(e),onSuccess:async()=>{T.invalidateCache(),await e.invalidateQueries({queryKey:m.all}),await e.invalidateQueries({queryKey:p.personal()})},meta:{disableToast:!0}})}function De({profile:e,onClose:t}){let{t:n}=c(`openhands`),r=Ee(),i=(0,Z.useRef)(null);if(!e)return null;let a=async()=>{try{await r.mutateAsync(e.name),u(n(l.SETTINGS$PROFILE_DELETED,{name:e.name})),t()}catch(e){d(e instanceof Error?e.message:n(l.ERROR$GENERIC))}},o=()=>{r.isPending||t()},s=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(b,{ref:i,type:`button`,variant:`tertiary`,onClick:o,isDisabled:r.isPending,children:n(l.BUTTON$CANCEL)}),(0,Q.jsx)(b,{testId:`delete-profile-confirm`,type:`button`,variant:`danger`,onClick:a,isDisabled:r.isPending,"aria-busy":r.isPending,children:r.isPending?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(x,{size:`small`}),(0,Q.jsx)(`span`,{className:`sr-only`,children:n(l.BUTTON$DELETE)})]}):n(l.BUTTON$DELETE)})]});return(0,Q.jsx)(q,{isOpen:!0,title:n(l.SETTINGS$PROFILE_DELETE_TITLE),footer:s,onClose:o,initialFocusRef:i,children:(0,Q.jsx)(`p`,{className:`text-sm break-all`,children:n(l.SETTINGS$PROFILE_DELETE_CONFIRMATION,{name:e.name})})})}var Oe=e(r(),1);function ke({onEdit:e,onRename:t,onDuplicate:n,onSetActive:r,onDelete:i,isActive:a,isActivating:o,onClose:s,anchorRef:u}){let{t:d}=c(`openhands`),f=(0,Z.useRef)(null),p=(0,Z.useRef)([]),m=u?.current??null,[h,g]=(0,Z.useState)();(0,Z.useLayoutEffect)(()=>{if(!m)return;let e=()=>{let e=m.getBoundingClientRect();e&&g({position:`fixed`,zIndex:9999,top:e.bottom+8,right:window.innerWidth-e.right,width:`max-content`})};return e(),window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),()=>{window.removeEventListener(`resize`,e),window.removeEventListener(`scroll`,e,!0)}},[m]),(0,Z.useEffect)(()=>{p.current[0]?.focus()},[]),(0,Z.useEffect)(()=>{let e=e=>{let t=e.target;f.current&&!f.current.contains(t)&&s()},t=e=>{e.key===`Escape`&&s()};return document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[s]);let v=e=>{e(),s()},b=(0,Z.useCallback)((e,t)=>{if(e.key===`Tab`){s();return}let n=p.current.filter(Boolean).length;if(e.key===`ArrowDown`){e.preventDefault();let r=(t+1)%n;p.current[r]?.focus()}else if(e.key===`ArrowUp`){e.preventDefault();let r=(t-1+n)%n;p.current[r]?.focus()}},[s]),x=a||o,C=!!m,w=(0,Q.jsxs)(`div`,{ref:f,className:y(`absolute right-0 top-full z-10 mt-2 w-[160px] rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 shadow-lg`,S,C&&`!static !top-auto !bottom-auto !left-auto !right-auto !mt-0`),role:`menu`,"aria-orientation":`vertical`,"data-testid":`profile-actions-menu`,children:[(0,Q.jsx)(J,{index:0,icon:(0,Q.jsx)(R,{width:16,height:16}),label:d(l.SETTINGS$PROFILE_EDIT),onClick:()=>v(e),onKeyDown:b,menuItemsRef:p,testId:`profile-edit`}),(0,Q.jsx)(J,{index:1,icon:(0,Q.jsx)(pe,{"aria-hidden":!0,className:`size-4`,strokeWidth:2}),label:d(l.BUTTON$RENAME),onClick:()=>v(t),onKeyDown:b,menuItemsRef:p,testId:`profile-rename`}),(0,Q.jsx)(J,{index:2,icon:(0,Q.jsx)(_,{"aria-hidden":!0,className:`size-4`,strokeWidth:2}),label:d(l.BUTTON$DUPLICATE),onClick:()=>v(n),onKeyDown:b,menuItemsRef:p,testId:`profile-duplicate`}),(0,Q.jsx)(J,{index:3,icon:(0,Q.jsx)(se,{width:16,height:16}),label:d(l.SETTINGS$PROFILE_SET_DEFAULT),onClick:()=>v(r),onKeyDown:b,menuItemsRef:p,disabled:x,testId:`profile-set-active`}),(0,Q.jsx)(J,{index:4,icon:(0,Q.jsx)(I,{width:16,height:16}),label:d(l.BUTTON$DELETE),onClick:()=>v(i),onKeyDown:b,menuItemsRef:p,testId:`profile-delete`})]});return C?typeof document>`u`||!h?null:Oe.createPortal((0,Q.jsx)(`div`,{style:h,children:w}),document.body):w}function Ae({profile:e,isActive:t,canManage:n,onActivate:r,onEdit:i,onRename:a,onDuplicate:o,onDelete:s,isActivating:u}){let{t:d}=c(`openhands`),[f,p]=(0,Z.useState)(!1),m=(0,Z.useRef)(null);return(0,Q.jsxs)(`div`,{"data-testid":`profile-row`,className:y(ce,`justify-between gap-3`),children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-3`,children:[(0,Q.jsx)(`span`,{className:`min-w-0 max-w-full truncate text-sm font-medium text-white`,title:e.name,children:e.name}),e.model?(0,Q.jsx)(`span`,{className:`min-w-0 max-w-full truncate text-sm text-[var(--oh-muted)]`,title:e.model,children:e.model}):null,t&&(0,Q.jsx)(ie,{className:`shrink-0 whitespace-nowrap px-2.5 py-1 text-xs`,"data-testid":`profile-active-badge`,children:d(l.SETTINGS$PROFILE_DEFAULT)})]}),n&&(0,Q.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,Q.jsx)(L,{ref:m,onClick:()=>p(e=>!e),ariaLabel:d(l.SETTINGS$PROFILE_MENU),testId:`profile-menu-trigger`,className:ue}),f&&(0,Q.jsx)(ke,{anchorRef:m,onEdit:()=>i(e),onRename:()=>a(e),onDuplicate:()=>o(e),onSetActive:()=>r(e.name),onDelete:()=>s(e),isActive:t,isActivating:u,onClose:()=>p(!1)})]})]})}function je({isLoading:e,loadError:t,profiles:n,active:r,canManage:i,onActivate:a,onEdit:o,onRename:s,onDuplicate:u,onDelete:d,isActivating:f}){let{t:p}=c(`openhands`);return e?(0,Q.jsx)(`div`,{className:`flex justify-center p-4`,children:(0,Q.jsx)(x,{size:`large`})}):t?(0,Q.jsx)(`div`,{"data-testid":`profiles-load-error`,className:G,children:(0,Q.jsx)(`p`,{className:`text-sm text-red-400`,children:p(l.SETTINGS$PROFILES_LOAD_ERROR)})}):n.length===0?(0,Q.jsx)(`div`,{"data-testid":`profiles-empty`,className:G,children:(0,Q.jsx)(`p`,{className:`text-sm text-[var(--oh-muted)]`,children:p(l.SETTINGS$PROFILES_EMPTY)})}):(0,Q.jsx)(`div`,{className:y(de,le),children:n.map(e=>(0,Q.jsx)(Ae,{profile:e,isActive:e.name===r,canManage:i,onActivate:a,onEdit:o,onRename:s,onDuplicate:u,onDelete:d,isActivating:f},e.name))})}function $(){let e=a();return o({mutationFn:({name:e,request:t})=>D.saveProfile(e,t),onSuccess:async()=>{T.invalidateCache(),await e.invalidateQueries({queryKey:m.all}),await e.invalidateQueries({queryKey:p.personal()})},meta:{disableToast:!0}})}function Me({onAddProfile:e,onEditProfile:t}){let{t:n}=c(`openhands`),{data:r,isLoading:i,error:a}=F(),o=X(),s=$(),f=oe(),[p,m]=(0,Z.useState)(null),[h,g]=(0,Z.useState)(null),_=r?.profiles??[],v=r?.active_profile??null;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Q.jsx)(`h2`,{className:`text-base font-medium text-white`,children:n(l.SETTINGS$AVAILABLE_PROFILES)}),e&&f?(0,Q.jsx)(b,{testId:`add-llm-profile`,type:`button`,variant:`secondary`,className:`ml-auto`,onClick:e,children:n(l.SETTINGS$ADD_LLM_PROFILE)}):null]}),(0,Q.jsx)(je,{isLoading:i,loadError:a??null,profiles:_,active:v,canManage:f,onActivate:async e=>{try{await o.mutateAsync(e),u(n(l.SETTINGS$PROFILE_ACTIVATED,{name:e}))}catch(e){console.error(`Failed to activate profile:`,e),d(n(l.ERROR$GENERIC))}},onEdit:e=>{t?.(e)},onRename:m,onDuplicate:async e=>{try{let t=await D.getProfile(e.name,`encrypted`),r=new Set(_.map(e=>e.name)),i=`${e.name}-copy`,a=1;for(;r.has(i);)i=`${e.name}-copy-${a}`,a+=1;await s.mutateAsync({name:i,request:{llm:t.config,include_secrets:!0}}),u(n(l.SETTINGS$PROFILE_DUPLICATED,{name:i}))}catch(e){console.error(`Failed to duplicate profile:`,e),d(n(l.ERROR$GENERIC))}},onDelete:g,isActivating:o.isPending})]}),(0,Q.jsx)(Te,{profile:p,onClose:()=>m(null)}),(0,Q.jsx)(De,{profile:h,onClose:()=>g(null)})]})}function Ne({activeProfileName:e,originalName:t,savedName:n}){return e?t?e===t:e===n:!1}function Pe(){let{t:e}=c(`openhands`),{setHideSectionHeader:t}=fe(),n=$(),r=X(),{data:i}=F(),{data:a}=E(),{data:o}=H(a?.agent_settings_schema),s=(0,Z.useRef)(o);s.current=o;let[f,p]=(0,Z.useState)(`list`),[m,h]=(0,Z.useState)(``),[_,v]=(0,Z.useState)(null),[y,x]=(0,Z.useState)(null),[S,C]=(0,Z.useState)(!1);(0,Z.useEffect)(()=>(t(f!==`list`),()=>t(!1)),[f,t]);let w=(0,Z.useMemo)(()=>new Set(i?.profiles.map(e=>e.name)??[]),[i]),T=(0,Z.useMemo)(()=>!(!Y(m,{isRequired:!0})||f===`create`&&w.has(m)||f===`edit`&&m!==_?.profile.name&&w.has(m)),[m,f,w,_?.profile.name]),P=(0,Z.useCallback)(()=>{h(``),v(null),p(`create`)},[]),I=(0,Z.useCallback)(async t=>{try{let e=(await D.getProfile(t.name,`encrypted`)).config??{},n=s.current?.sections.find(e=>e.key===`llm`)?.fields??[],r={};for(let t of n){let n=t.key.startsWith(`llm.`)?t.key.slice(4):t.key;r[t.key]=ee(t,e[n])}n.length===0&&(r[`llm.model`]=e.model??``,r[`llm.api_key`]=e.api_key??``,r[`llm.base_url`]=e.base_url??``,r[A]=j(e.auth_type),r[O]=e.subscription_vendor??`openai`),v({profile:t,initialValues:r,baseConfig:e}),h(t.name),p(`edit`)}catch(t){console.error(`Failed to fetch profile details:`,t),d(e(l.ERROR$GENERIC))}},[e]),L=(0,Z.useCallback)(()=>{p(`list`),v(null),h(``),x(null)},[]),R=(0,Z.useCallback)(e=>{if(x(e),f===`create`&&!m){let t=e.values[`llm.model`];if(typeof t==`string`&&t){let e=ae(t);w.has(e)||h(e)}}},[f,m,w]),z=(0,Z.useCallback)(async()=>{if(!y||!T)return;let t;try{t=y.getDirtyPayload().llm??{}}catch(t){d(t instanceof Error?t.message:e(l.ERROR$GENERIC));return}let a=f===`edit`&&_?.baseConfig?{..._.baseConfig}:{},o=y.view===`basic`&&Object.prototype.hasOwnProperty.call(t,`model`)&&t.model!==a.model,s={...a,...t};if(j(s.auth_type)===`subscription`)s.auth_type=M,s.subscription_vendor=k,delete s.api_key,delete s.base_url;else if(s.auth_type=N,s.subscription_vendor=null,o&&delete s.base_url,typeof s.api_key!=`string`||s.api_key.trim()===``){let e=typeof a.api_key==`string`?a.api_key:``;e?s.api_key=e:delete s.api_key}if(!(typeof s.model==`string`&&s.model)){d(e(l.SETTINGS$MODEL_REQUIRED));return}let c=m.trim(),p=_?.profile.name,h=f===`edit`&&p&&p!==c,g=Ne({activeProfileName:i?.active_profile,originalName:p,savedName:c});C(!0);try{h&&await D.renameProfile(p,c),await n.mutateAsync({name:c,request:{llm:s,include_secrets:!0}}),g&&await r.mutateAsync(c),u(e(f===`create`?l.SETTINGS$PROFILE_CREATED:l.SETTINGS$PROFILE_UPDATED,{name:c})),L()}catch(t){console.error(`Failed to save profile:`,t),d(e(l.ERROR$GENERIC))}finally{C(!1)}},[y,T,m,f,_,i?.active_profile,n,r,e,L]);if(f===`list`)return(0,Q.jsx)(Me,{onAddProfile:P,onEditProfile:I});let B=e(f===`edit`?l.SETTINGS$EDIT_LLM_PROFILE:l.SETTINGS$ADD_LLM_PROFILE),V=f===`edit`&&_?e(l.SETTINGS$PROFILE_LOADED,{name:_.profile.name}):e(l.SETTINGS$PROFILE_SAVE_HINT);return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsx)(g,{testId:`back-to-profiles`,onClick:L,children:e(l.BUTTON$BACK)}),(0,Q.jsx)(W.H2,{testId:`profile-editor-title`,children:B}),(0,Q.jsx)(`p`,{"data-testid":`profile-editor-description`,className:`text-sm leading-5 text-tertiary-light`,children:V})]}),(0,Q.jsx)(K,{testId:`profile-name-input`,value:m,onChange:h,isRequired:!0}),(0,Q.jsx)(Ue,{embedded:!0,hideSaveButton:!0,initialValueOverrides:f===`edit`&&_?.initialValues?_.initialValues:{"llm.model":``,"llm.api_key":``,"llm.base_url":``,[A]:N,[O]:k},onSaveControlChange:R},f===`edit`?`edit-${_?.profile.name}`:`new-profile`),(0,Q.jsxs)(`div`,{className:`flex justify-start gap-3 pt-4`,children:[(0,Q.jsx)(b,{testId:`cancel-profile-btn`,type:`button`,variant:`secondary`,onClick:L,children:e(l.BUTTON$CANCEL)}),(0,Q.jsx)(b,{testId:`save-profile-btn`,type:`button`,variant:`primary`,onClick:z,isDisabled:!T||S||!y,"aria-busy":S,children:e(S?l.STATUS$SAVING:l.BUTTON$SAVE)})]})]})}function Fe({enabled:e=!0}={}){return s({queryKey:f.openaiModels,queryFn:P.getOpenAIModels,enabled:e,retry:!1,refetchOnWindowFocus:!1,staleTime:1e3*60*5,meta:{disableToast:!0}})}var Ie=new Set([`llm.model`,`llm.api_key`,`llm.base_url`,A,O]),Le=(e,t)=>!e||!t?null:`${e}/${t}`,Re=(e,t)=>e?.sections.flatMap(e=>e.fields).find(e=>e.key===t)?.default??null,ze={openai:new Set([`https://api.openai.com`,`https://api.openai.com/v1`]),moonshot:new Set([`https://api.kimi.com/coding/v1`])},Be=e=>{try{let t=new URL(e),n=t.pathname.replace(/\/+$/,``)||``;return`${t.origin}${n}`}catch{return e.trim().replace(/\/+$/,``)}},Ve=(e,t)=>{let n=Be(t),{provider:r}=z(e);if(r){let e=ze[r];if(e)return e.has(n)}return Object.values(ze).some(e=>e?.has(n))};function He({testId:e}){let{t}=c(`openhands`);return(0,Q.jsx)(V,{testId:e,text:t(l.SETTINGS$OPENHANDS_API_KEY_HELP_TEXT),linkText:t(l.SETTINGS$NAV_API_KEYS),href:`https://app.all-hands.dev/settings/api-keys`,suffix:` ${t(l.SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX)}`})}function Ue({scope:e=`personal`,onSaveSuccess:t,initialValueOverrides:n,embedded:r,hideSaveButton:i,suppressSuccessToast:a,onSaveControlChange:o}){let{t:s}=c(`openhands`),{data:u}=E(e),{data:d}=H(u?.agent_settings_schema),f=u?.agent_settings?.llm,p=j(n?.[`llm.auth_type`]??f?.auth_type),[m,h]=Z.useState(p===M),{data:g,isLoading:_,isFetching:v}=Fe({enabled:m}),y=m&&!g&&(_||v),b=Z.useRef(null),x=Z.useRef(null);Z.useEffect(()=>{p===`subscription`&&h(!0)},[p]);let S=String(w.agent_settings?.llm?.model??``),T=Z.useCallback((e,t)=>{let n=te(e,t);if(n!==`basic`)return n;let r=e.llm_model??``,i=e.llm_base_url?.trim()??``;return i.length>0&&!Ve(r,i)?`all`:`basic`},[]),D=Z.useCallback(({values:e,isDisabled:t,view:n,onChange:i})=>{let a=typeof e[`llm.model`]==`string`?e[`llm.model`]:``,o=typeof e[`llm.base_url`]==`string`?e[`llm.base_url`]:``,c=a.startsWith(`openhands/`),d=j(e[A]),f=d===M,p=t||f&&y,m=g?.includes(a)?a:g?.[0]??``,_=typeof e[`llm.api_key`]==`string`?e[`llm.api_key`]:``,v=r?_.length>0:!!u?.llm_api_key_set,w=(e,n)=>(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(C,{testId:e,label:s(l.SETTINGS_FORM$API_KEY),type:`password`,className:`w-full`,value:_,placeholder:v?`<hidden>`:``,onChange:e=>i(`llm.api_key`,e),isDisabled:t,startContent:v?(0,Q.jsx)(Ce,{isSet:v}):void 0}),(0,Q.jsx)(V,{testId:n,text:s(l.SETTINGS$DONT_KNOW_API_KEY),linkText:s(l.SETTINGS$CLICK_FOR_INSTRUCTIONS),href:`https://docs.openhands.dev/usage/local-setup#getting-an-api-key`})]}),T=e=>{let t=e===`subscription`?M:N;if(i(A,t),t===`subscription`){h(!0),a&&!g?.includes(a)&&(b.current=a);let e=x.current&&g?.includes(x.current)?x.current:g?.[0];i(O,k),!g?.includes(a)&&e&&i(`llm.model`,e);return}a&&g?.includes(a)&&(x.current=a,i(`llm.model`,b.current??S))},E=()=>(0,Q.jsx)(U,{testId:`llm-auth-type-input`,name:A,label:s(l.SETTINGS$LLM_AUTH_TYPE),items:[{key:N,label:s(l.SETTINGS$LLM_AUTH_TYPE_API_KEY)},{key:M,label:s(l.SETTINGS$LLM_AUTH_TYPE_SUBSCRIPTION)}],selectedKey:d,isClearable:!1,required:!0,isDisabled:p,onSelectionChange:T}),D=()=>(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6`,"data-testid":`llm-subscription-settings`,children:[(0,Q.jsx)(U,{testId:`llm-subscription-model-input`,name:`llm.subscription_model`,label:s(l.SETTINGS$SUBSCRIPTION_MODEL),items:(g??[]).map(e=>({key:e,label:e})),selectedKey:m,isClearable:!1,required:!0,isDisabled:p||!g?.length,onSelectionChange:e=>{let t=typeof e==`string`?e:g?.[0];t&&i(`llm.model`,t)}}),(0,Q.jsx)(xe,{isDisabled:t})]});return(0,Q.jsx)(`div`,{className:`flex flex-col gap-6`,children:n===`basic`?(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6`,"data-testid":`llm-settings-form-basic`,children:[E(),f?D():(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(B,{currentModel:a||void 0,onChange:(e,t)=>{let n=Le(e,t);n&&i(`llm.model`,n)},wrapperClassName:`!flex-col !gap-6`,isDisabled:t}),c?(0,Q.jsx)(He,{testId:`openhands-api-key-help`}):null,w(`llm-api-key-input`,`llm-api-key-help-anchor`)]})]}):(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6`,"data-testid":`llm-settings-form-advanced`,children:[E(),f?D():(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(C,{testId:`llm-custom-model-input`,label:s(l.SETTINGS$CUSTOM_MODEL),type:`text`,className:`w-full`,value:a,placeholder:S,onChange:e=>i(`llm.model`,e),isDisabled:t}),c?(0,Q.jsx)(He,{testId:`openhands-api-key-help-2`}):null,(0,Q.jsx)(C,{testId:`base-url-input`,label:s(l.SETTINGS$BASE_URL),type:`text`,className:`w-full`,value:o,placeholder:`https://api.openai.com`,onChange:e=>i(`llm.base_url`,e),isDisabled:t}),w(`llm-api-key-input`,`llm-api-key-help-anchor-advanced`)]})]})})},[S,r,y,u?.llm_api_key_set,g,s]),P=Z.useCallback((e,t)=>{let n=structuredClone(e.agent_settings_diff??{}),r=n.llm??{};if(j(t.values[`llm.auth_type`])===`subscription`){r.auth_type=M,r.subscription_vendor=k;let e=typeof r.model==`string`?r.model:String(t.values[`llm.model`]??``),n=g?.[0];if(!g?.includes(e)&&!n)throw Error(`Subscription models are not loaded yet.`);r.model=g?.includes(e)?e:n,delete r.api_key,delete r.base_url}else t.dirty[`llm.auth_type`]&&(r.auth_type=N,r.subscription_vendor=null),t.view===`basic`&&r.model!==void 0&&(r.base_url=Re(d,`llm.base_url`));return n.llm=r,{agent_settings_diff:n}},[d,g]);return(0,Q.jsx)(re,{scope:e,settingsSources:[{settingsSource:`agent_settings`,sectionKeys:[`llm`],excludeKeys:Ie}],header:D,buildPayload:P,getInitialView:T,forceShowAdvancedView:!0,allowAllView:!0,onSaveSuccess:t,initialValueOverrides:n,embedded:r,hideSaveButton:i,suppressSuccessToast:a,onSaveControlChange:o,testId:`llm-settings-screen`})}var We=i(function(){return(0,Q.jsx)(Pe,{})});export{X as i,We as n,$ as r,Ue as t};
1
+ import{a as e}from"./rolldown-runtime-BFRubm34.js";import{Ct as t,bt as n,xt as r}from"./vendor-styling-CI0PQ3ab.js";import{L as i}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~jkpzbynd-CkpBIhVe.js";import{n as a}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~e0djk9ee-Cw6LUe8p.js";import{t as o}from"./useMutation-u8UgRgDK.js";import{t as s}from"./useQuery-D5pEZbY0.js";import{t as c}from"./useTranslation-Cbf5AGg_.js";import{t as l}from"./declaration-BGsHjPEW.js";import{C as u,S as d,c as f,f as p,s as m}from"./active-backend-context-DHhm10VS.js";import{t as h}from"./createLucideIcon-D4Tak8A1.js";import{t as g}from"./back-nav-button-DVknCcSP.js";import{t as _}from"./copy-D1YGjP-C.js";import{t as v}from"./external-link-lhdITPqq.js";import{t as y}from"./utils-DB9LsAzA.js";import{t as b}from"./brand-button-B1izLAdR.js";import{t as x}from"./loading-spinner-BcdnT0mN.js";import{i as S}from"./dropdown-classes-D3wMJlXT.js";import{t as C}from"./settings-input-BsgQWS5R.js";import{t as w}from"./settings-mQUckT0g.js";import{t as T}from"./settings-service.api-DPTFyRXL.js";import{r as E}from"./use-settings-BeJap6YL.js";import{t as D}from"./profiles-service.api-DWetW2TL.js";import{a as O,d as k,n as A,p as j,r as M,t as N}from"./llm-subscription-DtsX5Lhg.js";import{t as P}from"./llm-subscription-service-C0zN0-rH.js";import{t as F}from"./use-llm-profiles-CgRtnj74.js";import{r as I,t as L}from"./ellipsis-button-CbNnHlIq.js";import{t as R}from"./u-edit-DL5LgKon.js";import{n as z,t as B}from"./model-selector-D51W2Q9b.js";import{d as ee,g as V,l as te}from"./sdk-settings-schema-CLR01YIK.js";import{r as H}from"./schema-field-CwdqUOnE.js";import{t as U}from"./settings-dropdown-input-Dhx9ErGd.js";import{t as ne}from"./copy-to-clipboard-button-CFzH_NOX.js";import{r as W}from"./typography-CzfoD9DY.js";import{t as re}from"./sdk-section-page-Cwj0T4gF.js";import{o as G}from"./extension-module-card-classes-9V3J9J_b.js";import{a as K,i as q,n as ie,o as ae,r as J,s as Y,t as oe}from"./use-can-manage-org-profiles-CyYqfzeo.js";import{t as se}from"./u-check-circle-BqoIxNz_.js";import{i as ce,n as le,r as ue,t as de}from"./settings-list-classes-DSJJX99U.js";import{n as fe}from"./settings-section-header-context-COMOIaxV.js";var pe=h(`text-cursor`,[[`path`,{d:`M17 22h-1a4 4 0 0 1-4-4V6a4 4 0 0 1 4-4h1`,key:`uvaxm9`}],[`path`,{d:`M7 22h1a4 4 0 0 0 4-4v-1`,key:`11xy8d`}],[`path`,{d:`M7 2h1a4 4 0 0 1 4 4v1`,key:`1uw06m`}]]);function X(){let e=a();return o({mutationFn:e=>D.activateProfile(e),onSuccess:async()=>{T.invalidateCache(),await e.invalidateQueries({queryKey:m.all}),await e.invalidateQueries({queryKey:p.personal()})},meta:{disableToast:!0}})}function me(){return o({mutationFn:P.startOpenAIDeviceLogin})}function he(){let e=a();return o({mutationFn:P.pollOpenAIDeviceLogin,onSuccess:()=>{e.invalidateQueries({queryKey:f.openaiStatus})}})}function ge(){let e=a();return o({mutationFn:P.logoutOpenAI,onSuccess:()=>{e.invalidateQueries({queryKey:f.openaiStatus})}})}function _e({enabled:e=!0}={}){return s({queryKey:f.openaiStatus,queryFn:P.getOpenAIStatus,enabled:e,retry:!1,refetchOnWindowFocus:!1,staleTime:1e3*60*5,meta:{disableToast:!0}})}var Z=e(t(),1),Q=n(),ve=5,ye=1;function be(e){let t=e.verificationUriComplete??e.verificationUri;window.open(t,`_blank`,`noopener,noreferrer`)}function xe({isDisabled:e=!1}){let{t}=c(`openhands`),n=_e(),r=me(),i=he(),a=ge(),[o,s]=Z.useState(null),[f,p]=Z.useState(!1),[m,h]=Z.useState(!1),g=Z.useRef(null),_=Z.useCallback(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null)},[]),y=()=>{o&&(navigator.clipboard.writeText(o.userCode),p(!0),setTimeout(()=>p(!1),2e3))},x=r.isPending||i.isPending||a.isPending,S=!!n.data?.connected,C=Z.useCallback(async e=>{try{return(await i.mutateAsync(e)).connected?(s(null),h(!1),u(t(l.SETTINGS$SUBSCRIPTION_CONNECTED_TOAST)),!0):(h(!0),!1)}catch{return d(t(l.SETTINGS$SUBSCRIPTION_CONNECT_ERROR)),!0}},[i,t]);return Z.useEffect(()=>{if(!o||S||e)return;let t=!1,n=Math.max(o.intervalSeconds??ve,ye),r=()=>{_(),g.current=window.setTimeout(async()=>{if(t)return;let e=await C(o.deviceCode);!t&&!e&&r()},n*1e3)};return r(),()=>{t=!0,_()}},[o,_,S,e,C]),(0,Q.jsxs)(`section`,{"data-testid":`openai-subscription-auth-card`,className:`flex flex-col gap-4 rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface-raised)] p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsx)(W.H3,{children:t(l.SETTINGS$SUBSCRIPTION_CARD_TITLE)}),(0,Q.jsx)(W.Paragraph,{className:`text-tertiary-alt text-sm leading-5`,children:t(l.SETTINGS$SUBSCRIPTION_CARD_DESCRIPTION)})]}),(0,Q.jsx)(`div`,{className:`flex flex-col gap-1 text-sm`,"data-testid":`subscription-status`,children:n.isLoading?(0,Q.jsx)(`span`,{className:`text-tertiary-light`,children:t(l.SETTINGS$SUBSCRIPTION_STATUS_CHECKING)}):n.isError?(0,Q.jsx)(`span`,{className:`text-danger`,children:t(l.SETTINGS$SUBSCRIPTION_STATUS_UNAVAILABLE)}):S?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{className:`text-success`,children:t(l.SETTINGS$SUBSCRIPTION_STATUS_CONNECTED)}),n.data?.accountEmail?(0,Q.jsx)(`span`,{className:`text-tertiary-light`,children:t(l.SETTINGS$SUBSCRIPTION_ACCOUNT,{account:n.data.accountEmail})}):null]}):(0,Q.jsx)(`span`,{className:`text-warning`,children:t(l.SETTINGS$SUBSCRIPTION_STATUS_DISCONNECTED)})}),o?(0,Q.jsxs)(`div`,{"data-testid":`subscription-device-challenge`,className:`flex flex-col gap-2 rounded-lg border border-[var(--oh-border-subtle)] p-3 text-sm`,children:[(0,Q.jsx)(`span`,{children:t(l.SETTINGS$SUBSCRIPTION_DEVICE_INSTRUCTIONS)}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg bg-[var(--oh-surface-deep)] px-3 py-2 font-mono text-base font-semibold text-white`,children:[(0,Q.jsx)(`span`,{"data-testid":`subscription-user-code`,className:`flex-1 select-all tracking-[0.08em]`,children:o.userCode}),(0,Q.jsx)(ne,{isHidden:!1,isDisabled:!1,onClick:y,mode:f?`copied`:`copy`})]}),(0,Q.jsxs)(`a`,{href:o.verificationUriComplete??o.verificationUri,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-sm text-[var(--oh-accent)] underline`,children:[t(l.SETTINGS$SUBSCRIPTION_OPEN_LOGIN),(0,Q.jsx)(v,{size:14,"aria-hidden":!0})]}),m?(0,Q.jsx)(`span`,{className:`text-warning`,children:t(l.SETTINGS$SUBSCRIPTION_PENDING_TOAST)}):null]}):null,(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[S?(0,Q.jsx)(b,{testId:`subscription-disconnect`,type:`button`,variant:`tertiary`,isDisabled:e||x,onClick:async()=>{try{await a.mutateAsync(),_(),s(null),h(!1),u(t(l.SETTINGS$SUBSCRIPTION_DISCONNECTED_TOAST))}catch{d(t(l.ERROR$GENERIC))}},children:t(l.SETTINGS$SUBSCRIPTION_DISCONNECT)}):(0,Q.jsx)(b,{testId:`subscription-connect`,type:`button`,variant:`primary`,isDisabled:e||x,onClick:async()=>{try{let e=await r.mutateAsync();s(e),h(!0),be(e)}catch{d(t(l.SETTINGS$SUBSCRIPTION_CONNECT_ERROR))}},children:t(l.SETTINGS$SUBSCRIPTION_CONNECT)}),o?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(b,{testId:`subscription-poll`,type:`button`,variant:`secondary`,isDisabled:e||x,onClick:async()=>{o&&(_(),C(o.deviceCode))},children:t(l.SETTINGS$SUBSCRIPTION_FINISH_SIGN_IN)}),(0,Q.jsx)(b,{testId:`subscription-cancel`,type:`button`,variant:`tertiary`,isDisabled:e||x,onClick:()=>{_(),s(null),h(!1)},children:t(l.BUTTON$CANCEL)})]}):null]})]})}var Se=e=>(0,Q.jsxs)(`svg`,{width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,...e,children:[(0,Q.jsx)(`path`,{d:`M9.9509 15.588H10.8349L16.5125 9.91042L15.6285 9.0264L10.3991 14.2681L8.00867 11.8777L7.12465 12.7617L9.9509 15.588Z`,fill:`currentColor`}),(0,Q.jsx)(`path`,{fillRule:`evenodd`,clipRule:`evenodd`,d:`M12.8521 3.29895C14.8443 3.42346 16.712 4.41954 18.0816 5.78916C19.7002 7.53231 20.5718 9.64898 20.5718 12.1392C20.5718 14.1314 19.8247 15.999 18.5796 17.6177C17.3345 19.1118 15.5914 20.2324 13.5992 20.6059C11.607 20.9794 9.61486 20.7304 7.87171 19.7343C6.12856 18.7382 4.75895 17.2441 4.01189 15.3765C3.26482 13.5088 3.14031 11.3921 3.76286 9.52447C4.38542 7.53231 5.50601 5.91367 7.24916 4.79308C8.86779 3.67248 10.86 3.17444 12.8521 3.29895ZM13.4747 19.3608C15.0933 18.9873 16.5874 18.1157 17.708 16.7461C18.7041 15.3765 19.3267 13.7578 19.2022 12.0147C19.2022 10.0225 18.4551 8.03035 17.0855 6.66073C15.8404 5.41563 14.3463 4.66857 12.6031 4.54405C10.9845 4.41954 9.24132 4.79308 7.87171 5.78916C6.50209 6.78524 5.50601 8.15486 5.00797 9.89801C4.50993 11.5166 4.50993 13.2598 5.25699 14.8784C6.00405 16.4971 7.12465 17.7422 8.61877 18.6137C10.1129 19.4853 11.856 19.7343 13.4747 19.3608Z`,fill:`currentColor`})]});function Ce({testId:e,isSet:t}){return(0,Q.jsx)(`span`,{"data-testid":e||(t?`set-indicator`:`unset-indicator`),children:(0,Q.jsx)(Se,{className:y(t?`text-success`:`text-danger`)})})}function we(){let e=a();return o({mutationFn:({name:e,newName:t})=>D.renameProfile(e,t),onSuccess:async()=>{T.invalidateCache(),await e.invalidateQueries({queryKey:m.all}),await e.invalidateQueries({queryKey:p.personal()})},meta:{disableToast:!0}})}function Te({profile:e,onClose:t}){let{t:n}=c(`openhands`),[r,i]=(0,Z.useState)(``),a=we(),o=(0,Z.useRef)(null);if((0,Z.useEffect)(()=>{i(e?.name??``)},[e?.name]),!e)return null;let s=Y(r,{isRequired:!0}),f=r===e.name,p=async()=>{if(!s){d(n(l.SETTINGS$PROFILE_NAME_RULE));return}if(f){t();return}try{await a.mutateAsync({name:e.name,newName:r}),u(n(l.SETTINGS$PROFILE_RENAMED,{name:r})),t()}catch(e){d(e instanceof Error?e.message:n(l.ERROR$GENERIC))}},m=()=>{a.isPending||t()},h=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(b,{type:`button`,variant:`tertiary`,onClick:m,isDisabled:a.isPending,children:n(l.BUTTON$CANCEL)}),(0,Q.jsx)(b,{testId:`rename-profile-submit`,type:`button`,variant:`primary`,onClick:p,isDisabled:a.isPending||!s,children:a.isPending?(0,Q.jsx)(x,{size:`small`}):n(l.BUTTON$RENAME)})]});return(0,Q.jsx)(q,{isOpen:!0,title:n(l.SETTINGS$PROFILE_RENAME_TITLE),footer:h,onClose:m,initialFocusRef:o,children:(0,Q.jsx)(`div`,{"data-testid":`rename-profile-modal`,className:`flex flex-col gap-3`,children:(0,Q.jsx)(K,{ref:o,testId:`rename-profile-input`,ruleTestId:`rename-profile-rule`,value:r,onChange:i,isRequired:!0,onKeyDown:e=>{e.key===`Enter`&&!a.isPending&&s&&p()}})})})}function Ee(){let e=a();return o({mutationFn:e=>D.deleteProfile(e),onSuccess:async()=>{T.invalidateCache(),await e.invalidateQueries({queryKey:m.all}),await e.invalidateQueries({queryKey:p.personal()})},meta:{disableToast:!0}})}function De({profile:e,onClose:t}){let{t:n}=c(`openhands`),r=Ee(),i=(0,Z.useRef)(null);if(!e)return null;let a=async()=>{try{await r.mutateAsync(e.name),u(n(l.SETTINGS$PROFILE_DELETED,{name:e.name})),t()}catch(e){d(e instanceof Error?e.message:n(l.ERROR$GENERIC))}},o=()=>{r.isPending||t()},s=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(b,{ref:i,type:`button`,variant:`tertiary`,onClick:o,isDisabled:r.isPending,children:n(l.BUTTON$CANCEL)}),(0,Q.jsx)(b,{testId:`delete-profile-confirm`,type:`button`,variant:`danger`,onClick:a,isDisabled:r.isPending,"aria-busy":r.isPending,children:r.isPending?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(x,{size:`small`}),(0,Q.jsx)(`span`,{className:`sr-only`,children:n(l.BUTTON$DELETE)})]}):n(l.BUTTON$DELETE)})]});return(0,Q.jsx)(q,{isOpen:!0,title:n(l.SETTINGS$PROFILE_DELETE_TITLE),footer:s,onClose:o,initialFocusRef:i,children:(0,Q.jsx)(`p`,{className:`text-sm break-all`,children:n(l.SETTINGS$PROFILE_DELETE_CONFIRMATION,{name:e.name})})})}var Oe=e(r(),1);function ke({onEdit:e,onRename:t,onDuplicate:n,onSetActive:r,onDelete:i,isActive:a,isActivating:o,onClose:s,anchorRef:u}){let{t:d}=c(`openhands`),f=(0,Z.useRef)(null),p=(0,Z.useRef)([]),m=u?.current??null,[h,g]=(0,Z.useState)();(0,Z.useLayoutEffect)(()=>{if(!m)return;let e=()=>{let e=m.getBoundingClientRect();e&&g({position:`fixed`,zIndex:9999,top:e.bottom+8,right:window.innerWidth-e.right,width:`max-content`})};return e(),window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),()=>{window.removeEventListener(`resize`,e),window.removeEventListener(`scroll`,e,!0)}},[m]),(0,Z.useEffect)(()=>{p.current[0]?.focus()},[]),(0,Z.useEffect)(()=>{let e=e=>{let t=e.target;f.current&&!f.current.contains(t)&&s()},t=e=>{e.key===`Escape`&&s()};return document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[s]);let v=e=>{e(),s()},b=(0,Z.useCallback)((e,t)=>{if(e.key===`Tab`){s();return}let n=p.current.filter(Boolean).length;if(e.key===`ArrowDown`){e.preventDefault();let r=(t+1)%n;p.current[r]?.focus()}else if(e.key===`ArrowUp`){e.preventDefault();let r=(t-1+n)%n;p.current[r]?.focus()}},[s]),x=a||o,C=!!m,w=(0,Q.jsxs)(`div`,{ref:f,className:y(`absolute right-0 top-full z-10 mt-2 w-[160px] rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 shadow-lg`,S,C&&`!static !top-auto !bottom-auto !left-auto !right-auto !mt-0`),role:`menu`,"aria-orientation":`vertical`,"data-testid":`profile-actions-menu`,children:[(0,Q.jsx)(J,{index:0,icon:(0,Q.jsx)(R,{width:16,height:16}),label:d(l.SETTINGS$PROFILE_EDIT),onClick:()=>v(e),onKeyDown:b,menuItemsRef:p,testId:`profile-edit`}),(0,Q.jsx)(J,{index:1,icon:(0,Q.jsx)(pe,{"aria-hidden":!0,className:`size-4`,strokeWidth:2}),label:d(l.BUTTON$RENAME),onClick:()=>v(t),onKeyDown:b,menuItemsRef:p,testId:`profile-rename`}),(0,Q.jsx)(J,{index:2,icon:(0,Q.jsx)(_,{"aria-hidden":!0,className:`size-4`,strokeWidth:2}),label:d(l.BUTTON$DUPLICATE),onClick:()=>v(n),onKeyDown:b,menuItemsRef:p,testId:`profile-duplicate`}),(0,Q.jsx)(J,{index:3,icon:(0,Q.jsx)(se,{width:16,height:16}),label:d(l.SETTINGS$PROFILE_SET_DEFAULT),onClick:()=>v(r),onKeyDown:b,menuItemsRef:p,disabled:x,testId:`profile-set-active`}),(0,Q.jsx)(J,{index:4,icon:(0,Q.jsx)(I,{width:16,height:16}),label:d(l.BUTTON$DELETE),onClick:()=>v(i),onKeyDown:b,menuItemsRef:p,testId:`profile-delete`})]});return C?typeof document>`u`||!h?null:Oe.createPortal((0,Q.jsx)(`div`,{style:h,children:w}),document.body):w}function Ae({profile:e,isActive:t,canManage:n,onActivate:r,onEdit:i,onRename:a,onDuplicate:o,onDelete:s,isActivating:u}){let{t:d}=c(`openhands`),[f,p]=(0,Z.useState)(!1),m=(0,Z.useRef)(null);return(0,Q.jsxs)(`div`,{"data-testid":`profile-row`,className:y(ce,`justify-between gap-3`),children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-3`,children:[(0,Q.jsx)(`span`,{className:`min-w-0 max-w-full truncate text-sm font-medium text-white`,title:e.name,children:e.name}),e.model?(0,Q.jsx)(`span`,{className:`min-w-0 max-w-full truncate text-sm text-[var(--oh-muted)]`,title:e.model,children:e.model}):null,t&&(0,Q.jsx)(ie,{className:`shrink-0 whitespace-nowrap px-2.5 py-1 text-xs`,"data-testid":`profile-active-badge`,children:d(l.SETTINGS$PROFILE_DEFAULT)})]}),n&&(0,Q.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,Q.jsx)(L,{ref:m,onClick:()=>p(e=>!e),ariaLabel:d(l.SETTINGS$PROFILE_MENU),testId:`profile-menu-trigger`,className:ue}),f&&(0,Q.jsx)(ke,{anchorRef:m,onEdit:()=>i(e),onRename:()=>a(e),onDuplicate:()=>o(e),onSetActive:()=>r(e.name),onDelete:()=>s(e),isActive:t,isActivating:u,onClose:()=>p(!1)})]})]})}function je({isLoading:e,loadError:t,profiles:n,active:r,canManage:i,onActivate:a,onEdit:o,onRename:s,onDuplicate:u,onDelete:d,isActivating:f}){let{t:p}=c(`openhands`);return e?(0,Q.jsx)(`div`,{className:`flex justify-center p-4`,children:(0,Q.jsx)(x,{size:`large`})}):t?(0,Q.jsx)(`div`,{"data-testid":`profiles-load-error`,className:G,children:(0,Q.jsx)(`p`,{className:`text-sm text-red-400`,children:p(l.SETTINGS$PROFILES_LOAD_ERROR)})}):n.length===0?(0,Q.jsx)(`div`,{"data-testid":`profiles-empty`,className:G,children:(0,Q.jsx)(`p`,{className:`text-sm text-[var(--oh-muted)]`,children:p(l.SETTINGS$PROFILES_EMPTY)})}):(0,Q.jsx)(`div`,{className:y(de,le),children:n.map(e=>(0,Q.jsx)(Ae,{profile:e,isActive:e.name===r,canManage:i,onActivate:a,onEdit:o,onRename:s,onDuplicate:u,onDelete:d,isActivating:f},e.name))})}function $(){let e=a();return o({mutationFn:({name:e,request:t})=>D.saveProfile(e,t),onSuccess:async()=>{T.invalidateCache(),await e.invalidateQueries({queryKey:m.all}),await e.invalidateQueries({queryKey:p.personal()})},meta:{disableToast:!0}})}function Me({onAddProfile:e,onEditProfile:t}){let{t:n}=c(`openhands`),{data:r,isLoading:i,error:a}=F(),o=X(),s=$(),f=oe(),[p,m]=(0,Z.useState)(null),[h,g]=(0,Z.useState)(null),_=r?.profiles??[],v=r?.active_profile??null;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Q.jsx)(`h2`,{className:`text-base font-medium text-white`,children:n(l.SETTINGS$AVAILABLE_PROFILES)}),e&&f?(0,Q.jsx)(b,{testId:`add-llm-profile`,type:`button`,variant:`secondary`,className:`ml-auto`,onClick:e,children:n(l.SETTINGS$ADD_LLM_PROFILE)}):null]}),(0,Q.jsx)(je,{isLoading:i,loadError:a??null,profiles:_,active:v,canManage:f,onActivate:async e=>{try{await o.mutateAsync(e),u(n(l.SETTINGS$PROFILE_ACTIVATED,{name:e}))}catch(e){console.error(`Failed to activate profile:`,e),d(n(l.ERROR$GENERIC))}},onEdit:e=>{t?.(e)},onRename:m,onDuplicate:async e=>{try{let t=await D.getProfile(e.name,`encrypted`),r=new Set(_.map(e=>e.name)),i=`${e.name}-copy`,a=1;for(;r.has(i);)i=`${e.name}-copy-${a}`,a+=1;await s.mutateAsync({name:i,request:{llm:t.config,include_secrets:!0}}),u(n(l.SETTINGS$PROFILE_DUPLICATED,{name:i}))}catch(e){console.error(`Failed to duplicate profile:`,e),d(n(l.ERROR$GENERIC))}},onDelete:g,isActivating:o.isPending})]}),(0,Q.jsx)(Te,{profile:p,onClose:()=>m(null)}),(0,Q.jsx)(De,{profile:h,onClose:()=>g(null)})]})}function Ne({activeProfileName:e,originalName:t,savedName:n}){return e?t?e===t:e===n:!1}function Pe(){let{t:e}=c(`openhands`),{setHideSectionHeader:t}=fe(),n=$(),r=X(),{data:i}=F(),{data:a}=E(),{data:o}=H(a?.agent_settings_schema),s=(0,Z.useRef)(o);s.current=o;let[f,p]=(0,Z.useState)(`list`),[m,h]=(0,Z.useState)(``),[_,v]=(0,Z.useState)(null),[y,x]=(0,Z.useState)(null),[S,C]=(0,Z.useState)(!1);(0,Z.useEffect)(()=>(t(f!==`list`),()=>t(!1)),[f,t]);let w=(0,Z.useMemo)(()=>new Set(i?.profiles.map(e=>e.name)??[]),[i]),T=(0,Z.useMemo)(()=>!(!Y(m,{isRequired:!0})||f===`create`&&w.has(m)||f===`edit`&&m!==_?.profile.name&&w.has(m)),[m,f,w,_?.profile.name]),P=(0,Z.useCallback)(()=>{h(``),v(null),p(`create`)},[]),I=(0,Z.useCallback)(async t=>{try{let e=(await D.getProfile(t.name,`encrypted`)).config??{},n=s.current?.sections.find(e=>e.key===`llm`)?.fields??[],r={};for(let t of n){let n=t.key.startsWith(`llm.`)?t.key.slice(4):t.key;r[t.key]=ee(t,e[n])}n.length===0&&(r[`llm.model`]=e.model??``,r[`llm.api_key`]=e.api_key??``,r[`llm.base_url`]=e.base_url??``,r[A]=j(e.auth_type),r[O]=e.subscription_vendor??`openai`),v({profile:t,initialValues:r,baseConfig:e}),h(t.name),p(`edit`)}catch(t){console.error(`Failed to fetch profile details:`,t),d(e(l.ERROR$GENERIC))}},[e]),L=(0,Z.useCallback)(()=>{p(`list`),v(null),h(``),x(null)},[]),R=(0,Z.useCallback)(e=>{if(x(e),f===`create`&&!m){let t=e.values[`llm.model`];if(typeof t==`string`&&t){let e=ae(t);w.has(e)||h(e)}}},[f,m,w]),z=(0,Z.useCallback)(async()=>{if(!y||!T)return;let t;try{t=y.getDirtyPayload().llm??{}}catch(t){d(t instanceof Error?t.message:e(l.ERROR$GENERIC));return}let a=f===`edit`&&_?.baseConfig?{..._.baseConfig}:{},o=y.view===`basic`&&Object.prototype.hasOwnProperty.call(t,`model`)&&t.model!==a.model,s={...a,...t};if(j(s.auth_type)===`subscription`)s.auth_type=M,s.subscription_vendor=k,delete s.api_key,delete s.base_url;else if(s.auth_type=N,s.subscription_vendor=null,o&&delete s.base_url,typeof s.api_key!=`string`||s.api_key.trim()===``){let e=typeof a.api_key==`string`?a.api_key:``;e?s.api_key=e:delete s.api_key}if(!(typeof s.model==`string`&&s.model)){d(e(l.SETTINGS$MODEL_REQUIRED));return}let c=m.trim(),p=_?.profile.name,h=f===`edit`&&p&&p!==c,g=Ne({activeProfileName:i?.active_profile,originalName:p,savedName:c});C(!0);try{h&&await D.renameProfile(p,c),await n.mutateAsync({name:c,request:{llm:s,include_secrets:!0}}),g&&await r.mutateAsync(c),u(e(f===`create`?l.SETTINGS$PROFILE_CREATED:l.SETTINGS$PROFILE_UPDATED,{name:c})),L()}catch(t){console.error(`Failed to save profile:`,t),d(e(l.ERROR$GENERIC))}finally{C(!1)}},[y,T,m,f,_,i?.active_profile,n,r,e,L]);if(f===`list`)return(0,Q.jsx)(Me,{onAddProfile:P,onEditProfile:I});let B=e(f===`edit`?l.SETTINGS$EDIT_LLM_PROFILE:l.SETTINGS$ADD_LLM_PROFILE),V=f===`edit`&&_?e(l.SETTINGS$PROFILE_LOADED,{name:_.profile.name}):e(l.SETTINGS$PROFILE_SAVE_HINT);return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsx)(g,{testId:`back-to-profiles`,onClick:L,children:e(l.BUTTON$BACK)}),(0,Q.jsx)(W.H2,{testId:`profile-editor-title`,children:B}),(0,Q.jsx)(`p`,{"data-testid":`profile-editor-description`,className:`text-sm leading-5 text-tertiary-light`,children:V})]}),(0,Q.jsx)(K,{testId:`profile-name-input`,value:m,onChange:h,isRequired:!0}),(0,Q.jsx)(Ue,{embedded:!0,hideSaveButton:!0,initialValueOverrides:f===`edit`&&_?.initialValues?_.initialValues:{"llm.model":``,"llm.api_key":``,"llm.base_url":``,[A]:N,[O]:k},onSaveControlChange:R},f===`edit`?`edit-${_?.profile.name}`:`new-profile`),(0,Q.jsxs)(`div`,{className:`flex justify-start gap-3 pt-4`,children:[(0,Q.jsx)(b,{testId:`cancel-profile-btn`,type:`button`,variant:`secondary`,onClick:L,children:e(l.BUTTON$CANCEL)}),(0,Q.jsx)(b,{testId:`save-profile-btn`,type:`button`,variant:`primary`,onClick:z,isDisabled:!T||S||!y,"aria-busy":S,children:e(S?l.STATUS$SAVING:l.BUTTON$SAVE)})]})]})}function Fe({enabled:e=!0}={}){return s({queryKey:f.openaiModels,queryFn:P.getOpenAIModels,enabled:e,retry:!1,refetchOnWindowFocus:!1,staleTime:1e3*60*5,meta:{disableToast:!0}})}var Ie=new Set([`llm.model`,`llm.api_key`,`llm.base_url`,A,O]),Le=(e,t)=>!e||!t?null:`${e}/${t}`,Re=(e,t)=>e?.sections.flatMap(e=>e.fields).find(e=>e.key===t)?.default??null,ze={openai:new Set([`https://api.openai.com`,`https://api.openai.com/v1`]),moonshot:new Set([`https://api.kimi.com/coding/v1`])},Be=e=>{try{let t=new URL(e),n=t.pathname.replace(/\/+$/,``)||``;return`${t.origin}${n}`}catch{return e.trim().replace(/\/+$/,``)}},Ve=(e,t)=>{let n=Be(t),{provider:r}=z(e);if(r){let e=ze[r];if(e)return e.has(n)}return Object.values(ze).some(e=>e?.has(n))};function He({testId:e}){let{t}=c(`openhands`);return(0,Q.jsx)(V,{testId:e,text:t(l.SETTINGS$OPENHANDS_API_KEY_HELP_TEXT),linkText:t(l.SETTINGS$NAV_API_KEYS),href:`https://app.all-hands.dev/settings/api-keys`,suffix:` ${t(l.SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX)}`})}function Ue({scope:e=`personal`,onSaveSuccess:t,initialValueOverrides:n,embedded:r,hideSaveButton:i,suppressSuccessToast:a,onSaveControlChange:o}){let{t:s}=c(`openhands`),{data:u}=E(e),{data:d}=H(u?.agent_settings_schema),f=u?.agent_settings?.llm,p=j(n?.[`llm.auth_type`]??f?.auth_type),[m,h]=Z.useState(p===M),{data:g,isLoading:_,isFetching:v}=Fe({enabled:m}),y=m&&!g&&(_||v),b=Z.useRef(null),x=Z.useRef(null);Z.useEffect(()=>{p===`subscription`&&h(!0)},[p]);let S=String(w.agent_settings?.llm?.model??``),T=Z.useCallback((e,t)=>{let n=te(e,t);if(n!==`basic`)return n;let r=e.llm_model??``,i=e.llm_base_url?.trim()??``;return i.length>0&&!Ve(r,i)?`all`:`basic`},[]),D=Z.useCallback(({values:e,isDisabled:t,view:n,onChange:i})=>{let a=typeof e[`llm.model`]==`string`?e[`llm.model`]:``,o=typeof e[`llm.base_url`]==`string`?e[`llm.base_url`]:``,c=a.startsWith(`openhands/`),d=j(e[A]),f=d===M,p=t||f&&y,m=g?.includes(a)?a:g?.[0]??``,_=typeof e[`llm.api_key`]==`string`?e[`llm.api_key`]:``,v=r?_.length>0:!!u?.llm_api_key_set,w=(e,n)=>(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(C,{testId:e,label:s(l.SETTINGS_FORM$API_KEY),type:`password`,className:`w-full`,value:_,placeholder:v?`<hidden>`:``,onChange:e=>i(`llm.api_key`,e),isDisabled:t,startContent:v?(0,Q.jsx)(Ce,{isSet:v}):void 0}),(0,Q.jsx)(V,{testId:n,text:s(l.SETTINGS$DONT_KNOW_API_KEY),linkText:s(l.SETTINGS$CLICK_FOR_INSTRUCTIONS),href:`https://docs.openhands.dev/usage/local-setup#getting-an-api-key`})]}),T=e=>{let t=e===`subscription`?M:N;if(i(A,t),t===`subscription`){h(!0),a&&!g?.includes(a)&&(b.current=a);let e=x.current&&g?.includes(x.current)?x.current:g?.[0];i(O,k),!g?.includes(a)&&e&&i(`llm.model`,e);return}a&&g?.includes(a)&&(x.current=a,i(`llm.model`,b.current??S))},E=()=>(0,Q.jsx)(U,{testId:`llm-auth-type-input`,name:A,label:s(l.SETTINGS$LLM_AUTH_TYPE),items:[{key:N,label:s(l.SETTINGS$LLM_AUTH_TYPE_API_KEY)},{key:M,label:s(l.SETTINGS$LLM_AUTH_TYPE_SUBSCRIPTION)}],selectedKey:d,isClearable:!1,required:!0,isDisabled:p,onSelectionChange:T}),D=()=>(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6`,"data-testid":`llm-subscription-settings`,children:[(0,Q.jsx)(U,{testId:`llm-subscription-model-input`,name:`llm.subscription_model`,label:s(l.SETTINGS$SUBSCRIPTION_MODEL),items:(g??[]).map(e=>({key:e,label:e})),selectedKey:m,isClearable:!1,required:!0,isDisabled:p||!g?.length,onSelectionChange:e=>{let t=typeof e==`string`?e:g?.[0];t&&i(`llm.model`,t)}}),(0,Q.jsx)(xe,{isDisabled:t})]});return(0,Q.jsx)(`div`,{className:`flex flex-col gap-6`,children:n===`basic`?(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6`,"data-testid":`llm-settings-form-basic`,children:[E(),f?D():(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(B,{currentModel:a||void 0,onChange:(e,t)=>{let n=Le(e,t);n&&i(`llm.model`,n)},wrapperClassName:`!flex-col !gap-6`,isDisabled:t}),c?(0,Q.jsx)(He,{testId:`openhands-api-key-help`}):null,w(`llm-api-key-input`,`llm-api-key-help-anchor`)]})]}):(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6`,"data-testid":`llm-settings-form-advanced`,children:[E(),f?D():(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(C,{testId:`llm-custom-model-input`,label:s(l.SETTINGS$CUSTOM_MODEL),type:`text`,className:`w-full`,value:a,placeholder:S,onChange:e=>i(`llm.model`,e),isDisabled:t}),c?(0,Q.jsx)(He,{testId:`openhands-api-key-help-2`}):null,(0,Q.jsx)(C,{testId:`base-url-input`,label:s(l.SETTINGS$BASE_URL),type:`text`,className:`w-full`,value:o,placeholder:`https://api.openai.com`,onChange:e=>i(`llm.base_url`,e),isDisabled:t}),w(`llm-api-key-input`,`llm-api-key-help-anchor-advanced`)]})]})})},[S,r,y,u?.llm_api_key_set,g,s]),P=Z.useCallback((e,t)=>{let n=structuredClone(e.agent_settings_diff??{}),r=n.llm??{};if(j(t.values[`llm.auth_type`])===`subscription`){r.auth_type=M,r.subscription_vendor=k;let e=typeof r.model==`string`?r.model:String(t.values[`llm.model`]??``),n=g?.[0];if(!g?.includes(e)&&!n)throw Error(`Subscription models are not loaded yet.`);r.model=g?.includes(e)?e:n,delete r.api_key,delete r.base_url}else t.dirty[`llm.auth_type`]&&(r.auth_type=N,r.subscription_vendor=null),t.view===`basic`&&r.model!==void 0&&(r.base_url=Re(d,`llm.base_url`));return n.llm=r,{agent_settings_diff:n}},[d,g]);return(0,Q.jsx)(re,{scope:e,settingsSources:[{settingsSource:`agent_settings`,sectionKeys:[`llm`],excludeKeys:Ie}],header:D,buildPayload:P,getInitialView:T,forceShowAdvancedView:!0,allowAllView:!0,onSaveSuccess:t,initialValueOverrides:n,embedded:r,hideSaveButton:i,suppressSuccessToast:a,onSaveControlChange:o,testId:`llm-settings-screen`})}var We=i(function(){return(0,Q.jsx)(Pe,{})});export{X as i,We as n,$ as r,Ue as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./llm-settings-Cs_iieFY.js";export{e as default};
@@ -1 +1 @@
1
- import{d as e}from"./agent-server-compatibility-BWN-EIQn.js";import{c as t,d as n,l as r,o as i,s as a,u as o}from"./llm-subscription-DtsX5Lhg.js";function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var c=(e,t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim().length>0)return t.trim()}return null},l=(e,t)=>{for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t}return null},u=(e,t)=>{for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}return!1};async function d(t,n={}){let{host:r,apiKey:i}=e(),a=new Headers(n.headers);a.set(`Accept`,`application/json`),n.body&&!a.has(`Content-Type`)&&a.set(`Content-Type`,`application/json`),i&&a.set(`X-Session-API-Key`,i);let o=await fetch(`${r}${t}`,{...n,headers:a});if(!o.ok)throw Error(`Subscription request failed with ${o.status}`);return o.json()}function f(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):s(e)&&Array.isArray(e.models)?e.models.filter(e=>typeof e==`string`):[]}function p(e){return{vendor:n,connected:u(e,[`connected`,`authenticated`,`is_connected`]),accountEmail:c(e,[`account_email`,`email`,`account`]),expiresAt:c(e,[`expires_at`,`expiresAt`])??l(e,[`expires_at`,`expiresAt`])}}function m(e){let t=c(e,[`device_code`,`deviceCode`]),n=c(e,[`user_code`,`userCode`]),r=c(e,[`verification_uri`,`verificationUri`,`verification_url`,`verificationUrl`]);if(!t||!n||!r)throw Error(`Subscription device login response is incomplete`);return{deviceCode:t,userCode:n,verificationUri:r,verificationUriComplete:c(e,[`verification_uri_complete`,`verificationUriComplete`,`verification_url_complete`,`verificationUrlComplete`]),expiresAt:c(e,[`expires_at`,`expiresAt`])??l(e,[`expires_at`,`expiresAt`,`expires_in`,`expiresIn`]),intervalSeconds:l(e,[`interval`,`interval_seconds`,`intervalSeconds`])}}var h=class{static async getOpenAIModels(){return f(await d(r))}static async getOpenAIStatus(){return p(await d(o))}static async startOpenAIDeviceLogin(){return m(await d(a,{method:`POST`}))}static async pollOpenAIDeviceLogin(e){return p(await d(i,{method:`POST`,body:JSON.stringify({device_code:e})}))}static async logoutOpenAI(){return p(await d(t,{method:`POST`}))}};export{h as t};
1
+ import{d as e}from"./agent-server-compatibility-C0MtTTwb.js";import{c as t,d as n,l as r,o as i,s as a,u as o}from"./llm-subscription-DtsX5Lhg.js";function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var c=(e,t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim().length>0)return t.trim()}return null},l=(e,t)=>{for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t}return null},u=(e,t)=>{for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}return!1};async function d(t,n={}){let{host:r,apiKey:i}=e(),a=new Headers(n.headers);a.set(`Accept`,`application/json`),n.body&&!a.has(`Content-Type`)&&a.set(`Content-Type`,`application/json`),i&&a.set(`X-Session-API-Key`,i);let o=await fetch(`${r}${t}`,{...n,headers:a});if(!o.ok)throw Error(`Subscription request failed with ${o.status}`);return o.json()}function f(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):s(e)&&Array.isArray(e.models)?e.models.filter(e=>typeof e==`string`):[]}function p(e){return{vendor:n,connected:u(e,[`connected`,`authenticated`,`is_connected`]),accountEmail:c(e,[`account_email`,`email`,`account`]),expiresAt:c(e,[`expires_at`,`expiresAt`])??l(e,[`expires_at`,`expiresAt`])}}function m(e){let t=c(e,[`device_code`,`deviceCode`]),n=c(e,[`user_code`,`userCode`]),r=c(e,[`verification_uri`,`verificationUri`,`verification_url`,`verificationUrl`]);if(!t||!n||!r)throw Error(`Subscription device login response is incomplete`);return{deviceCode:t,userCode:n,verificationUri:r,verificationUriComplete:c(e,[`verification_uri_complete`,`verificationUriComplete`,`verification_url_complete`,`verificationUrlComplete`]),expiresAt:c(e,[`expires_at`,`expiresAt`])??l(e,[`expires_at`,`expiresAt`,`expires_in`,`expiresIn`]),intervalSeconds:l(e,[`interval`,`interval_seconds`,`intervalSeconds`])}}var h=class{static async getOpenAIModels(){return f(await d(r))}static async getOpenAIStatus(){return p(await d(o))}static async startOpenAIDeviceLogin(){return m(await d(a,{method:`POST`}))}static async pollOpenAIDeviceLogin(e){return p(await d(i,{method:`POST`,body:JSON.stringify({device_code:e})}))}static async logoutOpenAI(){return p(await d(t,{method:`POST`}))}};export{h as t};
@@ -1 +1 @@
1
- import{a as e,r as t}from"./rolldown-runtime-BFRubm34.js";import{Ct as n,bt as r}from"./vendor-styling-CI0PQ3ab.js";import{t as i}from"./useQuery-D5pEZbY0.js";import{t as a}from"./useTranslation-Cbf5AGg_.js";import{t as o}from"./declaration-BGsHjPEW.js";import{r as s}from"./active-backend-context-B8rMv0X9.js";import{t as c}from"./pencil-CWhApFIT.js";import{n as l,t as u}from"./refresh-cw-B9B7-vsy.js";import{t as d}from"./trash-2-BU6BlW4i.js";import{t as f}from"./utils-DB9LsAzA.js";import{F as p,d as m,r as h}from"./agent-server-compatibility-BWN-EIQn.js";import{y as g}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-eGLBu60s.js";import{a as _,n as v,r as y}from"./use-backends-health-CLHPitJM.js";import{t as b}from"./modal-backdrop-zVwfOJZr.js";import{r as x,t as S}from"./modal-body-Cc2zp0xb.js";import{n as C}from"./modal-classes-3qT9Ap7Q.js";import{t as w}from"./brand-button-B1izLAdR.js";import{n as T,t as E}from"./use-cloud-current-user-id-DUCSxNjY.js";import{a as D,o as O,r as k,s as A}from"./backend-form-modal-RGcu909r.js";import{t as j}from"./modal-close-button-BcIBUdSq.js";import{t as M}from"./confirmation-modal-DGBWM2Ls.js";var N=e(n(),1),P=r();function F({backend:e}){let{t}=a(`openhands`),{data:n}=i({queryKey:[`backend-version`,e.host,e.apiKey],queryFn:async()=>h(await new g(m({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo()),retry:!1,staleTime:6e4,enabled:e.kind===`local`});return n?(0,P.jsx)(`span`,{className:`inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none text-[var(--oh-text-dim)]`,"data-testid":`manage-backends-version-${e.name}`,children:t(o.BACKEND$VERSION_LABEL,{version:n})}):null}var I=`inline-flex cursor-pointer items-center justify-center rounded-md p-1 text-muted transition-colors hover:bg-interactive-hover hover:text-white`;function L({backend:e,health:t,orgLabel:n,onSelect:r,onEdit:i,onRemove:s,onLogin:l}){let{t:m}=a(`openhands`),h=y(t?.lastError),g=e.kind===`cloud`&&v(t?.lastError),_=!h&&!g&&t?.isConnected===!1&&t.lastError?t.lastError:null,b=g?m(o.BACKEND$LOGGED_OUT):A(m,e,t),x=t?.isConnected===!0?`text-green-300`:t?.isConnected===!1?`text-red-300`:`text-[var(--oh-muted)]`,S=h?!1:t?.isConnected??null,C=t?.isConnected===!0&&!h,w=p();return(0,P.jsxs)(`li`,{className:`flex items-stretch`,"data-testid":`manage-backends-row-${e.name}`,children:[(0,P.jsxs)(`button`,{type:`button`,disabled:!C,onClick:r,className:f(`flex min-w-0 flex-1 items-center gap-3 px-3 py-3 text-left`,C?`cursor-pointer transition-colors hover:bg-interactive-hover focus-visible:bg-interactive-hover focus-visible:outline-none`:`cursor-default`),children:[(0,P.jsx)(O,{isConnected:S}),(0,P.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col`,children:[(0,P.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,P.jsx)(`span`,{className:`truncate text-sm text-white`,children:e.name}),(0,P.jsx)(F,{backend:e})]}),n?(0,P.jsx)(`span`,{"data-testid":`manage-backends-org-${e.name}`,className:`truncate text-xs text-[var(--oh-text-secondary)]`,children:n}):null,(0,P.jsx)(`span`,{className:`truncate text-xs text-[var(--oh-muted)]`,children:e.host}),(0,P.jsx)(`span`,{"data-testid":`manage-backends-status-${e.name}`,className:f(`truncate text-xs`,x),children:b}),_?(0,P.jsx)(`span`,{"data-testid":`manage-backends-status-detail-${e.name}`,title:_,className:`text-xs text-red-300/80 whitespace-normal break-words`,children:_}):null]}),(0,P.jsx)(`span`,{className:`px-2 py-1 rounded-full text-[11px] uppercase tracking-wide text-[var(--oh-text-tertiary)] bg-[var(--oh-surface)] border border-[var(--oh-border)]`,children:e.kind===`cloud`?m(o.BACKEND$KIND_CLOUD):m(o.BACKEND$KIND_LOCAL)})]}),(0,P.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 px-3 py-3`,children:[g&&l?(0,P.jsx)(D,{host:e.host,onSuccess:l,testIdRoot:`manage-backends-login-${e.id}`,idleButtonLabel:m(o.BACKEND$LOG_BACK_IN),idleButtonContent:(0,P.jsx)(u,{className:`size-4`,strokeWidth:2,"aria-hidden":!0}),className:`w-auto`,buttonVariant:`unstyled`,buttonClassName:I,statusDisplay:`modal`,analyticsSource:`manage_backends_modal`}):null,!w&&(0,P.jsx)(`button`,{type:`button`,onClick:i,"aria-label":m(o.BACKEND$EDIT),"data-testid":`manage-backends-edit-${e.name}`,className:I,children:(0,P.jsx)(c,{"aria-hidden":!0,className:`size-4`,strokeWidth:2})}),!w&&(0,P.jsx)(`button`,{type:`button`,onClick:s,"aria-label":m(o.BACKEND$REMOVE),"data-testid":`manage-backends-remove-${e.name}`,className:I,children:(0,P.jsx)(d,{"aria-hidden":!0,className:`size-4`,strokeWidth:2})})]})]})}var R=t({ManageBackendsModal:()=>B});function z(e,t,n,r){if(e.kind!==`cloud`)return;let i=t[e.id];if(!i||i.orgs.length===0)return;let a=n[e.id]?.userId??null;return i.orgs.map(e=>a&&a===e.id?r:e.name).join(`, `)}function B({onClose:e,recoveryMode:t=!1}){let{t:n}=a(`openhands`),{backends:r,active:i,removeBackend:c,setActive:u,updateBackend:d}=s(),p=_(r,{probeDisabledOnce:!0}),m=T(),h=E(),g=n(o.BACKEND$PERSONAL_WORKSPACE),[v,y]=N.useState(null),[D,O]=N.useState(null),[A,F]=N.useState(!1),I=()=>{v&&(c(v.id),y(null))},R=N.useCallback(t=>{(i.backend.id!==t.id||i.orgId!==null)&&u(t.id),e()},[i.backend.id,i.orgId,e,u]),B=N.useCallback((e,t)=>{d(e.id,{apiKey:t})},[d]);return(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(b,{onClose:t?void 0:e,closeOnEscape:!t,closeOnBackdropClick:!t,"aria-label":n(o.BACKEND$MANAGE_TITLE),children:(0,P.jsxs)(`div`,{"data-testid":`manage-backends-modal`,className:f(`relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl`,x(`lg`),S,`max-h-[70vh]`),children:[t?null:(0,P.jsx)(j,{onClose:e,testId:`close-manage-backends-modal`}),(0,P.jsx)(`div`,{className:f(`p-5`,!t&&`pr-12`),children:(0,P.jsx)(`h2`,{className:C,children:n(o.BACKEND$MANAGE_TITLE)})}),(0,P.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col px-5`,children:(0,P.jsx)(`div`,{className:`flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always`,"data-testid":`manage-backends-list`,children:r.length===0?(0,P.jsx)(`p`,{className:`px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]`,children:n(o.BACKEND$MANAGE_EMPTY)}):(0,P.jsx)(`ul`,{className:`divide-y divide-[var(--oh-border)]`,children:r.map(e=>(0,P.jsx)(L,{backend:e,health:p[e.id],orgLabel:z(e,m,h,g),onSelect:()=>R(e),onEdit:()=>O(e),onRemove:()=>y({id:e.id,name:e.name}),onLogin:t=>B(e,t)},e.id))})})}),(0,P.jsxs)(`div`,{className:`flex justify-end gap-2 p-5`,children:[(0,P.jsx)(w,{type:`button`,variant:t?`primary`:`secondary`,onClick:()=>F(!0),testId:`manage-backends-add`,startContent:(0,P.jsx)(l,{width:14,height:14}),children:n(o.BACKEND$ADD)}),t?null:(0,P.jsx)(w,{type:`button`,variant:`primary`,onClick:e,testId:`manage-backends-done`,children:n(o.HOME$DONE)})]})]})}),A?(0,P.jsx)(k,{mode:`add`,source:`manage_backends_modal`,onClose:()=>F(!1)}):null,D?(0,P.jsx)(k,{mode:`edit`,backend:D,onClose:()=>O(null)}):null,v?(0,P.jsx)(M,{text:n(o.BACKEND$REMOVE_CONFIRMATION,{name:v.name}),onConfirm:I,onCancel:()=>y(null)}):null]})}export{R as n,B as t};
1
+ import{a as e,r as t}from"./rolldown-runtime-BFRubm34.js";import{Ct as n,bt as r}from"./vendor-styling-CI0PQ3ab.js";import{t as i}from"./useQuery-D5pEZbY0.js";import{t as a}from"./useTranslation-Cbf5AGg_.js";import{t as o}from"./declaration-BGsHjPEW.js";import{r as s}from"./active-backend-context-DHhm10VS.js";import{t as c}from"./pencil-CWhApFIT.js";import{n as l,t as u}from"./refresh-cw-B9B7-vsy.js";import{t as d}from"./trash-2-BU6BlW4i.js";import{t as f}from"./utils-DB9LsAzA.js";import{F as p,d as m,r as h}from"./agent-server-compatibility-C0MtTTwb.js";import{y as g}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-eGLBu60s.js";import{a as _,n as v,r as y}from"./use-backends-health-BagmAE_W.js";import{t as b}from"./modal-backdrop-zVwfOJZr.js";import{r as x,t as S}from"./modal-body-Cc2zp0xb.js";import{n as C}from"./modal-classes-3qT9Ap7Q.js";import{t as w}from"./brand-button-B1izLAdR.js";import{n as T,t as E}from"./use-cloud-current-user-id-BwMX7jHW.js";import{a as D,o as O,r as k,s as A}from"./backend-form-modal-B8GtBA-J.js";import{t as j}from"./modal-close-button-BcIBUdSq.js";import{t as M}from"./confirmation-modal-DGBWM2Ls.js";var N=e(n(),1),P=r();function F({backend:e}){let{t}=a(`openhands`),{data:n}=i({queryKey:[`backend-version`,e.host,e.apiKey],queryFn:async()=>h(await new g(m({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo()),retry:!1,staleTime:6e4,enabled:e.kind===`local`});return n?(0,P.jsx)(`span`,{className:`inline-flex shrink-0 items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface)] px-1.5 py-0.5 text-[10px] font-medium leading-none text-[var(--oh-text-dim)]`,"data-testid":`manage-backends-version-${e.name}`,children:t(o.BACKEND$VERSION_LABEL,{version:n})}):null}var I=`inline-flex cursor-pointer items-center justify-center rounded-md p-1 text-muted transition-colors hover:bg-interactive-hover hover:text-white`;function L({backend:e,health:t,orgLabel:n,onSelect:r,onEdit:i,onRemove:s,onLogin:l}){let{t:m}=a(`openhands`),h=y(t?.lastError),g=e.kind===`cloud`&&v(t?.lastError),_=!h&&!g&&t?.isConnected===!1&&t.lastError?t.lastError:null,b=g?m(o.BACKEND$LOGGED_OUT):A(m,e,t),x=t?.isConnected===!0?`text-green-300`:t?.isConnected===!1?`text-red-300`:`text-[var(--oh-muted)]`,S=h?!1:t?.isConnected??null,C=t?.isConnected===!0&&!h,w=p();return(0,P.jsxs)(`li`,{className:`flex items-stretch`,"data-testid":`manage-backends-row-${e.name}`,children:[(0,P.jsxs)(`button`,{type:`button`,disabled:!C,onClick:r,className:f(`flex min-w-0 flex-1 items-center gap-3 px-3 py-3 text-left`,C?`cursor-pointer transition-colors hover:bg-interactive-hover focus-visible:bg-interactive-hover focus-visible:outline-none`:`cursor-default`),children:[(0,P.jsx)(O,{isConnected:S}),(0,P.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col`,children:[(0,P.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,P.jsx)(`span`,{className:`truncate text-sm text-white`,children:e.name}),(0,P.jsx)(F,{backend:e})]}),n?(0,P.jsx)(`span`,{"data-testid":`manage-backends-org-${e.name}`,className:`truncate text-xs text-[var(--oh-text-secondary)]`,children:n}):null,(0,P.jsx)(`span`,{className:`truncate text-xs text-[var(--oh-muted)]`,children:e.host}),(0,P.jsx)(`span`,{"data-testid":`manage-backends-status-${e.name}`,className:f(`truncate text-xs`,x),children:b}),_?(0,P.jsx)(`span`,{"data-testid":`manage-backends-status-detail-${e.name}`,title:_,className:`text-xs text-red-300/80 whitespace-normal break-words`,children:_}):null]}),(0,P.jsx)(`span`,{className:`px-2 py-1 rounded-full text-[11px] uppercase tracking-wide text-[var(--oh-text-tertiary)] bg-[var(--oh-surface)] border border-[var(--oh-border)]`,children:e.kind===`cloud`?m(o.BACKEND$KIND_CLOUD):m(o.BACKEND$KIND_LOCAL)})]}),(0,P.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 px-3 py-3`,children:[g&&l?(0,P.jsx)(D,{host:e.host,onSuccess:l,testIdRoot:`manage-backends-login-${e.id}`,idleButtonLabel:m(o.BACKEND$LOG_BACK_IN),idleButtonContent:(0,P.jsx)(u,{className:`size-4`,strokeWidth:2,"aria-hidden":!0}),className:`w-auto`,buttonVariant:`unstyled`,buttonClassName:I,statusDisplay:`modal`,analyticsSource:`manage_backends_modal`}):null,!w&&(0,P.jsx)(`button`,{type:`button`,onClick:i,"aria-label":m(o.BACKEND$EDIT),"data-testid":`manage-backends-edit-${e.name}`,className:I,children:(0,P.jsx)(c,{"aria-hidden":!0,className:`size-4`,strokeWidth:2})}),!w&&(0,P.jsx)(`button`,{type:`button`,onClick:s,"aria-label":m(o.BACKEND$REMOVE),"data-testid":`manage-backends-remove-${e.name}`,className:I,children:(0,P.jsx)(d,{"aria-hidden":!0,className:`size-4`,strokeWidth:2})})]})]})}var R=t({ManageBackendsModal:()=>B});function z(e,t,n,r){if(e.kind!==`cloud`)return;let i=t[e.id];if(!i||i.orgs.length===0)return;let a=n[e.id]?.userId??null;return i.orgs.map(e=>a&&a===e.id?r:e.name).join(`, `)}function B({onClose:e,recoveryMode:t=!1}){let{t:n}=a(`openhands`),{backends:r,active:i,removeBackend:c,setActive:u,updateBackend:d}=s(),p=_(r,{probeDisabledOnce:!0}),m=T(),h=E(),g=n(o.BACKEND$PERSONAL_WORKSPACE),[v,y]=N.useState(null),[D,O]=N.useState(null),[A,F]=N.useState(!1),I=()=>{v&&(c(v.id),y(null))},R=N.useCallback(t=>{(i.backend.id!==t.id||i.orgId!==null)&&u(t.id),e()},[i.backend.id,i.orgId,e,u]),B=N.useCallback((e,t)=>{d(e.id,{apiKey:t})},[d]);return(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(b,{onClose:t?void 0:e,closeOnEscape:!t,closeOnBackdropClick:!t,"aria-label":n(o.BACKEND$MANAGE_TITLE),children:(0,P.jsxs)(`div`,{"data-testid":`manage-backends-modal`,className:f(`relative flex flex-col bg-[var(--oh-surface)] border border-[var(--oh-border)] rounded-xl`,x(`lg`),S,`max-h-[70vh]`),children:[t?null:(0,P.jsx)(j,{onClose:e,testId:`close-manage-backends-modal`}),(0,P.jsx)(`div`,{className:f(`p-5`,!t&&`pr-12`),children:(0,P.jsx)(`h2`,{className:C,children:n(o.BACKEND$MANAGE_TITLE)})}),(0,P.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col px-5`,children:(0,P.jsx)(`div`,{className:`flex-1 overflow-auto rounded-md border border-[var(--oh-border)] bg-surface-raised custom-scrollbar-always`,"data-testid":`manage-backends-list`,children:r.length===0?(0,P.jsx)(`p`,{className:`px-3 py-6 text-center text-sm text-[var(--oh-text-secondary)]`,children:n(o.BACKEND$MANAGE_EMPTY)}):(0,P.jsx)(`ul`,{className:`divide-y divide-[var(--oh-border)]`,children:r.map(e=>(0,P.jsx)(L,{backend:e,health:p[e.id],orgLabel:z(e,m,h,g),onSelect:()=>R(e),onEdit:()=>O(e),onRemove:()=>y({id:e.id,name:e.name}),onLogin:t=>B(e,t)},e.id))})})}),(0,P.jsxs)(`div`,{className:`flex justify-end gap-2 p-5`,children:[(0,P.jsx)(w,{type:`button`,variant:t?`primary`:`secondary`,onClick:()=>F(!0),testId:`manage-backends-add`,startContent:(0,P.jsx)(l,{width:14,height:14}),children:n(o.BACKEND$ADD)}),t?null:(0,P.jsx)(w,{type:`button`,variant:`primary`,onClick:e,testId:`manage-backends-done`,children:n(o.HOME$DONE)})]})]})}),A?(0,P.jsx)(k,{mode:`add`,source:`manage_backends_modal`,onClose:()=>F(!1)}):null,D?(0,P.jsx)(k,{mode:`edit`,backend:D,onClose:()=>O(null)}):null,v?(0,P.jsx)(M,{text:n(o.BACKEND$REMOVE_CONFIRMATION,{name:v.name}),onConfirm:I,onCancel:()=>y(null)}):null]})}export{R as n,B as t};