libre-webui 0.23.1 → 0.24.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.
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +2 -0
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/routes/chat.d.ts.map +1 -1
- package/backend/dist/routes/chat.js +93 -1
- package/backend/dist/routes/chat.js.map +1 -1
- package/backend/dist/routes/ollama.d.ts.map +1 -1
- package/backend/dist/routes/ollama.js +48 -1
- package/backend/dist/routes/ollama.js.map +1 -1
- package/backend/dist/services/apiTokenService.d.ts.map +1 -1
- package/backend/dist/services/apiTokenService.js +1 -0
- package/backend/dist/services/apiTokenService.js.map +1 -1
- package/backend/dist/services/chatGenerationService.d.ts +11 -1
- package/backend/dist/services/chatGenerationService.d.ts.map +1 -1
- package/backend/dist/services/chatGenerationService.js +22 -2
- package/backend/dist/services/chatGenerationService.js.map +1 -1
- package/backend/dist/services/chatService.d.ts +6 -0
- package/backend/dist/services/chatService.d.ts.map +1 -1
- package/backend/dist/services/chatService.js +51 -1
- package/backend/dist/services/chatService.js.map +1 -1
- package/backend/dist/services/contextCompactionService.d.ts +31 -0
- package/backend/dist/services/contextCompactionService.d.ts.map +1 -0
- package/backend/dist/services/contextCompactionService.js +185 -0
- package/backend/dist/services/contextCompactionService.js.map +1 -0
- package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -1
- package/backend/dist/services/durableChatGenerationService.js +114 -10
- package/backend/dist/services/durableChatGenerationService.js.map +1 -1
- package/backend/dist/services/followUpService.d.ts.map +1 -1
- package/backend/dist/services/followUpService.js +8 -2
- package/backend/dist/services/followUpService.js.map +1 -1
- package/backend/dist/services/modelVisibilityService.d.ts +45 -0
- package/backend/dist/services/modelVisibilityService.d.ts.map +1 -0
- package/backend/dist/services/modelVisibilityService.js +215 -0
- package/backend/dist/services/modelVisibilityService.js.map +1 -0
- package/backend/dist/services/ollamaService.d.ts +16 -1
- package/backend/dist/services/ollamaService.d.ts.map +1 -1
- package/backend/dist/services/ollamaService.js +47 -13
- package/backend/dist/services/ollamaService.js.map +1 -1
- package/backend/dist/services/pluginService.d.ts +4 -0
- package/backend/dist/services/pluginService.d.ts.map +1 -1
- package/backend/dist/services/pluginService.js +76 -13
- package/backend/dist/services/pluginService.js.map +1 -1
- package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
- package/backend/dist/services/titleGenerationService.js +20 -2
- package/backend/dist/services/titleGenerationService.js.map +1 -1
- package/backend/dist/services/workAgentService.d.ts.map +1 -1
- package/backend/dist/services/workAgentService.js +22 -0
- package/backend/dist/services/workAgentService.js.map +1 -1
- package/backend/dist/types/index.d.ts +16 -2
- package/backend/dist/types/index.d.ts.map +1 -1
- package/backend/dist/types/index.js.map +1 -1
- package/backend/dist/utils/ollamaModelDefaults.d.ts +10 -0
- package/backend/dist/utils/ollamaModelDefaults.d.ts.map +1 -1
- package/backend/dist/utils/ollamaModelDefaults.js +19 -1
- package/backend/dist/utils/ollamaModelDefaults.js.map +1 -1
- package/backend/dist/utils/openAIResponsesAdapter.d.ts +2 -0
- package/backend/dist/utils/openAIResponsesAdapter.d.ts.map +1 -1
- package/backend/dist/utils/openAIResponsesAdapter.js +3 -0
- package/backend/dist/utils/openAIResponsesAdapter.js.map +1 -1
- package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
- package/backend/dist/utils/pluginChatAdapter.js +29 -2
- package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
- package/backend/dist/utils/pluginModelCatalog.d.ts +30 -0
- package/backend/dist/utils/pluginModelCatalog.d.ts.map +1 -0
- package/backend/dist/utils/pluginModelCatalog.js +129 -0
- package/backend/dist/utils/pluginModelCatalog.js.map +1 -0
- package/backend/dist/utils/pluginStreamAdapter.d.ts +12 -1
- package/backend/dist/utils/pluginStreamAdapter.d.ts.map +1 -1
- package/backend/dist/utils/pluginStreamAdapter.js +32 -2
- package/backend/dist/utils/pluginStreamAdapter.js.map +1 -1
- package/backend/dist/utils/pluginStreaming.d.ts +10 -0
- package/backend/dist/utils/pluginStreaming.d.ts.map +1 -1
- package/backend/dist/utils/pluginStreaming.js.map +1 -1
- package/backend/dist/utils/thinkingOptions.d.ts +48 -0
- package/backend/dist/utils/thinkingOptions.d.ts.map +1 -0
- package/backend/dist/utils/thinkingOptions.js +104 -0
- package/backend/dist/utils/thinkingOptions.js.map +1 -0
- package/backend/package.json +3 -3
- package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
- package/frontend/dist/artifact-runtime/framer-motion.js +3 -3
- package/frontend/dist/artifact-runtime/papaparse.js +5 -5
- package/frontend/dist/assets/{index-BXMQqOXF.js → index-BlTbxYPP.js} +30 -8
- package/frontend/dist/assets/index-CbiWSGOj.css +1 -0
- package/frontend/dist/assets/{markdown-math-ClTedVi7.css → markdown-math-Ddr6Z9Sf.css} +1 -1
- package/frontend/dist/index.html +14 -14
- package/frontend/dist/js/{ArtifactContainer-BUjOZ5M5.js → ArtifactContainer-C-n1vPsA.js} +1 -1
- package/frontend/dist/js/{ArtifactDemoPage-QRve-734.js → ArtifactDemoPage-TONeQvof.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-DhvA-t-7.js → ArtifactSandboxFrame-CV2XXu_t.js} +2 -2
- package/frontend/dist/js/{ArtifactSlideOutPanel-B8w1Orr1.js → ArtifactSlideOutPanel-2exw7YqL.js} +1 -1
- package/frontend/dist/js/{Button-BV44cTnj.js → Button-BPf_pOxH.js} +1 -1
- package/frontend/dist/js/ChatPage-wnyG_TyC.js +23 -0
- package/frontend/dist/js/{FirstTimeSetup-DaQveC0v.js → FirstTimeSetup-smhj0X6o.js} +1 -1
- package/frontend/dist/js/{GalleryPage-Cz-VvarV.js → GalleryPage-BZfeWlBg.js} +1 -1
- package/frontend/dist/js/{HomePage-DF9pZ5V5.js → HomePage-gf4GgI6z.js} +1 -1
- package/frontend/dist/js/{LibreClawPage-Dw8YQyFj.js → LibreClawPage-CRKei1MM.js} +1 -1
- package/frontend/dist/js/{ModelManagerModals-CZAWUxjI.js → ModelManagerModals-D0amaOnl.js} +1 -1
- package/frontend/dist/js/ModelSelector-C5Tn6y0p.js +1 -0
- package/frontend/dist/js/{ModelsPage-BgaQuCry.js → ModelsPage-Rbags4Xq.js} +2 -2
- package/frontend/dist/js/{NotesPage-CRAo-TFI.js → NotesPage-9NR9HZZ8.js} +1 -1
- package/frontend/dist/js/{OptimizedSyntaxHighlighter-XwqZEoTf.js → OptimizedSyntaxHighlighter-Dz7D1LPB.js} +1 -1
- package/frontend/dist/js/{PersonasPage-DpN8DQkY.js → PersonasPage-DYP67Qiy.js} +1 -1
- package/frontend/dist/js/{PluginUsagePage-5PXXZXle.js → PluginUsagePage-QtCgymRu.js} +1 -1
- package/frontend/dist/js/RichMessageContent-Bxi_u0gC.js +3 -0
- package/frontend/dist/js/SettingsModal-B4RelkLP.js +1 -0
- package/frontend/dist/js/{SettingsToggle-WTa0rgvY.js → SettingsToggle-woG_WebF.js} +1 -1
- package/frontend/dist/js/{SystemPage-FUnoW7Er.js → SystemPage-xFSTYdBS.js} +1 -1
- package/frontend/dist/js/UserManagementPage-Cp430WCP.js +1 -0
- package/frontend/dist/js/{WorkPage-D3ChSFo-.js → WorkPage-DFES41Qm.js} +4 -4
- package/frontend/dist/js/{api-Dw_IuHaz.js → api-DUUxxx_B.js} +2 -2
- package/frontend/dist/js/{appStore-DAT2R-5p.js → appStore-CJtomipz.js} +2 -2
- package/frontend/dist/js/ar-DMH3qbt6.js +2 -0
- package/frontend/dist/js/authStore-BckFDL70.js +4 -0
- package/frontend/dist/js/bn-CGDX8khx.js +2 -0
- package/frontend/dist/js/chatStore-DK-_wd-j.js +3 -0
- package/frontend/dist/js/{config-0eBxRk6E.js → config-CNVNpf_q.js} +1 -1
- package/frontend/dist/js/cs-CJLgUk3m.js +2 -0
- package/frontend/dist/js/da-DnZMnCVM.js +2 -0
- package/frontend/dist/js/de-CWpguVQ5.js +2 -0
- package/frontend/dist/js/es-DVU1vjm0.js +2 -0
- package/frontend/dist/js/{estree-Db_NKIE7.js → estree-D1TYSBcf.js} +1 -1
- package/frontend/dist/js/fr-pWnSnypD.js +2 -0
- package/frontend/dist/js/hi-B6xDfxA5.js +2 -0
- package/frontend/dist/js/{html-INl_p8N8.js → html-Dmddj0zf.js} +1 -1
- package/frontend/dist/js/id-BThSTUAG.js +2 -0
- package/frontend/dist/js/is-BOohDFie.js +2 -0
- package/frontend/dist/js/it-BdRArcCC.js +2 -0
- package/frontend/dist/js/ja-5Cq35sMr.js +2 -0
- package/frontend/dist/js/ko-BlzNRtpQ.js +2 -0
- package/frontend/dist/js/{markdown-DQbfLH11.js → markdown-Bl_LsHEk.js} +1 -1
- package/frontend/dist/js/{messageCodeStyles-D7zXzjgH.js → messageCodeStyles-CgKxn4tN.js} +1 -1
- package/frontend/dist/js/ms-CtGeurkZ.js +2 -0
- package/frontend/dist/js/nl-MKPHGjVF.js +2 -0
- package/frontend/dist/js/pl-BwBrqCey.js +2 -0
- package/frontend/dist/js/pt-CKzoHWBB.js +2 -0
- package/frontend/dist/js/ru-BQC4jh0Y.js +2 -0
- package/frontend/dist/js/{standalone-CFSd7xCM.js → standalone-BWau8hEE.js} +1 -1
- package/frontend/dist/js/sv-Cm0qXxzM.js +2 -0
- package/frontend/dist/js/th-DUPbiRI2.js +2 -0
- package/frontend/dist/js/thinking-DwlkTfPX.js +1 -0
- package/frontend/dist/js/tr-AsFu_Br5.js +2 -0
- package/frontend/dist/js/{typescript-BIFKSiW0.js → typescript-DxGn3Yn-.js} +1 -1
- package/frontend/dist/js/ui-jlx9WA5A.js +2 -0
- package/frontend/dist/js/uk-DrMMOZ17.js +2 -0
- package/frontend/dist/js/{useTranslation-C3ei3mJq.js → useTranslation-Bho4HCyg.js} +1 -1
- package/frontend/dist/js/{utils-CuC1beTY.js → utils-D9W1Lnkn.js} +1 -1
- package/frontend/dist/js/{utils-vendor-BBa8OxtB.js → utils-vendor-DWh39_3x.js} +1 -1
- package/frontend/dist/js/vi-BgRaIrQC.js +2 -0
- package/frontend/dist/js/{workApi-DlmJ72dN.js → workApi-DWRpZ_cq.js} +2 -2
- package/frontend/dist/js/zh-B4rcgcAy.js +2 -0
- package/package.json +3 -3
- package/frontend/dist/assets/index-DBaj1DRj.css +0 -1
- package/frontend/dist/js/ChatPage-DKVwaYxn.js +0 -23
- package/frontend/dist/js/ModelSelector-Cc91MEm4.js +0 -1
- package/frontend/dist/js/RichMessageContent-C67tFlr1.js +0 -3
- package/frontend/dist/js/SettingsModal-BEzMSDlp.js +0 -1
- package/frontend/dist/js/UserManagementPage-SBsRbt0H.js +0 -1
- package/frontend/dist/js/ar-D0z0P4rC.js +0 -2
- package/frontend/dist/js/authStore-CwSMGkEM.js +0 -4
- package/frontend/dist/js/bn-BYYU41A7.js +0 -2
- package/frontend/dist/js/chatStore-BK6YcouV.js +0 -3
- package/frontend/dist/js/cs-BFx6KNZe.js +0 -2
- package/frontend/dist/js/da-DSDuY5Du.js +0 -2
- package/frontend/dist/js/de-YqhP0FmX.js +0 -2
- package/frontend/dist/js/es-Dpr_y1cN.js +0 -2
- package/frontend/dist/js/fr-nVg_iAEC.js +0 -2
- package/frontend/dist/js/hi-gHKYCgkP.js +0 -2
- package/frontend/dist/js/id-C_yID1Zk.js +0 -2
- package/frontend/dist/js/is-MoRPLbOM.js +0 -2
- package/frontend/dist/js/it-BZTscLxR.js +0 -2
- package/frontend/dist/js/ja-DpIbtmZq.js +0 -2
- package/frontend/dist/js/ko-LkWggmjU.js +0 -2
- package/frontend/dist/js/ms-p3XiQSAo.js +0 -2
- package/frontend/dist/js/nl-sEHHO2Kb.js +0 -2
- package/frontend/dist/js/pl-D2GD6PDW.js +0 -2
- package/frontend/dist/js/pt-DPkn3GUn.js +0 -2
- package/frontend/dist/js/ru-C42iHrEd.js +0 -2
- package/frontend/dist/js/sv-CGvHo4os.js +0 -2
- package/frontend/dist/js/th-BaDNpCdY.js +0 -2
- package/frontend/dist/js/tr-BHQvi1cN.js +0 -2
- package/frontend/dist/js/ui-CS8EAgvS.js +0 -2
- package/frontend/dist/js/uk-7pNGS1b2.js +0 -2
- package/frontend/dist/js/vi-DgAfh6mo.js +0 -2
- package/frontend/dist/js/zh-FRTz6ZqA.js +0 -2
- /package/frontend/dist/js/{markdown-math-mH7AZ_mb.js → markdown-math-DK846gXU.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{m as t,p as n}from"./markdown-core-BmPPZiuD.js";import{t as r}from"./useTranslation-Bho4HCyg.js";import{An as i,F as a,G as o,T as s,V as c,c as l,cn as u,d,h as f,k as p,nn as m,s as h,u as g,un as _,z as v}from"./ui-vendor-54SgntkX.js";import{t as y}from"./logger-DSXjF4ye.js";import{t as b}from"./workApi-DWRpZ_cq.js";import{O as x,T as S,_ as C,b as w,h as T}from"./api-DUUxxx_B.js";import{n as E}from"./authStore-BckFDL70.js";import{t as D}from"./Button-BPf_pOxH.js";import{a as O,c as k,d as A,i as j,n as M,o as N,p as P,r as F,s as I,t as L}from"./ui-jlx9WA5A.js";import{b as R,v as z}from"../assets/index-BlTbxYPP.js";import{t as B}from"./SettingsToggle-woG_WebF.js";var V=e(t(),1),H=n(),U=y(`components:user-manager`),W=()=>{let{t:e}=r(),t=R(),[n,a]=(0,V.useState)(!1),[o,u]=(0,V.useState)(null),[h,g]=(0,V.useState)({username:``,email:``,password:``,role:`user`}),{user:_}=E(),{data:v=[],isLoading:y}=z({queryKey:[`users`],queryFn:async()=>{let t=await x.getUsers();if(!t.success||!t.data)throw Error(e(`errors.generic`));return t.data}}),b=()=>t.invalidateQueries({queryKey:[`users`]}),S=v.filter(e=>e.status===`pending`),C=v.filter(e=>e.status!==`pending`),w=async t=>{t.preventDefault();try{let t=await x.createUser(h);t.success&&t.data&&(await b(),g({username:``,email:``,password:``,role:`user`}),a(!1),i.success(e(`userManager.form.createSuccess`)))}catch(t){U.error(`Error creating user:`,t);let n=e(`userManager.form.createFailed`);t instanceof Error&&`response`in t&&(n=t.response?.data?.message||e(`userManager.form.createFailed`)),i.error(n)}},T=async t=>{if(t.preventDefault(),o)try{let t={username:h.username,email:h.email,role:h.role};h.password&&h.password.trim()!==``&&(t.password=h.password);let n=await x.updateUser(o.id,t);n.success&&n.data&&(await b(),u(null),g({username:``,email:``,password:``,role:`user`}),i.success(e(`userManager.form.updateSuccess`)))}catch(t){U.error(`Error updating user:`,t);let n=e(`userManager.form.updateFailed`);t instanceof Error&&`response`in t&&(n=t.response?.data?.message||e(`userManager.form.updateFailed`)),i.error(n)}},A=async(t,n)=>{if(confirm(e(`userManager.deleteConfirm`,{name:n})))try{(await x.deleteUser(t)).success&&(await b(),i.success(e(`userManager.deleteSuccess`)))}catch(t){U.error(`Error deleting user:`,t);let n=e(`userManager.deleteFailed`);t instanceof Error&&`response`in t&&(n=t.response?.data?.message||e(`userManager.deleteFailed`)),i.error(n)}},M=async t=>{try{let n=await x.approveUser(t.id);n.success&&n.data&&(await b(),i.success(e(`userManager.approval.approved`,{name:t.username,defaultValue:`{{name}} can now sign in.`})))}catch(t){U.error(`Error approving user:`,t);let n=t;i.error(n.response?.data?.message||e(`userManager.approval.failed`,`The account could not be approved.`))}},L=e=>{u(e),g({username:e.username,email:e.email||``,password:``,role:e.role})};return y?(0,H.jsx)(`div`,{className:`flex items-center justify-center p-8`,children:(0,H.jsx)(`div`,{className:`w-8 h-8 border-4 border-gray-200 dark:border-gray-600 border-t-primary-500 rounded-full animate-spin`})}):(0,H.jsxs)(`div`,{className:`space-y-4`,children:[(0,H.jsxs)(`div`,{className:`flex justify-between items-center`,children:[(0,H.jsx)(`div`,{}),(0,H.jsxs)(D,{onClick:()=>a(!n),className:`flex items-center space-x-2 bg-primary-600 hover:bg-primary-700 dark:bg-primary-500 dark:hover:bg-primary-600`,children:[(0,H.jsx)(c,{size:16}),(0,H.jsx)(`span`,{children:e(`userManager.createUser`)})]})]}),n&&(0,H.jsxs)(F,{className:`bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 shadow-lg`,children:[(0,H.jsxs)(N,{children:[(0,H.jsx)(I,{className:`text-gray-900 dark:text-gray-100`,children:e(`userManager.form.title.create`)}),(0,H.jsx)(O,{className:`text-gray-600 dark:text-gray-400`,children:e(`userManager.subtitle`)})]}),(0,H.jsx)(j,{children:(0,H.jsxs)(`form`,{onSubmit:w,className:`space-y-4`,children:[(0,H.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(k,{htmlFor:`username`,className:`text-gray-700 dark:text-gray-300`,children:e(`userManager.form.username`)}),(0,H.jsx)(P,{id:`username`,value:h.username,onChange:e=>g({...h,username:e.target.value}),required:!0,className:`bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100`})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(k,{htmlFor:`email`,className:`text-gray-700 dark:text-gray-300`,children:e(`userManager.form.email`)}),(0,H.jsx)(P,{id:`email`,type:`email`,value:h.email,onChange:e=>g({...h,email:e.target.value}),required:!0,className:`bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100`})]})]}),(0,H.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(k,{htmlFor:`password`,className:`text-gray-700 dark:text-gray-300`,children:e(`userManager.form.password`)}),(0,H.jsx)(P,{id:`password`,type:`password`,value:h.password,onChange:e=>g({...h,password:e.target.value}),required:!0,className:`bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100`}),(0,H.jsx)(`p`,{className:`mt-1 text-xs text-ink-muted`,children:`Use at least 12 characters, no more than 72 UTF-8 bytes, with uppercase, lowercase, and a number.`})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(k,{htmlFor:`role`,className:`text-gray-700 dark:text-gray-300`,children:e(`userManager.form.role`)}),(0,H.jsxs)(`select`,{id:`role`,value:h.role,onChange:e=>g({...h,role:e.target.value}),className:`w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 bg-white dark:bg-dark-100 text-gray-900 dark:text-gray-100 transition-colors duration-200`,children:[(0,H.jsx)(`option`,{value:`user`,children:e(`userManager.roles.user`)}),(0,H.jsx)(`option`,{value:`admin`,children:e(`userManager.roles.admin`)})]})]})]}),(0,H.jsxs)(`div`,{className:`flex space-x-2`,children:[(0,H.jsx)(D,{type:`submit`,children:e(`userManager.form.createButton`)}),(0,H.jsx)(D,{type:`button`,variant:`outline`,onClick:()=>{g({username:``,email:``,password:``,role:`user`}),a(!1)},children:e(`common.cancel`)})]})]})})]}),o&&(0,H.jsxs)(F,{className:`bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 shadow-lg`,children:[(0,H.jsxs)(N,{children:[(0,H.jsxs)(I,{className:`text-gray-900 dark:text-gray-100`,children:[e(`userManager.form.title.edit`),`: `,o.username]}),(0,H.jsx)(O,{className:`text-gray-600 dark:text-gray-400`,children:e(`userManager.subtitle`)})]}),(0,H.jsx)(j,{children:(0,H.jsxs)(`form`,{onSubmit:T,className:`space-y-4`,children:[(0,H.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(k,{htmlFor:`edit-username`,className:`text-gray-700 dark:text-gray-300`,children:e(`userManager.form.username`)}),(0,H.jsx)(P,{id:`edit-username`,value:h.username,onChange:e=>g({...h,username:e.target.value}),required:!0,className:`bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100`})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(k,{htmlFor:`edit-email`,className:`text-gray-700 dark:text-gray-300`,children:e(`userManager.form.email`)}),(0,H.jsx)(P,{id:`edit-email`,type:`email`,value:h.email,onChange:e=>g({...h,email:e.target.value}),required:!0,className:`bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100`})]})]}),(0,H.jsxs)(`div`,{className:`grid grid-cols-2 gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsxs)(k,{htmlFor:`edit-password`,className:`text-gray-700 dark:text-gray-300`,children:[e(`userManager.form.password`),` (`,e(`common.optional`),`)`]}),(0,H.jsx)(P,{id:`edit-password`,type:`password`,value:h.password,onChange:e=>g({...h,password:e.target.value}),placeholder:e(`userManager.form.passwordHint`),className:`bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100`}),(0,H.jsx)(`p`,{className:`mt-1 text-xs text-ink-muted`,children:`Use at least 12 characters, no more than 72 UTF-8 bytes, with uppercase, lowercase, and a number.`})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(k,{htmlFor:`edit-role`,className:`text-gray-700 dark:text-gray-300`,children:e(`userManager.form.role`)}),(0,H.jsxs)(`select`,{id:`edit-role`,value:h.role,onChange:e=>g({...h,role:e.target.value}),disabled:o?.id===_?.id&&_?.role===`admin`,className:`w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 bg-white dark:bg-dark-100 text-gray-900 dark:text-gray-100 transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed`,children:[(0,H.jsx)(`option`,{value:`user`,children:e(`userManager.roles.user`)}),(0,H.jsx)(`option`,{value:`admin`,children:e(`userManager.roles.admin`)})]}),o?.id===_?.id&&_?.role===`admin`&&(0,H.jsx)(`p`,{className:`mt-1 text-xs text-ink-muted`,children:e(`userManager.cannotDeleteSelf`)})]})]}),(0,H.jsxs)(`div`,{className:`flex space-x-2`,children:[(0,H.jsx)(D,{type:`submit`,children:e(`userManager.form.updateButton`)}),(0,H.jsx)(D,{type:`button`,variant:`outline`,onClick:()=>{u(null),g({username:``,email:``,password:``,role:`user`})},children:e(`common.cancel`)})]})]})})]}),S.length>0&&(0,H.jsxs)(F,{"data-testid":`pending-user-approvals`,className:`border border-warning-500/30 bg-warning-500/[0.06] shadow-lg`,children:[(0,H.jsxs)(N,{children:[(0,H.jsxs)(I,{className:`flex items-center gap-2 text-gray-900 dark:text-gray-100`,children:[(0,H.jsx)(m,{className:`h-5 w-5 text-warning-700 dark:text-warning-400`}),e(`userManager.approval.title`,`Pending approvals`),` (`,S.length,`)`]}),(0,H.jsx)(O,{className:`text-gray-600 dark:text-gray-400`,children:e(`userManager.approval.description`,`Review new registrations before allowing them into this instance.`)})]}),(0,H.jsx)(j,{children:(0,H.jsx)(`div`,{className:`space-y-3`,children:S.map(t=>(0,H.jsxs)(`div`,{"data-testid":`pending-user-row`,className:`flex flex-col gap-4 rounded-xl border border-warning-500/25 bg-surface p-4 sm:flex-row sm:items-center sm:justify-between`,children:[(0,H.jsxs)(`div`,{className:`min-w-0`,children:[(0,H.jsx)(`h3`,{className:`truncate font-medium text-ink`,children:t.username}),(0,H.jsx)(`p`,{className:`truncate text-sm text-ink-muted`,children:t.email||e(`userManager.noEmail`)}),(0,H.jsxs)(`p`,{className:`mt-1 text-xs text-ink-subtle`,children:[e(`userManager.approval.registered`,`Registered`),`:`,` `,new Date(t.createdAt).toLocaleString()]})]}),(0,H.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[(0,H.jsxs)(D,{type:`button`,size:`sm`,"data-testid":`approve-user-button`,onClick:()=>void M(t),className:`gap-2`,children:[(0,H.jsx)(d,{size:16}),e(`userManager.approval.activate`,`Activate account`)]}),(0,H.jsx)(D,{type:`button`,variant:`outline`,size:`sm`,"aria-label":e(`userManager.approval.reject`,`Reject registration`),onClick:()=>void A(t.id,t.username),className:`text-red-600 hover:bg-red-50 hover:text-red-700 dark:text-red-400 dark:hover:bg-red-900/20 dark:hover:text-red-300`,children:(0,H.jsx)(f,{size:16})})]})]},t.id))})})]}),(0,H.jsxs)(F,{className:`bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 shadow-lg`,children:[(0,H.jsxs)(N,{children:[(0,H.jsxs)(I,{className:`text-gray-900 dark:text-gray-100`,children:[e(`userManager.title`),` (`,C.length,`)`]}),(0,H.jsx)(O,{className:`text-gray-600 dark:text-gray-400`,children:e(`userManager.subtitle`)})]}),(0,H.jsx)(j,{children:(0,H.jsx)(`div`,{className:`space-y-3`,children:C.map(t=>(0,H.jsxs)(`div`,{className:`flex items-center justify-between p-4 bg-gray-50 dark:bg-dark-100 rounded-lg border border-gray-200 dark:border-dark-300`,children:[(0,H.jsxs)(`div`,{className:`flex items-center space-x-3`,children:[(0,H.jsx)(`div`,{className:`p-2 bg-primary-100 dark:bg-primary-900/20 rounded-lg`,children:t.role===`admin`?(0,H.jsx)(p,{className:`h-5 w-5 text-primary-600 dark:text-primary-400`}):(0,H.jsx)(l,{className:`h-5 w-5 text-primary-600 dark:text-primary-400`})}),(0,H.jsxs)(`div`,{children:[(0,H.jsxs)(`h3`,{className:`font-medium text-gray-900 dark:text-gray-100`,children:[t.username,t.id===_?.id&&(0,H.jsxs)(`span`,{className:`ml-2 text-xs text-primary-600 dark:text-primary-400 font-normal`,children:[`(`,e(`chatMessage.you`),`)`]})]}),(0,H.jsxs)(`p`,{className:`text-sm text-gray-600 dark:text-gray-400`,children:[t.email||e(`userManager.noEmail`),` •`,` `,t.role===`admin`?e(`userManager.roles.admin`):e(`userManager.roles.user`)]}),(0,H.jsxs)(`p`,{className:`text-xs text-gray-500 dark:text-gray-500`,children:[e(`userManager.columns.created`),`:`,` `,new Date(t.createdAt).toLocaleDateString()]})]})]}),(0,H.jsxs)(`div`,{className:`flex space-x-2`,children:[(0,H.jsx)(D,{variant:`outline`,size:`sm`,onClick:()=>L(t),className:`text-gray-600 dark:text-gray-400 hover:text-primary-600 dark:hover:text-primary-400`,children:(0,H.jsx)(s,{size:16})}),(0,H.jsx)(D,{variant:`outline`,size:`sm`,onClick:()=>A(t.id,t.username),disabled:t.id===_?.id,className:`text-red-600 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300 hover:bg-red-50 dark:hover:bg-red-900/20`,children:(0,H.jsx)(f,{size:16})})]})]},t.id))})})]})]})},G=()=>{let{t:e}=r(),t=E(e=>e.systemInfo),n=E(e=>e.setSystemInfo),[a,o]=(0,V.useState)(null),[s,c]=(0,V.useState)(!1),[l,u]=(0,V.useState)(!1),[d,f]=(0,V.useState)(!1),[p,m]=(0,V.useState)(0);return(0,V.useEffect)(()=>{let e=!1;return C.access().then(t=>{e||(t.success&&t.data?(o(t.data.enabled),c(t.data.lockedByEnv)):f(!0))}).catch(()=>{e||f(!0)}),()=>{e=!0}},[p]),(0,H.jsx)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-white dark:bg-dark-100 p-4`,children:(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`h4`,{className:`text-sm font-medium text-gray-900 dark:text-gray-100`,children:e(`userManager.agentAccess.title`)}),(0,H.jsx)(`p`,{className:`text-xs text-gray-500 dark:text-gray-400 mt-1`,children:e(`userManager.agentAccess.description`)}),s&&(0,H.jsx)(`p`,{className:`text-xs text-amber-600 dark:text-amber-400 mt-1`,children:e(`userManager.agentAccess.lockedByEnv`)})]}),a===null&&d?(0,H.jsx)(D,{size:`sm`,variant:`outline`,onClick:()=>{f(!1),m(e=>e+1)},children:e(`common.retry`)}):(0,H.jsx)(B,{checked:a===!0,onChange:async r=>{u(!0);try{let a=await C.setAccess(r);if(!a.success||!a.data)throw Error(a.error||`Agent access update failed.`);o(a.data.enabled),t&&n({...t,agentsEnabled:a.data.enabled}),i.success(e(`userManager.agentAccess.saved`))}catch{i.error(e(`userManager.agentAccess.saveFailed`))}finally{u(!1)}},disabled:l||a===null||s})]})})},K=()=>{let{t:e}=r(),[t,n]=(0,V.useState)([]),[a,o]=(0,V.useState)([]),[s,l]=(0,V.useState)(!1),[d,p]=(0,V.useState)(!0),[m,v]=(0,V.useState)(!1),[y,b]=(0,V.useState)(``),[C,w]=(0,V.useState)(``),[T,E]=(0,V.useState)(!1),[O,k]=(0,V.useState)(null),[j,M]=(0,V.useState)(``),[N,F]=(0,V.useState)(null),[I,L]=(0,V.useState)(``),[R,z]=(0,V.useState)(null),[B,U]=(0,V.useState)(!1),W=(0,V.useMemo)(()=>{let e=new Map;return a.forEach(t=>e.set(t.id,t.username)),e},[a]),G=(0,V.useCallback)(async()=>{p(!0),l(!1);try{let[e,t]=await Promise.all([S.getGroups(),x.getUsers()]);if(!e.success||!e.data)throw Error(e.error||`Failed to load groups.`);n(e.data),t.success&&t.data&&o(t.data)}catch{l(!0)}finally{p(!1)}},[]);(0,V.useEffect)(()=>{let e=setTimeout(()=>void G(),0);return()=>clearTimeout(e)},[G]);let K=async t=>{if(t.preventDefault(),!y.trim()){i.error(e(`userManager.groups.nameRequired`,`Give the group a name.`));return}E(!0);try{let t=await S.createGroup({name:y.trim(),description:C.trim()||void 0});if(!t.success)throw Error(t.error||`Group creation failed.`);b(``),w(``),v(!1),i.success(e(`userManager.groups.created`,`Group created.`)),await G()}catch(t){i.error(t instanceof Error&&t.message?t.message:e(`userManager.groups.createFailed`,`The group could not be created.`))}finally{E(!1)}},q=async t=>{F(t.id);try{let n=await S.deleteGroup(t.id);if(!n.success)throw Error(n.error||`Group delete failed.`);i.success(e(`userManager.groups.deleted`,`Group deleted.`)),O===t.id&&k(null),await G()}catch(t){i.error(t instanceof Error&&t.message?t.message:e(`userManager.groups.deleteFailed`,`The group could not be deleted.`))}finally{F(null)}},J=async t=>{if(j){F(t.id);try{let n=await S.addGroupMember(t.id,j);if(!n.success)throw Error(n.error||`Member add failed.`);M(``),i.success(e(`userManager.groups.memberAdded`,`Member added.`)),await G()}catch(t){i.error(t instanceof Error&&t.message?t.message:e(`userManager.groups.memberAddFailed`,`The member could not be added.`))}finally{F(null)}}},Y=async(t,n)=>{F(t.id);try{let r=await S.removeGroupMember(t.id,n);if(!r.success)throw Error(r.error||`Member remove failed.`);i.success(e(`userManager.groups.memberRemoved`,`Member removed.`)),await G()}catch(t){i.error(t instanceof Error&&t.message?t.message:e(`userManager.groups.memberRemoveFailed`,`The member could not be removed.`))}finally{F(null)}},X=async t=>{if(L(t),z(null),t){U(!0);try{let e=await S.getEffectiveAccess(t);if(!e.success||!e.data)throw Error(e.error||`Access lookup failed.`);z(e.data)}catch(t){i.error(t instanceof Error&&t.message?t.message:e(`userManager.groups.accessLookupFailed`,`The effective access could not be loaded.`))}finally{U(!1)}}},Z=e=>e.map(e=>({value:e.id,label:e.username}));return(0,H.jsxs)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-white dark:bg-dark-100 p-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsxs)(`h4`,{className:`flex items-center gap-2 text-sm font-medium text-gray-900 dark:text-gray-100`,children:[(0,H.jsx)(h,{className:`h-4 w-4 text-primary-500`}),e(`userManager.groups.title`,`Groups`)]}),(0,H.jsx)(`p`,{className:`text-xs text-gray-500 dark:text-gray-400 mt-1`,children:e(`userManager.groups.description`,`Group accounts to manage shared access, and inspect what any account can effectively do.`)})]}),s?(0,H.jsx)(D,{size:`sm`,variant:`outline`,onClick:()=>void G(),children:e(`common.retry`)}):(0,H.jsxs)(D,{size:`sm`,variant:`outline`,onClick:()=>v(e=>!e),className:`gap-1.5`,children:[(0,H.jsx)(c,{size:14}),e(`userManager.groups.newGroup`,`New group`)]})]}),m&&(0,H.jsxs)(`form`,{onSubmit:K,className:`mt-4 rounded-lg border border-gray-200 dark:border-dark-300 bg-gray-50 dark:bg-dark-50 p-4 space-y-3`,children:[(0,H.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,H.jsxs)(`label`,{className:`block`,children:[(0,H.jsx)(`span`,{className:`mb-1 block text-sm font-medium text-gray-900 dark:text-gray-100`,children:e(`userManager.groups.nameLabel`,`Name`)}),(0,H.jsx)(P,{value:y,onChange:e=>b(e.target.value)})]}),(0,H.jsxs)(`label`,{className:`block`,children:[(0,H.jsx)(`span`,{className:`mb-1 block text-sm font-medium text-gray-900 dark:text-gray-100`,children:e(`userManager.groups.descriptionLabel`,`Description (optional)`)}),(0,H.jsx)(P,{value:C,onChange:e=>w(e.target.value)})]})]}),(0,H.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,H.jsx)(D,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>v(!1),children:e(`common.cancel`)}),(0,H.jsx)(D,{type:`submit`,size:`sm`,disabled:T,children:T?e(`userManager.groups.creating`,`Creating…`):e(`userManager.groups.create`,`Create group`)})]})]}),(0,H.jsx)(`div`,{className:`mt-4 space-y-3`,children:d?(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`common.loading`)}):s?(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`userManager.groups.loadFailed`,`The groups could not be loaded.`)}):t.length===0?(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`userManager.groups.empty`,`No groups yet.`)}):t.map(t=>{let n=O===t.id,r=new Set(t.members.map(e=>e.user_id)),i=a.filter(e=>!r.has(e.id));return(0,H.jsxs)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-gray-50 dark:bg-dark-100`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-3 p-4`,children:[(0,H.jsxs)(`button`,{type:`button`,className:`flex min-w-0 flex-1 items-center gap-2 text-start`,onClick:()=>{k(n?null:t.id),M(``)},"aria-expanded":n,children:[n?(0,H.jsx)(_,{className:`h-4 w-4 shrink-0 text-gray-500 dark:text-gray-400`}):(0,H.jsx)(u,{className:`h-4 w-4 shrink-0 text-gray-500 dark:text-gray-400`}),(0,H.jsxs)(`span`,{className:`min-w-0`,children:[(0,H.jsxs)(`span`,{className:`block truncate text-sm font-medium text-gray-900 dark:text-gray-100`,children:[t.name,(0,H.jsx)(`span`,{className:`ms-2 text-xs font-normal text-gray-500 dark:text-gray-400`,children:e(`userManager.groups.memberCount`,{count:t.members.length,defaultValue:`Members: {{count}}`})})]}),t.description&&(0,H.jsx)(`span`,{className:`block truncate text-xs text-gray-500 dark:text-gray-400`,children:t.description})]})]}),(0,H.jsx)(D,{size:`sm`,variant:`outline`,onClick:()=>void q(t),disabled:N===t.id,"aria-label":e(`userManager.groups.deleteGroup`,`Delete group`),className:`text-red-600 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300 hover:bg-red-50 dark:hover:bg-red-900/20`,children:(0,H.jsx)(f,{size:16})})]}),n&&(0,H.jsxs)(`div`,{className:`border-t border-gray-200 dark:border-dark-300 p-4 space-y-3`,children:[t.members.length===0?(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`userManager.groups.noMembers`,`No members yet.`)}):(0,H.jsx)(`div`,{className:`space-y-2`,children:t.members.map(n=>(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-lg border border-gray-200 dark:border-dark-300 bg-white dark:bg-dark-50 px-3 py-2`,children:[(0,H.jsxs)(`div`,{className:`min-w-0`,children:[(0,H.jsx)(`p`,{className:`truncate text-sm text-gray-900 dark:text-gray-100`,children:W.get(n.user_id)||n.user_id}),(0,H.jsxs)(`p`,{className:`text-xs text-gray-500 dark:text-gray-400`,children:[e(`userManager.groups.addedAt`,`Added`),`:`,` `,new Date(n.added_at).toLocaleDateString()]})]}),(0,H.jsx)(D,{size:`sm`,variant:`outline`,onClick:()=>void Y(t,n.user_id),disabled:N===t.id,"aria-label":e(`userManager.groups.removeMember`,`Remove member`),children:(0,H.jsx)(g,{size:16})})]},n.user_id))}),i.length>0&&(0,H.jsxs)(`div`,{className:`flex items-end gap-2`,children:[(0,H.jsx)(`div`,{className:`flex-1`,children:(0,H.jsx)(A,{label:e(`userManager.groups.addMember`,`Add member`),value:j,onChange:e=>M(e.target.value),options:[{value:``,label:e(`userManager.groups.selectUser`,`Select a user…`)},...Z(i)]})}),(0,H.jsx)(D,{size:`sm`,onClick:()=>void J(t),disabled:!j||N===t.id,className:`mb-0.5`,children:e(`userManager.groups.add`,`Add`)})]})]})]},t.id)})}),(0,H.jsxs)(`div`,{className:`mt-6 border-t border-gray-200 dark:border-dark-300 pt-4 space-y-3`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`h4`,{className:`text-sm font-medium text-gray-900 dark:text-gray-100`,children:e(`userManager.groups.effectiveTitle`,`Effective access`)}),(0,H.jsx)(`p`,{className:`text-xs text-gray-500 dark:text-gray-400 mt-1`,children:e(`userManager.groups.effectiveDescription`,`Pick an account to see the access it ends up with across role, groups, and grants.`)})]}),(0,H.jsx)(A,{value:I,onChange:e=>void X(e.target.value),options:[{value:``,label:e(`userManager.groups.selectUser`,`Select a user…`)},...Z(a)]}),B&&(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`common.loading`)}),R&&!B&&(0,H.jsxs)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-gray-50 dark:bg-dark-50 p-4 space-y-3`,children:[(0,H.jsxs)(`p`,{className:`text-sm text-gray-900 dark:text-gray-100`,children:[(0,H.jsx)(`span`,{className:`font-medium`,children:R.username}),(0,H.jsxs)(`span`,{className:`text-gray-500 dark:text-gray-400`,children:[` · `,e(`userManager.groups.roleLabel`,`Role`),`: `,R.role,` · `,e(`userManager.groups.statusLabel`,`Status`),`: `,R.status]})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`p`,{className:`mb-1 text-xs font-medium text-gray-500 dark:text-gray-400`,children:e(`userManager.groups.memberOf`,`Groups`)}),R.groups.length===0?(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`common.none`)}):(0,H.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:R.groups.map(e=>(0,H.jsx)(`span`,{className:`rounded-full bg-primary-100 dark:bg-primary-900/30 px-2 py-0.5 text-xs text-primary-700 dark:text-primary-300`,children:e.name},e.id))})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`p`,{className:`mb-1 text-xs font-medium text-gray-500 dark:text-gray-400`,children:e(`userManager.groups.featuresLabel`,`Feature access`)}),(0,H.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:Object.entries(R.features).map(([t,n])=>(0,H.jsxs)(`span`,{className:n?`rounded-full bg-green-100 dark:bg-green-900/30 px-2 py-0.5 text-xs text-green-700 dark:text-green-300`:`rounded-full bg-gray-100 dark:bg-dark-200 px-2 py-0.5 text-xs text-gray-500 dark:text-gray-400`,children:[t,`: `,e(n?`common.yes`:`common.no`)]},t))})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`p`,{className:`mb-1 text-xs font-medium text-gray-500 dark:text-gray-400`,children:e(`userManager.groups.grantsLabel`,`Grants`)}),R.grants.length===0?(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`common.none`)}):(0,H.jsx)(`div`,{className:`space-y-1`,children:R.grants.map(t=>(0,H.jsxs)(`p`,{className:`text-xs text-gray-700 dark:text-gray-300`,children:[t.resourceType,`/`,t.resourceId,` ·`,` `,t.permission,` `,(0,H.jsxs)(`span`,{className:`text-gray-500 dark:text-gray-400`,children:[`(`,e(`userManager.groups.grantVia`,`via`),` `,t.via,`)`]})]},t.id))})]})]})]})]})},q={success:`bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300`,denied:`bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-300`,failure:`bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300`},J=()=>{let{t:e}=r(),[t,n]=(0,V.useState)([]),[i,o]=(0,V.useState)(!0),[s,c]=(0,V.useState)(!1),[l,d]=(0,V.useState)(null),[f,p]=(0,V.useState)(``),[m,h]=(0,V.useState)(``),[g,y]=(0,V.useState)(`50`),b=(0,V.useCallback)(async()=>{o(!0),c(!1);try{let e=Number(g),t=await S.getAuditEvents({action:f.trim()||void 0,result:m||void 0,limit:Number.isInteger(e)&&e>0?e:void 0});if(!t.success||!t.data)throw Error(t.error||`Failed to load audit events.`);n(t.data)}catch{c(!0)}finally{o(!1)}},[f,m,g]);(0,V.useEffect)(()=>{let e=setTimeout(()=>void b(),0);return()=>clearTimeout(e)},[]);let x=t=>{switch(t){case`success`:return e(`userManager.audit.resultSuccess`,`Success`);case`denied`:return e(`userManager.audit.resultDenied`,`Denied`);case`failure`:return e(`userManager.audit.resultFailure`,`Failure`);default:return t}};return(0,H.jsxs)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-white dark:bg-dark-100 p-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsxs)(`h4`,{className:`flex items-center gap-2 text-sm font-medium text-gray-900 dark:text-gray-100`,children:[(0,H.jsx)(a,{className:`h-4 w-4 text-primary-500`}),e(`userManager.audit.title`,`Security audit log`)]}),(0,H.jsx)(`p`,{className:`text-xs text-gray-500 dark:text-gray-400 mt-1`,children:e(`userManager.audit.description`,`Recent sign-ins, permission checks, and administrative changes on this instance.`)})]}),(0,H.jsxs)(D,{size:`sm`,variant:`outline`,onClick:()=>void b(),disabled:i,className:`gap-1.5`,children:[(0,H.jsx)(v,{size:14,className:i?`animate-spin`:void 0}),e(`common.refresh`)]})]}),(0,H.jsxs)(`div`,{className:`mt-4 grid gap-3 sm:grid-cols-3`,children:[(0,H.jsxs)(`label`,{className:`block`,children:[(0,H.jsx)(`span`,{className:`mb-1 block text-xs font-medium text-gray-500 dark:text-gray-400`,children:e(`userManager.audit.actionFilter`,`Action`)}),(0,H.jsx)(P,{value:f,onChange:e=>p(e.target.value),placeholder:e(`userManager.audit.actionPlaceholder`,`e.g. auth.login`),spellCheck:!1,dir:`ltr`})]}),(0,H.jsxs)(`label`,{className:`block`,children:[(0,H.jsx)(`span`,{className:`mb-1 block text-xs font-medium text-gray-500 dark:text-gray-400`,children:e(`userManager.audit.resultFilter`,`Result`)}),(0,H.jsx)(A,{value:m,onChange:e=>h(e.target.value),options:[{value:``,label:e(`common.all`)},{value:`success`,label:e(`userManager.audit.resultSuccess`,`Success`)},{value:`denied`,label:e(`userManager.audit.resultDenied`,`Denied`)},{value:`failure`,label:e(`userManager.audit.resultFailure`,`Failure`)}]})]}),(0,H.jsxs)(`label`,{className:`block`,children:[(0,H.jsx)(`span`,{className:`mb-1 block text-xs font-medium text-gray-500 dark:text-gray-400`,children:e(`userManager.audit.limitFilter`,`Limit`)}),(0,H.jsx)(P,{type:`number`,min:1,max:500,value:g,onChange:e=>y(e.target.value),dir:`ltr`})]})]}),(0,H.jsx)(`div`,{className:`mt-4 space-y-2`,children:i?(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`common.loading`)}):s?(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`userManager.audit.loadFailed`,`The audit log could not be loaded.`)}),(0,H.jsx)(D,{size:`sm`,variant:`outline`,onClick:()=>void b(),children:e(`common.retry`)})]}):t.length===0?(0,H.jsx)(`p`,{className:`text-sm text-gray-500 dark:text-gray-400`,children:e(`userManager.audit.empty`,`No audit events recorded yet.`)}):t.map(t=>{let n=l===t.id,r=t.details&&Object.keys(t.details).length>0;return(0,H.jsxs)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-gray-50 dark:bg-dark-50`,children:[(0,H.jsxs)(`button`,{type:`button`,className:`flex w-full items-center gap-3 px-3 py-2 text-start`,onClick:()=>d(n?null:t.id),"aria-expanded":n,children:[r?n?(0,H.jsx)(_,{className:`h-4 w-4 shrink-0 text-gray-500 dark:text-gray-400`}):(0,H.jsx)(u,{className:`h-4 w-4 shrink-0 text-gray-500 dark:text-gray-400`}):(0,H.jsx)(`span`,{className:`h-4 w-4 shrink-0`}),(0,H.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,H.jsxs)(`span`,{className:`flex flex-wrap items-center gap-2`,children:[(0,H.jsx)(`span`,{className:`text-sm font-medium text-gray-900 dark:text-gray-100`,children:t.action}),(0,H.jsx)(`span`,{className:`rounded-full px-2 py-0.5 text-xs font-medium ${q[t.result]||`bg-gray-100 dark:bg-dark-200 text-gray-600 dark:text-gray-300`}`,children:x(t.result)})]}),(0,H.jsxs)(`span`,{className:`mt-0.5 block truncate text-xs text-gray-500 dark:text-gray-400`,children:[new Date(t.occurredAt).toLocaleString(),` · `,e(`userManager.audit.actor`,`Actor`),`:`,` `,t.actorUserId||t.actorKind,t.targetType&&(0,H.jsxs)(H.Fragment,{children:[` · `,e(`userManager.audit.target`,`Target`),`:`,` `,t.targetType,t.targetId?`/${t.targetId}`:``]})]})]})]}),n&&r&&(0,H.jsx)(`pre`,{dir:`ltr`,className:`mx-3 mb-3 overflow-x-auto rounded-md bg-white dark:bg-dark-100 border border-gray-200 dark:border-dark-300 p-3 text-xs text-gray-700 dark:text-gray-300`,children:JSON.stringify(t.details,null,2)})]},t.id)})})]})},Y=()=>{let{t:e}=r(),[t,n]=(0,V.useState)(null),[a,o]=(0,V.useState)(!1),[s,c]=(0,V.useState)(!1),[l,u]=(0,V.useState)(0);return(0,V.useEffect)(()=>{let e=!1;return T.getModelAccess().then(t=>{e||(t.success&&t.data?n(t.data.mode):c(!0))}).catch(()=>{e||c(!0)}),()=>{e=!0}},[l]),(0,H.jsx)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-white dark:bg-dark-100 p-4`,children:(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`h4`,{className:`text-sm font-medium text-gray-900 dark:text-gray-100`,children:e(`userManager.modelAccess.title`)}),(0,H.jsx)(`p`,{className:`text-xs text-gray-500 dark:text-gray-400 mt-1`,children:e(`userManager.modelAccess.description`)})]}),t===null&&s?(0,H.jsx)(D,{size:`sm`,variant:`outline`,onClick:()=>{c(!1),u(e=>e+1)},children:e(`common.retry`)}):(0,H.jsx)(B,{checked:t===`all-users`,onChange:async t=>{let r=t?`all-users`:`admins`;o(!0);try{if(!(await T.setModelAccess(r)).success)throw Error(`Model download access update failed.`);n(r),i.success(e(`userManager.modelAccess.saved`))}catch{i.error(e(`userManager.modelAccess.saveFailed`))}finally{o(!1)}},disabled:a||t===null})]})})},X=()=>{let{t:e}=r(),[t,n]=(0,V.useState)(null),[a,o]=(0,V.useState)(!1),[s,c]=(0,V.useState)(!1),[l,u]=(0,V.useState)(0);return(0,V.useEffect)(()=>{let e=!1;return w.getAccess().then(t=>{e||(t.success&&t.data?n(t.data.mode):c(!0))}).catch(()=>{e||c(!0)}),()=>{e=!0}},[l]),(0,H.jsx)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-white dark:bg-dark-100 p-4`,children:(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`h4`,{className:`text-sm font-medium text-gray-900 dark:text-gray-100`,children:e(`userManager.webSearchAccess.title`)}),(0,H.jsx)(`p`,{className:`text-xs text-gray-500 dark:text-gray-400 mt-1`,children:e(`userManager.webSearchAccess.description`)})]}),t===null&&s?(0,H.jsx)(D,{size:`sm`,variant:`outline`,onClick:()=>{c(!1),u(e=>e+1)},children:e(`common.retry`)}):(0,H.jsx)(B,{checked:t===`all-users`,onChange:async t=>{let r=t?`all-users`:`admins`;o(!0);try{if(!(await w.setAccess(r)).success)throw Error(`Web search access update failed.`);n(r),i.success(e(`userManager.webSearchAccess.saved`))}catch{i.error(e(`userManager.webSearchAccess.saveFailed`))}finally{o(!1)}},disabled:a||t===null})]})})},Z=()=>{let{t:e}=r(),t=E(e=>e.refreshWorkAccess),[n,a]=(0,V.useState)(null),[o,s]=(0,V.useState)(!1),[c,l]=(0,V.useState)(!1),[u,d]=(0,V.useState)(0);return(0,V.useEffect)(()=>{let e=!1;return b.access().then(t=>{e||(t.success&&t.data?a(t.data.mode):l(!0))}).catch(()=>{e||l(!0)}),()=>{e=!0}},[u]),(0,H.jsx)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-white dark:bg-dark-100 p-4`,children:(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`h4`,{className:`text-sm font-medium text-gray-900 dark:text-gray-100`,children:e(`userManager.workAccess.title`)}),(0,H.jsx)(`p`,{className:`text-xs text-gray-500 dark:text-gray-400 mt-1`,children:e(`userManager.workAccess.description`)})]}),n===null&&c?(0,H.jsx)(D,{size:`sm`,variant:`outline`,onClick:()=>{l(!1),d(e=>e+1)},children:e(`common.retry`)}):(0,H.jsx)(B,{checked:n===`all-users`,onChange:async n=>{let r=n?`all-users`:`admins`;s(!0);try{if(!(await b.setAccess(r)).success)throw Error(`Work access update failed.`);a(r),await t(),i.success(e(`userManager.workAccess.saved`))}catch{i.error(e(`userManager.workAccess.saveFailed`))}finally{s(!1)}},disabled:o||n===null})]})})},Q={name:``,image:``,memoryLimit:``,cpuLimit:``,pidsLimit:``,workspaceSize:``,idleMinutes:``,networkDefault:`inherit`},ee=e=>({name:e.name,image:e.image??``,memoryLimit:e.memoryLimit??``,cpuLimit:e.cpuLimit??``,pidsLimit:e.pidsLimit===void 0?``:String(e.pidsLimit),workspaceSize:e.workspaceSize??``,idleMinutes:e.idleTimeoutMs===void 0?``:String(e.idleTimeoutMs/6e4),networkDefault:e.networkDefault===void 0?`inherit`:e.networkDefault?`on`:`off`}),te=e=>[e.pidsLimit,e.idleMinutes].some(e=>e.trim()!==``&&!Number.isFinite(Number(e))),ne=e=>({name:e.name.trim(),image:e.image.trim()||null,memoryLimit:e.memoryLimit.trim()||null,cpuLimit:e.cpuLimit.trim()||null,pidsLimit:e.pidsLimit.trim()?Number(e.pidsLimit):null,workspaceSize:e.workspaceSize.trim()||null,idleTimeoutMs:e.idleMinutes.trim()?Math.round(Number(e.idleMinutes)*6e4):null,networkDefault:e.networkDefault===`inherit`?null:e.networkDefault===`on`}),re=()=>{let{t:e}=r(),[t,n]=(0,V.useState)([]),[a,s]=(0,V.useState)(null),[l,u]=(0,V.useState)(Q),[d,p]=(0,V.useState)(!1),m=async()=>{try{let e=await b.listPolicies();e.success&&e.data&&n(e.data)}catch{}};(0,V.useEffect)(()=>{let e=!1;return b.listPolicies().then(t=>{!e&&t.success&&t.data&&n(t.data)}).catch(()=>{}),()=>{e=!0}},[]);let h=e=>({value:l[e],onChange:t=>u(n=>({...n,[e]:t.target.value}))}),g=async()=>{if(te(l)){i.error(e(`userManager.workPolicies.invalidNumber`));return}p(!0);try{let t=ne(l),n=a===`new`?await b.createPolicy(t):await b.updatePolicy(a,t);if(!n.success)throw Error(n.error||`Policy save failed.`);i.success(e(`userManager.workPolicies.saved`)),s(null),u(Q),await m()}catch(t){i.error(t instanceof Error&&t.message?t.message:e(`userManager.workPolicies.failed`))}finally{p(!1)}},_=async t=>{if(window.confirm(e(`userManager.workPolicies.deleteConfirm`)))try{let n=await b.deletePolicy(t.id);if(!n.success)throw Error(n.error||`Policy delete failed.`);i.success(e(`userManager.workPolicies.deleted`)),await m()}catch(t){i.error(t instanceof Error&&t.message?t.message:e(`userManager.workPolicies.failed`))}},v=(e,t,n)=>(0,H.jsxs)(`label`,{className:`block text-xs`,children:[(0,H.jsx)(`span`,{className:`mb-1 block font-medium text-gray-700 dark:text-gray-300`,children:t}),(0,H.jsx)(`input`,{...h(e),placeholder:n,spellCheck:!1,className:`w-full rounded-lg border border-gray-200 bg-white px-2.5 py-1.5 text-sm text-gray-900 outline-none focus:border-primary-500 dark:border-dark-300 dark:bg-dark-50 dark:text-gray-100`})]});return(0,H.jsxs)(`div`,{className:`rounded-lg border border-gray-200 dark:border-dark-300 bg-white dark:bg-dark-100 p-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`h4`,{className:`text-sm font-medium text-gray-900 dark:text-gray-100`,children:e(`userManager.workPolicies.title`)}),(0,H.jsx)(`p`,{className:`text-xs text-gray-500 dark:text-gray-400 mt-1`,children:e(`userManager.workPolicies.description`)})]}),a===null&&(0,H.jsxs)(D,{size:`sm`,variant:`outline`,className:`shrink-0 whitespace-nowrap`,onClick:()=>{u(Q),s(`new`)},children:[(0,H.jsx)(c,{size:14,className:`shrink-0`}),(0,H.jsx)(`span`,{className:`ms-1.5`,children:e(`userManager.workPolicies.add`)})]})]}),t.length===0&&a===null&&(0,H.jsx)(`p`,{className:`mt-3 text-xs text-gray-500 dark:text-gray-400`,children:e(`userManager.workPolicies.empty`)}),t.length>0&&(0,H.jsx)(`ul`,{className:`mt-3 divide-y divide-gray-100 dark:divide-dark-300`,children:t.map(t=>(0,H.jsxs)(`li`,{className:`flex items-center justify-between gap-3 py-2`,children:[(0,H.jsxs)(`div`,{className:`min-w-0`,children:[(0,H.jsx)(`div`,{className:`text-sm font-medium text-gray-900 dark:text-gray-100`,children:t.name}),(0,H.jsx)(`div`,{className:`mt-0.5 truncate font-mono text-[11px] text-gray-500 dark:text-gray-400`,children:[t.memoryLimit,t.cpuLimit&&`cpu ${t.cpuLimit}`,t.pidsLimit&&`pids ${t.pidsLimit}`,t.workspaceSize,t.idleTimeoutMs!==void 0&&`idle ${Math.round(t.idleTimeoutMs/6e4)}m`,t.networkDefault!==void 0&&`net ${t.networkDefault?`on`:`off`}`,t.image].filter(Boolean).join(` · `)||`—`})]}),(0,H.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[(0,H.jsx)(D,{size:`sm`,variant:`ghost`,"aria-label":e(`userManager.workPolicies.edit`),onClick:()=>{u(ee(t)),s(t.id)},children:(0,H.jsx)(o,{size:14})}),(0,H.jsx)(D,{size:`sm`,variant:`ghost`,"aria-label":e(`userManager.workPolicies.delete`),onClick:()=>void _(t),children:(0,H.jsx)(f,{size:14})})]})]},t.id))}),a!==null&&(0,H.jsxs)(`div`,{className:`mt-4 rounded-lg border border-gray-200 p-3 dark:border-dark-300`,children:[(0,H.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-4`,children:[v(`name`,e(`userManager.workPolicies.name`),`heavy`),v(`memoryLimit`,e(`userManager.workPolicies.memory`),`4g`),v(`cpuLimit`,e(`userManager.workPolicies.cpu`),`4`),v(`pidsLimit`,e(`userManager.workPolicies.pids`),`512`),v(`workspaceSize`,e(`userManager.workPolicies.workspaceSize`),`20Gi`),v(`idleMinutes`,e(`userManager.workPolicies.idleMinutes`),`30`),(0,H.jsxs)(`label`,{className:`block text-xs`,children:[(0,H.jsx)(`span`,{className:`mb-1 block font-medium text-gray-700 dark:text-gray-300`,children:e(`userManager.workPolicies.networkDefault`)}),(0,H.jsxs)(`select`,{...h(`networkDefault`),className:`w-full rounded-lg border border-gray-200 bg-white px-2.5 py-1.5 text-sm text-gray-900 outline-none focus:border-primary-500 dark:border-dark-300 dark:bg-dark-50 dark:text-gray-100`,children:[(0,H.jsx)(`option`,{value:`inherit`,children:e(`userManager.workPolicies.networkInherit`)}),(0,H.jsx)(`option`,{value:`on`,children:e(`userManager.workPolicies.networkOn`)}),(0,H.jsx)(`option`,{value:`off`,children:e(`userManager.workPolicies.networkOff`)})]})]}),v(`image`,e(`userManager.workPolicies.image`),`node:22-bookworm@sha256:…`)]}),(0,H.jsxs)(`div`,{className:`mt-3 flex justify-end gap-2`,children:[(0,H.jsx)(D,{size:`sm`,variant:`ghost`,disabled:d,onClick:()=>{s(null),u(Q)},children:e(`userManager.workPolicies.cancel`)}),(0,H.jsx)(D,{size:`sm`,disabled:d||!l.name.trim(),onClick:()=>void g(),children:e(`userManager.workPolicies.save`)})]})]})]})},$=()=>{let{t:e}=r();return(0,H.jsxs)(M,{children:[(0,H.jsx)(L,{title:e(`userManager.title`),description:e(`userManager.pageDescription`)}),(0,H.jsxs)(`div`,{className:`mb-4 space-y-4`,children:[(0,H.jsx)(Z,{}),(0,H.jsx)(re,{}),(0,H.jsx)(Y,{}),(0,H.jsx)(X,{}),(0,H.jsx)(G,{}),(0,H.jsx)(K,{}),(0,H.jsx)(J,{})]}),(0,H.jsx)(W,{})]})};export{$ as UserManagementPage,$ as default};
|