PageSourceSearch

https://hiiian-lizpaw1.hf.space/assets/index-kSfDswZP.js

js hiiian-lizpaw1.hf.space collected 2026-10-03 16:56:03 UTC 1,906,291 bytes, 208 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/install-PK32tiu8.js","assets/slotKeys-BY9TYVQB.js","assets/i18n-vendor-BrUIoOSg.js","assets/react-vendor-DbzdS4FP.js","assets/ui-vendor-DCtmHMLE.js","assets/markdown-vendor-DonjKQI4.js","assets/ui-vendor-CS7tQW8N.css","assets/dnd-vendor-DdAwup11.js","assets/registerBuiltinCards-C46HIZ6m.js","assets/v1Adapter-WWRAvqZ5.js","assets/index-4CUxCnTY.js","assets/index-kItWBLGU.css","assets/one-dark-DH5OkDEf.js","assets/useBackgroundTaskWatcher-TX0co-VU.js","assets/toolCalls-CC2B6OZC.js","assets/v1Adapter-BWbtmATx.css","assets/internalFileLinks-CvVEwrm1.js","assets/ACPCard-C4zOJgWk.js","assets/ACPDrawer-B9sxzYjX.js","assets/index-BbHZtuPQ.js","assets/index-BSocZh1V.js","assets/index-CY2dj66M.css","assets/error-AqWg9PNT.js","assets/index-BBRYdjlN.css","assets/CheckpointGraph-BAUhTaXQ.js","assets/index.module-B2d6FHZR.js","assets/index-COCDsWpa.css","assets/RestoreModal-BQdLWM-x.js","assets/index-W-1h6qhM.js","assets/graphLayout-DsTwB23q.js","assets/ADBPGConfigCard-D1fyqxY7.js","assets/AgentLoopCard-B7kUN2Pi.js","assets/index.module-CzrQATot.js","assets/index-BOpol2mu.css","assets/AgentLoopCard-D0gyRPms.css","assets/EmbeddingModelCard-MQvhvOg6.js","assets/embeddingUtils-DgIXRuaC.js","assets/memoryMaintenanceContext-DxqV1BjJ.js","assets/useEmbeddingVerification-DpzZmoLo.js","assets/LightContextCard-xZFovL48.js","assets/SliderWithValue-BmS3E491.js","assets/toolResultSettings-CZtTKPre.js","assets/VisualCompactSettings-DPQgdbZX.js","assets/LlmRateLimiterCard-BySMFRa7.js","assets/LlmRetryCard-Dl8ob0-U.js","assets/PowerContextConfigCard-D0yPt9T2.js","assets/ReMeLightMemoryCard-CyEqqCwm.js","assets/ReMeStatusModal-tYHKCjZ5.js","assets/ReactAgentCard-Cma5GYB8.js","assets/useTimezoneOptions-CoMuKKSC.js","assets/backendMappings-Cw_6_At-.js","assets/ReactAgentCard-BJD7tF9W.css","assets/ToolExecutionLevelCard-DEQT8N7H.js","assets/index-Dx53S_Nf.js","assets/index-D5gjzlxZ.js","assets/useAgentConfig-D4LWtFt2.js","assets/useReMeRuntimeStatus-Dpz9ksxo.js","assets/MCPAccessClientPanel-BbipD0DW.js","assets/accessPolicy-D5yKlKW-.js","assets/index.module-Cl1f8c8i.js","assets/index-CHmdd6AS.css","assets/MCPAccessPolicySegmented-BJjO0LlT.js","assets/MCPAccessRuleRows-CMvVLGsw.js","assets/MCPAccessModal-Dtrt8tw5.js","assets/MCPAccessToolPanel-BBSNAQFW.js","assets/index-SvwHl0E2.js","assets/MCPOAuthSection-BAobGauy.js","assets/index-BmidOtem.js","assets/useMCP-Br23EKE8.js","assets/harness-B4JVY2Eg.js","assets/AddSkillDropdown-b8A3tmUb.js","assets/HeaderActions-zK81qe0n.js","assets/index.module-DBV_778j.js","assets/index-DLY2iJKY.css","assets/ImportHubModal-BaYsg7hB.js","assets/SkillCard-D7d4Jpnf.js","assets/SkillDrawer-DI2-Qvlw.js","assets/markdown-B8mVm3vi.js","assets/index-DyV_w88U.js","assets/RenderableCodeBlock-DDCh5c_v.js","assets/RenderableCodeBlock-BhKKlhZT.css","assets/skillMetadata-TCIsEf6A.js","assets/SkillDrawer-CYeIxOeI.css","assets/useConflictRenameModal-9kvRZJRC.js","assets/PoolTransferModal-Skd0LWHz.js","assets/useSkillFilter-V336M0s8.js","assets/skill-CXem7BIX.js","assets/SkillFilterDropdown-BnkqN8Up.js","assets/SkillsToolbar-KBqTox-g.js","assets/SkillListItem-D7o-Xxk6.js","assets/ProviderSkillDrawer-hO4TzOYa.js","assets/ProviderSkillDrawer-DxR_ylsw.css","assets/ImportHubModal-3SIq6Km5.css","assets/index-DKnpJuil.js","assets/useSkillsPage-BPrT-_CL.js","assets/useProgressiveRender-DtuLq6OS.js","assets/scanError-DQCLOqLD.js","assets/useSkills-GDHB4qmu.js","assets/skillChangeEvents-D5hsAokE.js","assets/WebSearchConfigModal-91UVSbuS.js","assets/index-DXLgk3RU.js","assets/useTools-BgEYIo1s.js","assets/index-BMWuWSDL.css","assets/AppCard-CEOX4XpT.js","assets/index.module-DThFtgIN.js","assets/index-Bbob454p.css","assets/AppMarket-C7wzVsK9.js","assets/pluginCompatibility-CgCY97bP.js","assets/plugin-DmECWo2h.js","assets/marketAppState-CGOAFj9K.js","assets/index-TFPDXvqg.js","assets/index-BWoiKPyv.js","assets/index-B5MhiQlt.css","assets/pawapp-D4r2lX_e.js","assets/osCleanup-T-v_r8ES.js","assets/context-BcZ9rHDt.js","assets/HostBubbles-B0QmsmHA.js","assets/FileGlyph-D-MOCoHl.js","assets/messageDisplay-BSbvVkKY.js","assets/LazyAccordion-BDYN5571.js","assets/HostBubbles-Ew3Dz7dH.css","assets/AgentModelSettings-DiMAMvxB.js","assets/index.module-BmTmeHGb.js","assets/index-5scRJX_f.css","assets/CandidateModelSection-D4hisvK-.js","assets/ProviderIconComponent-BxmHkMKR.js","assets/providerIcon-C-5dBp3Z.js","assets/providerLetterIcon-B_5oy5OF.js","assets/ProviderIconComponent-sVLSBzDp.css","assets/modelSelectorModels-DMgK-EX7.js","assets/OAuthConfirmModal-BkdR5UvF.js","assets/index-D7k2s-Bl.js","assets/freeModelSwitchWarning-Der3TVnK.js","assets/modelSelectorApi-BQMo_uy8.js","assets/useModelSelectorData-Ba7nXSmG.js","assets/RichFileReferenceInput-BCcP_FXx.js","assets/lastEditorCopy-CUqkqeK4.js","assets/fileReferenceFormatting-DRtp_cZv.js","assets/RichFileReferenceInput-CMdduEpj.css","assets/ApprovalLevelToggle-CUDfNY0C.js","assets/useIsMobile-CrxOArvB.js","assets/OsOverlay-BHZwWE2W.js","assets/osWindowContainer-B-Et0jle.js","assets/ApprovalToggle.module-aZlZmt8r.js","assets/ApprovalToggle-C6SEj9yd.css","assets/Backgroun
1dTaskPanel-B_R9A_iC.js","assets/index-BQ7xgpEo.js","assets/useCreateNewSession-DRMSAwOn.js","assets/index-D2Znodb4.css","assets/index-CH7P5TIH.js","assets/index-C84Vrjbl.css","assets/index-CoZdZ5rN.js","assets/index-BvNjHIDo.css","assets/ChatSenderTabsPanel-B3W66Q-L.js","assets/MessageQueuePanel-DLrrXvXA.js","assets/index-nyqj9R32.js","assets/sessionTime-M1-RaxUO.js","assets/index-dt3koKRQ.css","assets/index-Ck21JYev.js","assets/index-DS9PMsST.js","assets/formatNumber-CkfI-tbp.js","assets/cacheUsage-CTPPZqFQ.js","assets/HarnessApprovalToggle-Cvatd3JO.js","assets/HarnessApprovalToggle-DQuOYRrz.css","assets/HarnessModelSelector-CTu69e5m.js","assets/HarnessModelSelector-5vdnDA8b.css","assets/index-BO8NyFcY.js","assets/index-DE2MiYaN.js","assets/chatInputDraft-DjTYFPOs.js","assets/backgroundQueueRegistry-DcoIKQBo.js","assets/defaultConfig-DqDT_JBN.js","assets/loopSlashSuggestions-BnC1fISh.js","assets/replayFastForward-HOU_ABil.js","assets/fallbackNotice-BDnCml1J.js","assets/ApprovalCard-BqfL4fpn.js","assets/ApprovalCard-BZ68DQE6.css","assets/commands-Cf7Hyyxa.js","assets/approvalPayload-D8R4MEha.js","assets/headlineFilter-CYyh7i0b.js","assets/FilePreview-DpljDfWN.js","assets/FilePreview-DjPwGnaN.css","assets/SessionProjectDirectory-DCqOUsdl.js","assets/SessionProjectDirectory-DvTo--TC.css","assets/codingTabsStore-DyMcMMU3.js","assets/messageScroll-CvP4Dz0H.js","assets/longChatPerformance-qL7rrUkY.js","assets/index-DLu9rRdt.css","assets/GitPanel-C0AqP1_2.js","assets/GitPanel-BGR6hE_j.css","assets/TabbedEditor-CkqmFBSN.js","assets/editor-vendor-B_WExrnz.js","assets/editor-vendor-Cgso7ViX.css","assets/editorCopyFormatting-CEBvKJJN.js","assets/getLanguage-DPW4aTiG.js","assets/TabbedEditor-B3KF421A.css","assets/AccessControlDrawer-Cn35PL5G.js","assets/ChannelDrawer-CWMsZZha.js","assets/QrcodeAuthBlock-p3Fedopp.js","assets/useChannelQrcode-CBf0RJIs.js","assets/index-E6z3IerU.js","assets/useChannels-BcJkW6zv.js","assets/index-C43OEexS.js","assets/channelConfig-DvnzDYx1.js","assets/JobDrawer-CePOBq-b.js","assets/constants-D_bHuLWc.js","assets/index.module-DKJ6u8jI.js","assets/index-CGD9qKSu.css","assets/TemplatePickerModal-C6Uu8E66.js","assets/templates-w_DtCC5j.js","assets/columns-BAMZM8Cu.js","assets/parseCron-x4KbODrB.js","assets/index-D3FwRs2J.js","assets/useCronJobs-Bu_5LGfg.js","assets/index-BbCsebvC.js","assets/calendar-C0fhfIib.js","assets/index-Dnt2O03I.js","assets/parseEvery-DLpkEJ2R.js","assets/index-CFyuobL2.css","assets/FilterBar-DDBwrC0c.js","assets/index.module-D6pydUic.js","assets/index-DLlHdVmj.css","assets/SessionDrawer-BRgdgXyS.js","assets/columns-7F6Oqr-E.js","assets/constants-hQbnZLJ2.js","assets/index-dgW_LPtK.js","assets/index-CJdzQc6F.js","assets/useSessions-SuFxaNQi.js","assets/index-DEVlwNas.js","assets/FilesWorkspace-BxlhpaDZ.js","assets/FilesWorkspace-iiBvoLKD.css","assets/index-hrHI94Iw.css","assets/index-C_kk7iNE.js","assets/pageUtils-Bjq7LafW.js","assets/index-CdDmN1hs.css","assets/ApprovalCard-CYg5263g.js","assets/ApprovalCard-DCMj6Sia.css","assets/CreateHarvestModal-BeFlOCvX.js","assets/CreateHarvestModal-D-elwlMs.css","assets/HarvestCard-Bx_flfCZ.js","assets/useHarvestCountdown-B6sY9m-2.js","assets/HarvestCard-r6dLAVZ1.css","assets/MagazineStackViewer-CE3Wwmo4.js","assets/useMockHarvestContent-u_jzVWfp.js","assets/MagazineStackViewer-BID-hsNh.css","assets/MailAccessControlDrawer-BnGaIHY-.js","assets/mailAccessControl-BoJ9LCNz.js","assets/PushMessageCard-T4HRfjc9.js","assets/PushMessageCard-DpaajPdi.css","assets/index-BBODEF4T.js","assets/useInboxData-ClejyQP5.js","assets/inboxEvents-BfjGbJwM.js","assets/useMailPendingCount-BUgH-dsI.js","assets/useTraceViewer-BUjD7h2R.js","assets/traceUtils-BDB8GBWN.js","assets/index-B8w7vB10.js","assets/index-CqAuL1V6.css","assets/index-5mbuJ9A7.js","assets/index-w793Z5lh.css","assets/index-C1xdFnG7.js","assets/index-C7VD8sSj.js","assets/usePluginManager-CVRjZoIm.js","assets/useInstallModal-DIVLvUEI.js","assets/utils-Dd3MJpM-.js","assets/InstallPluginModal-BBGtrTGX.js","assets/InstallPluginModal-FIb3MBpg.css","assets/InstalledPluginList-CCr29e4S.js","assets/usePluginColumns-DVeq6euH.js","assets/PluginTypeTag-BBF8LoQC.js","assets/PluginViewToggle-eem-N1PU.js","assets/PluginViewToggle-BBfOCgj3.css","assets/PluginListToolbar.module-DUGIY8MU.js","assets/PluginListToolbar-CMlboHKS.css","assets/InstalledPluginList-BhqTblH0.css","assets/Off
1icialPluginList-7T3mW_po.js","assets/useOfficialPlugins-CMyTx9wV.js","assets/MarketPluginList-DoUiRqXV.js","assets/useMarketPlugins-DhRsQKm2.js","assets/MarketPanel-BrPhNizX.js","assets/useMarketSearch-DMfaUnpQ.js","assets/EmptyState-BRZ1sRDw.js","assets/EmptyState-DJwHlXzG.css","assets/ResultCard-CKgKZ5g3.js","assets/SkillIcon-DNdbo6yj.js","assets/SkillIcon-BCiA6HCV.css","assets/ResultCard-Bz8gzwYu.css","assets/DetailDrawer-C5PYlzdN.js","assets/DetailDrawer-B9ZAKAZN.css","assets/QueueItem-DKXFaIdj.js","assets/QueueItem-CjizKYU3.css","assets/MarketPanel-XvmFFbyW.css","assets/useMarketInstall-BvBPC-Yc.js","assets/index-DlOFsfIX.css","assets/SummaryCard-BYmi_in0.js","assets/SummaryCard-CquDqBd6.css","assets/index-CGS0W1aZ.js","assets/charts-vendor-BpTB0noD.js","assets/AgentBackendFields-DCqayr1D.js","assets/AgentBackendFields-D1IoXWhf.css","assets/AgentModal-BAbAa3ls.js","assets/index.module-HiDHtt1A.js","assets/index-ClCTR-mC.css","assets/mailDomains-DIDmgc71.js","assets/AgentTable-C8_A5Ehc.js","assets/SortableAgentRow-C90tOa9k.js","assets/CopyAgentModal-CAzuPSiI.js","assets/index-CHNKsSLs.js","assets/index-BJRDoBow.js","assets/useAgents-CwIzu_KG.js","assets/reorder-BF63alpm.js","assets/AgentMultiSelect-rbe_Dfoq.js","assets/BackupProgress-C8KEDIS5.js","assets/BackupProgress-Bp9E7tbE.css","assets/BackupScopeForm-DKht73bZ.js","assets/BackupScopeForm-5jkRK7xb.css","assets/CreateBackupModal-Doieov_1.js","assets/useBackupRunner-CEkr8O2K.js","assets/progress-SVYNRtvp.js","assets/scope-CEwDNAj7.js","assets/backup-lqMPH_9f.js","assets/CreateBackupModal-_rzO0OGl.css","assets/SilentBackupModal-BQ7VYvaF.js","assets/ImportButton-DoUvy1sC.js","assets/ImportConflictModal-DbFkMTfV.js","assets/useImportFlow-rUwt8oF9.js","assets/trustErrors-Cnu7JLRc.js","assets/index-_iaRDZCs.js","assets/BackupTable-C55hj7Ie.js","assets/ScopeTags-BzXcQgZS.js","assets/ScopeTags-KNeMDNxi.css","assets/BackupTable-ZkEB3TUP.css","assets/BackupToolbar-CUYq6qDG.js","assets/BackupToolbar-4ETJZqRs.css","assets/BackupTrustDialog-BXCD7aTH.js","assets/PreRestoreConfirmModal-DDy_6jvi.js","assets/RestoreBackupModal-ORqF8TAH.js","assets/RestoreAgentTable-T1XW8oqW.js","assets/RestoreAgentTable-BtAMBNOA.css","assets/RestoreBackupModal-BDYgVzpq.css","assets/useRestoreFlow-BLnpDcZi.js","assets/index-CqcrxKqW.css","assets/index-RB1aLeDl.js","assets/index-CiMQgTWc.css","assets/index-Du8lfCnN.js","assets/useDebugLogs-D1PB1HZB.js","assets/AddButton-Bs1xq6-L.js","assets/index.module-toTChVDG.js","assets/index-CvD2bYdm.css","assets/EmptyState-CgEYv1_w.js","assets/EnvRow-C8pgSXfo.js","assets/Toolbar-C55cQMV5.js","assets/index--9yHCggP.js","assets/index-BkOxdHz
1X.js","assets/useEnvVars-GHeG5Pm-.js","assets/index-Cp4fV27k.js","assets/LocalProviderCard-Dh_I_Plx.js","assets/index.module-mJ0s0yAc.js","assets/index-BQTR0pFk.css","assets/ProviderCard-B_Wtdi0T.js","assets/RemoteProviderCard-jNC8geCw.js","assets/utils-B_sR6IXl.js","assets/ProviderGroupCard-AFuE1Xgs.js","assets/index-Ccr3OggZ.js","assets/index-CXsHQBx-.js","assets/LoadingState-D-lx13xQ.js","assets/ModelsSection-tlZ8o75i.js","assets/CustomProviderModal-IoceEC_N.js","assets/ProviderConfigModal-BZ9ITqw9.js","assets/testConnectionMessage-_eg2MXHW.js","assets/apiKeyValidation-cDjnNy7b.js","assets/ModelManageModal-D5PNaLHd.js","assets/LocalModelManageModal--mWa9yEx.js","assets/JsonConfigEditor-DR5bt9uJ.js","assets/LocalModelRow-D_CzZ0Hu.js","assets/index-AyFIb-2h.js","assets/LocalRuntimePanel-CjFmGqqr.js","assets/shared-9V1PnZCE.js","assets/RemoteModelManageModal-VrSt_Jc3.js","assets/ModelCapabilityTags-BlCwnT9k.js","assets/ModelConfigEditor-g1TTWrm_.js","assets/OpenRouterFilterSection-Dfkq-T_6.js","assets/OpenRouterFilterSection-bX9nQX8d.css","assets/index-C1x5PzL1.js","assets/index-IJWa7fnx.js","assets/index-DdhgX1-w.js","assets/useProviders-C6vQL7RZ.js","assets/OffloadPolicyCard-CdpaSbJh.js","assets/index-_Hnm-qKi.js","assets/index-BiBTtAH2.js","assets/index-CBfaeGB9.css","assets/AllowNoAuthHostsTab-DOfKmzVb.js","assets/index.module-BhtR1ueo.js","assets/index-nEzPtbGY.css","assets/FileGuardSection-CIsCAA8V.js","assets/PreviewModal-DSwwUYls.js","assets/RuleModal-CB3K58Pn.js","assets/RuleTable-D4UQzEMr.js","assets/ShellEvasionSection-iYW3_lTM.js","assets/SkillScannerSection-DXoW6cCc.js","assets/useSkillScanner-IpycXNcJ.js","assets/ToolGuardTab-LAbIX09C.js","assets/index-CG1mzu8c.js","assets/index-YRdhft9t.js","assets/useSecurityPage-_cNgWly1.js","assets/useToolGuard-DUiIYmfb.js","assets/BroadcastModal-Du4rREE_.js","assets/ImportBuiltinModal-BdeMaxFX.js","assets/builtinNotice-ah4GEsD1.js","assets/index.module-_PflA4dS.js","assets/index-BcC89eeG.css","assets/PoolSkillCard-CO4zxpFW.js","assets/index-BV6HvXQo.js","assets/PoolSkillDrawer-Cnhir3K1.js","assets/PoolSkillListItem-Dz7u2Rxq.js","assets/SkillMeta-S_GzmCcz.js","assets/index-BgcWHpJ1.js","assets/index-q__8LHRI.js","assets/useSkillPool-Cx57ZCgp.js","assets/DataTables-DlyLvJ9q.js","assets/index.module-Bh11-nXv.js","assets/index-KZlFauec.css","assets/EmptyState-CC4TFPnF.js","assets/LoadingState-BnFaU9HC.js","assets/ModelTrendChart-B-VZf3G_.js","assets/SummaryCards-2bHf9hVX.js","assets/TokenTypeChart-DDaVAR-J.js","assets/index-BA4JBs_R.js","assets/lineChartChrome-B0o4v2PL.js","assets/useDataAggregation-BrDVFzJK.js","assets/useModelTrendConfig-0r4ezO3L.js","assets/useTokenTypeConfig-9ollBZEW.js","assets/index-sXrDNJQX.js","assets/tokenUsageRows-rhvieyre.js","assets/AudioModeCard-CgISeoMg.js","assets/index.module-Dl8MjCBp.js","assets/index-DYzLHWbe.css","assets/ProviderSelectCard-DmFrQYkq.js","assets/ProviderTypeCard-BRyEzJLI.js","assets/index-D_AwKCzM.js","assets/index-DFglmXC1.js","assets/useVoiceTranscription-kmB_QBuF.js","assets/DesktopOS-Co1B_JSN.js","assets/DesktopOS-C0Pqulza.css"])))=>i.map(i=>d[i]);
2var Xp=Object.defineProperty;var Zp=(e,t,a)=>t in e?Xp(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var V=(e,t,a)=>Zp(e,typeof t!="symbol"?t+"":t,a);import{g as em,r as h,j as c,b as Ne,i as Cd,d as Qi,e as tm,l as Ji,m as wd,n as Ln,o as am,B as nm,N as go,p as om}from"./react-vendor-DbzdS4FP.js";import{kb as fo,h7 as Pd,cj as mt,je as Ut,cv as Nt,cL as im,dW as bo,kc as sm,kd as rm,eH as Qa,c_ as lm,dX as dm,cI as cm,ke as um,k6 as pm,k9 as mm,k7 as zs,cb as hm,cO as Ad,d1 as oa,ck as Se,cx as gm,ek as En,dF as Md,dp as fm,d4 as bm,el as km,eP as Dd,eK as xd,kf as ym,jF as vm,cp as Rd,ct as Ct,gQ as oi,gR as Id,cn as ha,co as _d,iQ as Tm,kg as Sm,dh as Cm,cg as Yi,df as wm,h2 as Pm,cw as nn,kh as Ro,ki as Am,kj as Mm,kk as Dm,kl as xm,km as Ld,kn as Ed,ko as Rm,kp as Im,kq as Fd,jr as _m,kr as Ja,ch as Lt,ks as Lm,kt as ii,ku as Ks,kv as $s,d9 as Em,kw as Fm,h4 as Od,kx as Om,ky as Bm,kz as Nm,ex as Hm,iR as Bd,ep as Nd,dn as Um,kA as qm,kB as jm,e$ as Gm,jn as Vm,kC as Qs,kD as Js,f3 as Wm,i2 as zm,cX as ct,j7 as Km,eS as $m,cV as Qm,kE as Jm,e2 as Ys,eu as Ym,ht as Xm,dL as Zm,j6 as eh,kF as th,kG as ah,_ as f,eU as si,kH as nh,eN as oh,dv as ri,kI as ih,kJ as sh,kK as rh,kL as lh,kM as li,kN as dh,kO as ch,ji as Xs,kP as uh,kQ as ph,kR as mh,eA as hh,kS as gh,kT as Zs,kU as fh,kV as bh,kW as kh,kX as yh,kY as vh,kZ as Th,k_ as Sh,k$ as Ch,gU as wh,l0 as Ph,l1 as Ah,l2 as Mh,l3 as Dh,l4 as xh,l5 as Rh,l6 as Ih,ej as _h,l7 as Lh}from"./ui-vendor-DCtmHMLE.js";import{u as ve,i as Ht,a as Eh}from"./i18n-vendor-BrUIoOSg.js";import{e as Fh,f as Oh,C as Bh,u as Nh,a as er,T as Hh,M as Uh,D as qh,g as jh,h as Gh,i as Vh}from"./dnd-vendor-DdAwup11.js";import{M as Wh,a as zh}from"./markdown-vendor-DonjKQI4.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))n(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&n(s)}).observe(document,{childList:!0,subtree:!0});function a(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(o){if(o.ep)return;o.ep=!0;const i=a(o);fetch(o.href,i)}})();var Fn={exports:{}},Kh=Fn.exports,tr;function $h(){return tr||(tr=1,(function(e,t){(function(a,n){e.exports=n()})(Kh,(function(){return function(a,n,o){a=a||{};var i=n.prototype,s={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function r(d,u,p,m){return i.fromToBase(d,u,p,m)}o.en.relativeTime=s,i.fromToBase=function(d,u,p,m,k){for(var g,b,y,T=p.$locale().relativeTime||s,S=a.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],P=S.length,w=0;w<P;w+=1){var C=S[w];C.d&&(g=m?o(d).diff(p,C.d,!0):p.diff(d,C.d,!0));
2var x=(a.rounding||Math.round)(Math.abs(g));if(y=g>0,x<=C.r||!C.r){x<=1&&w>0&&(C=S[w-1]);var I=T[C.l];k&&(x=k(""+x)),b=typeof I=="string"?I.replace("%d",x):I(x,u,C.l,y);break}}if(u)return b;var R=y?T.future:T.past;return typeof R=="function"?R(b):R.replace("%s",b)},i.to=function(d,u){return r(d,u,this,!0)},i.from=function(d,u){return r(d,u,this)};var l=function(d){return d.$u?o.utc():o()};i.toNow=function(d){return this.to(l(this),d)},i.fromNow=function(d){return this.from(l(this),d)}}}))})(Fn)),Fn.exports}var Qh=$h();const Jh=em(Qh);var On={exports:{}},Yh=On.exports,ar;function Xh(){return ar||(ar=1,(function(e,t){(function(a,n){e.exports=n(fo())})(Yh,(function(a){function n(s){return s&&typeof s=="object"&&"default"in s?s:{default:s}}var o=n(a),i={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(s,r){return r==="W"?s+"周":s+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(s,r){var l=100*s+r;return l<600?"凌晨":l<900?"早上":l<1100?"上午":l<1300?"中午":l<1800?"下午":"晚上"}};return o.default.locale(i,null,!0),i}))})(On)),On.exports}Xh();var Bn={exports:{}},Zh=Bn.exports,nr;function eg(){return nr||(nr=1,(function(e,t){(function(a,n){e.exports=n(fo())})(Zh,(function(a){function n(s){return s&&typeof s=="object"&&"default"in s?s:{default:s}}var o=n(a),i={name:"ja",weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(s){return s+"日"},formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiem:function(s){return s<12?"午前":"午後"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}};return o.default.locale(i,null,!0),i}))})(Bn)),Bn.exports}eg();var Nn={exports:{}},tg=Nn.exports,or;function ag(){return or||(or=1,(function(e,t){(function(a,n){e.exports=n(fo())})(tg,(function(a){function n(g){return g&&typeof g=="object"&&"default"in g?g:{default:g}}var o=n(a),i="января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),s="январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),r="янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),l="янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_"),d=/D[oD]?(\[[^[\]]*\]|\s)+MMMM?/;function u(g,b,y){var T,S;return y==="m"?b?"минута":"минуту":g+" "+(T=+g,S={mm:b?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"}[y].split("_"),T%10==1&&T%100!=11?S[0]:T%10>=2&&T%10<=4&&(T%100<10||T%100>=20)?S[1]:S[2])}var p=function(g,b){return d.test(b)?i[g.month()]:s[g.month()]};p.s=s,p.f=i;var m=function(g,b){return d.test(b)?r[g.month()]:l[g.month()]};
2m.s=l,m.f=r;var k={name:"ru",weekdays:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),weekdaysShort:"вск_пнд_втр_срд_чтв_птн_сбт".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),months:p,monthsShort:m,weekStart:1,yearStart:4,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:u,mm:u,h:"час",hh:u,d:"день",dd:u,M:"месяц",MM:u,y:"год",yy:u},ordinal:function(g){return g},meridiem:function(g){return g<4?"ночи":g<12?"утра":g<17?"дня":"вечера"}};return o.default.locale(k,null,!0),k}))})(Nn)),Nn.exports}ag();var Hn={exports:{}},ng=Hn.exports,ir;function og(){return ir||(ir=1,(function(e,t){(function(a,n){e.exports=n(fo())})(ng,(function(a){function n(s){return s&&typeof s=="object"&&"default"in s?s:{default:s}}var o=n(a),i={name:"id",weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),weekStart:1,formats:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},ordinal:function(s){return s+"."}};return o.default.locale(i,null,!0),i}))})(Hn)),Hn.exports}og();const Xi=h.createContext({});function Zi(e){const t=h.useRef(null);return t.current===null&&(t.current=e()),t.current}const ig=typeof window<"u",es=ig?h.useLayoutEffect:h.useEffect,ko=h.createContext(null);function ts(e,t){e.indexOf(t)===-1&&e.push(t)}function Jn(e,t){const a=e.indexOf(t);a>-1&&e.splice(a,1)}const gt=(e,t,a)=>a>t?t:a<e?e:a;let yo=()=>{};const At={},Hd=e=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(e),Ud=e=>typeof e=="object"&&e!==null,qd=e=>/^0[^.\s]+$/u.test(e);function jd(e){let t;return()=>(t===void 0&&(t=e()),t)}const Xe=e=>e,on=(...e)=>e.reduce((t,a)=>n=>a(t(n))),Ya=(e,t,a)=>{const n=t-e;return n?(a-e)/n:1};class as{constructor(){this.subscriptions=[]}add(t){return ts(this.subscriptions,t),()=>Jn(this.subscriptions,t)}notify(t,a,n){const o=this.subscriptions.length;if(o)if(o===1)this.subscriptions[0](t,a,n);else for(let i=0;i<o;i++){const s=this.subscriptions[i];s&&s(t,a,n)}}getSize(){return this.subscriptions.length}clear(){this.subscriptions.length=0}}const Ve=e=>e*1e3,Ye=e=>e/1e3,Gd=(e,t)=>t?e*(1e3/t):0,Vd=(e,t,a)=>(((1-3*a+3*t)*e+(3*a-6*t))*e+3*t)*e,sg=1e-7,rg=12;function lg(e,t,a,n,o){let i,s,r=0;do s=t+(a-t)/2,i=Vd(s,n,o)-e,i>0?a=s:t=s;while(Math.abs(i)>sg&&++r<rg);return s}function sn(e,t,a,n){if(e===t&&a===n)return Xe;const o=i=>lg(i,0,1,e,a);return i=>i===0||i===1?i:Vd(o(i),t,n)}const Wd=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,zd=e=>t=>1-e(1-t),Kd=sn(.33,1.53,.69,.99),ns=zd(Kd),$d=Wd(ns),Qd=e=>e>=1?1:(e*=2)<1?.5*ns(e):.5*(2-Math.pow(2,-10*(e-1))),os=e=>1-Math.sin(Math.acos(e)),Jd=zd(os),Yd=Wd(os),dg=sn(.42,0,1,1),cg=sn(0,0,.58,1),Xd=sn(.42,0,.58,1),ug=e=>Array.isArray(e)&&typeof e[0]!="number",Zd=e=>Array.isArray(e)&&typeof e[0]=="number",pg={linear:Xe,easeIn:dg,easeInOut:Xd,easeOut:cg,circIn:os,circInOut:Yd,circOut:Jd,backIn:ns,backInOut:$d,backOut:Kd,anticipate:Qd},mg=e=>typeof e=="string",sr=e=>{if(Zd(e)){yo(e.length===4);const[t,a,n,o]=e;return sn(t,a,n,o)}else if(mg(e))return pg[e];return e},kn=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function hg(e){let t=new Set,a=new Set,n=!1,o=!1;const i=new WeakSet;let s={delta:0,timestamp:0,isProcessing:!1};function r(d){i.has(d)&&(l.schedule(d),e()),d(s)}const l={schedule:(d,u=!1,p=!1)=>{const k=p&&n?t:a;return u&&i.add(d),k.add(d),d},cancel:d=>
vendor: 14,461 bytes, line 2
2{a.delete(d),i.delete(d)},process:d=>{if(s=d,n){o=!0;return}n=!0;const u=t;t=a,a=u,t.forEach(r),t.clear(),n=!1,o&&(o=!1,l.process(d))}};return l}const gg=40;function ec(e,t){let a=!1,n=!0;const o={delta:0,timestamp:0,isProcessing:!1},i=()=>a=!0,s=kn.reduce((P,w)=>(P[w]=hg(i),P),{}),{setup:r,read:l,resolveKeyframes:d,preUpdate:u,update:p,preRender:m,render:k,postRender:g}=s,b=()=>{const P=At.useManualTiming,w=P?o.timestamp:performance.now();a=!1,P||(o.delta=n?1e3/60:Math.max(Math.min(w-o.timestamp,gg),1)),o.timestamp=w,o.isProcessing=!0,r.process(o),l.process(o),d.process(o),u.process(o),p.process(o),m.process(o),k.process(o),g.process(o),o.isProcessing=!1,a&&t&&(n=!1,e(b))},y=()=>{a=!0,n=!0,o.isProcessing||e(b)};return{schedule:kn.reduce((P,w)=>{const C=s[w];return P[w]=(x,I=!1,R=!1)=>(a||y(),C.schedule(x,I,R)),P},{}),cancel:P=>{for(let w=0;w<kn.length;w++)s[kn[w]].cancel(P)},state:o,steps:s}}const{schedule:re,cancel:Mt,state:Pe,steps:Io}=ec(typeof requestAnimationFrame<"u"?requestAnimationFrame:Xe,!0);let Un;function fg(){Un=void 0}const Le={now:()=>(Un===void 0&&Le.set(Pe.isProcessing||At.useManualTiming?Pe.timestamp:performance.now()),Un),set:e=>{Un=e,queueMicrotask(fg)}},tc=e=>t=>typeof t=="string"&&t.startsWith(e),ac=tc("--"),bg=tc("var(--"),is=e=>bg(e)?kg.test(e.split("/*")[0].trim()):!1,kg=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;function rr(e){return typeof e!="string"?!1:e.split("/*")[0].includes("var(--")}const ya={test:e=>typeof e=="number",parse:parseFloat,transform:e=>e},Xa={...ya,transform:e=>gt(0,1,e)},yn={...ya,default:1},Ga=e=>Math.round(e*1e5)/1e5,ss=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function yg(e){return e==null}const vg=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,rs=(e,t)=>a=>!!(typeof a=="string"&&vg.test(a)&&a.startsWith(e)||t&&!yg(a)&&Object.prototype.hasOwnProperty.call(a,t)),nc=(e,t,a)=>n=>{if(typeof n!="string")return n;const[o,i,s,r]=n.match(ss);return{[e]:parseFloat(o),[t]:parseFloat(i),[a]:parseFloat(s),alpha:r!==void 0?parseFloat(r):1}},Tg=e=>gt(0,255,e),_o={...ya,transform:e=>Math.round(Tg(e))},qt={test:rs("rgb","red"),parse:nc("red","green","blue"),transform:({red:e,green:t,blue:a,alpha:n=1})=>"rgba("+_o.transform(e)+", "+_o.transform(t)+", "+_o.transform(a)+", "+Ga(Xa.transform(n))+")"};function Sg(e){let t="",a="",n="",o="";return e.length>5?(t=e.substring(1,3),a=e.substring(3,5),n=e.substring(5,7),o=e.substring(7,9)):(t=e.substring(1,2),a=e.substring(2,3),n=e.substring(3,4),o=e.substring(4,5),t+=t,a+=a,n+=n,o+=o),{red:parseInt(t,16),green:parseInt(a,16),blue:parseInt(n,16),alpha:o?parseInt(o,16)/255:1}}const di={test:rs("#"),parse:Sg,transform:qt.transform},rn=e=>({test:t=>typeof t=="string"&&t.endsWith(e)&&t.split(" ").length===1,parse:parseFloat,transform:t=>`${t}${e}`}),kt=rn("deg"),ht=rn("%"),B=rn("px"),Cg=rn("vh"),wg=rn("vw"),lr={...ht,parse:e=>ht.parse(e)/100,transform:e=>ht.transform(e*100)},ia={test:rs("hsl","hue"),parse:nc("hue","saturation","lightness"),transform:({hue:e,saturation:t,lightness:a,alpha:n=1})=>"hsla("+Math.round(e)+", "+ht.transform(Ga(t))+", "+ht.transform(Ga(a))+", "+Ga(Xa.transform(n))+")"},ye={test:e=>qt.test(e)||di.test(e)||ia.test(e),parse:e=>qt.test(e)?qt.parse(e):ia.test(e)?ia.parse(e):di.parse(e),transform:e=>typeof e=="string"?e:e.hasOwnProperty("red")?qt.transform(e):ia.transform(e),getAnimatableNone:e=>{const t=ye.parse(e);return t.alpha=0,ye.transform(t)}},Pg=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function Ag(e){var t,a;return isNaN(e)&&typeof e=="string"&&(((t=e.match(ss))==null?void 0:t.length)||0)+(((a=e.match(Pg))==null?void 0:a.length)||0)>0}const oc="number",ic="color",Mg="var",Dg="var(",dr="${}",xg=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function ga(e){const t=e.toString(),a=[],n={color:[],number:[],var:[]},o=[];let i=0;const r=t.replace(xg,l=>(ye.test(l)?(n.color.push(i),o.push(ic),a.push(ye.parse(l))):l.startsWith(Dg)?(n.var.push(i),o.push(Mg),a.push(l)):(n.number.push(i),o.push(oc),a.push(parseFloat(l))),++i,dr)).split(dr);return{values:a,split:r,indexes:n,types:o}}function Rg(e){return ga(e).values}function sc({split:e,types:t}){const a=e.length;return n=>{let o="";for(let i=0;i<a;i++)if(o+=e[i],n[i]!==void 0){const s=t[i];s===oc?o+=Ga(n[i]):s===ic?o+=ye.transform(n[i]):o+=n[i]}return o}}function Ig(e){return sc(ga(e))}const _g=e=>typeof e=="number"?0:ye.test(e)?ye.getAnimatableNone(e):e,Lg=(e,t)=>typeof e=="number"?t!=null&&t.trim().endsWith("/")?e:0:_g(e);function Eg(e){const t=ga(e);return sc(t)(t.values.map((n,o)=>Lg(n,t.split[o])))}const it={test:Ag,parse:Rg,createTransformer:Ig,getAnimatableNone:Eg};function Lo(e,t,a){return a<0&&(a+=1),a>1&&(a-=1),a<1/6?e+(t-e)*6*a:a<1/2?t:a<2/3?e+(t-e)*(2/3-a)*6:e}function Fg({hue:e,saturation:t,lightness:a,alpha:n}){e/=360,t/=100,a/=100;let o=0,i=0,s=0;if(!t)o=i=s=a;else{const r=a<.5?a*(1+t):a+t-a*t,l=2*a-r;o=Lo(l,r,e+1/3),i=Lo(l,r,e),s=Lo(l,r,e-1/3)}return{red:Math.round(o*255),green:Math.round(i*255),blue:Math.round(s*255),alpha:n}}function Yn(e,t){return a=>a>0?t:e}const se=(e,t,a)=>e+(t-e)*a,Eo=(e,t,a)=>{const n=e*e,o=a*(t*t-n)+n;return o<0?0:Math.sqrt(o)},Og=[di,qt,ia],Bg=e=>Og.find(t=>t.test(e));function cr(e){const t=Bg(e);if(!t)return!1;let a=t.parse(e);return t===ia&&(a=Fg(a)),a}const ur=(e,t)=>{const a=cr(e),n=cr(t);if(!a||!n)return Yn(e,t);const o={...a};return i=>(o.red=Eo(a.red,n.red,i),o.green=Eo(a.green,n.green,i),o.blue=Eo(a.blue,n.blue,i),o.alpha=se(a.alpha,n.alpha,i),qt.transform(o))},ci=new Set(["none","hidden"]);function Ng(e,t){return ci.has(e)?a=>a<=0?e:t:a=>a>=1?t:e}function Hg(e,t){return a=>se(e,t,a)}function ls(e){return typeof e=="number"?Hg:typeof e=="string"?is(e)?Yn:ye.test(e)?ur:jg:Array.isArray(e)?rc:typeof e=="object"?ye.test(e)?ur:Ug:Yn}function rc(e,t){const a=[...e],n=a.length,o=e.map((i,s)=>ls(i)(i,t[s]));return i=>{for(let s=0;s<n;s++)a[s]=o[s](i);return a}}function Ug(e,t){const a={...e,...t},n={};for(const o in a)e[o]!==void 0&&t[o]!==void 0&&(n[o]=ls(e[o])(e[o],t[o]));return o=>{for(const i in n)a[i]=n[i](o);return a}}function qg(e,t){const a=[],n={color:0,var:0,number:0};for(let o=0;o<t.values.length;o++){const i=t.types[o],s=e.indexes[i][n[i]],r=e.values[s]??0;a[o]=r,n[i]++}return a}const jg=(e,t)=>{const a=it.createTransformer(t),n=ga(e),o=ga(t);return n.indexes.var.length===o.indexes.var.length&&n.indexes.color.length===o.indexes.color.length&&n.indexes.number.length>=o.indexes.number.length?ci.has(e)&&!o.values.length||ci.has(t)&&!n.values.length?Ng(e,t):on(rc(qg(n,o),o.values),a):Yn(e,t)};function lc(e,t,a){return typeof e=="number"&&typeof t=="number"&&typeof a=="number"?se(e,t,a):ls(e)(e,t)}const Gg=e=>{const t=({timestamp:a})=>e(a);return{start:(a=!0)=>re.update(t,a),stop:()=>Mt(t),now:()=>Pe.isProcessing?Pe.timestamp:Le.now()}},dc=(e,t,a=10)=>{let n="";const o=Math.max(Math.round(t/a),2);for(let i=0;i<o;i++)n+=Math.round(e(i/(o-1))*1e4)/1e4+", ";return`linear(${n.substring(0,n.length-2)})`},Xn=2e4;function ds(e){let t=0;const a=50;let n=e.next(t);for(;!n.done&&t<Xn;)t+=a,n=e.next(t);return t>=Xn?1/0:t}function Vg(e,t=100,a){const n=a({...e,keyframes:[0,t]}),o=Math.min(ds(n),Xn);return{type:"keyframes",ease:i=>n.next(o*i).value/t,duration:Ye(o)}}const be={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1};function ui(e,t){return e*Math.sqrt(1-t*t)}const Wg=12;function zg(e,t,a){let n=a;for(let o=1;o<Wg;o++)n=n-e(n)/t(n);return n}const Fo=.001;function Kg({duration:e=be.duration,bounce:t=be.bounce,velocity:a=be.velocity,mass:n=be.mass}){let o,i,s=1-t;s=gt(be.minDamping,be.maxDamping,s),e=gt(be.minDuration,be.maxDuration,Ye(e)),s<1?(o=d=>{const u=d*s,p=u*e,m=u-a,k=ui(d,s),g=Math.exp(-p);return Fo-m/k*g},i=d=>{const p=d*s*e,m=p*a+a,k=Math.pow(s,2)*Math.pow(d,2)*e,g=Math.exp(-p),b=ui(Math.pow(d,2),s);return(-o(d)+Fo>0?-1:1)*((m-k)*g)/b}):(o=d=>{const u=Math.exp(-d*e),p=(d-a)*e+1;return-Fo+u*p},i=d=>{const u=Math.exp(-d*e),p=(a-d)*(e*e);return u*p});const r=5/e,l=zg(o,i,r);if(e=Ve(e),isNaN(l))return{stiffness:be.stiffness,damping:be.damping,duration:e};{const d=Math.pow(l,2)*n;return{stiffness:d,damping:s*2*Math.sqrt(n*d),duration:e}}}const $g=["duration","bounce"],Qg=["stiffness","damping","mass"];function pr(e,t){return t.some(a=>e[a]!==void 0)}function Jg(e){let t={velocity:be.velocity,stiffness:be.stiffness,damping:be.damping,mass:be.mass,isResolvedFromDuration:!1,...e};if(!pr(e,Qg)&&pr(e,$g))if(t.velocity=0,e.visualDuration){const a=e.visualDuration,n=2*Math.PI/(a*1.2),o=n*n,i=2*gt(.05,1,1-(e.bounce||0))*Math.sqrt(o);t={...t,mass:be.mass,stiffness:o,damping:i}}else{const a=Kg({...e,velocity:0});t={...t,...a,mass:be.mass},t.isResolvedFromDuration=!0}return t}function Zn(e=be.visualDuration,t=be.bounce){const a=typeof e!="object"?{visualDuration:e,keyframes:[0,1],bounce:t}:e;let{restSpeed:n,restDelta:o}=a;const i=a.keyframes[0],s=a.keyframes[a.keyframes.length-1],r={done:!1,value:i},{stiffness:l,damping:d,mass:u,duration:p,velocity:m,isResolvedFromDuration:k}=Jg({...a,velocity:-Ye(a.velocity||0)}),g=m||0,b=d/(2*Math.sqrt(l*u)),y=s-i,T=Ye(Math.sqrt(l/u)),S=Math.abs(y)<5;n||(n=S?be.restSpeed.granular:be.restSpeed.default),o||(o=S?be.restDelta.granular:be.restDelta.default);let P,w,C,x,I,R;if(b<1)C=ui(T,b),x=(g+b*T*y)/C,P=A=>{const L=Math.exp(-b*T*A);return s-L*(x*Math.sin(C*A)+y*Math.cos(C*A))},I=b*T*x+y*C,R=b*T*y-x*C,w=A=>Math.exp(-b*T*A)*(I*Math.sin(C*A)+R*Math.cos(C*A));else if(b===1){P=L=>s-Math.exp(-T*L)*(y+(g+T*y)*L);const A=g+T*y;w=L=>Math.exp(-T*L)*(T*A*L-g)}else{const A=T*Math.sqrt(b*b-1);P=z=>{const W=Math.exp(-b*T*z),Q=Math.min(A*z,300);return s-W*((g+b*T*y)*Math.sinh(Q)+A*y*Math.cosh(Q))/A};const L=(g+b*T*y)/A,j=b*T*L-y*A,U=b*T*y-L*A;w=z=>{const W=Math.exp(-b*T*z),Q=Math.min(A*z,300);return W*(j*Math.sinh(Q)+U*Math.cosh(Q))}}const _={calculatedDuration:k&&p||null,velocity:A=>Ve(w(A)),next:A=>{if(!k&&b<1){const j=Math.exp(-b*T*A),U=Math.sin(C*A),z=Math.cos(C*A),W=s-j*(x*U+y*z),Q=Ve(j*(I*U+R*z));return r.done=Math.abs(Q)<=n&&Math.abs(s-W)<=o,r.value=r.done?s:W,r}const L=P(A);if(k)r.done=A>=p;else{const j=Ve(w(A));r.done=Math.abs(j)<=n&&Math.abs(s-L)<=o}return r.value=r.done?s:L,r},toString:()=>{const A=Math.min(ds(_),Xn),L=dc(j=>_.next(A*j).value,A,30);return A+"ms "+L},toTransition:()=>{}};return _}Zn.applyToOptions=e=>{const t=Vg(e,100,Zn);return e.ease=t.ease,e.duration=Ve(t.duration),e.type="keyframes",e};const Yg=5;function cc(e,t,a){const n=Math.max(t-Yg,0);return Gd(a-e(n),t-n)}function pi({keyframes:e,velocity:t=0,power:a=.8,timeConstant:n=325,bounceDamping:o=10,bounceStiffness:i=500,modifyTarget:s,min:r,max:l,restDelta:d=.5,restSpeed:u}){const p=e[0],m={done:!1,value:p},k=R=>r!==void 0&&R<r||l!==void 0&&R>l,g=R=>r===void 0?l:l===void 0||Math.abs(r-R)<Math.abs(l-R)?r:l;let b=a*t;const y=p+b,T=s===void 0?y:s(y);T!==y&&(b=T-p);const S=R=>-b*Math.exp(-R/n),P=R=>T+S(R),w=R=>{const _=S(R),A=P(R);m.done=Math.abs(_)<=d,m.value=m.done?T:A};let C,x;const I=R=>{k(m.value)&&(C=R,x=Zn({keyframes:[m.value,g(m.value)],velocity:cc(P,R,m.value),damping:o,stiffness:i,restDelta:d,restSpeed:u}))};return I(0),{calculatedDuration:null,next:R=>{let _=!1;return!x&&C===void 0&&(_=!0,w(R),I(R)),C!==void 0&&R>=C?x.next(R-C):(!_&&w(R),m)}}}function Xg(e,t,a){const n=[],o=a||At.mix||lc,i=e.length-1;for(let s=0;s<i;s++){let r=o(e[s],e[s+1]);if(t){const l=Array.isArray(t)?t[s]||Xe:t;r=on(l,r)}n.push(r)}return n}function Zg(e,t,{clamp:a=!0,ease:n,mixer:o}={}){const i=e.length;if(yo(i===t.length),i===1)return()=>t[0];if(i===2&&t[0]===t[1])return()=>t[1];const s=e[0]===e[1];e[0]>e[i-1]&&(e=[...e].reverse(),t=[...t].reverse());const r=Xg(t,n,o),l=r.length,d=u=>{if(s&&u<e[0])return t[0];let p=0;if(l>1)for(;p<e.length-2&&!(u<e[p+1]);p++);const m=Ya(e[p],e[p+1],u);return r[p](m)};return a?u=>d(gt(e[0],e[i-1],u)):d}function ef(e,t){const a=e[e.length-1];for(let n=1;n<=t;n++){const o=Ya(0,t,n);e.push(se(a,1,o))}}function tf(e){const t=[0];return ef(t,e.length-1),t}function af(e,t){return e.map(a=>a*t)}function nf(e,t){return e.map(()=>t||Xd).splice(0,e.length-1)}function Va({duration:e=300,keyframes:t,times:a,ease:n="easeInOut"}){const o=ug(n)?n.map(sr):sr(n),i={done:!1,value:t[0]},s=af(a&&a.length===t.length?a:tf(t),e),r=Zg(s,t,{ease:Array.isArray(o)?o:nf(t,o)});return{calculatedDuration:e,next:l=>(i.value=r(l),i.done=l>=e,i)}}const of=e=>e!==null;function vo(e,{repeat:t,repeatType:a="loop"},n,o=1){const i=e.filter(of),r=o<0||t&&a!=="loop"&&t%2===1?0:i.length-1;return!r||n===void 0?i[r]:n}const sf={decay:pi,inertia:pi,tween:Va,keyframes:Va,spring:Zn};function uc(e){typeof e.type=="string"&&(e.type=sf[e.type])}class cs{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(t=>{this.resolve=t})}notifyFinished(){this.resolve()}then(t,a){return this.finished.then(t,a)}}const rf=e=>e/100;class eo extends cs{constructor(t){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.delayState={done:!1,value:void 0},this.stop=()=>{var n,o;const{motionValue:a}=this.options;a&&a.updatedAt!==Le.now()&&this.tick(Le.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),(o=(n=this.options).onStop)==null||o.call(n))},this.options=t,this.initAnimation(),this.play(),t.autoplay===!1&&this.pause()}initAnimation(){const{options:t}=this;uc(t);const{type:a=Va,repeat:n=0,repeatDelay:o=0,repeatType:i,velocity:s=0}=t;let{keyframes:r}=t;const l=a||Va;l!==Va&&typeof r[0]!="number"&&(this.mixKeyframes=on(rf,lc(r[0],r[1])),r=[0,100]);const d=l({...t,keyframes:r});i==="mirror"&&(this.mirroredGenerator=l({...t,keyframes:[...r].reverse(),velocity:-s})),d.calculatedDuration===null&&(d.calculatedDuration=ds(d));const{calculatedDuration:u}=d;this.calculatedDuration=u,this.resolvedDuration=u+o,this.totalDuration=this.resolvedDuration*(n+1)-o,this.generator=d}updateTime(t){const a=Math.round(t-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=a}
2tick(t,a=!1){const{generator:n,totalDuration:o,mixKeyframes:i,mirroredGenerator:s,resolvedDuration:r,calculatedDuration:l}=this;if(this.startTime===null)return n.next(0);const{delay:d=0,keyframes:u,repeat:p,repeatType:m,repeatDelay:k,type:g,onUpdate:b,finalKeyframe:y}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,t):this.speed<0&&(this.startTime=Math.min(t-o/this.speed,this.startTime)),a?this.currentTime=t:this.updateTime(t);const T=this.currentTime-d*(this.playbackSpeed>=0?1:-1),S=this.playbackSpeed>=0?T<0:T>o;this.currentTime=Math.max(T,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=o);let P=this.currentTime,w=n;if(p){const R=Math.min(this.currentTime,o)/r;let _=Math.floor(R),A=R%1;!A&&R>=1&&(A=1),A===1&&_--,_=Math.min(_,p+1),!!(_%2)&&(m==="reverse"?(A=1-A,k&&(A-=k/r)):m==="mirror"&&(w=s)),P=gt(0,1,A)*r}let C;S?(this.delayState.value=u[0],C=this.delayState):C=w.next(P),i&&!S&&(C.value=i(C.value));let{done:x}=C;!S&&l!==null&&(x=this.playbackSpeed>=0?this.currentTime>=o:this.currentTime<=0);const I=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&x);return I&&g!==pi&&(C.value=vo(u,this.options,y,this.speed)),b&&b(C.value),I&&this.finish(),C}then(t,a){return this.finished.then(t,a)}get duration(){return Ye(this.calculatedDuration)}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+Ye(t)}get time(){return Ye(this.currentTime)}set time(t){t=Ve(t),this.currentTime=t,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=t:this.driver&&(this.startTime=this.driver.now()-t/this.playbackSpeed),this.driver?this.driver.start(!1):(this.startTime=0,this.state="paused",this.holdTime=t,this.tick(t))}getGeneratorVelocity(){const t=this.currentTime;if(t<=0)return this.options.velocity||0;if(this.generator.velocity)return this.generator.velocity(t);const a=this.generator.next(t).value;return cc(n=>this.generator.next(n).value,t,a)}get speed(){return this.playbackSpeed}set speed(t){const a=this.playbackSpeed!==t;a&&this.driver&&this.updateTime(Le.now()),this.playbackSpeed=t,a&&this.driver&&(this.time=Ye(this.currentTime))}play(){var o,i;if(this.isStopped)return;const{driver:t=Gg,startTime:a}=this.options;this.driver||(this.driver=t(s=>this.tick(s))),(i=(o=this.options).onPlay)==null||i.call(o);const n=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=n):this.holdTime!==null?this.startTime=n-this.holdTime:this.startTime||(this.startTime=a??n),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(Le.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){var t,a;this.notifyFinished(),this.teardown(),this.state="finished",(a=(t=this.options).onComplete)==null||a.call(t)}cancel(){var t,a;this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),(a=(t=this.options).onCancel)==null||a.call(t)}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(t){return this.startTime=0,this.tick(t,!0)}attachTimeline(t){var a;return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),(a=this.driver)==null||a.stop(),t.observe(this)}}function lf(e){for(let t=1;t<e.length;t++)e[t]??(e[t]=e[t-1])}const jt=e=>e*180/Math.PI,mi=e=>{const t=jt(Math.atan2(e[1],e[0]));return hi(t)},df={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:e=>(Math.abs(e[0])+Math.abs(e[3]))/2,rotate:mi,rotateZ:mi,skewX:e=>jt(Math.atan(e[1])),skewY:e=>jt(Math.atan(e[2])),skew:e=>(Math.abs(e[1])+Math.abs(e[2]))/2},hi=e=>(e=e%360,e<0&&(e+=360),e),mr=mi,hr=e=>Math.sqrt(e[0]*e[0]+e[1]*e[1]),gr=e=>Math.sqrt(e[4]*e[4]+e[5]*e[5]),cf={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:hr,scaleY:gr,scale:e=>(hr(e)+gr(e))/2,rotateX:e=>hi(jt(Math.atan2(e[6],e[5]))),rotateY:e=>hi(jt(Math.atan2(-e[2],e[0]))),rotateZ:mr,rotate:mr,skewX:e=>jt(Math.atan(e[4])),skewY:e=>jt(Math.atan(e[1])),skew:e=>(Math.abs(e[1])+Math.abs(e[4]))/2};function gi(e){return e.includes("scale")?1:0}function fi(e,t){if(!e||e==="none")return gi(t);const a=e.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let n,o;
vendor: 3,191 bytes, line 2
2if(a)n=cf,o=a;else{const r=e.match(/^matrix\(([-\d.e\s,]+)\)$/u);n=df,o=r}if(!o)return gi(t);const i=n[t],s=o[1].split(",").map(pf);return typeof i=="function"?i(s):s[i]}const uf=(e,t)=>{const{transform:a="none"}=getComputedStyle(e);return fi(a,t)};function pf(e){return parseFloat(e.trim())}const va=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],Ta=new Set([...va,"pathRotation"]),fr=e=>e===ya||e===B,mf=new Set(["x","y","z"]),hf=va.filter(e=>!mf.has(e));function gf(e){const t=[];return hf.forEach(a=>{const n=e.getValue(a);n!==void 0&&(t.push([a,n.get()]),n.set(a.startsWith("scale")?1:0))}),t}const wt={width:({x:e},{paddingLeft:t="0",paddingRight:a="0",boxSizing:n})=>{const o=e.max-e.min;return n==="border-box"?o:o-parseFloat(t)-parseFloat(a)},height:({y:e},{paddingTop:t="0",paddingBottom:a="0",boxSizing:n})=>{const o=e.max-e.min;return n==="border-box"?o:o-parseFloat(t)-parseFloat(a)},top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:(e,{transform:t})=>fi(t,"x"),y:(e,{transform:t})=>fi(t,"y")};wt.translateX=wt.x;wt.translateY=wt.y;const Wt=new Set;let bi=!1,ki=!1,yi=!1;function pc(){if(ki){const e=Array.from(Wt).filter(n=>n.needsMeasurement),t=new Set(e.map(n=>n.element)),a=new Map;t.forEach(n=>{const o=gf(n);o.length&&(a.set(n,o),n.render())}),e.forEach(n=>n.measureInitialState()),t.forEach(n=>{n.render();const o=a.get(n);o&&o.forEach(([i,s])=>{var r;(r=n.getValue(i))==null||r.set(s)})}),e.forEach(n=>n.measureEndState()),e.forEach(n=>{n.suspendedScrollY!==void 0&&window.scrollTo(0,n.suspendedScrollY)})}ki=!1,bi=!1,Wt.forEach(e=>e.complete(yi)),Wt.clear()}function mc(){Wt.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(ki=!0)})}function ff(){yi=!0,mc(),pc(),yi=!1}class us{constructor(t,a,n,o,i,s=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...t],this.onComplete=a,this.name=n,this.motionValue=o,this.element=i,this.isAsync=s}scheduleResolve(){this.state="scheduled",this.isAsync?(Wt.add(this),bi||(bi=!0,re.read(mc),re.resolveKeyframes(pc))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:t,name:a,element:n,motionValue:o}=this;if(t[0]===null){const i=o==null?void 0:o.get(),s=t[t.length-1];if(i!==void 0)t[0]=i;else if(n&&a){const r=n.readValue(a,s);r!=null&&(t[0]=r)}t[0]===void 0&&(t[0]=s),o&&i===void 0&&o.set(t[0])}lf(t)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(t=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,t),Wt.delete(this)}cancel(){this.state==="scheduled"&&(Wt.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const bf=e=>e.startsWith("--");function hc(e,t,a){bf(t)?e.style.setProperty(t,a):e.style[t]=a}const kf={};function gc(e,t){const a=jd(e);return()=>kf[t]??a()}const yf=gc(()=>window.ScrollTimeline!==void 0,"scrollTimeline"),fc=gc(()=>{try{document.createElement("div").animate({opacity:0}
2,{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),Na=([e,t,a,n])=>`cubic-bezier(${e}, ${t}, ${a}, ${n})`,br={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:Na([0,.65,.55,1]),circOut:Na([.55,0,1,.45]),backIn:Na([.31,.01,.66,-.59]),backOut:Na([.33,1.53,.69,.99])};function bc(e,t){if(e)return typeof e=="function"?fc()?dc(e,t):"ease-out":Zd(e)?Na(e):Array.isArray(e)?e.map(a=>bc(a,t)||br.easeOut):br[e]}function vf(e,t,a,{delay:n=0,duration:o=300,repeat:i=0,repeatType:s="loop",ease:r="easeOut",times:l}={},d=void 0){const u={[t]:a};l&&(u.offset=l);const p=bc(r,o);Array.isArray(p)&&(u.easing=p);const m={delay:n,duration:o,easing:Array.isArray(p)?"linear":p,fill:"both",iterations:i+1,direction:s==="reverse"?"alternate":"normal"};return d&&(m.pseudoElement=d),e.animate(u,m)}function kc(e){return typeof e=="function"&&"applyToOptions"in e}function Tf({type:e,...t}){return kc(e)&&fc()?e.applyToOptions(t):(t.duration??(t.duration=300),t.ease??(t.ease="easeOut"),t)}class yc extends cs{constructor(t){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!t)return;const{element:a,name:n,keyframes:o,pseudoElement:i,allowFlatten:s=!1,finalKeyframe:r,onComplete:l}=t;this.isPseudoElement=!!i,this.allowFlatten=s,this.options=t,yo(typeof t.type!="string");const d=Tf(t);this.animation=vf(a,n,o,d,i),d.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!i){const u=vo(o,this.options,r,this.speed);this.updateMotionValue&&this.updateMotionValue(u),hc(a,n,u),this.animation.cancel()}l==null||l(),this.notifyFinished()}}play(){this.isStopped||(this.manualStartTime=null,this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){var t,a;(a=(t=this.animation).finish)==null||a.call(t)}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:t}=this;t==="idle"||t==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){var a,n,o;const t=(a=this.options)==null?void 0:a.element;!this.isPseudoElement&&(t!=null&&t.isConnected)&&((o=(n=this.animation).commitStyles)==null||o.call(n))}get duration(){var a,n;const t=((n=(a=this.animation.effect)==null?void 0:a.getComputedTiming)==null?void 0:n.call(a).duration)||0;return Ye(Number(t))}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+Ye(t)}get time(){return Ye(Number(this.animation.currentTime)||0)}set time(t){const a=this.finishedTime!==null;this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=Ve(t),a&&this.animation.pause()}get speed(){return this.animation.playbackRate}set speed(t){t<0&&(this.finishedTime=null),this.animation.playbackRate=t}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(t){this.manualStartTime=this.animation.startTime=t}attachTimeline({timeline:t,rangeStart:a,rangeEnd:n,observe:o}){var i;return this.allowFlatten&&((i=this.animation.effect)==null||i.updateTiming({easing:"linear"})),this.animation.onfinish=null,t&&yf()?(this.animation.timeline=t,a&&(this.animation.rangeStart=a),n&&(this.animation.rangeEnd=n),Xe):o(this)}}const vc={anticipate:Qd,backInOut:$d,circInOut:Yd};function Sf(e){return e in vc}function Cf(e){typeof e.ease=="string"&&Sf(e.ease)&&(e.ease=vc[e.ease])}const Oo=10;class wf extends yc{constructor(t){Cf(t),uc(t),super(t),t.startTime!==void 0&&t.autoplay!==!1&&(this.startTime=t.startTime),this.options=t}updateMotionValue(t){const{motionValue:a,onUpdate:n,onComplete:o,element:i,...s}=this.options;if(!a)return;if(t!==void 0){a.set(t);return}const r=new eo({...s,autoplay:!1}),l=Math.max(Oo,Le.now()-this.startTime),d=gt(0,Oo,l-Oo),u=r.sample(l).value,{name:p}=this.options;i&&p&&hc(i,p,u),a.setWithVelocity(r.sample(Math.max(0,l-d)).value,u,d),r.stop()}}const kr=(e,t)=>t==="zIndex"?!1:!!(typeof e=="number"||Array.isArray(e)||typeof e=="string"&&(it.test(e)||e==="0")&&!e.startsWith("url("));function Pf(e){const t=e[0];if(e.length===1)return!0;for(let a=0;a<e.length;a++)if(e[a]!==t)return!0}function Af(e,t,a,n){const o=e[0];if(o===null)return!1;if(t==="display"||t==="visibility")return!0;
2const i=e[e.length-1],s=kr(o,t),r=kr(i,t);return!s||!r?!1:Pf(e)||(a==="spring"||kc(a))&&n}function vi(e){e.duration=0,e.type="keyframes"}const Tc=new Set(["opacity","clipPath","filter","transform","backgroundColor"]),Mf=/^(?:oklch|oklab|lab|lch|color|color-mix|light-dark)\(/;function Df(e){for(let t=0;t<e.length;t++)if(typeof e[t]=="string"&&Mf.test(e[t]))return!0;return!1}const xf=new Set(["color","backgroundColor","outlineColor","fill","stroke","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"]),Rf=jd(()=>Object.hasOwnProperty.call(Element.prototype,"animate"));function If(e){var p;const{motionValue:t,name:a,repeatDelay:n,repeatType:o,damping:i,type:s,keyframes:r}=e,l=(p=t==null?void 0:t.owner)==null?void 0:p.current;if(!(l instanceof HTMLElement)&&!(l instanceof SVGElement))return!1;const{onUpdate:d,transformTemplate:u}=t.owner.getProps();return Rf()&&a&&(Tc.has(a)||xf.has(a)&&Df(r))&&(a!=="transform"||!u)&&!d&&!n&&o!=="mirror"&&i!==0&&s!=="inertia"}const _f=40;class Lf extends cs{constructor({autoplay:t=!0,delay:a=0,type:n="keyframes",repeat:o=0,repeatDelay:i=0,repeatType:s="loop",keyframes:r,name:l,motionValue:d,element:u,...p}){var g;super(),this.stop=()=>{var b,y;this._animation&&(this._animation.stop(),(b=this.stopTimeline)==null||b.call(this)),(y=this.keyframeResolver)==null||y.cancel()},this.createdAt=Le.now();const m={autoplay:t,delay:a,type:n,repeat:o,repeatDelay:i,repeatType:s,name:l,motionValue:d,element:u,...p},k=(u==null?void 0:u.KeyframeResolver)||us;this.keyframeResolver=new k(r,(b,y,T)=>this.onKeyframesResolved(b,y,m,!T),l,d,u),(g=this.keyframeResolver)==null||g.scheduleResolve()}onKeyframesResolved(t,a,n,o){var T,S;this.keyframeResolver=void 0;const{name:i,type:s,velocity:r,delay:l,isHandoff:d,onUpdate:u}=n;this.resolvedAt=Le.now();let p=!0;Af(t,i,s,r)||(p=!1,(At.instantAnimations||!l)&&(u==null||u(vo(t,n,a))),t[0]=t[t.length-1],vi(n),n.repeat=0);const k={startTime:o?this.resolvedAt?this.resolvedAt-this.createdAt>_f?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:a,...n,keyframes:t},g=p&&!d&&If(k),b=(S=(T=k.motionValue)==null?void 0:T.owner)==null?void 0:S.current;let y;if(g)try{y=new wf({...k,element:b})}catch{y=new eo(k)}else y=new eo(k);y.finished.then(()=>{this.notifyFinished()}).catch(Xe),this.pendingTimeline&&(this.stopTimeline=y.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=y}get finished(){return this._animation?this.animation.finished:this._finished}then(t,a){return this.finished.finally(t).then(()=>{})}get animation(){var t;return this._animation||((t=this.keyframeResolver)==null||t.resume(),ff()),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(t){this.animation.time=t}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(t){this.animation.speed=t}get startTime(){return this.animation.startTime}attachTimeline(t){return this._animation?this.stopTimeline=this.animation.attachTimeline(t):this.pendingTimeline=t,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){var t;this._animation&&this.animation.cancel(),(t=this.keyframeResolver)==null||t.cancel()}}function Sc(e,t,a,n=0,o=1){const i=Array.from(e).sort((d,u)=>d.sortNodePosition(u)).indexOf(t),s=e.size,r=(s-1)*n;return typeof a=="function"?a(i,s):o===1?i*n:r-i*n}const yr=30,Ef=e=>!isNaN(parseFloat(e));class Ff{constructor(t,a={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=n=>{var i;const o=Le.now();if(this.updatedAt!==o&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(n),this.current!==this.prev&&((i=this.events.change)==null||i.notify(this.current),this.dependents))for(const s of this.dependents)s.dirty()},this.hasAnimated=!1,this.setCurrent(t),this.owner=a.owner}setCurrent(t){this.current=t,this.updatedAt=Le.now(),this.canTrackVelocity===null&&t!==void 0&&(this.canTrackVelocity=Ef(this.current))}setPrevFrameValue(t=this.current){this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt}onChange(t){return this.on("change",t)}on(t,a){this.events[t]||(this.events[t]=new as);const n=this.events[t].add(a);return t==="change"?()=>{n(),re.read(()=>{this.events.change.getSize()||this.stop()})}:n}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,a){this.passiveEffect=t,this.stopPassiveEffect=a}set(t){this.passiveEffect?this.passiveEffect(t,this.updateAndNotify):this.updateAndNotify(t)}setWithVelocity(t,a,n){this.set(a),this.prev=void 0,this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt-n}jump(t,a=!0){this.updateAndNotify(t),this.prev=t,this.prevUpdatedAt=this.prevFrameValue=void 0,a&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){var t;(t=this.events.change)==null||t.notify(this.current)}addDependent(t){this.dependents||(this.dependents=new Set),this.dependents.add(t)}removeDependent(t){this.dependents&&this.dependents.delete(t)}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const t=Le.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||t-this.updatedAt>yr)return 0;const a=Math.min(this.updatedAt-this.prevUpdatedAt,yr);return Gd(parseFloat(this.current)-parseFloat(this.prevFrameValue),a)}start(t){return this.stop(),new Promise(a=>
2{this.hasAnimated=!0,this.animation=t(a),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){var t,a;(t=this.dependents)==null||t.clear(),(a=this.events.destroy)==null||a.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function fa(e,t){return new Ff(e,t)}function Cc(e,t){if(e!=null&&e.inherit&&t){const{inherit:a,...n}=e;return{...t,...n}}return e}function ps(e,t){const a=(e==null?void 0:e[t])??(e==null?void 0:e.default)??e;return a!==e?Cc(a,e):a}const Of={type:"spring",stiffness:500,damping:25,restSpeed:10},Bf=e=>({type:"spring",stiffness:550,damping:e===0?2*Math.sqrt(550):30,restSpeed:10}),Nf={type:"keyframes",duration:.8},Hf={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},Uf=(e,{keyframes:t})=>t.length>2?Nf:Ta.has(e)?e.startsWith("scale")?Bf(t[1]):Of:Hf,qf=new Set(["when","delay","delayChildren","staggerChildren","staggerDirection","repeat","repeatType","repeatDelay","from","elapsed"]);function jf(e){for(const t in e)if(!qf.has(t))return!0;return!1}const ms=(e,t,a,n={},o,i)=>s=>{const r=ps(n,e)||{},l=r.delay||n.delay||0;let{elapsed:d=0}=n;d=d-Ve(l);const u={keyframes:Array.isArray(a)?a:[null,a],ease:"easeOut",velocity:t.getVelocity(),...r,delay:-d,onUpdate:m=>{t.set(m),r.onUpdate&&r.onUpdate(m)},onComplete:()=>{s(),r.onComplete&&r.onComplete()},name:e,motionValue:t,element:i?void 0:o};jf(r)||Object.assign(u,Uf(e,u)),u.duration&&(u.duration=Ve(u.duration)),u.repeatDelay&&(u.repeatDelay=Ve(u.repeatDelay)),u.from!==void 0&&(u.keyframes[0]=u.from);let p=!1;if((u.type===!1||u.duration===0&&!u.repeatDelay)&&(vi(u),u.delay===0&&(p=!0)),(At.instantAnimations||At.skipAnimations||o!=null&&o.shouldSkipAnimations||r.skipAnimations)&&(p=!0,vi(u),u.delay=0),u.allowFlatten=!r.type&&!r.ease,p&&!i&&t.get()!==void 0){const m=vo(u.keyframes,r);if(m!==void 0){re.update(()=>{u.onUpdate(m),u.onComplete()});return}}return r.isSync?new eo(u):new Lf(u)},Gf=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function Vf(e){const t=Gf.exec(e);if(!t)return[,];const[,a,n,o]=t;return[`--${a??n}`,o]}function wc(e,t,a=1){const[n,o]=Vf(e);if(!n)return;const i=window.getComputedStyle(t).getPropertyValue(n);if(i){const s=i.trim();return Hd(s)?parseFloat(s):s}return is(o)?wc(o,t,a+1):o}function vr(e){const t=[{},{}];return e==null||e.values.forEach((a,n)=>{t[0][n]=a.get(),t[1][n]=a.getVelocity()}),t}function hs(e,t,a,n){if(typeof t=="function"){const[o,i]=vr(n);t=t(a!==void 0?a:e.custom,o,i)}if(typeof t=="string"&&(t=e.variants&&e.variants[t]),typeof t=="function"){const[o,i]=vr(n);t=t(a!==void 0?a:e.custom,o,i)}return t}function zt(e,t,a){const n=e.getProps();return hs(n,t,a!==void 0?a:n.custom,e)}const Pc=new Set(["width","height","top","left","right","bottom",...va]),Ti=e=>Array.isArray(e);function Wf(e,t,a){e.hasValue(t)?e.getValue(t).set(a):e.addValue(t,fa(a))}function zf(e){return Ti(e)?e[e.length-1]||0:e}function Kf(e,t){const a=zt(e,t);let{transitionEnd:n={},transition:o={},...i}=a||{};i={...i,...n};for(const s in i){const r=zf(i[s]);Wf(e,s,r)}}const Ae=e=>!!(e&&e.getVelocity);function $f(e){return!!(Ae(e)&&e.add)}function Si(e,t){const a=e.getValue("willChange");if($f(a))return a.add(t);if(!a&&At.WillChange){const n=new At.WillChange("auto");e.addValue("willChange",n),n.add(t)}}function gs(e){return e.replace(/([A-Z])/g,t=>`-${t.toLowerCase()}`)}const Qf="framerAppearId",Ac="data-"+gs(Qf);function Mc(e){return e.props[Ac]}function Jf({protectedKeys:e,needsAnimating:t},a){const n=e.hasOwnProperty(a)&&t[a]!==!0;return t[a]=!1,n}function Dc(e,t,{delay:a=0,transitionOverride:n,type:o}={}){let{transition:i,transitionEnd:s,...r}=t;const l=e.getDefaultTransition();i=i?Cc(i,l):l;const d=i==null?void 0:i.reduceMotion,u=i==null?void 0:i.skipAnimations;n&&(i=n);const p=[],m=o&&e.animationState&&e.animationState.getState()[o],k=i==null?void 0:i.path;k&&k.animateVisualElement(e,r,i,a,p);for(const g in r){const b=e.getValue(g,e.latestValues[g]??null),y=r[g];if(y===void 0||m&&Jf(m,g))continue;const T={delay:a,...ps(i||{},g)};u&&(T.skipAnimations=!0);const S=b.get();if(S!==void 0&&!b.isAnimating()&&!Array.isArray(y)&&y===S&&!T.velocity){re.update(()=>b.set(y));continue}let P=!1;if(window.MotionHandoffAnimation){const x=Mc(e);if(x){const I=window.MotionHandoffAnimation(x,g,re);I!==null&&(T.startTime=I,P=!0)}}Si(e,g);const w=d??e.shouldReduceMotion;b.start(ms(g,b,y,w&&Pc.has(g)?{type:!1}:T,e,P));const C=b.animation;C&&p.push(C)}if(s){const g=()=>re.update(()=>{s&&Kf(e,s)});p.length?Promise.all(p).then(g):g()}return p}function Ci(e,t,a={}){var l;const n=zt(e,t,a.type==="exit"?(l=e.presenceContext)==null?void 0:l.custom:void 0);let{transition:o=e.getDefaultTransition()||{}}=n||{};a.transitionOverride&&(o=a.transitionOverride);const i=n?()=>Promise.all(Dc(e,n,a)):()=>Promise.resolve(),s=e.variantChildren&&e.variantChildren.size?(d=0)=>{const{delayChildren:u=0,staggerChildren:p,staggerDirection:m}=o;return Yf(e,t,d,u,p,m,a)}:()=>Promise.resolve(),{when:r}=o;if(r){const[d,u]=r==="beforeChildren"?[i,s]:[s,i];return d().then(()=>u())}else return Promise.all([i(),s(a.delay)])}function Yf(e,t,a=0,n=0,o=0,i=1,s){const r=[];for(const l of e.variantChildren)l.notify("AnimationStart",t),r.push(Ci(l,t,{...s,delay:a+(typeof n=="function"?0:n)+Sc(e.variantChildren,l,n,o,i)}).then(()=>l.notify("AnimationComplete",t)));return Promise.all(r)}function Xf(e,t,a={}){e.notify("AnimationStart",t);let n;if(Array.isArray(t)){const o=t.map(i=>Ci(e,i,a));n=Promise.all(o)}else if(typeof t=="string")n=Ci(e,t,a);else{const o=typeof t=="function"?zt(e,t,a.custom):t;n=Promise.all(Dc(e,o,a))}return n.then(()=>
vendor: 19,356 bytes, line 2
2{e.notify("AnimationComplete",t)})}const Zf={test:e=>e==="auto",parse:e=>e},xc=e=>t=>t.test(e),Rc=[ya,B,ht,kt,wg,Cg,Zf],Tr=e=>Rc.find(xc(e));function eb(e){return typeof e=="number"?e===0:e!==null?e==="none"||e==="0"||qd(e):!0}const tb=new Set(["brightness","contrast","saturate","opacity"]);function ab(e){const[t,a]=e.slice(0,-1).split("(");if(t==="drop-shadow")return e;const[n]=a.match(ss)||[];if(!n)return e;const o=a.replace(n,"");let i=tb.has(t)?1:0;return n!==a&&(i*=100),t+"("+i+o+")"}const nb=/\b([a-z-]*)\(.*?\)/gu,wi={...it,getAnimatableNone:e=>{const t=e.match(nb);return t?t.map(ab).join(" "):e}},Pi={...it,getAnimatableNone:e=>{const t=it.parse(e);return it.createTransformer(e)(t.map(n=>typeof n=="number"?0:typeof n=="object"?{...n,alpha:1}:n))}},Sr={...ya,transform:Math.round},ob={rotate:kt,pathRotation:kt,rotateX:kt,rotateY:kt,rotateZ:kt,scale:yn,scaleX:yn,scaleY:yn,scaleZ:yn,skew:kt,skewX:kt,skewY:kt,distance:B,translateX:B,translateY:B,translateZ:B,x:B,y:B,z:B,perspective:B,transformPerspective:B,opacity:Xa,originX:lr,originY:lr,originZ:B},to={borderWidth:B,borderTopWidth:B,borderRightWidth:B,borderBottomWidth:B,borderLeftWidth:B,borderRadius:B,borderTopLeftRadius:B,borderTopRightRadius:B,borderBottomRightRadius:B,borderBottomLeftRadius:B,width:B,maxWidth:B,height:B,maxHeight:B,top:B,right:B,bottom:B,left:B,inset:B,insetBlock:B,insetBlockStart:B,insetBlockEnd:B,insetInline:B,insetInlineStart:B,insetInlineEnd:B,padding:B,paddingTop:B,paddingRight:B,paddingBottom:B,paddingLeft:B,paddingBlock:B,paddingBlockStart:B,paddingBlockEnd:B,paddingInline:B,paddingInlineStart:B,paddingInlineEnd:B,margin:B,marginTop:B,marginRight:B,marginBottom:B,marginLeft:B,marginBlock:B,marginBlockStart:B,marginBlockEnd:B,marginInline:B,marginInlineStart:B,marginInlineEnd:B,fontSize:B,backgroundPositionX:B,backgroundPositionY:B,...ob,zIndex:Sr,fillOpacity:Xa,strokeOpacity:Xa,numOctaves:Sr},ib={...to,color:ye,backgroundColor:ye,outlineColor:ye,fill:ye,stroke:ye,borderColor:ye,borderTopColor:ye,borderRightColor:ye,borderBottomColor:ye,borderLeftColor:ye,filter:wi,WebkitFilter:wi,mask:Pi,WebkitMask:Pi},Ic=e=>ib[e],sb=new Set([wi,Pi]);function _c(e,t){let a=Ic(e);return sb.has(a)||(a=it),a.getAnimatableNone?a.getAnimatableNone(t):void 0}const rb=new Set(["auto","none","0"]);function lb(e,t,a){let n=0,o;for(;n<e.length&&!o;){const i=e[n];typeof i=="string"&&!rb.has(i)&&ga(i).values.length&&(o=e[n]),n++}if(o&&a)for(const i of t)e[i]=_c(a,o)}class db extends us{constructor(t,a,n,o,i){super(t,a,n,o,i,!0)}readKeyframes(){const{unresolvedKeyframes:t,element:a,name:n}=this;if(!a||!a.current)return;super.readKeyframes();for(let u=0;u<t.length;u++){let p=t[u];if(typeof p=="string"&&(p=p.trim(),is(p))){const m=wc(p,a.current);m!==void 0&&(t[u]=m),u===t.length-1&&(this.finalKeyframe=p)}}if(this.resolveNoneKeyframes(),!Pc.has(n)||t.length!==2)return;const[o,i]=t,s=Tr(o),r=Tr(i),l=rr(o),d=rr(i);if(l!==d&&wt[n]){this.needsMeasurement=!0;return}if(s!==r)if(fr(s)&&fr(r))for(let u=0;u<t.length;u++){const p=t[u];typeof p=="string"&&(t[u]=parseFloat(p))}else wt[n]&&(this.needsMeasurement=!0)}resolveNoneKeyframes(){const{unresolvedKeyframes:t,name:a}=this,n=[];for(let o=0;o<t.length;o++)(t[o]===null||eb(t[o]))&&n.push(o);n.length&&lb(t,n,a)}measureInitialState(){const{element:t,unresolvedKeyframes:a,name:n}=this;if(!t||!t.current)return;n==="height"&&(this.suspendedScrollY=window.pageYOffset),this.measuredOrigin=wt[n](t.measureViewportBox(),window.getComputedStyle(t.current)),a[0]=this.measuredOrigin;const o=a[a.length-1];o!==void 0&&t.getValue(n,o).jump(o,!1)}measureEndState(){var r;const{element:t,name:a,unresolvedKeyframes:n}=this;if(!t||!t.current)return;const o=t.getValue(a);o&&o.jump(this.measuredOrigin,!1);const i=n.length-1,s=n[i];n[i]=wt[a](t.measureViewportBox(),window.getComputedStyle(t.current)),s!==null&&this.finalKeyframe===void 0&&(this.finalKeyframe=s),(r=this.removedTransforms)!=null&&r.length&&this.removedTransforms.forEach(([l,d])=>{t.getValue(l).set(d)}),this.resolveNoneKeyframes()}}const fs=["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"];function Lc(e,t,a){if(e==null)return[];if(e instanceof EventTarget)return[e];if(typeof e=="string"){let n=document;const o=(a==null?void 0:a[e])??n.querySelectorAll(e);return o?Array.from(o):[]}return Array.from(e).filter(n=>n!=null)}const Ai=(e,t)=>t&&typeof e=="number"?t.transform(e):e;function qn(e){return Ud(e)&&"offsetHeight"in e&&!("ownerSVGElement"in e)}const{schedule:bs}=ec(queueMicrotask,!1),nt={x:!1,y:!1};function Ec(){return nt.x||nt.y}function cb(e){return e==="x"||e==="y"?nt[e]?null:(nt[e]=!0,()=>{nt[e]=!1}):nt.x||nt.y?null:(nt.x=nt.y=!0,()=>{nt.x=nt.y=!1})}function Fc(e,t){const a=Lc(e),n=new AbortController,o={passive:!0,...t,signal:n.signal};return[a,o,()=>n.abort()]}function ub(e){return!(e.pointerType==="touch"||Ec())}function pb(e,t,a={}){const[n,o,i]=Fc(e,a);return n.forEach(s=>{let r=!1,l=!1,d;const u=()=>{s.removeEventListener("pointerleave",g)},p=y=>{d&&(d(y),d=void 0),u()},m=y=>{r=!1,window.removeEventListener("pointerup",m),window.removeEventListener("pointercancel",m),l&&(l=!1,p(y))},k=()=>{r=!0,window.addEventListener("pointerup",m,o),window.addEventListener("pointercancel",m,o)},g=y=>{if(y.pointerType!=="touch"){if(r){l=!0;return}p(y)}},b=y=>{if(!ub(y))return;l=!1;const T=t(s,y);typeof T=="function"&&(d=T,s.addEventListener("pointerleave",g,o))};s.addEventListener("pointerenter",b,o),s.addEventListener("pointerdown",k,o)}),i}const Oc=(e,t)=>t?e===t?!0:Oc(e,t.parentElement):!1,ks=e=>e.pointerType==="mouse"?typeof e.button!="number"||e.button<=0:e.isPrimary!==!1,mb=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function hb(e){return mb.has(e.tagName)||e.isContentEditable===!0}const gb=new Set(["INPUT","SELECT","TEXTAREA"]);function fb(e){return gb.has(e.tagName)||e.isContentEditable===!0}const jn=new WeakSet;function Cr(e){return t=>{t.key==="Enter"&&e(t)}}function Bo(e,t){e.dispatchEvent(new PointerEvent("pointer"+t,{isPrimary:!0,bubbles:!0}))}const bb=(e,t)=>{const a=e.currentTarget;if(!a)return;const n=Cr(()=>{if(jn.has(a))return;Bo(a,"down");const o=Cr(()=>{Bo(a,"up")}),i=()=>Bo(a,"cancel");a.addEventListener("keyup",o,t),a.addEventListener("blur",i,t)});a.addEventListener("keydown",n,t),a.addEventListener("blur",()=>a.removeEventListener("keydown",n),t)};function wr(e){return ks(e)&&!Ec()}const Pr=new WeakSet;function kb(e,t,a={}){const[n,o,i]=Fc(e,a),s=r=>{const l=r.currentTarget;if(!wr(r)||Pr.has(r))return;jn.add(l),a.stopPropagation&&Pr.add(r);const d=t(l,r),u={...o,capture:!0},p=(g,b)=>{window.removeEventListener("pointerup",m,u),window.removeEventListener("pointercancel",k,u),jn.has(l)&&jn.delete(l),wr(g)&&typeof d=="function"&&d(g,{success:b})},m=g=>{p(g,l===window||l===document||a.useGlobalTarget||Oc(l,g.target))},k=g=>{p(g,!1)};window.addEventListener("pointerup",m,u),window.addEventListener("pointercancel",k,u)};return n.forEach(r=>{(a.useGlobalTarget?window:r).addEventListener("pointerdown",s,o),qn(r)&&(r.addEventListener("focus",d=>bb(d,o)),!hb(r)&&!r.hasAttribute("tabindex")&&(r.tabIndex=0))}),i}function ys(e){return Ud(e)&&"ownerSVGElement"in e}const Gn=new WeakMap;let St;const Bc=(e,t,a)=>(n,o)=>o&&o[0]?o[0][e+"Size"]:ys(n)&&"getBBox"in n?n.getBBox()[t]:n[a],yb=Bc("inline","width","offsetWidth"),vb=Bc("block","height","offsetHeight");function Tb({target:e,borderBoxSize:t}){var a;(a=Gn.get(e))==null||a.forEach(n=>{n(e,{get width(){return yb(e,t)},get height(){return vb(e,t)}})})}function Sb(e){e.forEach(Tb)}function Cb(){typeof ResizeObserver>"u"||(St=new ResizeObserver(Sb))}function wb(e,t){St||Cb();const a=Lc(e);return a.forEach(n=>{let o=Gn.get(n);o||(o=new Set,Gn.set(n,o)),o.add(t),St==null||St.observe(n)}),()=>{a.forEach(n=>{const o=Gn.get(n);o==null||o.delete(t),o!=null&&o.size||St==null||St.unobserve(n)})}}const Vn=new Set;let sa;function Pb(){sa=()=>{const e={get width(){return window.innerWidth},get height(){return window.innerHeight}};Vn.forEach(t=>t(e))},window.addEventListener("resize",sa)}function Ab(e){return Vn.add(e),sa||Pb(),()=>{Vn.delete(e),!Vn.size&&typeof sa=="function"&&(window.removeEventListener("resize",sa),sa=void 0)}}function Ar(e,t){return typeof e=="function"?Ab(e):wb(e,t)}function Mb(e){return ys(e)&&e.tagName==="svg"}const Db=[...Rc,ye,it],xb=e=>Db.find(xc(e)),Mr=()=>({translate:0,scale:1,origin:0,originPoint:0}),ra=()=>({x:Mr(),y:Mr()}),Dr=()=>({min:0,max:0}),Te=()=>({x:Dr(),y:Dr()}),Rb=new WeakMap;function To(e){return e!==null&&typeof e=="object"&&typeof e.start=="function"}function Za(e){return typeof e=="string"||Array.isArray(e)}const vs=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],Ts=["initial",...vs];function So(e){return To(e.animate)||Ts.some(t=>Za(e[t]))}function Nc(e){return!!(So(e)||e.variants)}function Ib(e,t,a){for(const n in t){const o=t[n],i=a[n];if(Ae(o))e.addValue(n,o);else if(Ae(i))e.addValue(n,fa(o,{owner:e}));else if(i!==o)if(e.hasValue(n)){const s=e.getValue(n);s.liveStyle===!0?s.jump(o):s.hasAnimated||s.set(o)}else{const s=e.getStaticValue(n);e.addValue(n,fa(s!==void 0?s:o,{owner:e}))}}for(const n in a)t[n]===void 0&&e.removeValue(n);return t}const ao={current:null},Ss={current:!1},_b=typeof window<"u";function Hc(){if(Ss.current=!0,!!_b)if(window.matchMedia){const e=window.matchMedia("(prefers-reduced-motion)"),t=()=>ao.current=e.matches;e.addEventListener("change",t),t()}else ao.current=!1}const xr=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];let no={};function Uc(e){no=e}function Lb(){return no}class Eb{scrapeMotionValuesFromProps(t,a,n){return{}}constructor({parent:t,props:a,presenceContext:n,reducedMotionConfig:o,skipAnimations:i,blockInitialAnimation:s,visualState:r},l={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.shouldSkipAnimations=!1,this.values=new Map,this.KeyframeResolver=us,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.hasBeenMounted=!1,this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const k=Le.now();this.renderScheduledAt<k&&(this.renderScheduledAt=k,re.render(this.render,!1,!0))};const{latestValues:d,renderState:u}=r;this.latestValues=d,this.baseTarget={...d},this.initialValues=a.initial?{...d}:{},this.renderState=u,this.parent=t,this.props=a,this.presenceContext=n,this.depth=t?t.depth+1:0,this.reducedMotionConfig=o,this.skipAnimationsConfig=i,this.options=l,this.blockInitialAnimation=!!s,this.isControllingVariants=So(a),this.isVariantNode=Nc(a),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(t&&t.current);const{willChange:p,...m}=this.scrapeMotionValuesFromProps(a,{},this);for(const k in m){const g=m[k];d[k]!==void 0&&Ae(g)&&g.set(d[k])}}mount(t){var a,n;if(this.hasBeenMounted)for(const o in this.initialValues)(a=this.values.get(o))==null||a.jump(this.initialValues[o]),this.latestValues[o]=this.initialValues[o];this.current=t,Rb.set(t,this),this.projection&&!this.projection.instance&&this.projection.mount(t),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((o,i)=>this.bindToMotionValue(i,o)),this.reducedMotionConfig==="never"?this.shouldReduceMotion=!1:this.reducedMotionConfig==="always"?this.shouldReduceMotion=!0:(Ss.current||Hc(),this.shouldReduceMotion=ao.current),this.shouldSkipAnimations=this.skipAnimationsConfig??!1,(n=this.parent)==null||n.addChild(this),this.update(this.props,this.presenceContext),this.hasBeenMounted=!0}unmount(){var t;this.projection&&this.projection.unmount(),Mt(this.notifyUpdate),Mt(this.render),this.valueSubscriptions.forEach(a=>a()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),(t=this.parent)==null||t.removeChild(this);for(const a in this.events)this.events[a].clear();for(const a in this.features){const n=this.features[a];n&&(n.unmount(),n.isMounted=!1)}this.current=null}addChild(t){this.children.add(t),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(t)}removeChild(t){this.children.delete(t),this.enteringChildren&&this.enteringChildren.delete(t)}bindToMotionValue(t,a){if(this.valueSubscriptions.has(t)&&this.valueSubscriptions.get(t)(),a.accelerate&&Tc.has(t)&&this.current instanceof HTMLElement){const{factory:s,keyframes:r,times:l,ease:d,duration:u}=a.accelerate,p=new yc({element:this.current,name:t,keyframes:r,times:l,ease:d,duration:Ve(u)}),m=s(p);this.valueSubscriptions.set(t,()=>{m(),p.cancel()});return}const n=Ta.has(t);n&&this.onBindTransform&&this.onBindTransform();const o=a.on("change",s=>{this.latestValues[t]=s,this.props.onUpdate&&re.preRender(this.notifyUpdate),n&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let i;typeof window<"u"&&window.MotionCheckAppearSync&&(i=window.MotionCheckAppearSync(this,t,a)),this.valueSubscriptions.set(t,()=>{o(),i&&i()})}sortNodePosition(t){return!this.current||!this.sortInstanceNodePosition||this.type!==t.type?0:this.sortInstanceNodePosition(this.current,t.current)}updateFeatures(){let t="animation";for(t in no){const a=no[t];if(!a)continue;const{isEnabled:n,Feature:o}=a;if(!this.features[t]&&o&&n(this.props)&&(this.features[t]=new o(this)),this.features[t]){const i=this.features[t];i.isMounted?i.update():(i.mount(),i.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):Te()}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,a){this.latestValues[t]=a}update(t,a){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=a;for(let n=0;n<xr.length;n++){const o=xr[n];this.propEventSubscriptions[o]&&(this.propEventSubscriptions[o](),delete this.propEventSubscriptions[o]);const i="on"+o,s=t[i];s&&(this.propEventSubscriptions[o]=this.on(o,s))}this.prevMotionValues=Ib(this,this.scrapeMotionValuesFromProps(t,this.prevProps||{},this),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(t){return this.props.variants?this.props.variants[t]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}addVariantChild(t){const a=this.getClosestVariantNode();if(a)return a.variantChildren&&a.variantChildren.add(t),()=>a.variantChildren.delete(t)}addValue(t,a){const n=this.values.get(t);a!==n&&(n&&this.removeValue(t),this.bindToMotionValue(t,a),this.values.set(t,a),this.latestValues[t]=a.get())}removeValue(t){this.values.delete(t);const a=this.valueSubscriptions.get(t);a&&(a(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,a){if(this.props.values&&this.props.values[t])return this.props.values[t];let n=this.values.get(t);return n===void 0&&a!==void 0&&(n=fa(a===null?void 0:a,{owner:this}),this.addValue(t,n)),n}readValue(t,a){let n=this.latestValues[t]!==void 0||!this.current?this.latestValues[t]:this.getBaseTargetFromProps(this.props,t)??this.readValueFromInstance(this.current,t,this.options);return n!=null&&(typeof n=="string"&&(Hd(n)||qd(n))?n=parseFloat(n):!xb(n)&&it.test(a)&&(n=_c(t,a)),this.setBaseTarget(t,Ae(n)?n.get():n)),Ae(n)?n.get():n}setBaseTarget(t,a){this.baseTarget[t]=a}getBaseTarget(t){var i;const{initial:a}=this.props;let n;if(typeof a=="string"||typeof a=="object"){const s=hs(this.props,a,(i=this.presenceContext)==null?void 0:i.custom);s&&(n=s[t])}if(a&&n!==void 0)return n;const o=this.getBaseTargetFromProps(this.props,t);return o!==void 0&&!Ae(o)?o:this.initialValues[t]!==void 0&&n===void 0?void 0:this.baseTarget[t]}on(t,a){return this.events[t]||(this.events[t]=new as),this.events[t].add(a)}notify(t,...a){this.events[t]&&this.events[t].notify(...a)}scheduleRenderMicrotask(){bs.render(this.render)}}class qc extends Eb{constructor(){super(...arguments),this.KeyframeResolver=db}sortInstanceNodePosition(t,a){return t.compareDocumentPosition(a)&2?1:-1}getBaseTargetFromProps(t,a){const n=t.style;return n?n[a]:void 0}removeValueFromRenderState(t,{vars:a,style:n}){delete a[t],delete n[t]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:t}=this.props;Ae(t)&&(this.childSubscription=t.on("change",a=>{this.current&&(this.current.textContent=`${a}`)}))}}class xt{constructor(t){this.isMounted=!1,this.node=t}update(){}}function jc({top:e,left:t,right:a,bottom:n}){return{x:{min:t,max:a},y:{min:e,max:n}}}function Fb({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}function Ob(e,t){if(!t)return e;const a=t({x:e.left,y:e.top}),n=t({x:e.right,y:e.bottom});return{top:a.y,left:a.x,bottom:n.y,right:n.x}}function No(e){return e===void 0||e===1}function Mi({scale:e,scaleX:t,scaleY:a}){return!No(e)||!No(t)||!No(a)}function Bt(e){return Mi(e)||Gc(e)||e.z||e.rotate||e.rotateX||e.rotateY||e.skewX||e.skewY}function Gc(e){return Rr(e.x)||Rr(e.y)}function Rr(e){return e&&e!=="0%"}function oo(e,t,a){const n=e-a,o=t*n;return a+o}function Ir(e,t,a,n,o){return o!==void 0&&(e=oo(e,o,n)),oo(e,a,n)+t}function Di(e,t=0,a=1,n,o){e.min=Ir(e.min,t,a,n,o),e.max=Ir(e.max,t,a,n,o)}function Vc(e,{x:t,y:a}){Di(e.x,t.translate,t.scale,t.originPoint),Di(e.y,a.translate,a.scale,a.originPoint)}const _r=.999999999999,Lr=1.0000000000001;function Bb(e,t,a,n=!1){var r;const o=a.length;if(!o)return;t.x=t.y=1;let i,s;for(let l=0;l<o;l++){i=a[l],s=i.projectionDelta;const{visualElement:d}=i.options;d&&d.props.style&&d.props.style.display==="contents"||(n&&i.options.layoutScroll&&i.scroll&&i!==i.root&&(pt(e.x,-i.scroll.offset.x),pt(e.y,-i.scroll.offset.y)),s&&(t.x*=s.x.scale,t.y*=s.y.scale,Vc(e,s)),n&&Bt(i.latestValues)&&Wn(e,i.latestValues,(r=i.layout)==null?void 0:r.layoutBox))}t.x<Lr&&t.x>_r&&(t.x=1),t.y<Lr&&t.y>_r&&(t.y=1)}function pt(e,t){e.min+=t,e.max+=t}function Er(e,t,a,n,o=.5){const i=se(e.min,e.max,o);Di(e,t,a,i,n)}function Fr(e,t){return typeof e=="string"?parseFloat(e)/100*(t.max-t.min):e}function Wn(e,t,a){const n=a??e;Er(e.x,Fr(t.x,n.x),t.scaleX,t.scale,t.originX),Er(e.y,Fr(t.y,n.y),t.scaleY,t.scale,t.originY)}function Wc(e,t){return jc(Ob(e.getBoundingClientRect(),t))}function Nb(e,t,a){const n=Wc(e,a),{scroll:o}=t;return o&&(pt(n.x,o.offset.x),pt(n.y,o.offset.y)),n}const Hb={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},Ub=va.length;function qb(e,t,a){let n="",o=!0;for(let s=0;s<Ub;s++){const r=va[s],l=e[r];if(l===void 0)continue;let d=!0;if(typeof l=="number")d=l===(r.startsWith("scale")?1:0);else{const u=parseFloat(l);
2d=r.startsWith("scale")?u===1:u===0}if(!d||a){const u=Ai(l,to[r]);if(!d){o=!1;const p=Hb[r]||r;n+=`${p}(${u}) `}a&&(t[r]=u)}}const i=e.pathRotation;return i&&(o=!1,n+=`rotate(${Ai(i,to.pathRotation)}) `),n=n.trim(),a?n=a(t,o?"":n):o&&(n="none"),n}function Cs(e,t,a){const{style:n,vars:o,transformOrigin:i}=e;let s=!1,r=!1;for(const l in t){const d=t[l];if(Ta.has(l)){s=!0;continue}else if(ac(l)){o[l]=d;continue}else{const u=Ai(d,to[l]);l.startsWith("origin")?(r=!0,i[l]=u):n[l]=u}}if(t.transform||(s||a?n.transform=qb(t,e.transform,a):n.transform&&(n.transform="none")),r){const{originX:l="50%",originY:d="50%",originZ:u=0}=i;n.transformOrigin=`${l} ${d} ${u}`}}function zc(e,{style:t,vars:a},n,o){const i=e.style;let s;for(s in t)i[s]=t[s];o==null||o.applyProjectionStyles(i,n);for(s in a)i.setProperty(s,a[s])}function Or(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}const Da={correct:(e,t)=>{if(!t.target)return e;if(typeof e=="string")if(B.test(e))e=parseFloat(e);else return e;const a=Or(e,t.target.x),n=Or(e,t.target.y);return`${a}% ${n}%`}},jb={correct:(e,{treeScale:t,projectionDelta:a})=>{const n=e,o=it.parse(e);if(o.length>5)return n;const i=it.createTransformer(e),s=typeof o[0]!="number"?1:0,r=a.x.scale*t.x,l=a.y.scale*t.y;o[0+s]/=r,o[1+s]/=l;const d=se(r,l,.5);return typeof o[2+s]=="number"&&(o[2+s]/=d),typeof o[3+s]=="number"&&(o[3+s]/=d),i(o)}},xi={borderRadius:{...Da,applyTo:[...fs]},borderTopLeftRadius:Da,borderTopRightRadius:Da,borderBottomLeftRadius:Da,borderBottomRightRadius:Da,boxShadow:jb};function Kc(e,{layout:t,layoutId:a}){return Ta.has(e)||e.startsWith("origin")||(t||a!==void 0)&&(!!xi[e]||e==="opacity")}function ws(e,t,a){var s;const n=e.style,o=t==null?void 0:t.style,i={};if(!n)return i;for(const r in n)(Ae(n[r])||o&&Ae(o[r])||Kc(r,e)||((s=a==null?void 0:a.getValue(r))==null?void 0:s.liveStyle)!==void 0)&&(i[r]=n[r]);return i}function Gb(e){return window.getComputedStyle(e)}class Vb extends qc{constructor(){super(...arguments),this.type="html",this.renderInstance=zc}mount(t){yo(!!t.style),super.mount(t)}readValueFromInstance(t,a){var n;if(Ta.has(a))return(n=this.projection)!=null&&n.isProjecting?gi(a):uf(t,a);{const o=Gb(t),i=(ac(a)?o.getPropertyValue(a):o[a])||0;return typeof i=="string"?i.trim():i}}measureInstanceViewportBox(t,{transformPagePoint:a}){return Wc(t,a)}build(t,a,n){Cs(t,a,n.transformTemplate)}scrapeMotionValuesFromProps(t,a,n){return ws(t,a,n)}}const Wb={offset:"stroke-dashoffset",array:"stroke-dasharray"},zb={offset:"strokeDashoffset",array:"strokeDasharray"};function Kb(e,t,a=1,n=0,o=!0){e.pathLength=1;const i=o?Wb:zb;e[i.offset]=`${-n}`,e[i.array]=`${t} ${a}`}const $b=["offsetDistance","offsetPath","offsetRotate","offsetAnchor"];function $c(e,{attrX:t,attrY:a,attrScale:n,pathLength:o,pathSpacing:i=1,pathOffset:s=0,...r},l,d,u){if(Cs(e,r,d),l){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};const{attrs:p,style:m}=e;p.transform&&(m.transform=p.transform,delete p.transform),(m.transform||p.transformOrigin)&&(m.transformOrigin=p.transformOrigin??"50% 50%",delete p.transformOrigin),m.transform&&(m.transformBox=(u==null?void 0:u.transformBox)??"fill-box",delete p.transformBox);for(const k of $b)p[k]!==void 0&&(m[k]=p[k],delete p[k]);t!==void 0&&(p.x=t),a!==void 0&&(p.y=a),n!==void 0&&(p.scale=n),o!==void 0&&Kb(p,o,i,s,!1)}const Qc=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]),Jc=e=>typeof e=="string"&&e.toLowerCase()==="svg";function Qb(e,t,a,n){zc(e,t,void 0,n);for(const o in t.attrs)e.setAttribute(Qc.has(o)?o:gs(o),t.attrs[o])}function Yc(e,t,a){const n=ws(e,t,a);for(const o in e)if(Ae(e[o])||Ae(t[o])){const i=va.indexOf(o)!==-1?"attr"+o.charAt(0).toUpperCase()+o.substring(1):o;n[i]=e[o]}return n}class Jb extends qc{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=Te}getBaseTargetFromProps(t,a){return t[a]}readValueFromInstance(t,a){if(Ta.has(a)){const n=Ic(a);return n&&n.default||0}return a=Qc.has(a)?a:gs(a),t.getAttribute(a)}scrapeMotionValuesFromProps(t,a,n){return Yc(t,a,n)}
vendor: 7,136 bytes, line 2
2build(t,a,n){$c(t,a,this.isSVGTag,n.transformTemplate,n.style)}renderInstance(t,a,n,o){Qb(t,a,n,o)}mount(t){this.isSVGTag=Jc(t.tagName),super.mount(t)}}const Yb=Ts.length;function Xc(e){if(!e)return;if(!e.isControllingVariants){const a=e.parent?Xc(e.parent)||{}:{};return e.props.initial!==void 0&&(a.initial=e.props.initial),a}const t={};for(let a=0;a<Yb;a++){const n=Ts[a],o=e.props[n];(Za(o)||o===!1)&&(t[n]=o)}return t}function Zc(e,t){if(!Array.isArray(t))return!1;const a=t.length;if(a!==e.length)return!1;for(let n=0;n<a;n++)if(t[n]!==e[n])return!1;return!0}const Xb=[...vs].reverse(),Zb=vs.length;function ek(e){return t=>Promise.all(t.map(({animation:a,options:n})=>Xf(e,a,n)))}function tk(e){let t=ek(e),a=Br(),n=!0,o=!1;const i=d=>(u,p)=>{var k;const m=zt(e,p,d==="exit"?(k=e.presenceContext)==null?void 0:k.custom:void 0);if(m){const{transition:g,transitionEnd:b,...y}=m;u={...u,...y,...b}}return u};function s(d){t=d(e)}function r(d){const{props:u}=e,p=Xc(e.parent)||{},m=[],k=new Set;let g={},b=1/0;for(let T=0;T<Zb;T++){const S=Xb[T],P=a[S],w=u[S]!==void 0?u[S]:p[S],C=Za(w),x=S===d?P.isActive:null;x===!1&&(b=T);let I=w===p[S]&&w!==u[S]&&C;if(I&&(n||o)&&e.manuallyAnimateOnMount&&(I=!1),P.protectedKeys={...g},!P.isActive&&x===null||!w&&!P.prevProp||To(w)||typeof w=="boolean")continue;if(S==="exit"&&P.isActive&&x!==!0){P.prevResolvedValues&&(g={...g,...P.prevResolvedValues});continue}const R=ak(P.prevProp,w);let _=R||S===d&&P.isActive&&!I&&C||T>b&&C,A=!1;const L=Array.isArray(w)?w:[w];let j=L.reduce(i(S),{});x===!1&&(j={});const{prevResolvedValues:U={}}=P,z={...U,...j},W=D=>{_=!0,k.has(D)&&(A=!0,k.delete(D)),P.needsAnimating[D]=!0;const N=e.getValue(D);N&&(N.liveStyle=!1)};for(const D in z){const N=j[D],H=U[D];if(g.hasOwnProperty(D))continue;let M=!1;Ti(N)&&Ti(H)?M=!Zc(N,H)||R:M=N!==H,M?N!=null?W(D):k.add(D):N!==void 0&&k.has(D)?W(D):P.protectedKeys[D]=!0}P.prevProp=w,P.prevResolvedValues=j,P.isActive&&(g={...g,...j}),(n||o)&&e.blockInitialAnimation&&(_=!1);const Q=I&&R;_&&(!Q||A)&&m.push(...L.map(D=>{const N={type:S};if(typeof D=="string"&&(n||o)&&!Q&&e.manuallyAnimateOnMount&&e.parent){const{parent:H}=e,M=zt(H,D);if(H.enteringChildren&&M){const{delayChildren:O}=M.transition||{};N.delay=Sc(H.enteringChildren,e,O)}}return{animation:D,options:N}}))}if(k.size){const T={};if(typeof u.initial!="boolean"){const S=zt(e,Array.isArray(u.initial)?u.initial[0]:u.initial);S&&S.transition&&(T.transition=S.transition)}k.forEach(S=>{const P=e.getBaseTarget(S),w=e.getValue(S);w&&(w.liveStyle=!0),T[S]=P??null}),m.push({animation:T})}let y=!!m.length;return n&&(u.initial===!1||u.initial===u.animate)&&!e.manuallyAnimateOnMount&&(y=!1),n=!1,o=!1,y?t(m):Promise.resolve()}function l(d,u){var m;if(a[d].isActive===u)return Promise.resolve();(m=e.variantChildren)==null||m.forEach(k=>{var g;return(g=k.animationState)==null?void 0:g.setActive(d,u)}),a[d].isActive=u;const p=r(d);for(const k in a)a[k].protectedKeys={};return p}return{animateChanges:r,setActive:l,setAnimateFunction:s,getState:()=>a,reset:()=>{a=Br(),o=!0}}}function ak(e,t){return typeof t=="string"?t!==e:Array.isArray(t)?!Zc(t,e):!1}function Et(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function Br(){return{animate:Et(!0),whileInView:Et(),whileHover:Et(),whileTap:Et(),whileDrag:Et(),whileFocus:Et(),exit:Et()}}function Ri(e,t){e.min=t.min,e.max=t.max}function tt(e,t){Ri(e.x,t.x),Ri(e.y,t.y)}function Nr(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t.originPoint,e.origin=t.origin}const eu=1e-4,nk=1-eu,ok=1+eu,tu=.01,ik=0-tu,sk=0+tu;function Ee(e){return e.max-e.min}function rk(e,t,a){return Math.abs(e-t)<=a}function Hr(e,t,a,n=.5){e.origin=n,e.originPoint=se(t.min,t.max,e.origin),e.scale=Ee(a)/Ee(t),e.translate=se(a.min,a.max,e.origin)-e.originPoint,(e.scale>=nk&&e.scale<=ok||isNaN(e.scale))&&(e.scale=1),(e.translate>=ik&&e.translate<=sk||isNaN(e.translate))&&(e.translate=0)}function Wa(e,t,a,n){Hr(e.x,t.x,a.x,n?n.originX:void 0),Hr(e.y,t.y,a.y,n?n.originY:void 0)}function Ur(e,t,a,n=0){const o=n?se(a.min,a.max,n):a.min;e.min=o+t.min,e.max=e.min+Ee(t)}function lk(e,t,a,n){Ur(e.x,t.x,a.x,n==null?void 0:n.x),Ur(e.y,t.y,a.y,n==null?void 0:n.y)}function qr(e,t,a,n=0){const o=n?se(a.min,a.max,n):a.min;e.min=t.min-o,e.max=e.min+Ee(t)}function io(e,t,a,n){qr(e.x,t.x,a.x,n==null?void 0:n.x),qr(e.y,t.y,a.y,n==null?void 0:n.y)}function jr(e,t,a,n,o){return e-=t,e=oo(e,1/a,n),o!==void 0&&(e=oo(e,1/o,n)),e}function dk(e,t=0,a=1,n=.5,o,i=e,s=e){if(ht.test(t)&&(t=parseFloat(t),t=se(s.min,s.max,t/100)-s.min),typeof t!="number")return;let r=se(i.min,i.max,n);e===i&&(r-=t),e.min=jr(e.min,t,a,r,o),e.max=jr(e.max,t,a,r,o)}function Gr(e,t,[a,n,o],i,s){dk(e,t[a],t[n],t[o],t.scale,i,s)}const ck=["x","scaleX","originX"],uk=["y","scaleY","originY"];function Vr(e,t,a,n){Gr(e.x,t,ck,a?a.x:void 0,n?n.x:void 0),Gr(e.y,t,uk,a?a.y:void 0,n?n.y:void 0)}function Wr(e){return e.translate===0&&e.scale===1}function au(e){return Wr(e.x)&&Wr(e.y)}function zr(e,t){return e.min===t.min&&e.max===t.max}function pk(e,t){return zr(e.x,t.x)&&zr(e.y,t.y)}function Kr(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.round(e.max)===Math.round(t.max)}function nu(e,t){return Kr(e.x,t.x)&&Kr(e.y,t.y)}function $r(e){return Ee(e.x)/Ee(e.y)}function Qr(e,t){return e.translate===t.translate&&e.scale===t.scale&&e.originPoint===t.originPoint}function ut(e){return[e("x"),e("y")]}function mk(e,t,a){let n="";const o=e.x.translate/t.x,i=e.y.translate/t.y,s=(a==null?void 0:a.z)||0;if((o||i||s)&&(n=`translate3d(${o}px, ${i}px, ${s}px) `),(t.x!==1||t.y!==1)&&(n+=`scale(${1/t.x}, ${1/t.y}) `),a){const{transformPerspective:d,rotate:u,pathRotation:p,rotateX:m,rotateY:k,skewX:g,skewY:b}=a;d&&(n=`perspective(${d}px) ${n}`),u&&(n+=`rotate(${u}deg) `),p&&(n+=`rotate(${p}deg) `),m&&(n+=`rotateX(${m}deg) `),k&&(n+=`rotateY(${k}deg) `),g&&(n+=`skewX(${g}deg) `),b&&(n+=`skewY(${b}deg) `)}const r=e.x.scale*t.x,l=e.y.scale*t.y;return(r!==1||l!==1)&&(n+=`scale(${r}, ${l})`),n||"none"}const hk=fs.length,Jr=e=>typeof e=="string"?parseFloat(e):e,Yr=e=>typeof e=="number"||B.test(e);function gk(e,t,a,n,o,i){o?(e.opacity=se(0,a.opacity??1,fk(n)),e.opacityExit=se(t.opacity??1,0,bk(n))):i&&(e.opacity=se(t.opacity??1,a.opacity??1,n));for(let s=0;s<hk;s++){const r=fs[s];let l=Xr(t,r),d=Xr(a,r);if(l===void 0&&d===void 0)continue;l||(l=0),d||(d=0),l===0||d===0||Yr(l)===Yr(d)?(e[r]=Math.max(se(Jr(l),Jr(d),n),0),(ht.test(d)||ht.test(l))&&(e[r]+="%")):e[r]=d}(t.rotate||a.rotate)&&(e.rotate=se(t.rotate||0,a.rotate||0,n))}function Xr(e,t){return e[t]!==void 0?e[t]:e.borderRadius}const fk=ou(0,.5,Jd),bk=ou(.5,.95,Xe);function ou(e,t,a){return n=>n<e?0:n>t?1:a(Ya(e,t,n))}function kk(e,t,a){const n=Ae(e)?e:fa(e);return n.start(ms("",n,t,a)),n.animation}function en(e,t,a,n={passive:!0}){return e.addEventListener(t,a,n),()=>e.removeEventListener(t,a,n)}const yk=(e,t)=>e.depth-t.depth;class vk{constructor(){this.children=[],this.isDirty=!1}add(t){ts(this.children,t),this.isDirty=!0}remove(t){Jn(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort(yk),this.isDirty=!1,this.children.forEac
2h(t)}}function Tk(e,t){const a=Le.now(),n=({timestamp:o})=>{const i=o-a;i>=t&&(Mt(n),e(i-t))};return re.setup(n,!0),()=>Mt(n)}function zn(e){return Ae(e)?e.get():e}class Sk{constructor(){this.members=[]}add(t){ts(this.members,t);for(let a=this.members.length-1;a>=0;a--){const n=this.members[a];if(n===t||n===this.lead||n===this.prevLead)continue;const o=n.instance;(!o||o.isConnected===!1)&&!n.snapshot&&(Jn(this.members,n),n.unmount())}t.scheduleRender()}remove(t){if(Jn(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const a=this.members[this.members.length-1];a&&this.promote(a)}}relegate(t){var a;for(let n=this.members.indexOf(t)-1;n>=0;n--){const o=this.members[n];if(o.isPresent!==!1&&((a=o.instance)==null?void 0:a.isConnected)!==!1)return this.promote(o),!0}return!1}promote(t,a){var o;const n=this.lead;if(t!==n&&(this.prevLead=n,this.lead=t,t.show(),n)){n.updateSnapshot(),t.scheduleRender();const{layoutDependency:i}=n.options,{layoutDependency:s}=t.options;(i===void 0||i!==s)&&(t.resumeFrom=n,a&&(n.preserveOpacity=!0),n.snapshot&&(t.snapshot=n.snapshot,t.snapshot.latestValues=n.animationValues||n.latestValues),(o=t.root)!=null&&o.isUpdating&&(t.isLayoutDirty=!0)),t.options.crossfade===!1&&n.hide()}}exitAnimationComplete(){this.members.forEach(t=>{var a,n,o,i,s;(n=(a=t.options).onExitComplete)==null||n.call(a),(s=(o=t.resumingFrom)==null?void 0:(i=o.options).onExitComplete)==null||s.call(i)})}scheduleRender(){this.members.forEach(t=>t.instance&&t.scheduleRender(!1))}removeLeadSnapshot(){var t;(t=this.lead)!=null&&t.snapshot&&(this.lead.snapshot=void 0)}}const Kn={hasAnimatedSinceResize:!0,hasEverUpdated:!1},Ho=["","X","Y","Z"],Ck=1e3;let wk=0;function Uo(e,t,a,n){const{latestValues:o}=t;o[e]&&(a[e]=o[e],t.setStaticValue(e,0),n&&(n[e]=0))}function iu(e){if(e.hasCheckedOptimisedAppear=!0,e.root===e)return;const{visualElement:t}=e.options;if(!t)return;const a=Mc(t);if(window.MotionHasOptimisedAnimation(a,"transform")){const{layout:o,layoutId:i}=e.options;window.MotionCancelOptimisedAnimation(a,"transform",re,!(o||i))}const{parent:n}=e;n&&!n.hasCheckedOptimisedAppear&&iu(n)}function su({attachResizeListener:e,defaultParent:t,measureScroll:a,checkIsScrollRoot:n,resetTransform:o}){return class{constructor(s={},r=t==null?void 0:t()){this.id=wk++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.layoutVersion=0,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(Mk),this.nodes.forEach(Lk),this.nodes.forEach(Ek),this.nodes.forEach(Dk)},this.resolvedRelativeTargetAt=0,this.linkedParentVersion=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=s,this.root=r?r.root||r:this,this.path=r?[...r.path,r]:[],this.parent=r,this.depth=r?r.depth+1:0;for(let l=0;l<this.path.length;l++)this.path[l].shouldResetTransform=!0;this.root===this&&(this.nodes=new vk)}addEventListener(s,r){return this.eventHandlers.has(s)||this.eventHandlers.set(s,new as),this.eventHandlers.get(s).add(r)}notifyListeners(s,...r){const l=this.eventHandlers.get(s);l&&l.notify(...r)}hasListeners(s){return this.eventHandlers.has(s)}mount(s){if(this.instance)return;this.isSVG=ys(s)&&!Mb(s),this.instance=s;const{layoutId:r,layout:l,visualElement:d}=this.options;if(d&&!d.current&&d.mount(s),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),this.root.hasTreeAnimated&&(l||r)&&(this.isLayoutDirty=!0),e){let u,p=0;const m=()=>this.root.updateBlockedByResize=!1;re.read(()=>{p=window.innerWidth}),e(s,()=>{const k=window.innerWidth;k!==p&&(p=k,this.root.updateBlockedByResize=!0,u&&u(),u=Tk(m,250),Kn.hasAnimatedSinceResize&&(Kn.hasAnimatedSinceResize=!1,this.nodes.forEac
vendor: 9,731 bytes, line 2
2h(tl)))})}r&&this.root.registerSharedNode(r,this),this.options.animate!==!1&&d&&(r||l)&&this.addEventListener("didUpdate",({delta:u,hasLayoutChanged:p,hasRelativeLayoutChanged:m,layout:k})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const g=this.options.transition||d.getDefaultTransition()||Hk,{onLayoutAnimationStart:b,onLayoutAnimationComplete:y}=d.getProps(),T=!this.targetLayout||!nu(this.targetLayout,k),S=!p&&m;if(this.options.layoutRoot||this.resumeFrom||S||p&&(T||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const P={...ps(g,"layout"),onPlay:b,onComplete:y};(d.shouldReduceMotion||this.options.layoutRoot)&&(P.delay=0,P.type=!1),this.startAnimation(P),this.setAnimationOrigin(u,S,P.path)}else p||tl(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=k})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const s=this.getStack();s&&s.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),Mt(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(Fk),this.animationId++)}getTransformTemplate(){const{visualElement:s}=this.options;return s&&s.getProps().transformTemplate}willUpdate(s=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&iu(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let u=0;u<this.path.length;u++){const p=this.path[u];p.shouldResetTransform=!0,(typeof p.latestValues.x=="string"||typeof p.latestValues.y=="string")&&(p.isLayoutDirty=!0),p.updateScroll("snapshot"),p.options.layoutRoot&&p.willUpdate(!1)}const{layoutId:r,layout:l}=this.options;if(r===void 0&&!l)return;const d=this.getTransformTemplate();this.prevTransformTemplateValue=d?d(this.latestValues,""):void 0,this.updateSnapshot(),s&&this.notifyListeners("willUpdate")}update(){if(this.updateScheduled=!1,this.isUpdateBlocked()){const l=this.updateBlockedByResize;this.unblockUpdate(),this.updateBlockedByResize=!1,this.clearAllSnapshots(),l&&this.nodes.forEach(Rk),this.nodes.forEach(Zr);return}if(this.animationId<=this.animationCommitId){this.nodes.forEach(el);return}this.animationCommitId=this.animationId,this.isUpdating?(this.isUpdating=!1,this.nodes.forEach(Ik),this.nodes.forEach(_k),this.nodes.forEach(Pk),this.nodes.forEach(Ak)):this.nodes.forEach(el),this.clearAllSnapshots();const r=Le.now();Pe.delta=gt(0,1e3/60,r-Pe.timestamp),Pe.timestamp=r,Pe.isProcessing=!0,Io.update.process(Pe),Io.preRender.process(Pe),Io.render.process(Pe),Pe.isProcessing=!1}didUpdate(){this.updateScheduled||(this.updateScheduled=!0,bs.read(this.scheduleUpdate))}clearAllSnapshots(){this.nodes.forEach(xk),this.sharedNodes.forEach(Ok)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,re.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){re.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!Ee(this.snapshot.measuredBox.x)&&!Ee(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let l=0;l<this.path.length;l++)this.path[l].updateScroll();const s=this.layout;this.layout=this.measure(!1),this.layoutVersion++,this.layoutCorrected||(this.layoutCorrected=Te()),this.isLayoutDirty=!1,this.projectionDelta=void 0,this.notifyListeners("measure",this.layout.layoutBox);const{visualElement:r}=this.options;r&&r.notify("LayoutMeasure",this.layout.layoutBox,s?s.layoutBox:void 0)}updateScroll(s="measure"){let r=!!(this.options.layoutScroll&&this.instance);if(this.scroll&&this.scroll.animationId===this.root.animationId&&this.scroll.phase===s&&(r=!1),r&&this.instance){const l=n(this.instance);this.scroll={animationId:this.root.animationId,phase:s,isRoot:l,offset:a(this.instance),wasRoot:this.scroll?this.scroll.isRoot:l}}}resetTransform(){if(!o)return;const s=this.isLayoutDirty||this.shouldResetTransform||this.options.alwaysMeasureLayout,r=this.projectionDelta&&!au(this.projectionDelta),l=this.getTransformTemplate(),d=l?l(this.latestValues,""):void 0,u=d!==this.prevTransformTemplateValue;s&&this.instance&&(r||Bt(this.latestValues)||u)&&(o(this.instance,d),this.shouldResetTransform=!1,this.scheduleRender())}measure(s=!0){const r=this.measurePageBox();let l=this.removeElementScroll(r);return s&&(l=this.removeTransform(l)),Uk(l),{animationId:this.root.animationId,measuredBox:r,layoutBox:l,latestValues:{},source:this.id}}measurePageBox(){var d;const{visualElement:s}=this.options;if(!s)return Te();const r=s.measureViewportBox();if(!(((d=this.scroll)==null?void 0:d.wasRoot)||this.path.some(qk))){const{scroll:u}=this.root;u&&(pt(r.x,u.offset.x),pt(r.y,u.offset.y))}return r}removeElementScroll(s){var l;const r=Te();if(tt(r,s),(l=this.scroll)!=null&&l.wasRoot)return r;for(let d=0;d<this.path.length;d++){const u=this.path[d],{scroll:p,options:m}=u;u!==this.root&&p&&m.layoutScroll&&(p.wasRoot&&tt(r,s),pt(r.x,p.offset.x),pt(r.y,p.offset.y))}return r}applyTransform(s,r=!1,l){var u,p;const d=l||Te();tt(d,s);for(let m=0;m<this.path.length;m++){const k=this.path[m];!r&&k.options.layoutScroll&&k.scroll&&k!==k.root&&(pt(d.x,-k.scroll.offset.x),pt(d.y,-k.scroll.offset.y)),Bt(k.latestValues)&&Wn(d,k.latestValues,(u=k.layout)==null?void 0:u.layoutBox)}return Bt(this.latestValues)&&Wn(d,this.latestValues,(p=this.layout)==null?void 0:p.layoutBox),d}removeTransform(s){var l;const r=Te();tt(r,s);for(let d=0;d<this.path.length;d++){const u=this.path[d];if(!Bt(u.latestValues))continue;let p;u.instance&&(Mi(u.latestValues)&&u.updateSnapshot(),p=Te(),tt(p,u.measurePageBox())),Vr(r,u.latestValues,(l=u.snapshot)==null?void 0:l.layoutBox,p)}return Bt(this.latestValues)&&Vr(r,this.latestValues),r}setTargetDelta(s){this.targetDelta=s,this.root.scheduleUpdateProjection(),this.isProjectionDirty=!0}setOptions(s){this.options={...this.options,...s,crossfade:s.crossfade!==void 0?s.crossfade:!0}}clearMeasurements(){this.scroll=void 0,this.layout=void 0,this.snapshot=void 0,this.prevTransformTemplateValue=void 0,this.targetDelta=void 0,this.target=void 0,this.isLayoutDirty=!1}forceRelativeParentToResolveTarget(){this.relativeParent&&this.relativeParent.resolvedRelativeTargetAt!==Pe.timestamp&&this.relativeParent.resolveTargetDelta(!0)}resolveTargetDelta(s=!1){var k;const r=this.getLead();this.isProjectionDirty||(this.isProjectionDirty=r.isProjectionDirty),this.isTransformDirty||(this.isTransformDirty=r.isTransformDirty),this.isSharedProjectionDirty||(this.isSharedProjectionDirty=r.isSharedProjectionDirty);const l=!!this.resumingFrom||this!==r;if(!(s||l&&this.isSharedProjectionDirty||this.isProjectionDirty||(k=this.parent)!=null&&k.isProjectionDirty||this.attemptToResolveRelativeTarget||this.root.updateBlockedByResize))return;const{layout:u,layoutId:p}=this.options;if(!this.layout||!(u||p))return;this.resolvedRelativeTargetAt=Pe.timestamp;const m=this.getClosestProjectingParent();m&&this.linkedParentVersion!==m.layoutVersion&&!m.options.layoutRoot&&this.removeRelativeTarget(),!this.targetDelta&&!this.relativeTarget&&(this.options.layoutAnchor!==!1&&m&&m.layout?this.createRelativeTarget(m,this.layout.layoutBox,m.layout.layoutBox):this.removeRelativeTarget()),!(!this.relativeTarget&&!this.targetDelta)&&(this.target||(this.target=Te(),this.targetWithTransforms=Te()),this.relativeTarget&&this.relativeTargetOrigin&&this.relativeParent&&this.relativeParent.target?(this.forceRelativeParentToResolveTarget(),lk(this.target,this.relativeTarget,this.relativeParent.target,this.options.layoutAnchor||void 0)):this.targetDelta?(this.resumingFrom?this.applyTransform(this.layout.layoutBox,!1,this.target):tt(this.target,this.layout.layoutBox),Vc(this.target,this.targetDelta)):tt(this.target,this.layout.layoutBox),this.attemptToResolveRelativeTarget&&(this.attemptToResolveRelativeTarget=!1,this.options.layoutAnchor!==!1&&m&&!!m.resumingFrom==!!this.resumingFrom&&!m.options.layoutScroll&&m.target&&this.animationProgress!==1?this.createRelativeTarget(m,this.target,m.target):this.relativeParent=this.relativeTarget=void 0))}getClosestProjectingParent(){if(!(!this.parent||Mi(this.parent.latestValues)||Gc(this.parent.latestValues)))return this.parent.isProjecting()?this.parent:this.parent.getClosestProjectingParent()}isProjecting(){return!!((this.relativeTarget||this.targetDelta||this.options.layoutRoot)&&this.layout)}createRelativeTarget(s,r,l){this.relativeParent=s,this.linkedParentVersion=s.layoutVersion,this.forceRelativeParentToResolveTarget(),this.relativeTarget=Te(),this.relativeTargetOrigin=Te(),io(this.relativeTargetOrigin,r,l,this.options.layoutAnchor||void 0),tt(this.relativeTarget,this.relativeTargetOrigin)}removeRelativeTarget(){this.relativeParent=this.relativeTarget=void 0}calcProjection(){var g;const s=this.getLead(),r=!!this.resumingFrom||this!==s;let l=!0;if((this.isProjectionDirty||(g=this.parent)!=null&&g.isProjectionDirty)&&
2(l=!1),r&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(l=!1),this.resolvedRelativeTargetAt===Pe.timestamp&&(l=!1),l)return;const{layout:d,layoutId:u}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(d||u))return;tt(this.layoutCorrected,this.layout.layoutBox);const p=this.treeScale.x,m=this.treeScale.y;Bb(this.layoutCorrected,this.treeScale,this.path,r),s.layout&&!s.target&&(this.treeScale.x!==1||this.treeScale.y!==1)&&(s.target=s.layout.layoutBox,s.targetWithTransforms=Te());const{target:k}=s;if(!k){this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender());return}!this.projectionDelta||!this.prevProjectionDelta?this.createProjectionDeltas():(Nr(this.prevProjectionDelta.x,this.projectionDelta.x),Nr(this.prevProjectionDelta.y,this.projectionDelta.y)),Wa(this.projectionDelta,this.layoutCorrected,k,this.latestValues),(this.treeScale.x!==p||this.treeScale.y!==m||!Qr(this.projectionDelta.x,this.prevProjectionDelta.x)||!Qr(this.projectionDelta.y,this.prevProjectionDelta.y))&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",k))}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(s=!0){var r;if((r=this.options.visualElement)==null||r.scheduleRender(),s){const l=this.getStack();l&&l.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta=ra(),this.projectionDelta=ra(),this.projectionDeltaWithTransform=ra()}setAnimationOrigin(s,r=!1,l){const d=this.snapshot,u=d?d.latestValues:{},p={...this.latestValues},m=ra();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!r;const k=Te(),g=d?d.source:void 0,b=this.layout?this.layout.source:void 0,y=g!==b,T=this.getStack(),S=!T||T.members.length<=1,P=!!(y&&!S&&this.options.crossfade===!0&&!this.path.some(Nk));this.animationProgress=0;let w;const C=l==null?void 0:l.interpolateProjection(s);this.mixTargetDelta=x=>{const I=x/1e3,R=C==null?void 0:C(I);R?(m.x.translate=R.x,m.x.scale=se(s.x.scale,1,I),m.x.origin=s.x.origin,m.x.originPoint=s.x.originPoint,m.y.translate=R.y,m.y.scale=se(s.y.scale,1,I),m.y.origin=s.y.origin,m.y.originPoint=s.y.originPoint):(al(m.x,s.x,I),al(m.y,s.y,I)),this.setTargetDelta(m),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(io(k,this.layout.layoutBox,this.relativeParent.layout.layoutBox,this.options.layoutAnchor||void 0),Bk(this.relativeTarget,this.relativeTargetOrigin,k,I),w&&pk(this.relativeTarget,w)&&(this.isProjectionDirty=!1),w||(w=Te()),tt(w,this.relativeTarget)),y&&(this.animationValues=p,gk(p,u,this.latestValues,I,P,S)),R&&R.rotate!==void 0&&(this.animationValues||(this.animationValues=p),this.animationValues.pathRotation=R.rotate),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=I},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(s){var r,l,d;this.notifyListeners("animationStart"),(r=this.currentAnimation)==null||r.stop(),(d=(l=this.resumingFrom)==null?void 0:l.currentAnimation)==null||d.stop(),this.pendingAnimation&&(Mt(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=re.update(()=>{Kn.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=fa(0)),this.motionValue.jump(0,!1),this.currentAnimation=kk(this.motionValue,[0,1e3],{...s,velocity:0,isSync:!0,onUpdate:u=>{this.mixTargetDelta(u),s.onUpdate&&s.onUpdate(u)},onComplete:()=>{s.onComplete&&s.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const s=this.getStack();s&&s.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(Ck),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const s=this.getLead();let{targetWithTransforms:r,target:l,layout:d,latestValues:u}=s;if(!(!r||!l||!d)){if(this!==s&&this.layout&&d&&ru(this.options.animationType,this.layout.layoutBox,d.layoutBox)){l=this.target||Te();const p=Ee(this.layout.layoutBox.x);l.x.min=s.target.x.min,l.x.max=l.x.min+p;const m=Ee(this.layout.layoutBox.y);l.y.min=s.target.y.min,l.y.max=l.y.min+m}tt(r,l),Wn(r,u),Wa(this.projectionDeltaWithTransform,this.layoutCorrected,r,u)}}registerSharedNode(s,r){this.sharedNodes.has(s)||this.sharedNodes.set(s,new Sk),this.sharedNodes.get(s).add(r);const d=r.options.initialPromotionConfig;r.promote({transition:d?d.transition:void 0,preserveFollowOpacity:d&&d.shouldPreserveFollowOpacity?d.shouldPreserveFollowOpacity(r):void 0})}isLead(){const s=this.getStack();return s?s.lead===this:!0}getLead(){var r;const{layoutId:s}=this.options;return s?((r=this.getStack())==null?void 0:r.lead)||this:this}getPrevLead(){var r;const{layoutId:s}=this.options;return s?(r=this.getStack())==null?void 0:r.prevLead:void 0}getStack(){const{layoutId:s}=this.options;if(s)return this.root.sharedNodes.get(s)}promote({needsReset:s,transition:r,preserveFollowOpacity:l}={}){const d=this.getStack();d&&d.promote(this,l),s&&(this.projectionDelta=void 0,this.needsReset=!0),r&&this.setOptions({transition:r})}relegate(){const s=this.getStack();return s?s.relegate(this):!1}
vendor: 4,506 bytes, line 2
2resetSkewAndRotation(){const{visualElement:s}=this.options;if(!s)return;let r=!1;const{latestValues:l}=s;if((l.z||l.rotate||l.rotateX||l.rotateY||l.rotateZ||l.skewX||l.skewY)&&(r=!0),!r)return;const d={};l.z&&Uo("z",s,d,this.animationValues);for(let u=0;u<Ho.length;u++)Uo(`rotate${Ho[u]}`,s,d,this.animationValues),Uo(`skew${Ho[u]}`,s,d,this.animationValues);s.render();for(const u in d)s.setStaticValue(u,d[u]),this.animationValues&&(this.animationValues[u]=d[u]);s.scheduleRender()}applyProjectionStyles(s,r){if(!this.instance||this.isSVG)return;if(!this.isVisible){s.visibility="hidden";return}const l=this.getTransformTemplate();if(this.needsReset){this.needsReset=!1,s.visibility="",s.opacity="",s.pointerEvents=zn(r==null?void 0:r.pointerEvents)||"",s.transform=l?l(this.latestValues,""):"none";return}const d=this.getLead();if(!this.projectionDelta||!this.layout||!d.target){this.options.layoutId&&(s.opacity=this.latestValues.opacity!==void 0?this.latestValues.opacity:1,s.pointerEvents=zn(r==null?void 0:r.pointerEvents)||""),this.hasProjected&&!Bt(this.latestValues)&&(s.transform=l?l({},""):"none",this.hasProjected=!1);return}s.visibility="";const u=d.animationValues||d.latestValues;this.applyTransformsToTarget();let p=mk(this.projectionDeltaWithTransform,this.treeScale,u);l&&(p=l(u,p)),s.transform=p;const{x:m,y:k}=this.projectionDelta;s.transformOrigin=`${m.origin*100}% ${k.origin*100}% 0`,d.animationValues?s.opacity=d===this?u.opacity??this.latestValues.opacity??1:this.preserveOpacity?this.latestValues.opacity:u.opacityExit:s.opacity=d===this?u.opacity!==void 0?u.opacity:"":u.opacityExit!==void 0?u.opacityExit:0;for(const g in xi){if(u[g]===void 0)continue;const{correct:b,applyTo:y,isCSSVariable:T}=xi[g],S=p==="none"?u[g]:b(u[g],d);if(y){const P=y.length;for(let w=0;w<P;w++)s[y[w]]=S}else T?this.options.visualElement.renderState.vars[g]=S:s[g]=S}this.options.layoutId&&(s.pointerEvents=d===this?zn(r==null?void 0:r.pointerEvents)||"":"none")}clearSnapshot(){this.resumeFrom=this.snapshot=void 0}resetTree(){this.root.nodes.forEach(s=>{var r;return(r=s.currentAnimation)==null?void 0:r.stop()}),this.root.nodes.forEach(Zr),this.root.sharedNodes.clear()}}}function Pk(e){e.updateLayout()}function Ak(e){var a;const t=((a=e.resumeFrom)==null?void 0:a.snapshot)||e.snapshot;if(e.isLead()&&e.layout&&t&&e.hasListeners("didUpdate")){const{layoutBox:n,measuredBox:o}=e.layout,{animationType:i}=e.options,s=t.source!==e.layout.source;if(i==="size")ut(p=>{const m=s?t.measuredBox[p]:t.layoutBox[p],k=Ee(m);m.min=n[p].min,m.max=m.min+k});else if(i==="x"||i==="y"){const p=i==="x"?"y":"x";Ri(s?t.measuredBox[p]:t.layoutBox[p],n[p])}else ru(i,t.layoutBox,n)&&ut(p=>{const m=s?t.measuredBox[p]:t.layoutBox[p],k=Ee(n[p]);m.max=m.min+k,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[p].max=e.relativeTarget[p].min+k)});const r=ra();Wa(r,n,t.layoutBox);const l=ra();s?Wa(l,e.applyTransform(o,!0),t.measuredBox):Wa(l,n,t.layoutBox);const d=!au(r);let u=!1;if(!e.resumeFrom){const p=e.getClosestProjectingParent();if(p&&!p.resumeFrom){const{snapshot:m,layout:k}=p;if(m&&k){const g=e.options.layoutAnchor||void 0,b=Te();io(b,t.layoutBox,m.layoutBox,g);const y=Te();io(y,n,k.layoutBox,g),nu(b,y)||(u=!0),p.options.layoutRoot&&(e.relativeTarget=y,e.relativeTargetOrigin=b,e.relativeParent=p)}}}e.notifyListeners("didUpdate",{layout:n,snapshot:t,delta:l,layoutDelta:r,hasLayoutChanged:d,hasRelativeLayoutChanged:u})}else if(e.isLead()){const{onExitComplete:n}=e.options;n&&n()}e.options.transition=void 0}function Mk(e){e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function Dk(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function xk(e){e.clearSnapshot()}function Zr(e){e.clearMeasurements()}function Rk(e){e.isLayoutDirty=!0,e.updateLayout()}function el(e){e.isLayoutDirty=!1}function Ik(e){e.isAnimationBlocked&&e.layout&&!e.isLayoutDirty&&(e.snapshot=e.layout,e.isLayoutDirty=!0)}function _k(e){const{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify("BeforeLayoutMeasure"),e.resetTransform()}function tl(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function Lk(e){e.resolveTargetDelta()}function Ek(e){e.calcProjection()}
2function Fk(e){e.resetSkewAndRotation()}function Ok(e){e.removeLeadSnapshot()}function al(e,t,a){e.translate=se(t.translate,0,a),e.scale=se(t.scale,1,a),e.origin=t.origin,e.originPoint=t.originPoint}function nl(e,t,a,n){e.min=se(t.min,a.min,n),e.max=se(t.max,a.max,n)}function Bk(e,t,a,n){nl(e.x,t.x,a.x,n),nl(e.y,t.y,a.y,n)}function Nk(e){return e.animationValues&&e.animationValues.opacityExit!==void 0}const Hk={duration:.45,ease:[.4,0,.1,1]},ol=e=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(e),il=ol("applewebkit/")&&!ol("chrome/")?Math.round:Xe;function sl(e){e.min=il(e.min),e.max=il(e.max)}function Uk(e){sl(e.x),sl(e.y)}function ru(e,t,a){return e==="position"||e==="preserve-aspect"&&!rk($r(t),$r(a),.2)}function qk(e){var t;return e!==e.root&&((t=e.scroll)==null?void 0:t.wasRoot)}const jk=su({attachResizeListener:(e,t)=>en(e,"resize",t),measureScroll:()=>{var e,t;return{x:document.documentElement.scrollLeft||((e=document.body)==null?void 0:e.scrollLeft)||0,y:document.documentElement.scrollTop||((t=document.body)==null?void 0:t.scrollTop)||0}},checkIsScrollRoot:()=>!0}),qo={current:void 0},lu=su({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!qo.current){const e=new jk({});e.mount(window),e.setOptions({layoutScroll:!0}),qo.current=e}return qo.current},resetTransform:(e,t)=>{e.style.transform=t!==void 0?t:"none"},checkIsScrollRoot:e=>window.getComputedStyle(e).position==="fixed"}),Ps=h.createContext({transformPagePoint:e=>e,isStatic:!1,reducedMotion:"never"});function rl(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function Gk(...e){return t=>{let a=!1;const n=e.map(o=>{const i=rl(o,t);return!a&&typeof i=="function"&&(a=!0),i});if(a)return()=>{for(let o=0;o<n.length;o++){const i=n[o];typeof i=="function"?i():rl(e[o],null)}}}}function Vk(...e){return h.useCallback(Gk(...e),e)}class Wk extends h.Component{getSnapshotBeforeUpdate(t){const a=this.props.childRef.current;if(qn(a)&&t.isPresent&&!this.props.isPresent&&this.props.pop!==!1){const n=a.offsetParent,o=qn(n)&&n.offsetWidth||0,i=qn(n)&&n.offsetHeight||0,s=getComputedStyle(a),r=this.props.sizeRef.current;r.height=parseFloat(s.height),r.width=parseFloat(s.width),r.top=a.offsetTop,r.left=a.offsetLeft,r.right=o-r.width-r.left,r.bottom=i-r.height-r.top,r.direction=s.direction}return null}componentDidUpdate(){}render(){return this.props.children}}function zk({children:e,isPresent:t,anchorX:a,anchorY:n,root:o,pop:i}){var m;const s=h.useId(),r=h.useRef(null),l=h.useRef({width:0,height:0,top:0,left:0,right:0,bottom:0,direction:"ltr"}),{nonce:d}=h.useContext(Ps),u=i!==!1?((m=e.props)==null?void 0:m.ref)??(e==null?void 0:e.ref):void 0,p=Vk(r,u);return h.useInsertionEffect(()=>{const{width:k,height:g,top:b,left:y,right:T,bottom:S,direction:P}=l.current;if(t||i===!1||!r.current||!k||!g)return;const w=P==="rtl",C=a==="left"?w?`right: ${T}`:`left: ${y}`:w?`left: ${y}`:`right: ${T}`,x=n==="bottom"?`bottom: ${S}`:`top: ${b}`;r.current.dataset.motionPopId=s;const I=document.createElement("style");d&&(I.nonce=d);const R=o??document.head;return R.appendChild(I),I.sheet&&I.sheet.insertRule(`
3          [data-motion-pop-id="${s}"] {
4            position: absolute !important;
5            width: ${k}px !important;
6            height: ${g}px !important;
7            ${C}px !important;
8            ${x}px !important;
9          }
10        `),()=>{var _;(_=r.current)==null||_.removeAttribute("data-motion-pop-id"),R.contains(I)&&R.removeChild(I)}},[t]),c.jsx(Wk,{isPresent:t,childRef:r,sizeRef:l,pop:i,children:i===!1?e:h.cloneElement(e,{ref:p})})}const Kk=({children:e,initial:t,isPresent:a,onExitComplete:n,custom:o,presenceAffectsLayout:i,mode:s,anchorX:r,anchorY:l,root:d})=>{const u=Zi($k),p=h.useId(),m=h.useRef(a),k=h.useRef(n);es(()=>{m.current=a,k.current=n});let g=!0,b=h.useMemo(()=>(g=!1,{id:p,initial:t,isPresent:a,custom:o,onExitComplete:y=>{u.set(y,!0);for(const T of u.values())if(!T)return;n&&n()},register:y=>(u.set(y,!1),()=>{var T;u.delete(y),!m.current&&!u.size&&((T=k.current)==null||T.call(k))})}),[a,u,n]);return i&&g&&(b={...b}),h.useMemo(()=>{u.forEach((y,T)=>u.set(T,!1))},[a]),h.useEffect(()=>{!a&&!u.size&&n&&n()},[a]),e=c.jsx(zk,{pop:s==="popLayout",isPresent:a,anchorX:r,anchorY:l,root:d,children:e}),c.jsx(ko.Provider,{value:b,children:e})};function $k(){return new Map}function du(e=!0){const t=h.useContext(ko);if(t===null)return[!0,null];const{isPresent:a,onExitComplete:n,register:o}=t,i=h.useId();h.useEffect(()=>{if(e)return o(i)},[e]);const s=h.useCallback(()=>e&&n&&n(i),[i,n,e]);return!a&&n?[!1,s]:[!0]}const vn=e=>e.key||"";function ll(e){const t=[];
vendor: 4,503 bytes, line 10
10return h.Children.forEach(e,a=>{h.isValidElement(a)&&t.push(a)}),t}const Qk=({children:e,custom:t,initial:a=!0,onExitComplete:n,presenceAffectsLayout:o=!0,mode:i="sync",propagate:s=!1,anchorX:r="left",anchorY:l="top",root:d})=>{const[u,p]=du(s),m=h.useMemo(()=>ll(e),[e]),k=s&&!u?[]:m.map(vn),g=h.useRef(!0),b=h.useRef(m),y=Zi(()=>new Map),T=h.useRef(new Set),[S,P]=h.useState(m),[w,C]=h.useState(m);es(()=>{g.current=!1,b.current=m;for(let R=0;R<w.length;R++){const _=vn(w[R]);k.includes(_)?(y.delete(_),T.current.delete(_)):y.get(_)!==!0&&y.set(_,!1)}},[w,k.length,k.join("-")]);const x=[];if(m!==S){let R=[...m];for(let _=0;_<w.length;_++){const A=w[_],L=vn(A);k.includes(L)||(R.splice(_,0,A),x.push(A))}return i==="wait"&&x.length&&(R=x),C(ll(R)),P(m),null}const{forceRender:I}=h.useContext(Xi);return c.jsx(c.Fragment,{children:w.map(R=>{const _=vn(R),A=s&&!u?!1:m===w||k.includes(_),L=()=>{if(T.current.has(_))return;if(y.has(_))T.current.add(_),y.set(_,!0);else return;let j=!0;y.forEach(U=>{U||(j=!1)}),j&&(I==null||I(),C(b.current),s&&(p==null||p()),n&&n())};return c.jsx(Kk,{isPresent:A,initial:!g.current||a?void 0:!1,custom:t,presenceAffectsLayout:o,mode:i,root:d,onExitComplete:A?void 0:L,anchorX:r,anchorY:l,children:R},_)})})},cu=h.createContext({strict:!1}),dl={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]};let cl=!1;function Jk(){if(cl)return;const e={};for(const t in dl)e[t]={isEnabled:a=>dl[t].some(n=>!!a[n])};Uc(e),cl=!0}function uu(){return Jk(),Lb()}function Yk(e){const t=uu();for(const a in e)t[a]={...t[a],...e[a]};Uc(t)}const Xk=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","propagate","ignoreStrict","viewport"]);function so(e){return e.startsWith("while")||e.startsWith("drag")&&e!=="draggable"||e.startsWith("layout")||e.startsWith("onTap")||e.startsWith("onPan")||e.startsWith("onLayout")||Xk.has(e)}let pu=e=>!so(e);function Zk(e){typeof e=="function"&&(pu=t=>t.startsWith("on")?!so(t):e(t))}try{Zk(require("@emotion/is-prop-valid").default)}catch{}function ey(e,t,a){const n={};for(const o in e)o==="values"&&typeof e.values=="object"||Ae(e[o])||(pu(o)||a===!0&&so(o)||!t&&!so(o)||e.draggable&&o.startsWith("onDrag"))&&(n[o]=e[o]);return n}const Co=h.createContext({});function ty(e,t){if(So(e)){const{initial:a,animate:n}=e;return{initial:a===!1||Za(a)?a:void 0,animate:Za(n)?n:void 0}}return e.inherit!==!1?t:{}}function ay(e){const{initial:t,animate:a}=ty(e,h.useContext(Co));return h.useMemo(()=>({initial:t,animate:a}),[ul(t),ul(a)])}function ul(e){return Array.isArray(e)?e.join(" "):e}const As=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function mu(e,t,a){for(const n in t)!Ae(t[n])&&!Kc(n,a)&&(e[n]=t[n])}function ny({transformTemplate:e},t){return h.useMemo(()=>{const a=As();return Cs(a,t,e),Object.assign({},a.vars,a.style)},[t])}function oy(e,t){const a=e.style||{},n={};return mu(n,a,e),Object.assign(n,ny(e,t)),n}function iy(e,t){const a={},n=oy(e,t);return e.drag&&e.dragListener!==!1&&(a.draggable=!1,n.userSelect=n.WebkitUserSelect=n.WebkitTouchCallout="none",n.touchAction=e.drag===!0?"none":`pan-${e.drag==="x"?"y":"x"}`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(a.tabIndex=0),a.style=n,a}const hu=()=>({...As(),attrs:{}});function sy(e,t,a,n){const o=h.useMemo(()=>{const i=hu();return $c(i,t,Jc(n),e.transformTemplate,e.style),{...i.attrs,style:{...i.style}}},[t]);if(e.style){const i={};mu(i,e.style,e),o.style={...i,...o.style}}return o}const ry=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function Ms(e){return typeof e!="string"||e.includes("-")?!1:!!(ry.indexOf(e)>-1||/[A-Z]/u.test(e))}function ly(e,t,a,{latestValues:n}
vendor: 25,112 bytes, line 10
10,o,i=!1,s){const l=(s??Ms(e)?sy:iy)(t,n,o,e),d=ey(t,typeof e=="string",i),u=e!==h.Fragment?{...d,...l,ref:a}:{},{children:p}=t,m=h.useMemo(()=>Ae(p)?p.get():p,[p]);return h.createElement(e,{...u,children:m})}function dy({scrapeMotionValuesFromProps:e,createRenderState:t},a,n,o){return{latestValues:cy(a,n,o,e),renderState:t()}}function cy(e,t,a,n){const o={},i=n(e,{});for(const m in i)o[m]=zn(i[m]);let{initial:s,animate:r}=e;const l=So(e),d=Nc(e);t&&d&&!l&&e.inherit!==!1&&(s===void 0&&(s=t.initial),r===void 0&&(r=t.animate));let u=a?a.initial===!1:!1;u=u||s===!1;const p=u?r:s;if(p&&typeof p!="boolean"&&!To(p)){const m=Array.isArray(p)?p:[p];for(let k=0;k<m.length;k++){const g=hs(e,m[k]);if(g){const{transitionEnd:b,transition:y,...T}=g;for(const S in T){let P=T[S];if(Array.isArray(P)){const w=u?P.length-1:0;P=P[w]}P!==null&&(o[S]=P)}for(const S in b)o[S]=b[S]}}}return o}const gu=e=>(t,a)=>{const n=h.useContext(Co),o=h.useContext(ko),i=()=>dy(e,t,n,o);return a?i():Zi(i)},uy=gu({scrapeMotionValuesFromProps:ws,createRenderState:As}),py=gu({scrapeMotionValuesFromProps:Yc,createRenderState:hu}),my=Symbol.for("motionComponentSymbol");function hy(e,t,a){const n=h.useRef(a);h.useInsertionEffect(()=>{n.current=a});const o=h.useRef(null);return h.useCallback(i=>{var r;i&&((r=e.onMount)==null||r.call(e,i)),t&&(i?t.mount(i):t.unmount());const s=n.current;if(typeof s=="function")if(i){const l=s(i);typeof l=="function"&&(o.current=l)}else o.current?(o.current(),o.current=null):s(i);else s&&(s.current=i)},[t])}const fu=h.createContext({});function na(e){return e&&typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"current")}function gy(e,t,a,n,o,i){var P,w;const{visualElement:s}=h.useContext(Co),r=h.useContext(cu),l=h.useContext(ko),d=h.useContext(Ps),u=d.reducedMotion,p=d.skipAnimations,m=h.useRef(null),k=h.useRef(!1);n=n||r.renderer,!m.current&&n&&(m.current=n(e,{visualState:t,parent:s,props:a,presenceContext:l,blockInitialAnimation:l?l.initial===!1:!1,reducedMotionConfig:u,skipAnimations:p,isSVG:i}),k.current&&m.current&&(m.current.manuallyAnimateOnMount=!0));const g=m.current,b=h.useContext(fu);g&&!g.projection&&o&&(g.type==="html"||g.type==="svg")&&fy(m.current,a,o,b);const y=h.useRef(!1);h.useInsertionEffect(()=>{g&&y.current&&g.update(a,l)});const T=a[Ac],S=h.useRef(!!T&&typeof window<"u"&&!((P=window.MotionHandoffIsComplete)!=null&&P.call(window,T))&&((w=window.MotionHasOptimisedAnimation)==null?void 0:w.call(window,T)));return es(()=>{k.current=!0,g&&(y.current=!0,window.MotionIsMounted=!0,g.updateFeatures(),g.scheduleRenderMicrotask(),S.current&&g.animationState&&g.animationState.animateChanges())}),h.useEffect(()=>{g&&(!S.current&&g.animationState&&g.animationState.animateChanges(),S.current&&(queueMicrotask(()=>{var C;(C=window.MotionHandoffMarkAsComplete)==null||C.call(window,T)}),S.current=!1),g.enteringChildren=void 0)}),g}function fy(e,t,a,n){const{layoutId:o,layout:i,drag:s,dragConstraints:r,layoutScroll:l,layoutRoot:d,layoutAnchor:u,layoutCrossfade:p}=t;e.projection=new a(e.latestValues,t["data-framer-portal-id"]?void 0:bu(e.parent)),e.projection.setOptions({layoutId:o,layout:i,alwaysMeasureLayout:!!s||r&&na(r),visualElement:e,animationType:typeof i=="string"?i:"both",initialPromotionConfig:n,crossfade:p,layoutScroll:l,layoutRoot:d,layoutAnchor:u})}function bu(e){if(e)return e.options.allowProjection!==!1?e.projection:bu(e.parent)}function jo(e,{forwardMotionProps:t=!1,type:a}={},n,o){n&&Yk(n);const i=a?a==="svg":Ms(e),s=i?py:uy;function r(d,u){let p;const m={...h.useContext(Ps),...d,layoutId:by(d)},{isStatic:k}=m,g=ay(d),b=s(d,k);if(!k&&typeof window<"u"){ky();const y=yy(m);p=y.MeasureLayout,g.visualElement=gy(e,b,m,o,y.ProjectionNode,i)}return c.jsxs(Co.Provider,{value:g,children:[p&&g.visualElement?c.jsx(p,{visualElement:g.visualElement,...m}):null,ly(e,d,hy(b,g.visualElement,u),b,k,t,i)]})}r.displayName=`motion.${typeof e=="string"?e:`create(${e.displayName??e.name??""})`}`;const l=h.forwardRef(r);return l[my]=e,l}function by({layoutId:e}){const t=h.useContext(Xi).id;return t&&e!==void 0?t+"-"+e:e}function ky(e,t){h.useContext(cu).strict}function yy(e){const t=uu(),{drag:a,layout:n}=t;if(!a&&!n)return{};const o={...a,...n};return{MeasureLayout:a!=null&&a.isEnabled(e)||n!=null&&n.isEnabled(e)?o.MeasureLayout:void 0,ProjectionNode:o.ProjectionNode}}function vy(e,t){if(typeof Proxy>"u")return jo;const a=new Map,n=(i,s)=>jo(i,s,e,t),o=(i,s)=>n(i,s);return new Proxy(o,{get:(i,s)=>s==="create"?n:(a.has(s)||a.set(s,jo(s,void 0,e,t)),a.get(s))})}const Ty=(e,t)=>t.isSVG??Ms(e)?new Jb(t):new Vb(t,{allowProjection:e!==h.Fragment});class Sy extends xt{constructor(t){super(t),t.animationState||(t.animationState=tk(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();To(t)&&(this.unmountControls=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:a}=this.node.prevProps||{};t!==a&&this.updateAnimationControlsSubscription()}unmount(){var t;this.node.animationState.reset(),(t=this.unmountControls)==null||t.call(this)}}let Cy=0;class wy extends xt{constructor(){super(...arguments),this.id=Cy++,this.isExitComplete=!1}update(){var i;if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:a}=this.node.presenceContext,{isPresent:n}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===n)return;if(t&&n===!1){if(this.isExitComplete){const{initial:s,custom:r}=this.node.getProps();if(typeof s=="string"||typeof s=="object"&&s!==null&&!Array.isArray(s)){const l=zt(this.node,s,r);if(l){const{transition:d,transitionEnd:u,...p}=l;for(const m in p)(i=this.node.getValue(m))==null||i.jump(p[m])}}this.node.animationState.reset(),this.node.animationState.animateChanges()}else this.node.animationState.setActive("exit",!1);this.isExitComplete=!1;return}const o=this.node.animationState.setActive("exit",!t);a&&!t&&o.then(()=>{this.isExitComplete=!0,a(this.id)})}mount(){const{register:t,onExitComplete:a}=this.node.presenceContext||{};a&&a(this.id),t&&(this.unmount=t(this.id))}unmount(){}}const Py={animation:{Feature:Sy},exit:{Feature:wy}};function ln(e){return{point:{x:e.pageX,y:e.pageY}}}const Ay=e=>t=>ks(t)&&e(t,ln(t));function za(e,t,a,n){return en(e,t,Ay(a),n)}const ku=({current:e})=>e?e.ownerDocument.defaultView:null,pl=(e,t)=>Math.abs(e-t);function My(e,t){const a=pl(e.x,t.x),n=pl(e.y,t.y);return Math.sqrt(a**2+n**2)}const ml=new Set(["auto","scroll"]);class yu{constructor(t,a,{transformPagePoint:n,contextWindow:o=window,dragSnapToOrigin:i=!1,distanceThreshold:s=3,element:r}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.lastRawMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.removeScrollListeners=null,this.onElementScroll=g=>{this.handleScroll(g.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;this.lastRawMoveEventInfo&&(this.lastMoveEventInfo=Tn(this.lastRawMoveEventInfo,this.transformPagePoint));const g=Go(this.lastMoveEventInfo,this.history),b=this.startEvent!==null,y=My(g.offset,{x:0,y:0})>=this.distanceThreshold;if(!b&&!y)return;const{point:T}=g,{timestamp:S}=Pe;this.history.push({...T,timestamp:S});const{onStart:P,onMove:w}=this.handlers;b||(P&&P(this.lastMoveEvent,g),this.startEvent=this.lastMoveEvent),w&&w(this.lastMoveEvent,g)},this.handlePointerMove=(g,b)=>{this.lastMoveEvent=g,this.lastRawMoveEventInfo=b,this.lastMoveEventInfo=Tn(b,this.transformPagePoint),re.update(this.updatePoint,!0)},this.handlePointerUp=(g,b)=>{this.end();const{onEnd:y,onSessionEnd:T,resumeAnimation:S}=this.handlers;if((this.dragSnapToOrigin||!this.startEvent)&&S&&S(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const P=Go(g.type==="pointercancel"?this.lastMoveEventInfo:Tn(b,this.transformPagePoint),this.history);this.startEvent&&y&&y(g,P),T&&T(g,P)},!ks(t))return;this.dragSnapToOrigin=i,this.handlers=a,this.transformPagePoint=n,this.distanceThreshold=s,this.contextWindow=o||window;const l=ln(t),d=Tn(l,this.transformPagePoint),{point:u}=d,{timestamp:p}=Pe;this.history=[{...u,timestamp:p}];const{onSessionStart:m}=a;m&&m(t,Go(d,this.history));const k={passive:!0,capture:!0};this.removeListeners=on(za(this.contextWindow,"pointermove",this.handlePointerMove,k),za(this.contextWindow,"pointerup",this.handlePointerUp,k),za(this.contextWindow,"pointercancel",this.handlePointerUp,k)),r&&this.startScrollTracking(r)}startScrollTracking(t){let a=t.parentElement;for(;a;){const n=getComputedStyle(a);(ml.has(n.overflowX)||ml.has(n.overflowY))&&this.scrollPositions.set(a,{x:a.scrollLeft,y:a.scrollTop}),a=a.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener("scroll",this.onElementScroll,{capture:!0}),window.addEventListener("scroll",this.onWindowScroll),this.removeScrollListeners=()=>{window.removeEventListener("scroll",this.onElementScroll,{capture:!0}),window.removeEventListener("scroll",this.onWindowScroll)}}handleScroll(t){const a=this.scrollPositions.get(t);if(!a)return;const n=t===window,o=n?{x:window.scrollX,y:window.scrollY}:{x:t.scrollLeft,y:t.scrollTop},i={x:o.x-a.x,y:o.y-a.y};i.x===0&&i.y===0||(n?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=i.x,this.lastMoveEventInfo.point.y+=i.y):this.history.length>0&&(this.history[0].x-=i.x,this.history[0].y-=i.y),this.scrollPositions.set(t,o),re.update(this.updatePoint,!0))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners&&this.removeScrollListeners(),this.scrollPositions.clear(),Mt(this.updatePoint)}}function Tn(e,t){return t?{point:t(e.point)}:e}function hl(e,t){return{x:e.x-t.x,y:e.y-t.y}}function Go({point:e},t){return{point:e,delta:hl(e,vu(t)),offset:hl(e,Dy(t)),velocity:xy(t,.1)}}function Dy(e){return e[0]}function vu(e){return e[e.length-1]}function xy(e,t){if(e.length<2)return{x:0,y:0};let a=e.length-1,n=null;const o=vu(e);for(;a>=0&&(n=e[a],!(o.timestamp-n.timestamp>Ve(t)));)a--;if(!n)return{x:0,y:0};n===e[0]&&e.length>2&&o.timestamp-n.timestamp>Ve(t)*2&&(n=e[1]);const i=Ye(o.timestamp-n.timestamp);if(i===0)return{x:0,y:0};const s={x:(o.x-n.x)/i,y:(o.y-n.y)/i};return s.x===1/0&&(s.x=0),s.y===1/0&&(s.y=0),s}function Ry(e,{min:t,max:a},n){return t!==void 0&&e<t?e=n?se(t,e,n.min):Math.max(e,t):a!==void 0&&e>a&&(e=n?se(a,e,n.max):Math.min(e,a)),e}function gl(e,t,a){return{min:t!==void 0?e.min+t:void 0,max:a!==void 0?e.max+a-(e.max-e.min):void 0}}function Iy(e,{top:t,left:a,bottom:n,right:o}){return{x:gl(e.x,a,o),y:gl(e.y,t,n)}}function fl(e,t){let a=t.min-e.min,n=t.max-e.max;return t.max-t.min<e.max-e.min&&([a,n]=[n,a]),{min:a,max:n}}function _y(e,t){return{x:fl(e.x,t.x),y:fl(e.y,t.y)}}function Ly(e,t){let a=.5;const n=Ee(e),o=Ee(t);return o>n?a=Ya(t.min,t.max-n,e.min):n>o&&(a=Ya(e.min,e.max-o,t.min)),gt(0,1,a)}function Ey(e,t){const a={};return t.min!==void 0&&(a.min=t.min-e.min),t.max!==void 0&&(a.max=t.max-e.min),a}const Ii=.35;function Fy(e=Ii){return e===!1?e=0:e===!0&&(e=Ii),{x:bl(e,"left","right"),y:bl(e,"top","bottom")}}function bl(e,t,a){return{min:kl(e,t),max:kl(e,a)}}function kl(e,t){return typeof e=="number"?e:e[t]||0}const Oy=new WeakMap;class By{constructor(t){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=Te(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=t}start(t,{snapToCursor:a=!1,distanceThreshold:n}={}){const{presenceContext:o}=this.visualElement;if(o&&o.isPresent===!1)return;const i=p=>{a&&this.snapToCursor(ln(p).point),this.stopAnimation()},s=(p,m)=>{const{drag:k,dragPropagation:g,onDragStart:b}=this.getProps();if(k&&!g&&(this.openDragLock&&this.openDragLock(),this.openDragLock=cb(k),!this.openDragLock))return;this.latestPointerEvent=p,this.latestPanInfo=m,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),ut(T=>{let S=this.getAxisMotionValue(T).get()||0;if(ht.test(S)){const{projection:P}=this.visualElement;if(P&&P.layout){const w=P.layout.layoutBox[T];w&&(S=Ee(w)*(parseFloat(S)/100))}}this.originPoint[T]=S}),b&&re.update(()=>b(p,m),!1,!0),Si(this.visualElement,"transform");const{animationState:y}=this.visualElement;y&&y.setActive("whileDrag",!0)},r=(p,m)=>{this.latestPointerEvent=p,this.latestPanInfo=m;const{dragPropagation:k,dragDirectionLock:g,onDirectionLock:b,onDrag:y}=this.getProps();if(!k&&!this.openDragLock)return;const{offset:T}=m;if(g&&this.currentDirection===null){this.currentDirection=Hy(T),this.currentDirection!==null&&b&&b(this.currentDirection);return}this.updateAxis("x",m.point,T),this.updateAxis("y",m.point,T),this.visualElement.render(),y&&re.update(()=>y(p,m),!1,!0)},l=(p,m)=>{this.latestPointerEvent=p,this.latestPanInfo=m,this.stop(p,m),this.latestPointerEvent=null,this.latestPanInfo=null},d=()=>{const{dragSnapToOrigin:p}=this.getProps();(p||this.constraints)&&this.startAnimation({x:0,y:0})},{dragSnapToOrigin:u}=this.getProps();this.panSession=new yu(t,{onSessionStart:i,onStart:s,onMove:r,onSessionEnd:l,resumeAnimation:d},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:u,distanceThreshold:n,contextWindow:ku(this.visualElement),element:this.visualElement.current})}stop(t,a){const n=t||this.latestPointerEvent,o=a||this.latestPanInfo,i=this.isDragging;if(this.cancel(),!i||!o||!n)return;const{velocity:s}=o;this.startAnimation(s);const{onDragEnd:r}=this.getProps();r&&re.postRender(()=>r(n,o))}cancel(){this.isDragging=!1;const{projection:t,animationState:a}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.endPanSession();const{dragPropagation:n}=this.getProps();!n&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),a&&a.setActive("whileDrag",!1)}endPanSession(){this.panSession&&this.panSession.end(),this.panSession=void 0}updateAxis(t,a,n){const{drag:o}=this.getProps();if(!n||!Sn(t,o,this.currentDirection))return;const i=this.getAxisMotionValue(t);let s=this.originPoint[t]+n[t];this.constraints&&this.constraints[t]&&(s=Ry(s,this.constraints[t],this.elastic[t])),i.set(s)}resolveConstraints(){var i;const{dragConstraints:t,dragElastic:a}=this.getProps(),n=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):(i=this.visualElement.projection)==null?void 0:i.layout,o=this.constraints;t&&na(t)?this.constraints||(this.constraints=this.resolveRefConstraints()):t&&n?this.constraints=Iy(n.layoutBox,t):this.constraints=!1,this.elastic=Fy(a),o!==this.constraints&&!na(t)&&n&&this.constraints&&!this.hasMutatedConstraints&&ut(s=>{this.constraints!==!1&&this.getAxisMotionValue(s)&&(this.constraints[s]=Ey(n.layoutBox[s],this.constraints[s]))})}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:a}=this.getProps();if(!t||!na(t))return!1;const n=t.current,{projection:o}=this.visualElement;if(!o||!o.layout)return!1;o.root&&(o.root.scroll=void 0,o.root.updateScroll());const i=Nb(n,o.root,this.visualElement.getTransformPagePoint());let s=_y(o.layout.layoutBox,i);if(a){const r=a(Fb(s));this.hasMutatedConstraints=!!r,r&&(s=jc(r))}return s}startAnimation(t){const{drag:a,dragMomentum:n,dragElastic:o,dragTransition:i,dragSnapToOrigin:s,onDragTransitionEnd:r}=this.getProps(),l=this.constraints||{},d=ut(u=>{if(!Sn(u,a,this.currentDirection))return;let p=l&&l[u]||{};(s===!0||s===u)&&(p={min:0,max:0});const m=o?200:1e6,k=o?40:1e7,g={type:"inertia",velocity:n?t[u]:0,bounceStiffness:m,bounceDamping:k,timeConstant:750,restDelta:1,restSpeed:10,...i,...p};return this.startAxisValueAnimation(u,g)});return Promise.all(d).then(r)}startAxisValueAnimation(t,a){const n=this.getAxisMotionValue(t);return Si(this.visualElement,t),n.start(ms(t,n,0,a,this.visualElement,!1))}stopAnimation(){ut(t=>this.getAxisMotionValue(t).stop())}getAxisMotionValue(t){const a=`_drag${t.toUpperCase()}`,o=this.visualElement.getProps()[a];return o||this.visualElement.getValue(t,this.visualElement.latestValues[t]??0)}snapToCursor(t){ut(a=>{const{drag:n}=this.getProps();if(!Sn(a,n,this.currentDirection))return;const{projection:o}=this.visualElement,i=this.getAxisMotionValue(a);if(o&&o.layout){const{min:s,max:r}=o.layout.layoutBox[a],l=i.get()||0;i.set(t[a]-se(s,r,.5)+l)}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:a}=this.getProps(),{projection:n}=this.visualElement;if(!na(a)||!n||!this.constraints)return;this.stopAnimation();const o={x:0,y:0};ut(s=>{const r=this.getAxisMotionValue(s);if(r&&this.constraints!==!1){const l=r.get();o[s]=Ly({min:l,max:l},this.constraints[s])}});const{transformTemplate:i}=this.visualElement.getProps();this.visualElement.current.style.transform=i?i({},""):"none",n.root&&n.root.updateScroll(),n.updateLayout(),this.constraints=!1,this.resolveConstraints(),ut(s=>{if(!Sn(s,t,null))return;const r=this.getAxisMotionValue(s),{min:l,max:d}=this.constraints[s];r.set(se(l,d,o[s]))}),this.visualElement.render()}addListeners(){if(!this.visualElement.current)return;Oy.set(this.visualElement,this);const t=this.visualElement.current,a=za(t,"pointerdown",d=>{const{drag:u,dragListener:p=!0}=this.getProps(),m=d.target,k=m!==t&&fb(m);u&&p&&!k&&this.start(d)});let n;const o=()=>{const{dragConstraints:d}=this.getProps();na(d)&&d.current&&(this.constraints=this.resolveRefConstraints(),n||(n=Ny(t,d.current,()=>this.scalePositionWithinConstraints())))},{projection:i}=this.visualElement,s=i.addEventListener("measure",o);i&&!i.layout&&(i.root&&i.root.updateScroll(),i.updateLayout()),re.read(o);const r=en(window,"resize",()=>this.scalePositionWithinConstraints()),l=i.addEventListener("didUpdate",(({delta:d,hasLayoutChanged:u})=>{this.isDragging&&u&&(ut(p=>{const m=this.getAxisMotionValue(p);m&&(this.originPoint[p]+=d[p].translate,m.set(m.get()+d[p].translate))}),this.visualElement.render())}));return()=>{r(),a(),s(),l&&l(),n&&n()}}getProps(){const t=this.visualElement.getProps(),{drag:a=!1,dragDirectionLock:n=!1,dragPropagation:o=!1,dragConstraints:i=!1,dragElastic:s=Ii,dragMomentum:r=!0}=t;return{...t,drag:a,dragDirectionLock:n,dragPropagation:o,dragConstraints:i,dragElastic:s,dragMomentum:r}}}function yl(e){let t=!0;return()=>{if(t){t=!1;return}e()}}function Ny(e,t,a){const n=Ar(e,yl(a)),o=Ar(t,yl(a));return()=>{n(),o()}}function Sn(e,t,a){return(t===!0||t===e)&&(a===null||a===e)}function Hy(e,t=10){let a=null;return Math.abs(e.y)>t?a="y":Math.abs(e.x)>t&&(a="x"),a}class Uy extends xt{constructor(t){super(t),this.removeGroupControls=Xe,this.removeListeners=Xe,this.controls=new By(t)}mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||Xe}update(){const{dragControls:t}=this.node.getProps(),{dragControls:a}=this.node.prevProps||{};t!==a&&(this.removeGroupControls(),t&&(this.removeGroupControls=t.subscribe(this.controls)))}unmount(){this.removeGroupControls(),this.removeListeners(),this.controls.isDragging||this.controls.endPanSession()}}const Vo=e=>(t,a)=>{e&&re.update(()=>e(t,a),!1,!0)};class qy extends xt{constructor(){super(...arguments),this.removePointerDownListener=Xe}onPointerDown(t){this.session=new yu(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:ku(this.node)})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:a,onPan:n,onPanEnd:o}=this.node.getProps();return{onSessionStart:Vo(t),onStart:Vo(a),onMove:Vo(n),onEnd:(i,s)=>{delete this.session,o&&re.postRender(()=>o(i,s))}}}mount(){this.removePointerDownListener=za(this.node.current,"pointerdown",t=>this.onPointerDown(t))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}let Wo=!1;class jy extends h.Component{componentDidMount(){const{visualElement:t,layoutGroup:a,switchLayoutGroup:n,layoutId:o}=this.props,{projection:i}=t;i&&(a.group&&a.group.add(i),n&&n.register&&o&&n.register(i),Wo&&i.root.didUpdate(),i.addEventListener("animationComplete",()=>{this.safeToRemove()}),i.setOptions({...i.options,layoutDependency:this.props.layoutDependency,onExitComplete:()=>this.safeToRemove()})),Kn.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:a,visualElement:n,drag:o,isPresent:i}=this.props,{projection:s}=n;return s&&(s.isPresent=i,t.layoutDependency!==a&&s.setOptions({...s.options,layoutDependency:a}),Wo=!0,o||t.layoutDependency!==a||a===void 0||t.isPresent!==i?s.willUpdate():this.safeToRemove(),t.isPresent!==i&&(i?s.promote():s.relegate()||re.postRender(()=>{const r=s.getStack();(!r||!r.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{visualElement:t,layoutAnchor:a}=this.props,{projection:n}=t;n&&(n.options.layoutAnchor=a,n.root.didUpdate(),bs.postRender(()=>{!n.currentAnimation&&n.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:t,layoutGroup:a,switchLayoutGroup:n}=this.props,{projection:o}=t;Wo=!0,o&&(o.scheduleCheckAfterUnmount(),a&&a.group&&a.group.remove(o),n&&n.deregister&&n.deregister(o))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function Tu(e){const[t,a]=du(),n=h.useContext(Xi);return c.jsx(jy,{...e,layoutGroup:n,switchLayoutGroup:h.useContext(fu),isPresent:t,safeToRemove:a})}const Gy={pan:{Feature:qy},drag:{Feature:Uy,ProjectionNode:lu,MeasureLayout:Tu}};function vl(e,t,a){const{props:n}=e;e.animationState&&n.whileHover&&e.animationState.setActive("whileHover",a==="Start");const o="onHover"+a,i=n[o];i&&re.postRender(()=>i(t,ln(t)))}class Vy extends xt{mount(){const{current:t}=this.node;t&&(this.unmount=pb(t,(a,n)=>(vl(this.node,n,"Start"),o=>vl(this.node,o,"End"))))}unmount(){}}class Wy extends xt{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch{t=!0}!t||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=on(en(this.node.current,"focus",()=>this.onFocus()),en(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}function Tl(e,t,a){const{props:n}=e;if(e.current instanceof HTMLButtonElement&&e.current.disabled)return;e.animationState&&n.whileTap&&e.animationState.setActive("whileTap",a==="Start");const o="onTap"+(a==="End"?"":a),i=n[o];i&&re.postRender(()=>i(t,ln(t)))}class zy extends xt{mount(){const{current:t}=this.node;if(!t)return;const{globalTapTarget:a,propagate:n}=this.node.props;this.unmount=kb(t,(o,i)=>(Tl(this.node,i,"Start"),(s,{success:r})=>Tl(this.node,s,r?"End":"Cancel")),{useGlobalTarget:a,stopPropagation:(n==null?void 0:n.tap)===!1})}unmount(){}}const _i=new WeakMap,zo=new WeakMap,Ky=e=>{const t=_i.get(e.target);t&&t(e)},$y=e=>{e.forEach(Ky)};function Qy({root:e,...t}){const a=e||document;zo.has(a)||zo.set(a,{});const n=zo.get(a),o=JSON.stringify(t);return n[o]||(n[o]=new IntersectionObserver($y,{root:e,...t})),n[o]}function Jy(e,t,a){const n=Qy(t);return _i.set(e,a),n.observe(e),()=>{_i.delete(e),n.unobserve(e)}}const Yy={some:0,all:1};class Xy extends xt{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){var l;(l=this.stopObserver)==null||l.call(this);const{viewport:t={}}=this.node.getProps(),{root:a,margin:n,amount:o="some",once:i}=t,s={root:a?a.current:void 0,rootMargin:n,threshold:typeof o=="number"?o:Yy[o]},r=d=>{const{isIntersecting:u}=d;if(this.isInView===u||(this.isInView=u,i&&!u&&this.hasEnteredView))return;u&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",u);const{onViewportEnter:p,onViewportLeave:m}=this.node.getProps(),k=u?p:m;k&&k(d)};this.stopObserver=Jy(this.node.current,s,r)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:t,prevProps:a}=this.node;["amount","margin","root"].some(Zy(t,a))&&this.startObserver()}unmount(){var t;(t=this.stopObserver)==null||t.call(this),this.hasEnteredView=!1,this.isInView=!1}}function Zy({viewport:e={}},{viewport:t={}}={}){return a=>e[a]!==t[a]}const ev={inView:{Feature:Xy},tap:{Feature:zy},focus:{Feature:Wy},hover:{Feature:Vy}},tv={layout:{ProjectionNode:lu,MeasureLayout:Tu}},av={...Py,...ev,...Gy,...tv},nv=vy(av,Ty);function ov(){!Ss.current&&Hc();const[e]=h.useState(ao.current);return e}const Sl=nv;function dn(){const{message:e,modal:t,notification:a}=Pd.useApp();return{message:e,modal:t,notification:a}}const Cl=e=>{let t;const a=new Set,n=(d,u)=>{const p=typeof d=="function"?d(t):d;if(!Object.is(p,t)){const m=t;t=u??(typeof p!="object"||p===null)?p:Object.assign({},t,p),a.forEach(k=>k(t,m))}},o=()=>t,r={setState:n,getState:o,getInitialState:()=>l,subscribe:d=>(a.add(d),()=>
10a.delete(d))},l=t=e(n,o,r);return r},iv=(e=>e?Cl(e):Cl),sv=e=>e;function rv(e,t=sv){const a=Ne.useSyncExternalStore(e.subscribe,Ne.useCallback(()=>t(e.getState()),[e,t]),Ne.useCallback(()=>t(e.getInitialState()),[e,t]));return Ne.useDebugValue(a),a}const wl=e=>{const t=iv(e),a=n=>rv(t,n);return Object.assign(a,t),a},ft=(e=>e?wl(e):wl);function lv(e,t){let a;try{a=e()}catch{return}return{getItem:o=>{var i;const s=l=>l===null?null:JSON.parse(l,void 0),r=(i=a.getItem(o))!=null?i:null;return r instanceof Promise?r.then(s):s(r)},setItem:(o,i)=>a.setItem(o,JSON.stringify(i,void 0)),removeItem:o=>a.removeItem(o)}}const Li=e=>t=>{try{const a=e(t);return a instanceof Promise?a:{then(n){return Li(n)(a)},catch(n){return this}}}catch(a){return{then(n){return this},catch(n){return Li(n)(a)}}}},dv=(e,t)=>(a,n,o)=>{let i={storage:lv(()=>window.localStorage),partialize:y=>y,version:0,merge:(y,T)=>({...T,...y}),...t},s=!1,r=0;const l=new Set,d=new Set;let u=i.storage;if(!u)return e((...y)=>{console.warn(`[zustand persist middleware] Unable to update item '${i.name}', the given storage is currently unavailable.`),a(...y)},n,o);const p=()=>{const y=i.partialize({...n()});return u.setItem(i.name,{state:y,version:i.version})},m=o.setState;o.setState=(y,T)=>(m(y,T),p());const k=e((...y)=>(a(...y),p()),n,o);o.getInitialState=()=>k;let g;const b=()=>{var y,T;if(!u)return;const S=++r;s=!1,l.forEach(w=>{var C;return w((C=n())!=null?C:k)});const P=((T=i.onRehydrateStorage)==null?void 0:T.call(i,(y=n())!=null?y:k))||void 0;return Li(u.getItem.bind(u))(i.name).then(w=>{if(w)if(typeof w.version=="number"&&w.version!==i.version){if(i.migrate){const C=i.migrate(w.state,w.version);return C instanceof Promise?C.then(x=>[!0,x]):[!0,C]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,w.state];return[!1,void 0]}).then(w=>{var C;if(S!==r)return;const[x,I]=w;if(g=i.merge(I,(C=n())!=null?C:k),a(g,!0),x)return p()}).then(()=>{S===r&&(P==null||P(n(),void 0),g=n(),s=!0,d.forEach(w=>w(g)))}).catch(w=>{S===r&&(P==null||P(void 0,w))})};return o.persist={setOptions:y=>{i={...i,...y},y.storage&&(u=y.storage)},clearStorage:()=>{++r,u==null||u.removeItem(i.name)},getOptions:()=>i,rehydrate:()=>b(),hasHydrated:()=>s,onHydrate:y=>(l.add(y),()=>{l.delete(y)}),onFinishHydration:y=>(d.add(y),()=>{d.delete(y)})},i.skipHydration||b(),g||k},Su=dv,Ds="qwenpaw_auth_token";function ee(e){const a="/api",n=e.startsWith("/")?e:`/${e}`;return`${a}${n}`}function Sa(){const e=localStorage.getItem(Ds);return e||""}function $O(e){localStorage.setItem(Ds,e)}function tn(){localStorage.removeItem(Ds)}function xe(){var a;const e={},t=Sa();t&&(e.Authorization=`Bearer ${t}`);try{const n=sessionStorage.getItem("qwenpaw-agent-storage")||localStorage.getItem("qwenpaw-agent-storage");if(n){const o=JSON.parse(n),i=(a=o==null?void 0:o.state)==null?void 0:a.selectedAgent;i&&(e["X-Agent-Id"]=i)}}catch(n){console.warn("Failed to get selected agent from storage:",n)}return e}const cv="/console",Ei="osPawAppId";function Cu(e){return!e||typeof e!="object"||Array.isArray(e)?{}:e}function uv(e){return e.split(/[?#]/,1)[0]||"/"}function wo(e){return/^\/console(?:\/|$)/.test(e)?cv:void 0}function xs(e){const t=wo(e);return t?e.slice(t.length)||"/":e||"/"}function wu(e){const t=xs(uv(e));return t==="/os"||t.startsWith("/os/")}function pv(e){return xs(e)==="/login"}function mv(e){return`${xs(e.pathname)}${e.search??""}${e.hash??""}`}function Pu(e){return`/login?redirect=${encodeURIComponent(mv(e))}`}function Au(e){return`${wo(e.pathname)??""}${Pu(e)}`}function Rs(e,t){return`${wo(e)??""}${t}`}function QO(e,t){return wu(t)?Mu(e):null}function Mu(e){return Rs(e,"/os")}function JO(e){const t=Cu(e)[Ei];return typeof t=="string"&&t?t:void 0}function YO(e,t){const a={...Cu(e)};return t?a[Ei]=t:delete a[Ei],a}function XO(e){return Rs(e,"/chat")}function hv(e,t){if(!e)return null;if(!t.includes("application/json"))return e;try{const a=JSON.parse(e);if(typeof a.detail=="string"&&a.detail)return a.detail;if(typeof a.message=="string"&&a.message)return a.message;if(typeof a.error=="string"&&a.error)return a.error}catch{return e}return e}
10function gv(e,t){const a=t instanceof Headers?t:new Headers(t);["POST","PUT","PATCH"].includes(e.toUpperCase())&&(a.has("Content-Type")||a.set("Content-Type","application/json"));for(const[n,o]of Object.entries(xe()))a.has(n)||a.set(n,o);return a}const fv=3e4,bv=0,kv=1e3;async function v(e,t={}){const a=ee(e),n=t.method||"GET",o=gv(n,t.headers),{timeout:i=fv,retries:s=bv,retryDelay:r=kv,signal:l,...d}=t;if(l!=null&&l.aborted)throw new DOMException("The operation was aborted","AbortError");let u=null;for(let p=0;p<=s;p++){const m=new AbortController;let k=!1;const g=setTimeout(()=>{k=!0,m.abort()},i);let b;l&&(l.aborted?m.abort():(b=()=>m.abort(),l.addEventListener("abort",b,{once:!0})));try{const y=await fetch(a,{...d,headers:o,signal:m.signal});if(!y.ok){if(y.status===401)throw tn(),pv(window.location.pathname)||(window.location.href=Au(window.location)),new Error("Not authenticated");const S=await y.text().catch(()=>""),P=y.headers.get("content-type")||"",w=hv(S,P),C=w?`${w} - ${S}`:`Request failed: ${y.status} ${y.statusText}`;throw new Error(C)}return y.status===204?void 0:(y.headers.get("content-type")||"").includes("application/json")?await y.json():await y.text()}catch(y){if(y instanceof DOMException&&y.name==="AbortError"&&!k)throw y;if(y instanceof DOMException&&y.name==="AbortError"){if(u=new Error(`Request timeout after ${i}ms: ${n} ${e}`),p<s){await new Promise(T=>setTimeout(T,r));continue}}else throw y}finally{clearTimeout(g),b&&l&&l.removeEventListener("abort",b)}}throw u}const Fi={listAgents:()=>v("/agents"),getAgent:e=>v(`/agents/${e}`),createAgent:e=>v("/agents",{method:"POST",body:JSON.stringify(e)}),copyAgent:(e,t)=>v(`/agents/${e}/copy`,{method:"POST",body:JSON.stringify(t)}),updateAgent:(e,t)=>v(`/agents/${e}`,{method:"PUT",body:JSON.stringify(t)}),updateModelSettings:(e,t)=>v(`/agents/${e}/model-settings`,{method:"PATCH",body:JSON.stringify(t)}),updateBackendSettings:(e,t)=>v(`/agents/${e}/backend-settings`,{method:"PATCH",body:JSON.stringify(t)}),rebuildMemoryIndex:(e,t="all")=>v(`/agents/${e}/memory/reindex?scope=${t}`,{method:"POST",timeout:600*1e3}),undoEmbeddingReindex:e=>v(`/agents/${e}/memory/reindex/undo`,{method:"POST"}),getMemoryStatus:(e,t)=>{const a=`/agents/${e}/memory/status`;return t?v(a,{signal:t}):v(a)},getMemoryRuntimeStatus:(e,t)=>{const a=`/agents/${e}/memory/runtime-status`;return t?v(a,{signal:t}):v(a)},getMemoryGraph:e=>v(`/agents/${e}/memory/graph`),deleteAgent:e=>v(`/agents/${e}`,{method:"DELETE"}),reorderAgents:e=>v("/agents/order",{method:"PUT",body:JSON.stringify({agent_ids:e})}),toggleAgentEnabled:(e,t)=>v(`/agents/${e}/toggle`,{method:"PATCH",body:JSON.stringify({enabled:t})}),setAgentPinned:(e,t)=>v(`/agents/${e}/pin`,{method:"PATCH",body:JSON.stringify({pinned:t})})},yv=500;function vv(e){return e.targetId??e.field??""}class Tv{constructor(t=yv){V(this,"buf",[]);V(this,"cap");this.cap=t}record(t){this.buf.push(t),this.buf.length>this.cap&&this.buf.splice(0,this.buf.length-this.cap);const a=vv(t);t.kind==="menu.conflict"||t.kind==="route.conflict"||t.kind==="slot.error"||t.kind==="chat.error"?console.warn(`[QwenPaw audit] ${t.kind} ${a} by ${t.pluginId}`+(t.detail?`: ${t.detail}`:"")):console.info(`[QwenPaw audit] ${t.kind} ${a} by ${t.pluginId}`+(t.supersededPluginId?` (superseded ${t.supersededPluginId})`:""))}overrides(){return this.buf.slice()}clear(){this.buf=[]}}const ke=new Tv,Oi=new Set;function Ce(){for(const e of Oi)try{e()}catch(t){console.warn("[QwenPaw registry] subscriber threw:",t)}}function cn(e){return Oi.add(e),()=>Oi.delete(e)}let Pl=0;const Ka=()=>(Pl+=1,`r${Pl}`);function ro(e,t){let a=!1;for(const[n,o]of e){const i=o.filter(s=>s.source!==t);i.length!==o.length&&(a=!0,i.length>0?e.set(n,i):e.delete(n))}return a}class Sv{constructor(){V(this,"stacks",new Map);V(this,"snapshots",new Map);V(this,"allSnapshot",[])}addBuiltin(t){for(const a of t)this.addInternal("core",a,!1,!0);this.invalidate(),Ce()}add(t,a){return this.addInternal(t,a,!1,!1)}replace(t,a,n){const o=this.stacks.get(a);return!o||o.length===0?(ke.record({kind:"menu.conflict",targetId:a,pluginId:t,detail
10:"replace target not found; falling back to add",timestamp:Date.now()}),this.addInternal(t,{...n,id:a},!1,!1)):this.addInternal(t,{...n,id:a},!0,!1)}remove(t){this.stacks.delete(t)&&(this.invalidate(),Ce())}removeBySource(t){ro(this.stacks,t)&&(this.invalidate(),Ce())}refresh(){this.invalidate(),Ce()}snapshot(t){if(!t)return this.allSnapshot;const a=this.snapshots.get(t);if(a)return a;const n=this.buildSnapshot(t);return this.snapshots.set(t,n),n}__resetForTests(){this.stacks.clear(),this.invalidate()}addInternal(t,a,n,o){const i=this.stacks.get(a.id);if(i&&i.length>0&&!n)return ke.record({kind:"menu.conflict",targetId:a.id,pluginId:t,supersededPluginId:i[i.length-1].source,detail:"duplicate id; call replace() to override",timestamp:Date.now()}),{dispose:()=>{}};const s={source:t,item:a,registrationId:Ka(),registeredAt:Date.now()},r=i??[],l=r[r.length-1];r.push(s),this.stacks.set(a.id,r),o||(ke.record({kind:n?"menu.replace":"menu.add",targetId:a.id,pluginId:t,supersededPluginId:l==null?void 0:l.source,timestamp:s.registeredAt}),this.invalidate(),Ce());let d=!1;return{dispose:()=>{if(d)return;d=!0;const u=this.stacks.get(a.id);if(!u)return;const p=u.findIndex(m=>m.registrationId===s.registrationId);p<0||(u.splice(p,1),u.length===0&&this.stacks.delete(a.id),ke.record({kind:"menu.dispose",targetId:a.id,pluginId:t,timestamp:Date.now()}),this.invalidate(),Ce())}}}invalidate(){this.snapshots.clear(),this.allSnapshot=this.collectWinners()}collectWinners(){const t=[];for(const a of this.stacks.values()){const n=a[a.length-1];n&&t.push(n.item)}return t}buildSnapshot(t){const o=this.allSnapshot.filter(i=>(i.location??"primary.settings")===t).filter(i=>{var s;return((s=i.visible)==null?void 0:s.call(i))!==!1});return Cv(o)}}function Cv(e){const t=wv(e),a=new Map(t.map(i=>[i.id,i])),n=new Map,o=[];for(const i of t)if(i.parentId&&a.has(i.parentId)){const s=n.get(i.parentId)??[];s.push(i),n.set(i.parentId,s)}else o.push(i);return o.map(i=>{const s=n.get(i.id);return s?Object.assign({},i,{__children:s}):i})}function wv(e){const t=new Map(e.map(s=>[s.id,s])),a=new Map,n=new Map;for(const s of e)a.set(s.id,new Set),n.set(s.id,0);for(const s of e)s.before&&t.has(s.before)&&(a.get(s.id).add(s.before),n.set(s.before,(n.get(s.before)??0)+1)),s.after&&t.has(s.after)&&(a.get(s.after).add(s.id),n.set(s.id,(n.get(s.id)??0)+1));const o=e.filter(s=>(n.get(s.id)??0)===0);o.sort(Ko);const i=[];for(;o.length>0;){const s=o.shift();i.push(s);for(const r of a.get(s.id)??[]){const l=(n.get(r)??0)-1;if(n.set(r,l),l===0){const d=t.get(r);d&&(o.push(d),o.sort(Ko))}}}if(i.length<e.length){const s=e.filter(r=>!i.includes(r)).sort(Ko);i.push(...s)}return i}function Ko(e,t){return(e.order??1/0)-(t.order??1/0)}const je=new Sv;class Pv{constructor(){V(this,"bases",new Map);V(this,"overrides",new Map);V(this,"wraps",new Map);V(this,"resolvedSnapshot",[])}addBuiltin(t){for(const a of t)this.addInternal("core",a,!0);this.invalidate(),Ce()}add(t,a){return this.addInternal(t,a,!1)}replace(t,a,n){const o=this.overrides.get(a)??[],i={source:t,component:n,registrationId:Ka()},s=o[o.length-1];o.push(i),this.overrides.set(a,o),ke.record({kind:"route.replace",targetId:a,pluginId:t,supersededPluginId:s==null?void 0:s.source,timestamp:Date.now()}),this.invalidate(),Ce();let r=!1;return{dispose:()=>{if(r)return;r=!0;const l=this.overrides.get(a)??[],d=l.findIndex(u=>u.registrationId===i.registrationId);d<0||(l.splice(d,1),l.length===0&&this.overrides.delete(a),ke.record({kind:"route.dispose",targetId:a,pluginId:t,timestamp:Date.now()}),this.invalidate(),Ce())}}}wrap(t,a,n){const o=this.wraps.get(a)??[],i={source:t,wrapper:n,registrationId:Ka()};o.push(i),this.wraps.set(a,o),ke.record({kind:"route.wrap",targetId:a,pluginId:t,timestamp:Date.now()}),this.invalidate(),Ce();let s=!1;return{dispose:()=>{if(s)return;s=!0;const r=this.wraps.get(a)??[],l=r.findIndex(d=>d.registrationId===i.registrationId);l<0||(r.splice(l,1),r.length===0&&this.wraps.delete(a),ke.record({kind:"route.dispose",targetId:a,pluginId:t,timestamp:Date.now()}),this.invalidate(),Ce())}}}remove(t){(this.bases.delete(t)||this.overrides.delete(t)||this.wraps.delete(t))&&(this.invalidate(),Ce())}removeBySource(t){let a=!1;for(const[n,o]of this.bases)o.source===t&&(this.bases.delete(n),a=!0);a=ro(this.overrides,t)||a,a=ro(this.wraps,t)||a,a&&(this.invalidate(),Ce())}
10snapshot(){return this.resolvedSnapshot}__resetForTests(){this.bases.clear(),this.overrides.clear(),this.wraps.clear(),this.invalidate()}addInternal(t,a,n){if(this.bases.has(a.id))return ke.record({kind:"route.conflict",targetId:a.id,pluginId:t,detail:"duplicate route id; ignored",timestamp:Date.now()}),{dispose:()=>{}};for(const s of this.bases.values())if(s.route.path===a.path)return ke.record({kind:"route.conflict",targetId:a.id,pluginId:t,detail:`path ${a.path} already registered by ${s.source} (${s.route.id})`,timestamp:Date.now()}),{dispose:()=>{}};const o={source:t,route:a,registrationId:Ka()};this.bases.set(a.id,o),n||(ke.record({kind:"route.add",targetId:a.id,pluginId:t,timestamp:Date.now()}),this.invalidate(),Ce());let i=!1;return{dispose:()=>{if(i)return;i=!0;const s=this.bases.get(a.id);!s||s.registrationId!==o.registrationId||(this.bases.delete(a.id),ke.record({kind:"route.dispose",targetId:a.id,pluginId:t,timestamp:Date.now()}),this.invalidate(),Ce())}}}invalidate(){this.resolvedSnapshot=this.resolveAll()}resolveAll(){const t=[];for(const a of this.bases.values()){const n=this.overrides.get(a.route.id),o=n==null?void 0:n[n.length-1],i=(o==null?void 0:o.component)??a.route.component,r=(this.wraps.get(a.route.id)??[]).reduce((l,d)=>d.wrapper(l),i);t.push({id:a.route.id,path:a.route.path,source:(o==null?void 0:o.source)??a.source,Component:r})}return t}}const ot=new Pv;class Av{constructor(){V(this,"slots",new Map);V(this,"snapshots",new Map)}fill(t,a,n,o={}){return this.addInternal(t,a,"fill",n,o)}replace(t,a,n,o={}){return this.addInternal(t,a,"replace",n,o)}snapshot(t){const a=this.snapshots.get(t);if(a)return a;const n=this.buildSnapshot(t);return this.snapshots.set(t,n),n}removeBySource(t){ro(this.slots,t)&&(this.snapshots.clear(),Ce())}snapshotAll(){const t=[];for(const[a,n]of this.slots)for(const o of n)t.push({name:a,kind:o.kind,source:o.source,id:o.opts.id,order:o.opts.order});return t}__resetForTests(){this.slots.clear(),this.snapshots.clear()}addInternal(t,a,n,o,i){const s={source:t,kind:n,render:o,opts:i,registrationId:Ka(),registeredAt:Date.now()},r=this.slots.get(a)??[],l=r.find(u=>u.kind==="replace");r.push(s),this.slots.set(a,r),ke.record({kind:n==="replace"?"slot.replace":"slot.fill",targetId:a,pluginId:t,supersededPluginId:n==="replace"?l==null?void 0:l.source:void 0,detail:i.id,timestamp:s.registeredAt}),this.snapshots.delete(a),Ce();let d=!1;return{dispose:()=>{if(d)return;d=!0;const u=this.slots.get(a)??[],p=u.findIndex(m=>m.registrationId===s.registrationId);p<0||(u.splice(p,1),u.length===0&&this.slots.delete(a),this.snapshots.delete(a),ke.record({kind:"slot.dispose",targetId:a,pluginId:t,timestamp:Date.now()}),Ce())}}}buildSnapshot(t){const a=(this.slots.get(t)??[]).filter(o=>{var i,s;return((s=(i=o.opts).visible)==null?void 0:s.call(i))!==!1}),n=a.filter(o=>o.kind==="replace");return n.length>0?[n[n.length-1]]:Mv(a)}}function Mv(e){const t=new Map;for(const d of e)d.opts.id&&t.set(d.opts.id,d);const a=new Map,n=new Map,o=d=>d.registrationId;for(const d of e)a.set(o(d),new Set),n.set(o(d),0);for(const d of e){if(d.opts.before&&t.has(d.opts.before)){const u=o(t.get(d.opts.before));a.get(o(d)).add(u),n.set(u,(n.get(u)??0)+1)}if(d.opts.after&&t.has(d.opts.after)){const u=o(t.get(d.opts.after));a.get(u).add(o(d)),n.set(o(d),(n.get(o(d))??0)+1)}}const i=(d,u)=>{const p=(d.opts.order??1/0)-(u.opts.order??1/0);return p!==0?p:d.registeredAt-u.registeredAt},s=e.filter(d=>(n.get(o(d))??0)===0);s.sort(i);const r=[],l=new Map(e.map(d=>[o(d),d]));for(;s.length>0;){const d=s.shift();r.push(d);for(const u of a.get(o(d))??[]){const p=(n.get(u)??0)-1;if(n.set(u,p),p===0){const m=l.get(u);m&&(s.push(m),s.sort(i))}}}if(r.length<e.length){const d=e.filter(u=>!r.includes(u)).sort(i);
10r.push(...d)}return r}const $a=new Av,Bi="qwenpaw-agent-storage",Du="qwenpaw-last-used-agent",Dv=e=>/^\d+-[a-z0-9]+$/.test(e);let xa=null;function xv(){var e,t;try{const a=sessionStorage.getItem(Bi);if(a){const n=JSON.parse(a),o=(e=n==null?void 0:n.state)==null?void 0:e.selectedAgent;if(o)return o}}catch{}try{const a=localStorage.getItem(Du);if(a)return a}catch{}try{const a=localStorage.getItem(Bi);if(a){const n=JSON.parse(a),o=(t=n==null?void 0:n.state)==null?void 0:t.selectedAgent;if(o)return o}}catch{}return"default"}const We=ft()(Su((e,t)=>({selectedAgent:xv(),agents:[],lastChatIdByAgent:{},setSelectedAgent:a=>{e({selectedAgent:a}),je.refresh();try{localStorage.setItem(Du,a)}catch{}},setAgents:a=>e({agents:a}),refreshAgents:async()=>{if(xa!==null)return xa;xa=Fi.listAgents().then(a=>{e({agents:a.agents})});try{await xa}finally{xa=null}},addAgent:a=>e(n=>({agents:[...n.agents,a]})),removeAgent:a=>{const n=t().selectedAgent===a;e(o=>{const i={...o.lastChatIdByAgent};return delete i[a],{agents:o.agents.filter(s=>s.id!==a),lastChatIdByAgent:i,...o.selectedAgent===a?{selectedAgent:"default"}:{}}}),n&&je.refresh()},updateAgent:(a,n)=>e(o=>({agents:o.agents.map(i=>i.id===a?{...i,...n}:i)})),setLastChatId:(a,n)=>{if(Dv(n)){e(o=>{const i={...o.lastChatIdByAgent};return delete i[a],{lastChatIdByAgent:i}});return}e(o=>
10({lastChatIdByAgent:{...o.lastChatIdByAgent,[a]:n}}))},removeLastChatId:a=>e(n=>{const o={...n.lastChatIdByAgent};return delete o[a],{lastChatIdByAgent:o}}),getLastChatId:a=>t().lastChatIdByAgent[a]}),{name:Bi,storage:{getItem:e=>{try{const t=sessionStorage.getItem(e);if(t)return JSON.parse(t)}catch{}try{const t=localStorage.getItem(e);return t?JSON.parse(t):null}catch(t){return console.error(`Failed to parse agent storage "${e}":`,t),localStorage.removeItem(e),null}},setItem:(e,t)=>{try{sessionStorage.setItem(e,JSON.stringify(t))}catch{}try{localStorage.setItem(e,JSON.stringify(t))}catch(a){console.error(`Failed to save agent storage "${e}":`,a)}},removeItem:e=>{sessionStorage.removeItem(e),localStorage.removeItem(e)}}})),Rv="default",Iv="Default Agent";function ea(e,t){return e.id===Rv?e.name&&e.name!==Iv?e.name:t("agent.defaultDisplayName"):e.name||e.id}const _v="index-module__indicator__n5fAL",Lv="index-module__disabled__Qc3sP",Ev="index-module__pending__wxksI",Fv="index-module__starting__S5l2c",Ov="index-module__statusPulse__E1RQw",Bv="index-module__running__IZivY",Nv="index-module__failed__1hxDo",Al={indicator:_v,disabled:Lv,pending:Ev,starting:Fv,statusPulse:Ov,running:Bv,failed:Nv};function Cn({status:e,enabled:t=!0}){const{t:a}=ve(),n=e??(t?"pending":"disabled"),o=a(`agent.status.${n}`);return c.jsx(mt,{title:o,children:c.jsx("span",{className:`${Al.indicator} ${Al[n]}`,role:"status","aria-label":o,"data-status":n})})}const Hv=500,Uv=8,qv=520;function jv(e){const t=h.useRef(null),a=h.useRef(null),n=h.useRef(null),o=h.useRef(null),[i,s]=h.useState(null),[r,l]=h.useState(null),d=h.useCallback(()=>{t.current!==null&&(window.clearTimeout(t.current),t.current=null),n.current=null,s(null)},[]);h.useEffect(()=>()=>{d(),a.current!==null&&window.clearTimeout(a.current)},[d]);const u=h.useCallback(k=>{l(k),a.current!==null&&window.clearTimeout(a.current),a.current=window.setTimeout(()=>{l(null),a.current=null},qv)},[]),p=h.useCallback(k=>{k.id!=="default"&&(o.current=k.id,d(),u(k.id),e(k))},[d,e,u]);return{getLongPressProps:h.useCallback(k=>({tabIndex:0,onPointerDown:g=>{k.id==="default"||g.button!==0||g.target.closest("button")||(d(),n.current={agentId:k.id,pointerId:g.pointerId,x:g.clientX,y:g.clientY},s(k.id),t.current=window.setTimeout(()=>{p(k)},Hv))},onPointerMove:g=>{const b=n.current;if(!b||b.pointerId!==g.pointerId)return;Math.hypot(g.clientX-b.x,g.clientY-b.y)>Uv&&d()},onPointerUp:d,onPointerCancel:d,onPointerLeave:g=>{g.pointerType==="mouse"&&d()},onClickCapture:g=>{o.current===k.id&&(g.preventDefault(),g.stopPropagation(),o.current=null)}}),[d,p]),pressingId:i,feedbackId:r}}function Ml(e){return e.available_in_chat!==!1}const Gv="index-module__agentSelectorWrapper__Ewc3u",Vv="index-module__agentSelectorCollapsed__5BakG",Wv="index-module__collapsedStatusIndicator__4PNAh",zv="index-module__agentSelectorLabel__5TIgq",Kv="index-module__agentCountBadge__GMb72",$v="index-module__managementLink__yzRJL",Qv="index-module__agentSelector__Ss6Rd",Jv="index-module__selectedAgentLabel__6DCdY",Yv="index-module__dropdownHeader__AXVhc",Xv="index-module__dropdownHeaderTitle__xpQuA",Zv="index-module__agentSelectorDropdown__Cf59k",eT="index-module__dropdownContent__GqxBB",tT="index-module__enabledAgentList__EgJ0i",aT="index-module__agentOption__YoWkf",nT="index-module__agentOptionDisabled__E--bi",oT="index-module__agentOptionPressing__WO08m",iT="index-module__agentOptionPinFeedback__t00AF",sT="index-module__agentOptionHeader__j-sBo",rT="index-module__agentStatusColumn__XXsBi",lT="index-module__agentToggleButton__bbKae",dT="index-module__toggleSpinner__PAP43",cT="index-module__disabledAgentSection__-zIaq",uT="index-module__disabledAgentHeader__jMzyp",pT="index-module__disabledChevronExpanded__bzUz1",mT="index-module__disabledAgentList__MbbA5",hT="index-module__disabledAgentRow__rB8nQ",gT="index-module__agentOptionIcon__Y6gW1",fT="index-module__agentOptionContent__V45D4",bT="index-module__agentOptionName__acd7G",kT="index-module__agentOptionNameText__BXVGx",yT="index-module__pinnedIndicator__rFMjH",vT="index-module__activeIndicator__MuVJm",TT="index-module__agentOptionDescription__dOqFl",ST="index-module__agentOptionId__pSSVI",$={agentSelectorWrapper:Gv,agentSelectorCollapsed:Vv,collapsedStatusIndicator:Wv,agentSelectorLabel:zv,agentCountBadge:Kv,managementLink:$v,agentSelector:Qv,selectedAgentLabel:Jv,dropdownHeader:Yv,dropdownHeaderTitle:Xv,agentSelectorDropdown:Zv,dropdownContent:eT,enabledAgentList:tT,agentOption:aT,agentOptionDisabled:nT,agentOptionPressing:oT,agentOptionPinFeedback:iT,agentOptionHeader:sT,agentStatusColumn:rT,agentToggleButton:lT,toggleSpinner:dT,disabledAgentSection:cT,disabledAgentHeader:uT,disabledChevronExpanded:pT,disabledAgentList:mT,disabledAgentRow:hT,agentOptionIcon:gT,agentOptionContent:fT,agentOptionName:bT,agentOptionNameText:kT,pinnedIndicator:yT,activeIndicator:vT,agentOptionDescription:TT,agentOptionId:ST};function Dl({collapsed:e=!1}){const{t}=ve(),a=Cd(),{selectedAgent:n,agents:o,setSelectedAgent:i,setAgents:s,refreshAgents:r}=We(),{message:l}=dn(),d=h.useRef(l),u=h.useRef(t);d.current=l,u.current=t;
10const[p,m]=h.useState(!1),[k,g]=h.useState(!1),[b,y]=h.useState(!1),[T,S]=h.useState(null),[P,w]=h.useState(null),C=h.useCallback(async(M=!0,O=!0)=>{try{M&&m(!0),await r()}catch(q){console.error("Failed to load agents:",q),O&&d.current.error(u.current("agent.loadFailed"))}finally{M&&m(!1)}},[r]);h.useEffect(()=>{C()},[C]);const x=h.useMemo(()=>o.filter(Ml),[o]),I=h.useMemo(()=>x.filter(M=>M.enabled),[x]),R=h.useMemo(()=>x.filter(M=>M.id==="default"||M.pinned),[x]),_=h.useMemo(()=>x.filter(M=>M.enabled&&M.id!=="default"&&!M.pinned),[x]),A=h.useMemo(()=>x.filter(M=>!M.enabled&&M.id!=="default"&&!M.pinned),[x]),L=M=>{const O=x.find(q=>q.id===M);O!=null&&O.enabled&&(i(M),l.success(t("agent.switchSuccess")))};h.useEffect(()=>{if(!o.length||n==="default")return;const M=o.find(O=>O.id===n);M?Ml(M)?M.enabled||(i("default"),l.warning(t("agent.currentAgentDisabled"))):i("default"):(i("default"),l.warning(t("agent.currentAgentDeleted")))},[o,l,n,i,t]);const j=M=>{M.preventDefault(),M.stopPropagation()},U=async(M,O,q)=>{if(j(q),T===null){S(M.id),O&&s(o.map(K=>K.id===M.id?{...K,enabled:!0,startup_status:"starting"}:K));try{await Fi.toggleAgentEnabled(M.id,O),!O&&n===M.id&&(i("default"),l.info(t("agent.switchedToDefault"))),l.success(t(O?"agent.enableSuccess":"agent.disableSuccess"))}catch(K){l.error(K instanceof Error?K.message:t("agent.toggleFailed"))}finally{await C(!1,!1),S(null)}}},z=h.useCallback(async M=>{if(M.id==="default"||P!==null)return;const O=!M.pinned;w(M.id),s(o.map(q=>q.id===M.id?{...q,pinned:O}:q));try{await Fi.setAgentPinned(M.id,O),l.success(t(O?"agent.pinSuccess":"agent.unpinSuccess"))}catch(q){l.error(q instanceof Error?q.message:t("agent.pinFailed"))}finally{await C(!1,!1),w(null)}},[o,C,l,P,s,t]),{getLongPressProps:W,pressingId:Q,feedbackId:he}=jv(M=>{z(M)}),D=x.find(M=>M.id===n);if(e)return c.jsx(mt,{title:D?ea(D,t):n,placement:"right",overlayInnerStyle:{background:"rgba(0,0,0,0.75)",color:"#fff"},children:c.jsxs("div",{className:$.agentSelectorCollapsed,children:[c.jsx(Ut,{size:18,strokeWidth:2}),D&&c.jsx("span",{className:$.collapsedStatusIndicator,children:c.jsx(Cn,{status:D.startup_status,enabled:D.enabled})})]})});const N=(M,O)=>{const q=T===M.id,K=M.startup_status==="pending"||M.startup_status==="starting",pe=T!==null||!O&&K,ge=O?t("agent.enableAgent",{name:ea(M,t)}):t("agent.disableAgent",{name:ea(M,t)});return c.jsx(mt,{title:!O&&K?t("agent.status.waitUntilStarted"):ge,children:c.jsx("button",{type:"button",className:$.agentToggleButton,disabled:pe,"aria-label":ge,onMouseDown:j,onClick:te=>{U(M,O,te)},children:q?c.jsx(dm,{size:15,className:$.toggleSpinner,"aria-hidden":"true"}):O?c.jsx(cm,{size:15,"aria-hidden":"true"}):c.jsx(um,{size:15,"aria-hidden":"true"})})})},H=(M,O)=>c.jsxs("div",{className:[$.agentOption,O?$.agentOptionDisabled:"",Q===M.id?$.agentOptionPressing:"",he===M.id?$.agentOptionPinFeedback:""].filter(Boolean).join(" "),title:M.id==="default"?t("agent.defaultPinned"):M.pinned?t("agent.longPressToUnpin"):t("agent.longPressToPin"),...W(M),children:[c.jsxs("div",{className:$.agentOptionHeader,children:[c.jsx("div",{className:$.agentStatusColumn,children:c.jsx(Cn,{status:M.startup_status,enabled:M.enabled})}),c.jsx("div",{className:$.agentOptionIcon,children:c.jsx(Ut,{size:16,strokeWidth:2})}),c.jsxs("div",{className:$.agentOptionContent,children:[c.jsxs("div",{className:$.agentOptionName,children:[c.jsx("span",{className:$.agentOptionNameText,children:ea(M,t)}),(M.id==="default"||M.pinned)&&c.jsx(Qa,{size:12,strokeWidth:2.2,className:$.pinnedIndicator,"aria-label":t("agent.pinned")}),M.id===n&&c.jsx(lm,{size:14,strokeWidth:2,className:$.activeIndicator})]}),M.description&&c.jsx("div",{className:$.agentOptionDescription,children:M.description})]}),M.id!=="default"&&N(M,!M.enabled)]}),c.jsx("div",{className:$.agentOptionId,children:`ID: ${M.id}`})]});return c.jsxs("div",{className:$.agentSelectorWrapper,children:[c.jsx("div",{className:$.agentSelectorLabel,children:c.jsxs("span",{children:[t("agent.currentWorkspace"),I.length>0&&c.jsx("span",{className:$.agentCountBadge,children:` (${I.length})`})]})}),c.jsxs(Nt,{value:n,onChange:L,loading:p,className:$.agentSelector,placeholder:t("agent.selectAgent"),optionLabelProp:"label",popupClassName:$.agentSelectorDropdown,onOpenChange:g,suffixIcon:k?c.jsx(sm,{size:20}):c.jsx(rm,{size:20}),popupRender:M=>c.jsxs("div",{className:$.dropdownContent,children:[c.jsxs("div",{className:$.dropdownHeader,children:[c.jsx("span",{className:$.dropdownHeaderTitle,children:t("agent.currentWorkspace")}),c.jsxs("button",{type:"button",className:$.managementLink,onMouseDown:j,onClick:O=>{j(O),a("/agents")},children:[t("agent.management"),c.jsx(im,{size:12,strokeWidth:2.5})]})]}),c.jsx("div",{className:$.enabledAgentList,children:M}),A.length>0&&c.jsxs("div",{className:$.disabledAgentSection,children:[c.jsxs("button",{type:"button",className:$.disabledAgentHeader,"aria-expanded":b,"aria-controls":"disabled-agent-list",onMouseDown:j,onClick:O=>{j(O),y(q=>!q)},children:[c.jsx("span",{children:t("agent.disabledAgents",{count:A.length})}),c.jsx(bo,{size:15,className:b?$.disabledChevronExpanded:""})]}),b&&c.jsx("div",{id:"disabled-agent-list",className:$.disabledAgentList,children:A.map(O=>c.jsx("div",{className:$.disabledAgentRow,children:H(O,!0)},O.id))})]})]}),children:[c.jsx(Nt.OptGroup,{label:t("agent.pinnedAgents"),children:R.map(M=>c.jsx(Nt.Option,{value:M.id,disabled:!M.enabled,label:c.jsxs("div",{className:$.selectedAgentLabel,children:[c.jsx(Cn,{status:M.startup_status,enabled:M.enabled}),c.jsx(Ut,{size:14,strokeWidth:2}),c.jsx("span",{children:ea(M,t)})]}),children:H(M,!M.enabled)},M.id))}),_.length>0&&c.jsx(Nt.OptGroup,{label:t("agent.otherAgents"),children:_.map(M=>c.jsx(Nt.Option,{value:M.id,label:c.jsxs("div",{className:$.selectedAgentLabel,children:[c.jsx(Cn,{status:M.startup_status,enabled:M.enabled}),c.jsx(Ut,{size:14,strokeWidth:2}),c.jsx("span",{children:ea(M,t)})]}),children:H(M,!1)},M.id))})]})]})}var xl=Number.isNaN||function(t){return typeof t=="number"&&t!==t};function CT(e,t){return!!(e===t||xl(e)&&xl(t))}function wT(e,t){if(e.length!==t.length)return!1;for(var a=0;a<e.length;a++)if(!CT(e[a],t[a]))return!1;return!0}function $o(e,t){t===void 0&&(t=wT);var a,n=[],o,i=!1;function s(){for(var r=[],l=0;l<arguments.length;l++)r[l]=arguments[l];return i&&a===this&&t(r,n)||(o=e.apply(this,r),i=!0,a=this,n=r),o}return s}var PT=typeof performance=="object"&&typeof performance.now=="function",Rl=PT?function(){return performance.now()}:function(){return Date.now()};function Il(e){cancelAnimationFrame(e.id)}function AT(e,t){var a=Rl();function n(){Rl()-a>=t?e.call(null):o.id=requestAnimationFrame(n)}var o={id:requestAnimationFrame(n)};return o}var Qo=-1;function _l(e){if(e===void 0&&(e=!1),Qo===-1||e){var t=document.createElement("div"),a=t.style;a.width="50px",a.height="50px",a.overflow="scroll",document.body.appendChild(t),Qo=t.offsetWidth-t.clientWidth,document.body.removeChild(t)}return Qo}var ta=null;function Ll(e){if(e===void 0&&(e=!1),ta===null||e){var t=document.createElement("div"),a=t.style;a.width="50px",a.height="50px",a.overflow="scroll",a.direction="rtl";var n=document.createElement("div"),o=n.style;return o.width="100px",o.height="100px",t.appendChild(n),document.body.appendChild(t),t.scrollLeft>0?ta="positive-descending":(t.scrollLeft=1,t.scrollLeft===0?ta="negative":ta="positive-ascending"),document.body.removeChild(t),ta}return ta}var MT=150,DT=function(t,a){return t};function xu(e){var t,a=e.getItemOffset,n=e.getEstimatedTotalSize,o=e.getItemSize,i=e.getOffsetForIndexAndAlignment,s=e.getStartIndexForOffset,r=e.getStopIndexForStartIndex,l=e.initInstanceProps,d=e.shouldResetStyleCacheOnItemSizeChange,u=e.validateProps;return t=(function(p){pm(m,p);function m(g){var b;return b=p.call(this,g)||this,b._instanceProps=l(b.props,zs(b)),b._outerRef=void 0,b._resetIsScrollingTimeoutId=null,b.state={instance:zs(b),isScrolling:!1,scrollDirection:"forward",scrollOffset:typeof b.props.initialScrollOffset=="number"?b.props.initialScrollOffset:0,scrollUpdateWasRequested:!1},b._callOnItemsRendered=void 0,b._callOnItemsRendered=$o(function(y,T,S,P){return b.props.onItemsRendered({overscanStartIndex:y,overscanStopIndex:T,visibleStartIndex:S,visibleStopIndex:P})}),b._callOnScroll=void 0,b._callOnScroll=$o(function(y,T,S){return b.props.onScroll({scrollDirection:y,scrollOffset:T,scrollUpdateWasRequested:S})}),b._getItemStyle=void 0,b._getItemStyle=function(y){var T=b.props,S=T.direction,P=T.itemSize,w=T.layout,C=b._getItemStyleCache(d&&P,d&&w,d&&S),x;if(C.hasOwnProperty(y))x=C[y];else{var I=a(b.props,y,b._instanceProps),R=o(b.props,y,b._instanceProps),_=S==="horizontal"||w==="horizontal",A=S==="rtl",L=_?I:0;C[y]=x={position:"absolute",left:A?void 0:L,right:A?L:void 0,top:_?0:I,height:_?"100%":R,width:_?R:"100%"}}return x},b._getItemStyleCache=void 0,b._getItemStyleCache=$o(function(y,T,S){return{}}),b._onScrollHorizontal=function(y){var T=y.currentTarget,S=T.clientWidth,P=T.scrollLeft,w=T.scrollWidth;b.setState(function(C){if(C.scrollOffset===P)return null;var x=b.props.direction,I=P;if(x==="rtl")switch(Ll()){case"negative":I=-P;break;case"positive-descending":I=w-S-P;break}return I=Math.max(0,Math.min(I,w-S)),{isScrolling:!0,scrollDirection:C.scrollOffset<I?"forward":"backward",scrollOffset:I,scrollUpdateWasRequested:!1}},b._resetIsScrollingDebounced)},b._onScrollVertical=function(y){var T=y.currentTarget,S=T.clientHeight,P=T.scrollHeight,w=T.scrollTop;b.setState(function(C){if(C.scrollOffset===w)return null;var x=Math.max(0,Math.min(w,P-S));return{isScrolling:!0,scrollDirection:C.scrollOffset<x?"forward":"backward",scrollOffset:x,scrollUpdateWasRequested:!1}},b._resetIsScrollingDebounced)},b._outerRefSetter=function(y){var T=b.props.outerRef;b._outerRef=y,typeof T=="function"?T(y):T!=null&&typeof T=="object"&&T.hasOwnProperty("current")&&(T.current=y)},b._resetIsScrollingDebounced=function(){b._resetIsScrollingTimeoutId!==null&&Il(b._resetIsScrollingTimeoutId),b._resetIsScrollingTimeoutId=AT(b._resetIsScrolling,MT)},b._resetIsScrolling=function(){b._resetIsScrollingTimeoutId=null,b.setState({isScrolling:!1},function(){b._getItemStyleCache(-1,null)})},b}m.getDerivedStateFromProps=function(b,y){return xT(b,y),u(b),null};var k=m.prototype;return k.scrollTo=function(b){b=Math.max(0,b),this.setState(function(y){return y.scrollOffset===b?null:{scrollDirection:y.scrollOffset<b?"forward":"backward",scrollOffset:b,scrollUpdateWasRequested:!0}},this._resetIsScrollingDebounced)},k.scrollToItem=function(b,y){y===void 0&&(y="auto");var T=this.props,S=T.itemCount,P=T.layout,w=this.state.scrollOffset;b=Math.max(0,Math.min(b,S-1));var C=0;if(this._outerRef){var x=this._outerRef;P==="vertical"?C=x.scrollWidth>x.clientWidth?_l():0:C=x.scrollHeight>x.clientHeight?_l():0}this.scrollTo(i(this.props,b,y,w,this._instanceProps,C))},k.componentDidMount=function(){var b=this.props,y=b.direction,T=b.initialScrollOffset,S=b.layout;if(typeof T=="number"&&this._outerRef!=null){var P=this._outerRef;y==="horizontal"||S==="horizontal"?P.scrollLeft=T:P.scrollTop=T}this._callPropsCallbacks()},k.componentDidUpdate=function(){var b=this.props,y=b.direction,T=b.layout,S=this.state,P=S.scrollOffset,w=S.scrollUpdateWasRequested;if(w&&this._outerRef!=null){var C=this._outerRef;if(y==="horizontal"||T==="horizontal")if(y==="rtl")switch(Ll()){case"negative":C.scrollLeft=-P;break;case"positive-ascending":C.scrollLeft=P;break;default:var x=C.clientWidth,I=C.scrollWidth;C.scrollLeft=I-x-P;break}else C.scrollLeft=P;else C.scrollTop=P}this._callPropsCallbacks()},k.componentWillUnmount=function(){this._resetIsScrollingTimeoutId!==null&&Il(this._resetIsScrollingTimeoutId)},k.render=function(){var b=this.props,y=b.children,T=b.className,S=b.direction,P=b.height,w=b.innerRef,C=b.innerElementType,x=b.innerTagName,I=b.itemCount,R=b.itemData,_=b.itemKey,A=_===void 0?DT:_,L=b.layout,j=b.outerElementType,U=b.outerTagName,z=b.style,W=b.useIsScrolling,Q=b.width,he=this.state.isScrolling,D=S==="horizontal"||L==="horizontal",N=D?this._onScrollHorizontal:this._onScrollVertical,H=this._getRangeToRender(),M=
10H[0],O=H[1],q=[];if(I>0)for(var K=M;K<=O;K++)q.push(h.createElement(y,{data:R,key:A(K,R),index:K,isScrolling:W?he:void 0,style:this._getItemStyle(K)}));var pe=n(this.props,this._instanceProps);return h.createElement(j||U||"div",{className:T,onScroll:N,ref:this._outerRefSetter,style:mm({position:"relative",height:P,width:Q,overflow:"auto",WebkitOverflowScrolling:"touch",willChange:"transform",direction:S},z)},h.createElement(C||x||"div",{children:q,ref:w,style:{height:D?"100%":pe,pointerEvents:he?"none":void 0,width:D?pe:"100%"}}))},k._callPropsCallbacks=function(){if(typeof this.props.onItemsRendered=="function"){var b=this.props.itemCount;if(b>0){var y=this._getRangeToRender(),T=y[0],S=y[1],P=y[2],w=y[3];this._callOnItemsRendered(T,S,P,w)}}if(typeof this.props.onScroll=="function"){var C=this.state,x=C.scrollDirection,I=C.scrollOffset,R=C.scrollUpdateWasRequested;this._callOnScroll(x,I,R)}},k._getRangeToRender=function(){var b=this.props,y=b.itemCount,T=b.overscanCount,S=this.state,P=S.isScrolling,w=S.scrollDirection,C=S.scrollOffset;if(y===0)return[0,0,0,0];var x=s(this.props,C,this._instanceProps),I=r(this.props,x,C,this._instanceProps),R=!P||w==="backward"?Math.max(1,T):1,_=!P||w==="forward"?Math.max(1,T):1;return[Math.max(0,x-R),Math.max(0,Math.min(y-1,I+_)),x,I]},m})(h.PureComponent),t.defaultProps={direction:"ltr",itemData:void 0,layout:"vertical",overscanCount:2,useIsScrolling:!1},t}var xT=function(t,a){t.children,t.direction,t.height,t.layout,t.innerTagName,t.outerTagName,t.width,a.instance},RT=50,la=function(t,a,n){var o=t,i=o.itemSize,s=n.itemMetadataMap,r=n.lastMeasuredIndex;if(a>r){var l=0;if(r>=0){var d=s[r];l=d.offset+d.size}for(var u=r+1;u<=a;u++){var p=i(u);s[u]={offset:l,size:p},l+=p}n.lastMeasuredIndex=a}return s[a]},IT=function(t,a,n){var o=a.itemMetadataMap,i=a.lastMeasuredIndex,s=i>0?o[i].offset:0;return s>=n?Ru(t,a,i,0,n):_T(t,a,Math.max(0,i),n)},Ru=function(t,a,n,o,i){for(;o<=n;){var s=o+Math.floor((n-o)/2),r=la(t,s,a).offset;if(r===i)return s;r<i?o=s+1:r>i&&(n=s-1)}return o>0?o-1:0},_T=function(t,a,n,o){for(var i=t.itemCount,s=1;n<i&&la(t,n,a).offset<o;)n+=s,s*=2;return Ru(t,a,Math.min(n,i-1),Math.floor(n/2),o)},El=function(t,a){var n=t.itemCount,o=a.itemMetadataMap,i=a.estimatedItemSize,s=a.lastMeasuredIndex,r=0;if(s>=n&&(s=n-1),s>=0){var l=o[s];r=l.offset+l.size}var d=n-s-1,u=d*i;return r+u},LT=xu({getItemOffset:function(t,a,n){return la(t,a,n).offset},getItemSize:function(t,a,n){return n.itemMetadataMap[a].size},getEstimatedTotalSize:El,getOffsetForIndexAndAlignment:function(t,a,n,o,i,s){var r=t.direction,l=t.height,d=t.layout,u=t.width,p=r==="horizontal"||d==="horizontal",m=p?u:l,k=la(t,a,i),g=El(t,i),b=Math.max(0,Math.min(g-m,k.offset)),y=Math.max(0,k.offset-m+k.size+s);switch(n==="smart"&&(o>=y-m&&o<=b+m?n="auto":n="center"),n){case"start":return b;case"end":return y;case"center":return Math.round(y+(b-y)/2);case"auto":default:return o>=y&&o<=b?o:o<y?y:b}},getStartIndexForOffset:function(t,a,n){return IT(t,n,a)},getStopIndexForStartIndex:function(t,a,n,o){for(var i=t.direction,s=t.height,r=t.itemCount,l=t.layout,d=t.width,u=i==="horizontal"||l==="horizontal",p=u?d:s,m=la(t,a,o),k=n+p,g=m.offset+m.size,b=a;b<r-1&&g<k;)b++,g+=la(t,b,o).size;return b},initInstanceProps:function(t,a){var n=t,o=n.estimatedItemSize,i={itemMetadataMap:{},estimatedItemSize:o||RT,lastMeasuredIndex:-1};return a.resetAfterIndex=function(s,r){r===void 0&&(r=!0),i.lastMeasuredIndex=Math.min(i.lastMeasuredIndex,s-1),a._getItemStyleCache(-1),r&&a.forceUpdate()},i},shouldResetStyleCacheOnItemSizeChange:!1,validateProps:function(t){t.itemSize}}),ZO=xu({getItemOffset:function(t,a){var n=t.itemSize;return a*n},getItemSize:function(t,a){var n=t.itemSize;return n},getEstimatedTotalSize:function(t){var a=t.itemCount,n=t.itemSize;return n*a},getOffsetForIndexAndAlignment:function(t,a,n,o,i,s){var r=t.direction,l=t.height,d=t.itemCount,u=t.itemSize,p=t.layout,m=t.width,k=r==="horizontal"||p==="horizontal",g=k?m:l,b=Math.max(0,d*u-g),y=Math.min(b,a*u),T=Math.max(0,a*u-g+u+s);switch(n==="smart"&&(o>=T-g&&o<=y+g?n="auto":n="center"),n){case"start":return y;case"end":return T;case"center":{var S=Math.round(T+(y-T)/2);return S<Math.ceil(g/2)?0:S>b+Math.floor(g/2)?b:S}case"auto":default:return o>=T&&o<=y?o:o<T?T:y}},getStartIndexForOffset:function(t,a){var n=t.itemCount,o=t.itemSize;return Math.max(0,Math.min(n-1,Math.floor(a/o)))},getStopIndexForStartIndex:function(t,a,n){var o=t.direction,i=t.height,s=t.itemCount,r=t.itemSize,l=t.layout,d=t.width,u=o==="horizontal"||l==="horizontal",p=a*r,m=u?d:i,k=Math.ceil((m+n-p)/r);return Math.max(0,Math.min(s-1,a+k-1))},initInstanceProps:function(t){},shouldResetStyleCacheOnItemSizeChange:!0,validateProps:function(t){t.itemSize}});const Iu={dingtalk:"https://gw.alicdn.com/imgextra/i4/O1CN01g1u9vB1KdEreWzDdv_!!6000000001186-2-tps-400-400.png",voice:"https://gw.alicdn.com/imgextra/i1/O1CN016SJ9AO1SpA6L3j0KH_!!6000000002295-2-tps-400-400.png",sip:"https://gw.alicdn.com/imgextra/i1/O1CN016SJ9AO1SpA6L3j0KH_!!6000000002295-2-tps-400-400.png",qq:"https://gw.alicdn.com/imgextra/i3/O1CN014wGNgd27PsTzAyrcj_!!6000000007790-2-tps-400-400.png",feishu:"https://gw.alicdn.com/imgextra/i4/O1CN01jsn08m225euyUoaFN_!!6000000007069-2-tps-400-400.png",xiaoyi:"https://gw.alicdn.com/imgextra/i1/O1CN01EPS9Z81OKh
10IEcwpCd_!!6000000001687-2-tps-476-476.png",telegram:"https://gw.alicdn.com/imgextra/i2/O1CN0100jIva25Dqqq1VqJN_!!6000000007493-2-tps-400-400.png",slack:"https://gw.alicdn.com/imgextra/i2/O1CN01JcOK7v1GqHhRjG0fy_!!6000000000673-2-tps-512-512.png",mqtt:"https://gw.alicdn.com/imgextra/i2/O1CN0117Adu3282o9G5ZNCd_!!6000000007875-2-tps-400-400.png",imessage:"https://gw.alicdn.com/imgextra/i1/O1CN016pwG4m1uEntwJKsGl_!!6000000006006-2-tps-400-400.png",discord:"https://gw.alicdn.com/imgextra/i4/O1CN01BQFnBu21PWTtKbPmU_!!6000000006977-2-tps-400-400.png",mattermost:"https://gw.alicdn.com/imgextra/i2/O1CN01A2bvSh1eVig4fDBEF_!!6000000003877-2-tps-400-400.png",matrix:"https://gw.alicdn.com/imgextra/i2/O1CN01Q8i1P826mUQG4dCAs_!!6000000007704-2-tps-400-400.png",console:"https://gw.alicdn.com/imgextra/i3/O1CN01L3azqd1XIi7O2jumZ_!!6000000002901-2-tps-400-400.png",wecom:"https://gw.alicdn.com/imgextra/i1/O1CN01HWtzmr1hkK9beQICJ_!!6000000004315-2-tps-400-400.png",wechat:"https://gw.alicdn.com/imgextra/i4/O1CN01GsAob11fkfDWVIb3R_!!6000000004045-2-tps-400-400.png",onebot:"https://gw.alicdn.com/imgextra/i3/O1CN01xqM0EN1oKrRiAFX3K_!!6000000005207-2-tps-400-400.png",yuanbao:"https://img.alicdn.com/imgextra/i4/O1CN0164yBmJ1a2AftSglge_!!6000000003271-2-tps-225-225.png"},_u="https://gw.alicdn.com/imgextra/i3/O1CN01xqM0EN1oKrRiAFX3K_!!6000000005207-2-tps-400-400.png";function Lu(e){return Iu[e]??_u}const Fl={console:"#FF7F16",onebot:"#6ECB63",dingtalk:"#3370FF",feishu:"#3370FF",qq:"#12B7F5",telegram:"#2AABEE",slack:"#4A154B",discord:"#5865F2",wecom:"#07C160",wechat:"#07C160",mqtt:"#660066",mattermost:"#0058CC",matrix:"#0DBD8B",imessage:"#34C759",voice:"#F44336",xiaoyi:"#CF1322",yuanbao:"#1677FF"},Ol=["#FF6B6B","#4ECDC4","#45B7D1","#96CEB4","#FFEAA7","#DDA0DD","#98D8C8","#F7DC6F","#BB8FCE","#85C1E9","#F0B27A","#82E0AA"];function Eu(e){if(Fl[e])return Fl[e];let t=0;for(let a=0;a<e.length;a++)t=(t<<5)-t+e.charCodeAt(a)|0;return Ol[Math.abs(t)%Ol.length]}function Fu(e){return e.charAt(0).toUpperCase()}const ET=Object.freeze(Object.defineProperty({__proto__:null,CHANNEL_DEFAULT_ICON_URL:_u,CHANNEL_ICON_URLS:Iu,getChannelIconUrl:Lu,getChannelLetter:Fu,getChannelLetterColor:Eu},Symbol.toStringTag,{value:"Module"}));function FT(e){return!!e&&/^https?:\/\//i.test(e.trim())}const ba=({channelKey:e,size:t=32,iconUrl:a})=>{const n=FT(a)?a.trim():Lu(e),[o,i]=h.useState(!1),s=t*.25;if(n&&!o)return c.jsx("img",{src:n,alt:e,width:t,height:t,style:{borderRadius:s,objectFit:"cover",flexShrink:0},onError:()=>i(!0)});const r=Eu(e),l=Fu(e),d=t*.45;return c.jsx("div",{style:{width:t,height:t,borderRadius:s,backgroundColor:r,display:"flex",alignItems:"center",justifyContent:"center",color:"#fff",fontSize:d,fontWeight:600,fontFamily:"Inter, sans-serif",userSelect:"none",flexShrink:0},title:e,children:l})},OT=Object.freeze(Object.defineProperty({__proto__:null,ChannelIcon:ba},Symbol.toStringTag,{value:"Module"})),Ou={imessage:"iMessage",discord:"Discord",dingtalk:"DingTalk",feishu:"Feishu",qq:"QQ",telegram:"Telegram",slack:"Slack",mqtt:"MQTT",mattermost:"Mattermost",matrix:"Matrix",console:"Console",voice:"Twilio",sip:"SIP",wecom:"WeCom",xiaoyi:"XiaoYi",wechat:"WeChat",onebot:"OneBot",yuanbao:"Yuanbao"};function BT(e){return e.split(/[_-]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function Pt(e,t){const a=Ou[e]??BT(e);return t?t(`channels.channelNames.${e}`,{defaultValue:a}):a}const NT=new Set(["localhost"]),HT=/^127(\.\d{1,3}){3}$/,UT=/^(?:0*:)+0*1$/;function qT(e){const t=(e??"").trim().replace(/^\[|\]$/g,"").toLowerCase().replace(/\.$/,"");return t?NT.has(t)||HT.test(t)?!0:UT.test(t):!1}const jT=Object.freeze(Object.defineProperty({__proto__:null,CHANNEL_LABELS:Ou,getChannelLabel:Pt,isLoopbackHost:qT},Symbol.toStringTag,{value:"Module"})),GT="index-module__channelsPage__KERMS",VT="index-module__channelsContainer__BoHET",WT="index-module__pageHeader__huiqN",zT="index-module__filterTabs__lX95I",KT="index-module__filterTab__SwLOb",$T="index-module__filterTabActive__iHpOI",QT="index-module__loading__NCm2R",JT="index-module__loadingText__JovP-",YT="index-module__channelsGrid__i5OVf",XT="index-module__panelSection__Ebs6X",ZT="index-module__panelSectionDashed__11i31",eS="index-module__panelTitle__qs5m4",tS="index-module__panelDotGreen__nAAk6",aS="index-module__panelDotGray__qkFkV",nS="index-module__panelCount__z9eaz",oS="index-module__emptyConfigured__a5exQ",iS="index-module__availableGrid__UBOlC",sS="index-module__availableItem__CoyUX",rS="index-module__availableItemAction__Et-aH",lS="index-module__availableItemName__OJ3-I",dS="index-module__channelCard__a6OxB",cS="index-module__hover__UPifS",uS="index-module__cardTopSection__uQ2Up",pS="index-module__channelIcon__rXEaM",mS="index-module__statusIndicator__HmsOM",hS="index-module__statusText__aFTXL",gS="index-module__enabled__o157g",fS="index-module__disabled__C1DI1",bS="index-module__statusDot__0b9lX",kS="index-module__cardMiddleSection__2gsbi",yS="index-module__cardTitle__pNukR",vS="index-module__builtinTag__PtIKs",TS="index-module__customTag__-bNQF",SS="index-module__cardBottomSection__HHaYT",CS="index-module__cardDescription__-oM4i",wS="index-module__drawerTitle__cfLmt",PS="index-module__dingtalkDocBtn__eFV-V",AS="index-module__formActions__Iz42x",MS="index-module__formTopActions__l9JQy",DS="index-module__normal__SH6vm",xS="index-module__schemaDescription__32goL",ue={channelsPage:GT,channelsContainer:VT,pageHeader:WT,filterTabs:zT,filterTab:KT,filterTabActive:$T,loading:QT,loadingText:JT,channelsGrid:YT,panelSection:XT,panelSectionDashed:ZT,panelTitle:eS,panelDotGreen:tS,panelDotGray:aS,panelCount:nS,emptyConfigured:oS,availableGrid:iS,availableItem:sS,availableItemAction:rS,availableItemName:lS,channelCard:dS,hover:cS,cardTopSection:uS,channelIcon:pS,statusIndicator:mS,statusText:hS,enabled:gS,disabled:fS,statusDot:bS,cardMiddleSection:kS,cardTitle:yS,builtinTag:vS,customTag:TS,cardBottomSection:SS,cardDescription:CS,drawerTitle:wS,dingtalkDocBtn:PS,formActions:AS,formTopActions:MS,normal:DS,schemaDescription:xS}
10,RS=Ne.memo(function({channelKey:t,config:a,onClick:n,iconUrl:o}){const{t:i}=ve(),[s,r]=h.useState(!1),l=!!a.enabled,d=!!a.isBuiltin,u=Pt(t,i),m=(b=>typeof a[b]=="string"?a[b]:"")("bot_prefix"),k=()=>c.jsx(ba,{channelKey:t,size:32,iconUrl:o}),g=()=>s?`${ue.channelCard} ${ue.hover}`:l?`${ue.channelCard} ${ue.enabled}`:`${ue.channelCard} ${ue.normal}`;return c.jsxs(hm,{hoverable:!0,onClick:n,onMouseEnter:()=>r(!0),onMouseLeave:()=>r(!1),className:g(),bodyStyle:{padding:24},children:[c.jsxs("div",{className:ue.cardTopSection,children:[c.jsx("div",{className:ue.channelIcon,children:k()}),c.jsxs("div",{className:ue.statusIndicator,children:[c.jsx("div",{className:`${ue.statusDot} ${l?ue.enabled:ue.disabled}`}),c.jsx("span",{className:`${ue.statusText} ${l?ue.enabled:ue.disabled}`,children:i(l?"common.enabled":"common.disabled")})]})]}),c.jsxs("div",{className:ue.cardMiddleSection,children:[c.jsx("div",{className:ue.cardTitle,children:u}),d?c.jsx("span",{className:ue.builtinTag,children:i("channels.builtin")}):c.jsx("span",{className:ue.customTag,children:i("channels.custom")})]}),c.jsx("div",{className:ue.cardBottomSection,children:c.jsxs("div",{className:ue.cardDescription,children:[i("channels.botPrefix"),": ",m||i("channels.notSet")]})})]})}),IS=Object.freeze(Object.defineProperty({__proto__:null,ChannelCard:RS},Symbol.toStringTag,{value:"Module"})),Bu="qwenpaw-theme",Nu=h.createContext({themeMode:"light",isDark:!1,setThemeMode:()=>{},toggleTheme:()=>{}});function Bl(){try{const e=localStorage.getItem(Bu);if(e==="light"||e==="dark"||e==="system")return e}catch{}return"system"}function Nl(e){var t;return e==="dark"?!0:e==="light"?!1:((t=window.matchMedia)==null?void 0:t.call(window,"(prefers-color-scheme: dark)").matches)??!1}function _S({children:e}){const[t,a]=h.useState(Bl),[n,o]=h.useState(()=>Nl(Bl()));h.useEffect(()=>{const r=document.documentElement;n?r.classList.add("dark-mode"):r.classList.remove("dark-mode")},[n]),h.useEffect(()=>{if(t!=="system")return;const r=window.matchMedia("(prefers-color-scheme: dark)"),l=d=>{o(d.matches)};return r.addEventListener("change",l),()=>r.removeEventListener("change",l)},[t]);const i=h.useCallback(r=>{a(r),o(Nl(r));try{localStorage.setItem(Bu,r)}catch{}},[]),s=h.useCallback(()=>{i(n?"light":"dark")},[n,i]);return c.jsx(Nu.Provider,{value:{themeMode:t,isDark:n,setThemeMode:i,toggleTheme:s},children:e})}function un(){return h.useContext(Nu)}const LS={readRoot:()=>v("/"),getVersion:e=>v("/version",{signal:e})},ES={getACPConfig:()=>v("/config/acp"),getACPNodeRuntime:()=>v("/config/acp/node-runtime"),getACPAgentConfig:e=>v(`/config/acp/${encodeURIComponent(e)}`),updateACPConfig:e=>v("/config/acp",{method:"PUT",body:JSON.stringify(e)}),updateACPNodeRuntime:e=>v("/config/acp/node-runtime",{method:"PUT",body:JSON.stringify(e)}),updateACPAgentConfig:(e,t)=>v(`/config/acp/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(t)})},FS={listChannelTypes:()=>v("/config/channels/types"),listChannels:()=>v("/config/channels"),listChannelSchemas:()=>v("/config/channels/schemas"),updateChannels:e=>v("/config/channels",{method:"PUT",body:JSON.stringify(e)}),getChannelConfig:e=>v(`/config/channels/${encodeURIComponent(e)}`),updateChannelConfig:(e,t)=>v(`/config/channels/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(t)}),checkChannelConflict:(e,t)=>v(`/config/channels/${encodeURIComponent(e)}/conflict-check`,{method:"POST",body:JSON.stringify(t)}),getChannelQrcode:(e,t)=>{const a=t?"?"+new URLSearchParams(t).toString():"";return v(`/config/channels/${encodeURIComponent(e)}/qrcode${a}`)},getChannelQrcodeStatus:(e,t,a)=>{const n=a?"&"+new URLSearchParams(a).toString():"";return v(`/config/channels/${encodeURIComponent(e)}/qrcode/status?token=${encodeURIComponent(t)}${n}`)}},OS={getHeartbeatConfig:()=>v("/config/heartbeat"),updateHeartbeatConfig:e=>v("/config/heartbeat",{method:"PUT",body:JSON.stringify(e)}),runHeartbeatNow:()=>v("/config/heartbeat/run",{method:"POST"})},BS={listCronJobs:()=>v("/cron/jobs"),createCronJob:e=>v("/cron/jobs",{method:"POST",body:JSON.stringify(e)}),getCronJob:e=>v(`/cron/jobs/${encodeURIComponent(e)}`),replaceCronJob:(e,t)=>
10v(`/cron/jobs/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(t)}),deleteCronJob:e=>v(`/cron/jobs/${encodeURIComponent(e)}`,{method:"DELETE"}),pauseCronJob:e=>v(`/cron/jobs/${encodeURIComponent(e)}/pause`,{method:"POST"}),resumeCronJob:e=>v(`/cron/jobs/${encodeURIComponent(e)}/resume`,{method:"POST"}),runCronJob:e=>v(`/cron/jobs/${encodeURIComponent(e)}/run`,{method:"POST"}),triggerCronJob:e=>v(`/cron/jobs/${encodeURIComponent(e)}/run`,{method:"POST"}),getCronJobState:e=>v(`/cron/jobs/${encodeURIComponent(e)}/state`),getCronJobHistory:e=>v(`/cron/jobs/${encodeURIComponent(e)}/history`),listCronDispatchTargets:e=>{const t=new URLSearchParams;e!=null&&e.channel&&t.append("channel",e.channel),e!=null&&e.keyword&&t.append("keyword",e.keyword);const a=t.toString();return v(`/cron/dispatch-targets${a?`?${a}`:""}`)}},NS="/files/preview",_e={uploadFile:async e=>{const t=new FormData;t.append("file",e);const a=await fetch(ee("/console/upload"),{method:"POST",headers:xe(),body:t});if(!a.ok){const n=await a.text().catch(()=>"");throw new Error(`Upload failed: ${a.status} ${a.statusText}${n?` - ${n}`:""}`)}return a.json()},filePreviewUrl:e=>{if(!e)return"";if(e.startsWith("http://")||e.startsWith("https://"))return e;let t=e.replace(/^\/+/,"");const a=`${NS}/${t}`,n=ee(a),o=Sa();return o?`${n}?token=${encodeURIComponent(o)}`:n},listChats:e=>{const t=new URLSearchParams;e!=null&&e.user_id&&t.append("user_id",e.user_id),e!=null&&e.channel&&t.append("channel",e.channel),(e==null?void 0:e.archived)!==void 0&&t.append("archived",String(e.archived)),(e==null?void 0:e.include_app_owned)!==void 0&&t.append("include_app_owned",String(e.include_app_owned));const a=t.toString();return v(`/chats${a?`?${a}`:""}`)},createChat:e=>v("/chats",{method:"POST",body:JSON.stringify(e)}),getChat:(e,t)=>{const a=new URLSearchParams;(t==null?void 0:t.include_app_owned)!==void 0&&a.append("include_app_owned",String(t.include_app_owned));const n=a.toString();return v(`/chats/${encodeURIComponent(e)}${n?`?${n}`:""}`,{signal:t==null?void 0:t.signal})},updateChat:(e,t)=>v(`/chats/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(t)}),deleteChat:e=>v(`/chats/${encodeURIComponent(e)}`,{method:"DELETE"}),batchDeleteChats:e=>v("/chats/batch-delete",{method:"POST",body:JSON.stringify(e)}),archiveChat:e=>v(`/chats/${encodeURIComponent(e)}/archive`,{method:"POST"}),unarchiveChat:e=>v(`/chats/${encodeURIComponent(e)}/unarchive`,{method:"POST"}),batchArchiveChats:e=>v("/chats/actions/batch-archive",{method:"POST",body:JSON.stringify({chat_ids:e})}),batchUnarchiveChats:e=>v("/chats/actions/batch-unarchive",{method:"POST",body:JSON.stringify({chat_ids:e})}),listGroups:()=>v("/chats/groups"),createGroup:e=>v("/chats/groups",{method:"POST",body:JSON.stringify({name:e})}),updateGroup:(e,t)=>v(`/chats/groups/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(t)}),reorderGroups:e=>v("/chats/groups/order",{method:"PUT",body:JSON.stringify({group_ids:e})}),deleteGroup:e=>v(`/chats/groups/${encodeURIComponent(e)}`,{method:"DELETE"}),stopChat:e=>v(`/console/chat/stop?chat_id=${encodeURIComponent(e)}`,{method:"POST"})},HS={listSessions:e=>{const t=new URLSearchParams;e!=null&&e.user_id&&t.append("user_id",e.user_id),e!=null&&e.channel&&t.append("channel",e.channel);const a=t.toString();return v(`/chats${a?`?${a}`:""}`)},getSession:e=>v(`/chats/${encodeURIComponent(e)}`),deleteSession:e=>v(`/chats/${encodeURIComponent(e)}`,{method:"DELETE"}),createSession:e=>v("/chats",{method:"POST",body:JSON.stringify(e)}),updateSession:(e,t)=>v(`/chats/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(t)}),batchDeleteSessions:e=>v("/chats/batch-delete",{method:"POST",body:JSON.stringify(e)})},US={listEnvs:()=>v("/envs"),listEnvCatalog:()=>v("/envs/catalog"),patchEnvs:e=>v("/envs",{method:"PATCH",body:JSON.stringify(e)}),saveEnvs:e=>v("/envs",{method:"PUT",body:JSON.stringify(e)}),deleteEnv:e=>v(`/envs/${encodeURIComponent(e)}`,{method:"DELETE"}),resetEnv:e=>v(`/envs/${encodeURIComponent(e)}/reset`,{method:"POST"})};function qS(e){if(!(e!=null&&e.scope)&&!(e!=null&&e.agent_id))return"/models/active";const t=new URLSearchParams;return e.scope&&t.set("scope",e.scope),e.agent_id&&t.set("agent_id",e.agent_id),`/models/active?${t.toString()}`}let Ra=null;const wn=new Map,jS={listProviders:()=>Ra||(Ra=v("/models").finally(()=>{Ra=null}),Ra),configureProvider:(e,t)=>v(`/models/${encodeURIComponent(e)}/config`,{method:"PUT",body:JSON.stringify(t)}),getActiveModels:e=>{const t=qS(e),a=wn.get(t);if(a)return a;const n=v(t).finally(()=>{wn.delete(t)});return wn.set(t,n),n}
10,setActiveLlm:e=>v("/models/active",{method:"PUT",body:JSON.stringify(e)}).then(t=>(wn.clear(),t)),createCustomProvider:e=>v("/models/custom-providers",{method:"POST",body:JSON.stringify(e)}),deleteCustomProvider:e=>v(`/models/custom-providers/${encodeURIComponent(e)}`,{method:"DELETE"}),addModel:(e,t)=>v(`/models/${encodeURIComponent(e)}/models`,{method:"POST",body:JSON.stringify(t)}),removeModel:(e,t)=>v(`/models/${encodeURIComponent(e)}/models/${encodeURIComponent(t)}`,{method:"DELETE"}),setModelVisibility:(e,t,a)=>v(`/models/${encodeURIComponent(e)}/models/${encodeURIComponent(t)}/visibility`,{method:"PUT",body:JSON.stringify({hidden:a})}),configureModel:(e,t,a)=>v(`/models/${encodeURIComponent(e)}/models/${encodeURIComponent(t)}/config`,{method:"PUT",body:JSON.stringify(a)}),configureLocalModelSettings:e=>v("/local-models/config",{method:"PUT",body:JSON.stringify(e)}),getLocalModelConfig:()=>v("/local-models/config"),testProviderConnection:(e,t)=>v(`/models/${encodeURIComponent(e)}/test`,{method:"POST",body:t?JSON.stringify(t):void 0}),testModelConnection:(e,t)=>v(`/models/${encodeURIComponent(e)}/models/test`,{method:"POST",body:JSON.stringify(t)}),discoverModels:(e,t,a=!0)=>{const n=new URL(`/models/${encodeURIComponent(e)}/discover`,window.location.origin);return n.searchParams.set("save",a.toString()),v(n.pathname+n.search,{method:"POST",body:t?JSON.stringify(t):void 0})},probeMultimodal:(e,t)=>v(`/models/${encodeURIComponent(e)}/models/${encodeURIComponent(t)}/probe-multimodal`,{method:"POST"}),getOpenRouterSeries:()=>v("/models/openrouter/series"),discoverOpenRouterExtended:e=>v("/models/openrouter/discover-extended",{method:"POST",body:e?JSON.stringify(e):void 0}),filterOpenRouterModels:e=>v("/models/openrouter/models/filter",{method:"POST",body:JSON.stringify(e)}),startOAuth:e=>v(`/providers/${encodeURIComponent(e)}/oauth/start`,{method:"POST"}),getOAuthStatus:(e,t)=>v(`/providers/${encodeURIComponent(e)}/oauth/status?state=${encodeURIComponent(t)}`)},GS={listMarketProviders:()=>v("/market/providers"),listMarketCategories:e=>v(`/market/categories?lang=${encodeURIComponent(e)}`),searchMarket:e=>v("/market/search",{method:"POST",body:JSON.stringify(e)})},VS=3e4,yt=new Map;function Pn(e){const t=yt.get(e);return t?Date.now()-t.timestamp>VS?(yt.delete(e),null):t.data:null}function aa(e,t){yt.set(e,{data:t,timestamp:Date.now()})}function eB(e){for(const t of Array.from(yt.keys()))if(t.startsWith("/skills")){if(!e){yt.delete(t);continue}(e.pool&&(t==="/skills/pool"||t.startsWith("/skills/pool/"))||e.workspaces&&t==="/skills/workspaces"||e.agentId&&t===`/skills?agent=${e.agentId}`||e.agentId&&t==="/skills")&&yt.delete(t)}}function WS(){return"/api"}async function Hl(e,t,a){const n=new FormData;n.append("file",t);const o=new URLSearchParams;(a==null?void 0:a.enable)!==void 0&&o.set("enable",String(a.enable)),a!=null&&a.target_name&&o.set("target_name",a.target_name),a!=null&&a.rename_map&&Object.keys(a.rename_map).length&&o.set("rename_map",JSON.stringify(a.rename_map));const i=o.toString(),s=ee(`${e}${i?`?${i}`:""}`),r=xe(),l=await fetch(s,{method:"POST",headers:r,body:n});if(!l.ok){const d=await l.text();throw(l.headers.get("content-type")||"").includes("application/json")?new Error(`${l.status} ${l.statusText} - ${d}`):new Error(d||`Request failed: ${l.status}`)}return await l.json()}const zS={listSkills:async e=>{const t=`/skills${e?`?agent=${e}`:""}`,a=Pn(t);if(a)return a;const n={};e&&(n.headers=new Headers({"X-Agent-Id":e}));const o=await v("/skills",n);return aa(t,o),o},listSkillWorkspaces:async()=>{const e="/skills/workspaces",t=Pn(e);if(t)return t;const a=await v("/skills/workspaces");return aa(e,a),a},listSkillPoolSkills:async()=>{const e="/skills/pool",t=Pn(e);if(t)return t;const a=await v("/skills/pool");if(!Array.isArray(a))throw new Error(`Expected array from /skills/pool but got ${typeof a}`);return aa(e,a),a},getSkill:(e,t)=>{const a={};return t&&(a.headers=new Headers({"X-Agent-Id":t})),v(`/skills/${encodeURIComponent(e)}`,a)},getPoolSkill:e=>v(`/skills/pool/${encodeURIComponent(e)}`),refreshSkills:async e=>{const t={method:"POST"};e&&(t.headers=new Headers({"X-Agent-Id":e}));const a=await v("/skills/refresh",t),n=`/skills${e?`?agent=${e}`:""}`;return aa(n,a),a},refreshSkillPool:async()=>{const e=await v("/skills/pool/refresh",{method:"POST"});if(!Array.isArray(e))throw new Error(`Expected array from /skills/pool/refresh but got ${typeof e}`);return aa("/skills/pool",e),e},searchHubSkills:(e,t=20)=>v(`/skills/hub/search?q=${encodeURIComponent(e)}&limit=${t}`),createSkill:(e,t,a,n)=>v("/skills",{method:"POST",body:JSON.stringify({name:e,content:t,config:a,enable:n})}),saveSkill:e=>v("/skills/save",{method:"PUT",body:JSON.stringify(e)}),createSkillPoolSkill:e=>v("/skills/pool/create",{method:"POST",body:JSON.stringify(e)}),saveSkillPoolSkill:e=>v("/skills/pool/save",{method:"PUT",body:JSON.stringify(e)}),enableSkill:e=>v(`/skills/${encodeURIComponent(e)}/enable`,{method:"POST"}),disableSkill:e=>v(`/skills/${encodeURIComponent(e)}/disable`,{method:"POST"}),batchEnableSkills:e=>v("/skills/batch-enable",{method:"POST",body:JSON.stringify(e)}),batchDisableSkills:e=>v("/skills/batch-disable",{method:"POST",body:JSON.stringify(e)}),batchDeleteSkills:e=>v("/skills/batch-delete",{method:"POST",body:JSON.stringify(e)}
10),batchDeletePoolSkills:e=>v("/skills/pool/batch-delete",{method:"POST",body:JSON.stringify(e)}),deleteSkill:e=>v(`/skills/${encodeURIComponent(e)}`,{method:"DELETE"}),startHubSkillInstall:(e,t)=>{const a=t?new Headers({"X-Agent-Id":t}):void 0;return v("/skills/hub/install/start",{method:"POST",headers:a,body:JSON.stringify(e)})},importPoolSkillFromHub:e=>v("/skills/pool/import",{method:"POST",body:JSON.stringify(e)}),getHubSkillInstallStatus:(e,t)=>{const a=t?new Headers({"X-Agent-Id":t}):void 0;return v(`/skills/hub/install/status/${encodeURIComponent(e)}`,{headers:a})},cancelHubSkillInstall:(e,t)=>{const a=t?new Headers({"X-Agent-Id":t}):void 0;return v(`/skills/hub/install/cancel/${encodeURIComponent(e)}`,{method:"POST",headers:a})},listPoolBuiltinSources:()=>v("/skills/pool/builtin-sources"),getPoolBuiltinNotice:async()=>{const e="/skills/pool/builtin-notice",t=Pn(e);if(t)return t;const a=await v("/skills/pool/builtin-notice");return aa(e,a),a},importSelectedPoolBuiltins:e=>v("/skills/pool/import-builtin",{method:"POST",body:JSON.stringify(e)}),updatePoolBuiltin:(e,t)=>v(`/skills/pool/${encodeURIComponent(e)}/update-builtin`,{method:"POST",body:JSON.stringify({language:t})}),deleteSkillPoolSkill:e=>v(`/skills/pool/${encodeURIComponent(e)}`,{method:"DELETE"}),uploadWorkspaceSkillToPool:e=>v("/skills/pool/upload",{method:"POST",body:JSON.stringify(e)}),downloadSkillPoolSkill:e=>v("/skills/pool/download",{method:"POST",body:JSON.stringify(e)}),updateSkillChannels:(e,t)=>v(`/skills/${encodeURIComponent(e)}/channels`,{method:"PUT",body:JSON.stringify(t)}),updateSkillPreload:(e,t)=>v(`/skills/${encodeURIComponent(e)}/preload`,{method:"PUT",body:JSON.stringify({preload:t})}),updateSkillTags:(e,t)=>v(`/skills/${encodeURIComponent(e)}/tags`,{method:"PUT",body:JSON.stringify(t)}),updatePoolSkillTags:(e,t)=>v(`/skills/pool/${encodeURIComponent(e)}/tags`,{method:"PUT",body:JSON.stringify(t)}),updatePoolSkillAutoSync:(e,t)=>v(`/skills/pool/${encodeURIComponent(e)}/auto-sync`,{method:"PUT",body:JSON.stringify(t)}),updatePoolSkillAutomation:(e,t)=>v(`/skills/pool/${encodeURIComponent(e)}/automation`,{method:"PUT",body:JSON.stringify(t)}),streamOptimizeSkill:async function(e,t,a,n="en"){var d;const o=WS(),i=await fetch(`${o}/skills/ai/optimize/stream`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:e,language:n}),signal:a});if(!i.ok)throw new Error(`HTTP error! status: ${i.status}`);const s=(d=i.body)==null?void 0:d.getReader();if(!s)throw new Error("No reader available");const r=new TextDecoder;let l="";try{for(;;){const{done:u,value:p}=await s.read();if(u)break;l+=r.decode(p,{stream:!0});const m=l.split(`
11`);for(let k=0;k<m.length-1;k++){const g=m[k].trim();if(g.startsWith("data: ")){const b=g.slice(6);try{const y=JSON.parse(b);if(y.text)t(y.text);else{if(y.error)throw new Error(y.error);if(y.done)return}}catch{}}}l=m[m.length-1]}}finally{s.releaseLock()}},uploadSkill:(e,t)=>Hl("/skills/upload",e,t),uploadSkillPoolZip:(e,t)=>Hl("/skills/pool/upload-zip",e,t)};class KS extends Error{constructor(a,n,o){super(`Transcription failed: ${a} ${n}`);V(this,"status");V(this,"code");this.name="TranscriptionError",this.status=a,this.code=o}}const $S={agentRoot:()=>v("/agent/"),healthCheck:()=>v("/agent/health"),agentApi:e=>v("/console/chat",{method:"POST",body:JSON.stringify(e)}),getProcessStatus:()=>v("/agent/admin/status"),shutdownSimple:()=>v("/agent/shutdown",{method:"POST"}),shutdown:()=>v("/agent/admin/shutdown",{method:"POST"}),getAgentRunningConfig:()=>v("/workspace/running-config"),updateAgentRunningConfig:e=>v("/workspace/running-config",{method:"PUT",body:JSON.stringify(e),timeout:600*1e3}),testEmbedding:e=>v("/workspace/embedding/test",{method:"POST",body:JSON.stringify(e),timeout:Math.max(30,(e.health_check_timeout??15)*2+5)*1e3}),getAgentLanguage:()=>v("/workspace/language"),updateAgentLanguage:e=>v("/workspace/language",{method:"PUT",body:JSON.stringify({language:e})}),getAudioMode:()=>v("/workspace/audio-mode"),updateAudioMode:e=>v("/workspace/audio-mode",{method:"PUT",body:JSON.stringify({audio_mode:e})}),getTranscriptionProviders:()=>v("/workspace/transcription-providers"),updateTranscriptionProvider:e=>v("/workspace/transcription-provider",{method:"PUT",body:JSON.stringify({provider_id:e})}),getTranscriptionProviderType:()=>v("/workspace/transcription-provider-type"),updateTranscriptionProviderType:e=>v("/workspace/transcription-provider-type",{method:"PUT",body:JSON.stringify({transcription_provider_type:e})}),getLocalWhisperStatus:()=>v("/workspace/local-whisper-status"),transcribeAudio:async e=>{const t=new FormData;t.append("file",e);const a=await fetch(ee("/workspace/transcribe"),{method:"POST",headers:xe(),body:t});if(!a.ok){let n=a.statusText,o;try{const i=await a.json();typeof(i==null?void 0:i.detail)=="object"&&i.detail!==null?(o=i.detail.code,n=i.detail.message||n):typeof(i==null?void 0:i.detail)=="string"&&(n=i.detail)}catch{}throw new KS(a.status,n,o)}return a.json()}},QS=50,Ul=ft((e,t)=>
11({entries:new Map,counter:0,get:a=>{const n=t().entries.get(a);if(n)return n.touchedAt=++t().counter,n},set:(a,n,o)=>{e(i=>{const s=new Map(i.entries),r=i.counter+1;if(s.set(a,{content:n,etag:o,touchedAt:r}),s.size>QS){let l=null,d=1/0;for(const[u,p]of s)p.touchedAt<d&&(d=p.touchedAt,l=u);l!==null&&s.delete(l)}return{entries:s,counter:r}})},invalidate:a=>{e(n=>{if(!n.entries.has(a))return n;const o=new Map(n.entries);return o.delete(a),{entries:o}})},clear:()=>e({entries:new Map,counter:0})}));function JS(e,t=!1){return window.__TAURI_INTERNALS__.transformCallback(e,t)}async function Fe(e,t={},a){return window.__TAURI_INTERNALS__.invoke(e,t,a)}function Is(){return!!(globalThis||window).isTauri}async function YS(e={}){return typeof e=="object"&&Object.freeze(e),await Fe("plugin:dialog|open",{options:e})}async function Hu(e={}){return typeof e=="object"&&Object.freeze(e),await Fe("plugin:dialog|save",{options:e})}const tB=Object.freeze(Object.defineProperty({__proto__:null,open:YS,save:Hu},Symbol.toStringTag,{value:"Module"}));function _s(){var e;return(e=window.pywebview)==null?void 0:e.api}const XS=/^[a-z][a-z\d+\-.]*:/i,Uu=new Set(["http:","https:"]),ZS=new Set(["http:","https:","mailto:","tel:"]),eC="open_external_link";function qu(e){return/^https?:\/\//i.test(e)}function ju(e){const t=e.trim();if(!t||t.startsWith("#"))return null;try{return XS.test(t)?t:new URL(t,window.location.origin).toString()}catch{return null}}function Gu(e){return new URL(e).protocol}function Vu(e){try{return qu(e)&&Uu.has(Gu(e))}catch{return!1}}function tC(e){try{const t=Gu(e);return Uu.has(t)?qu(e):ZS.has(t)}catch{return!1}}function Wu(e){const t=ju(e);return!t||!tC(t)?null:t}function Ls(){return Is()||aC()}function aC(){var e;return typeof window>"u"?!1:typeof((e=window.__TAURI_INTERNALS__)==null?void 0:e.invoke)=="function"}function nC(e){const t=_s();return t!=null&&t.open_external_link&&Vu(e)?"pywebview":Ls()?"tauri":"browser"}function Es(e,t="_blank",a="noopener,noreferrer"){var i,s;if(!e)return;const n=Wu(e);if(!n)return;switch(nC(n)){case"pywebview":{(s=(i=_s())==null?void 0:i.open_external_link)==null||s.call(i,n);return}case"tauri":{Fe(eC,{url:n}).catch(r=>{console.warn("[external-link] Tauri open command failed",r)});return}case"browser":window.open(n,t,a)}}class Fs extends Error{constructor(){super("Download cancelled"),this.name="DownloadCancelledError"}}function oC(e){var o;if(!e)return"";const t=e.match(/filename\*=UTF-8''([^;]+)/i);if(t!=null&&t[1])try{return decodeURIComponent(t[1])}catch{return t[1]}const a=e.match(/filename="([^"]+)"/i);if(a!=null&&a[1])return a[1];const n=e.match(/filename=([^;]+)/i);return((o=n==null?void 0:n[1])==null?void 0:o.trim())??""}function iC(e,t){const a=document.createElement("a"),n=URL.createObjectURL(e);a.href=n,a.download=t,document.body.appendChild(a),a.click(),setTimeout(()=>{URL.revokeObjectURL(n),a.remove()},0)}function zu(e){return e.replace(/[<>:"/\\|?*]/g,"_").trim().replace(/[. ]+$/g,"")||"download"}async function sC(e,t,a,n){const o=n.headers??{};if(!(Object.keys(o).length>0?await e(t,a,o):await e(t,a)))throw new Fs}async function rC(e){const t=await Hu({defaultPath:e});if(!t)throw new Fs;return t}async function lC(e,t,a){const n=await rC(t);try{await Fe("download_backend_file",{request:{url:e,filePath:n,headers:a.headers}})}catch(o){if(a.errorMessage){const i=new Error(a.errorMessage);throw i.cause=o,i}throw o}}async function dC(e,t,a){const n=await fetch(e,{headers:a.headers});if(!n.ok){const i=new Error(a.errorMessage||`Download failed: ${n.status}`);throw i.status=n.status,i}const o=a.preferResponseFilename?oC(n.headers.get("Content-Disposition")):"";iC(await n.blob(),o?zu(o):t)}async function Ku(e,t,a={}){var s;if(!e)throw new Error(a.errorMessage||"Download URL is empty");const n=ju(e);if(!n||!Vu(n))throw new Error(a.errorMessage||"Download URL is invalid");const o=zu(t),i=(s=_s())==null?void 0:s.save_file;if(i){await sC(i,n,o,a);return}if(Ls()){await lC(n,o,a);return}await dC(n,o,a)}function cC(){var e;try{const t=sessionStorage.getItem("qwenpaw-agent-storage")||localStorage.getItem("qwenpaw-agent-storage");if(t){const a=JSON.parse(t),n=(e=a==null?void 0:a.state)==null?void 0:e.selectedAgent;if(n)return n}}catch(t){console.warn("Failed to get selected agent from storage:",t)}return"default"}function uC(){const e=cC(),a=new Date().toISOString().replace(/[-:]/g,"").replace(/\..+/,"").replace("T","_").slice(0,15);return`qwenpaw_workspace_${e}_${a}.zip`}function An(e){return e.split("/").map(encodeURIComponent).join("/")}function lt(e,t){const a=new URLSearchParams;return Object.entries(t).forEach(([n,o])=>{o!==void 0&&a.set(n,String(o))}),`${e}?${a.toString()}`}function Ia(e,t){return{...xe(),...e?{"X-Chat-Id":e}:{},...!e&&t?{"X-Session-Project-Dir":t}:{}}}
11class pC extends Error{constructor(a){super("Upload contains conflicting filenames");V(this,"files");this.name="UploadConflictError",this.files=a}}const $u={listDirectory:(e="",t,a=200,n,o="project",i)=>v(lt("/workspace/tree",{path:e,cursor:t,limit:a,root:o}),{headers:Ia(n,i)}),getFileMetadata:(e,t,a="project",n)=>v(lt("/workspace/file-metadata",{path:e,root:a}),{headers:Ia(t,n)}),loadFileChunk:(e,t=0,a=256*1024,n,o="project",i)=>v(lt("/workspace/file-content",{path:e,offset:t,limit:a,root:o}),{headers:Ia(n,i)}),loadFileText:async(e,t,a="project",n)=>{for(let o=0;o<2;o+=1){const i=[];let s=0,r="",l=!1;for(;;){let d;try{d=await $u.loadFileChunk(e,s,256*1024,t,a,n)}catch(u){if(o===0){l=!0;break}throw u}if(!r)r=d.etag;else if(d.etag!==r){l=!0;break}if(i.push(d.content),d.eof)return{content:i.join(""),etag:r};if(d.next_offset<=s)throw new Error("Workspace file reader did not advance");s=d.next_offset}if(!l||o===1)throw new Error("Workspace file changed while it was being read")}throw new Error("Workspace file changed while it was being read")},saveFileContent:async(e,t,a,n,o="project",i)=>{const s=await fetch(ee(lt("/workspace/file-content",{path:e,root:o})),{method:"PUT",headers:{"Content-Type":"application/json",...Ia(n,i),...a?{"If-Match":a}:{}},body:JSON.stringify({content:t})});if(!s.ok)throw new Error(`Workspace save failed: ${s.status}`);return s.json()},getFileDownloadUrl:(e,t="project")=>ee(lt("/workspace/file-download",{path:e,root:t})),getHtmlFileUriUrl:(e,t="project")=>ee(lt("/workspace/html-file-uri",{path:e,root:t})),uploadFiles:async(e,t="",a,n,o="project",i)=>{var l;const s=new FormData;e.forEach(d=>s.append("files",d));const r=await fetch(ee(lt("/workspace/file-upload",{path:t,conflict:a,root:o})),{method:"POST",headers:Ia(n,i),body:s});if(r.status===409){const d=await r.json().catch(()=>null);if(((l=d==null?void 0:d.detail)==null?void 0:l.code)==="upload_conflict")throw new pC(Array.isArray(d.detail.files)?d.detail.files:[])}if(!r.ok)throw new Error(`File upload failed: ${r.status}`);return r.json()},listFiles:()=>v("/workspace/files").then(e=>e.map(t=>({...t,updated_at:new Date(t.modified_time).getTime()}))),loadFile:e=>
11v(`/workspace/files/${encodeURIComponent(e)}`),saveFile:(e,t)=>v(`/workspace/files/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify({content:t})}),downloadWorkspace:()=>Ku(ee("/workspace/download"),uC(),{headers:xe(),errorMessage:"Workspace download failed",preferResponseFilename:!0}),uploadFile:async e=>{const t=new FormData;t.append("file",e);const a=await fetch(ee("/workspace/upload"),{method:"POST",headers:xe(),body:t});if(!a.ok){const n=await a.text();throw new Error(`Upload failed: ${a.status} ${a.statusText} - ${n}`)}return await a.json()},listMemoryFiles:e=>v(lt("/workspace/memory",{section:e})),loadMemoryFile:(e,t)=>v(lt(`/workspace/memory/${An(e)}`,{section:t})),saveMemoryFile:(e,t,a)=>v(lt(`/workspace/memory/${An(e)}`,{section:a}),{method:"PUT",body:JSON.stringify({content:t})}),listDailyMemory:()=>v("/workspace/memory").then(e=>e.map(t=>{const n=(t.filename.split("/").pop()||t.filename).replace(".md","");return{...t,date:n,updated_at:new Date(t.modified_time).getTime()}})),loadDailyMemory:e=>v(`/workspace/memory/${An(e)}`),saveDailyMemory:(e,t)=>v(`/workspace/memory/${An(e)}`,{method:"PUT",body:JSON.stringify({content:t})}),getSystemPromptFiles:()=>v("/workspace/system-prompt-files"),setSystemPromptFiles:e=>v("/workspace/system-prompt-files",{method:"PUT",body:JSON.stringify(e)}),listCodeFiles:()=>v("/workspace/code-files").then(e=>e.map(t=>({...t,updated_at:new Date(t.modified_time).getTime()}))),loadCodeFile:async e=>{const t=Ul.getState(),a=t.get(e);if(a)return{path:e,content:a.content};const n=ee(`/workspace/code-files/${e.split("/").map(encodeURIComponent).join("/")}`),o=new Headers;for(const[l,d]of Object.entries(xe()))o.set(l,d);const i=await fetch(n,{headers:o});if(!i.ok){const l=await i.text().catch(()=>""),d=new Error(l||`Request failed: ${i.status}`);throw d.status=i.status,d}const s=await i.json(),r=i.headers.get("ETag");return t.set(e,s.content,r),s},saveCodeFile:(e,t)=>v(`/workspace/code-files/${e.split("/").map(encodeURIComponent).join("/")}`,{method:"PUT",body:JSON.stringify({content:t})}).then(a=>(Ul.getState().invalidate(e),a)),getWatchUrl:(e="project")=>`${ee("/workspace/watch")}?root=${encodeURIComponent(e)}`,getBinaryFileUrl:e=>ee(`/workspace/binary-files/${e.split("/").map(encodeURIComponent).join("/")}`)},mC={getLocalServerStatus:()=>v("/local-models/server"),getLocalServerUpdateStatus:()=>v("/local-models/server/update"),startLlamacppDownload:()=>v("/local-models/server/download",{method:"POST"}),getLlamacppDownloadProgress:()=>v("/local-models/server/download"),cancelLlamacppDownload:()=>v("/local-models/server/download",{method:"DELETE"}),listRecommendedLocalModels:()=>v("/local-models/models"),startLocalModelDownload:(e,t)=>v("/local-models/models/download",{method:"POST",body:JSON.stringify({model_name:e,source:t})}),getLocalModelDownloadProgress:()=>v("/local-models/models/download"),cancelLocalModelDownload:()=>v("/local-models/models/download",{method:"DELETE"}),deleteLocalModel:e=>v(`/local-models/models/${encodeURIComponent(e)}`,{method:"DELETE"}),startLocalServer:e=>v("/local-models/server",{method:"POST",body:JSON.stringify(e)}),stopLocalServer:()=>v("/local-models/server",{method:"DELETE"})},hC={listMCPClients:()=>v("/mcp"),getMCPClient:e=>v(`/mcp/${encodeURIComponent(e)}`),createMCPClient:e=>v("/mcp",{method:"POST",body:JSON.stringify(e)}),updateMCPClient:(e,t)=>v(`/mcp/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(t)}),toggleMCPClient:e=>v(`/mcp/toggle/${encodeURIComponent(e)}`,{method:"PATCH"}),deleteMCPClient:e=>v(`/mcp/${encodeURIComponent(e)}`,{method:"DELETE"}),listMCPTools:e=>v(`/mcp/tools/${encodeURIComponent(e)}`),listMCPAccessPrincipals:()=>v("/mcp/access-principals"),getMCPPolicy:e=>v(`/mcp/policy/${encodeURIComponent(e)}`),updateMCPPolicy:(e,t)=>v(`/mcp/policy/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(t)}),updateMCPToolWhitelist:(e,t)=>v(`/mcp/tools/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify({tools:t})}),startOAuth:(e,t)=>v(`/mcp/oauth/start/${encodeURIComponent(e)}`,{method:"POST",body:JSON.stringify(t)}),getOAuthStatus:e=>v(`/mcp/oauth/status/${encodeURIComponent(e)}`),revokeOAuth:e=>v(`/mcp/oauth/${encodeURIComponent(e)}`,{method:"DELETE"})};function ql(e){const t=new URLSearchParams({start_date:e.start_date,end_date:e.end_date});return e.model&&t.set("model",e.model),e.provider&&t.set("provider",e.provider),`?${t.toString()}`}const gC={getTokenUsage:e=>v(`/token-usage${ql(e)}`),getTokenUsageDetails:e=>v(`/token-usage/details${ql(e)}`)};function jl(e){return`?${new URLSearchParams({start_date:e.start_date,end_date:e.end_date}).toString()}`}const fC={getAgentStats:e=>v(`/agent-stats${jl(e)}`),getGlobalLlmToolTrend:(e,t)=>v(`/agent-stats/llm-tool-trend${jl(e)}`,{timeout:6e4,signal:t==null?void 0:t.signal})},bC={listTools:()=>v("/tools"),toggleTool:e=>v(`/tools/${encodeURIComponent(e)}/toggle`,{method:"PATCH"}),updateAsyncExecution:(e,t)=>v(`/tools/${encodeURIComponent(e)}/async-execution`,{method:"PATCH",body:JSON.stringify({async_execution:t})}),getToolConfig:(e,t)=>
11{const a=t?`?${new URLSearchParams(t).toString()}`:"";return v(`/tools/${encodeURIComponent(e)}/config${a}`)},updateToolConfig:(e,t)=>v(`/tools/${encodeURIComponent(e)}/config`,{method:"POST",body:JSON.stringify({config:t})})},kC={getToolGuard:()=>v("/config/security/tool-guard"),updateToolGuard:e=>v("/config/security/tool-guard",{method:"PUT",body:JSON.stringify(e)}),getBuiltinRules:()=>v("/config/security/tool-guard/builtin-rules"),getSandbox:e=>v(e!==void 0?`/config/security/sandbox?enabled=${e}`:"/config/security/sandbox"),updateSandbox:e=>v("/config/security/sandbox",{method:"PUT",body:JSON.stringify(e)}),getDenyPathsProtection:()=>v("/config/security/sandbox/deny-paths-protection"),updateDenyPathsProtection:e=>v("/config/security/sandbox/deny-paths-protection",{method:"PUT",body:JSON.stringify(e)}),getFileGuard:()=>v("/config/security/file-guard"),updateFileGuard:e=>v("/config/security/file-guard",{method:"PUT",body:JSON.stringify(e)}),getSkillScanner:()=>v("/config/security/skill-scanner"),updateSkillScanner:e=>v("/config/security/skill-scanner",{method:"PUT",body:JSON.stringify(e)}),getBlockedHistory:()=>v("/config/security/skill-scanner/blocked-history"),clearBlockedHistory:()=>v("/config/security/skill-scanner/blocked-history",{method:"DELETE"}),removeBlockedEntry:e=>v(`/config/security/skill-scanner/blocked-history/${e}`,{method:"DELETE"}),addToWhitelist:(e,t="")=>v("/config/security/skill-scanner/whitelist",{method:"POST",body:JSON.stringify({skill_name:e,content_hash:t})}),removeFromWhitelist:e=>v(`/config/security/skill-scanner/whitelist/${encodeURIComponent(e)}`,{method:"DELETE"}),getAllowNoAuthHosts:()=>v("/config/security/allow-no-auth-hosts"),updateAllowNoAuthHosts:e=>v("/config/security/allow-no-auth-hosts",{method:"PUT",body:JSON.stringify(e)})},yC={getUserTimezone:()=>v("/config/user-timezone"),updateUserTimezone:e=>v("/config/user-timezone",{method:"PUT",body:JSON.stringify({timezone:e})})},Po={getLanguage:()=>v("/settings/language"),updateLanguage:e=>v("/settings/language",{method:"PUT",body:JSON.stringify({language:e})}),getUploadLimit:()=>v("/settings/upload-limit")},Qu=Po,vC=300*1e3,TC={listBackups:()=>v("/backups"),getBackup:e=>v(`/backups/${e}`),createBackupStream:async(e,t,a)=>{const n=ee("/backups/stream"),o=await fetch(n,{method:"POST",headers:{...xe(),"Content-Type":"application/json"},body:JSON.stringify(e),signal:a});if(!o.ok){const d=await o.text().catch(()=>"");throw new Error(d||`Request failed: ${o.status}`)}const i=o.body.getReader(),s=new TextDecoder;let r="",l=null;for(;;){const{done:d,value:u}=await i.read();if(d)break;r+=s.decode(u,{stream:!0});const p=r.split(`
12
13`);r=p.pop()??"";for(const m of p){if(!m.startsWith("data: "))continue;const k=JSON.parse(m.slice(6));if(t(k),k.type==="done"&&(l=k.meta),k.type==="error")throw new Error(k.message)}}if(!l)throw new Error("No completion event received");return l},startBackupJob:e=>v("/backups/jobs",{method:"POST",body:JSON.stringify(e)}),getActiveBackupJob:()=>v("/backups/jobs/active"),getBackupJob:e=>v(`/backups/jobs/${e}`),cancelBackupJob:e=>v(`/backups/jobs/${e}/cancel`,{method:"POST"}),streamBackupJob:async(e,t,a)=>{const n=ee(`/backups/jobs/${e}/events`),o=await fetch(n,{headers:xe(),signal:a});if(!o.ok){const l=await o.text().catch(()=>"");throw new Error(l||`Request failed: ${o.status}`)}if(!o.body)throw new Error("No backup event stream received");const i=o.body.getReader(),s=new TextDecoder;let r="";for(;;){const{done:l,value:d}=await i.read();if(l)break;r+=s.decode(d,{stream:!0});const u=r.split(`
14
15`);r=u.pop()??"";for(const p of u){if(!p.startsWith("data: "))continue;const m=JSON.parse(p.slice(6));t(m)}}},restoreBackup:(e,t)=>v(`/backups/${e}/restore`,{method:"POST",body:JSON.stringify(t),timeout:vC}),deleteBackups:e=>v("/backups/delete",{method:"POST",body:JSON.stringify({ids:e})}),exportBackup:async(e,t)=>{const a=ee(`/backups/${e}/export`);try{await Ku(a,`${t}.zip`,{headers:xe(),errorMessage:"Export failed"})}catch(n){if(n instanceof Fs)return;throw n}},importBackup:async(e,t={})=>{const a=new FormData;a.append("file",e),t.trustMode&&a.append("trust_mode",t.trustMode);const n=ee("/backups/import"),o=await fetch(n,{method:"POST",headers:xe(),body:a});if(o.status===409){const i=await o.json(),s=new Error("backup_conflict");throw s.conflict=i,s}if(!o.ok){const i=await o.text().catch(()=>"");throw new Error(i||`Import failed: ${o.status}`)}return o.json()},resolveImportConflict:async e=>{const t=new FormData;t.append("pending_token",e);const a=ee("/backups/import"),n=await fetch(a,{method:"POST",headers:xe(),body:t});if(!n.ok){const o=await n.text().catch(()=>"");throw new Error(o||`Import failed: ${n.status}`)}return n.json()}},Ju={getPushMessages:e=>v(e?`/console/push-messages?session_id=${e}
15`:"/console/push-messages"),getInboxEvents:e=>{const t=new URLSearchParams;(e==null?void 0:e.limit)!==void 0&&t.set("limit",String(e.limit)),(e==null?void 0:e.offset)!==void 0&&t.set("offset",String(e.offset)),e!=null&&e.source_type&&t.set("source_type",e.source_type);for(const n of(e==null?void 0:e.source_types)??[])t.append("source_types",n);e!=null&&e.status&&t.set("status",e.status),e!=null&&e.agent_id&&t.set("agent_id",e.agent_id),(e==null?void 0:e.unread_only)!==void 0&&t.set("unread_only",String(e.unread_only));const a=t.toString()?`?${t.toString()}`:"";return v(`/console/inbox/events${a}`)},markInboxRead:e=>v("/console/inbox/read",{method:"POST",body:JSON.stringify(e)}),deleteInboxEvent:e=>v(`/console/inbox/events/${encodeURIComponent(e)}`,{method:"DELETE"}),getInboxTrace:e=>v(`/console/inbox/traces/${encodeURIComponent(e)}`)},Kt={getAclAll:()=>v("/access-control"),getAclChannel:e=>v(`/access-control/${e}`),addAclWhitelist:e=>v("/access-control/whitelist/add",{method:"POST",body:JSON.stringify({entries:e})}),removeAclWhitelist:e=>v("/access-control/whitelist/remove",{method:"POST",body:JSON.stringify({entries:e})}),addAclBlacklist:e=>v("/access-control/blacklist/add",{method:"POST",body:JSON.stringify({entries:e})}),removeAclBlacklist:e=>v("/access-control/blacklist/remove",{method:"POST",body:JSON.stringify({entries:e})}),updateAclRemark:(e,t,a)=>v("/access-control/remark",{method:"POST",body:JSON.stringify({channel:e,user_id:t,remark:a})}),getAclAllPending:()=>v("/access-control/pending/all"),approveAclPending:e=>v("/access-control/pending/approve",{method:"POST",body:JSON.stringify({entries:e})}),denyAclPending:e=>v("/access-control/pending/deny",{method:"POST",body:JSON.stringify({entries:e})}),dismissAclPending:e=>v("/access-control/pending/dismiss",{method:"POST",body:JSON.stringify({entries:e})}),updatePendingRemark:(e,t,a)=>v("/access-control/pending/remark",{method:"POST",body:JSON.stringify({channel:e,user_id:t,remark:a})}),updateUsername:(e,t,a)=>v("/access-control/username",{method:"POST",body:JSON.stringify({channel:e,user_id:t,username:a})})},ua={...LS,...ES,...FS,...OS,...BS,..._e,...HS,...US,...jS,...$S,...zS,...GS,...$u,...mC,...hC,...gC,...fC,...bC,...kC,...yC,...Qu,...TC,...Ju,...Kt},{Text:_a}=Ad,Gl={approve:Kt.approveAclPending,deny:Kt.denyAclPending,dismiss:Kt.dismissAclPending},SC={approve:"channels.approveSuccess",deny:"channels.denySuccess",dismiss:"channels.dismissSuccess"};function CC({open:e,onClose:t}){const{t:a}=ve(),{message:n}=dn(),[o,i]=h.useState([]),[s,r]=h.useState(!1),[l,d]=h.useState(null),[u,p]=h.useState(!1),[m,k]=h.useState([]),[g,b]=h.useState([]),y=h.useCallback(async()=>{r(!0);try{const A=await Kt.getAclAllPending();i(A)}catch{}finally{r(!1)}},[]);h.useEffect(()=>{e&&(y(),k([]))},[e,y]);const T=h.useMemo(()=>{const A=new Set(o.map(L=>L.channel));return Array.from(A)},[o]),S=h.useMemo(()=>g.length===0?o:o.filter(A=>g.includes(A.channel)),[o,g]),P=h.useMemo(()=>m.map(A=>{const[L,...j]=A.split(":");return{channel:L,user_id:j.join(":")}}),[m]),w=async(A,L)=>{try{await Kt.updatePendingRemark(A.channel,A.user_id,L),i(j=>j.map(U=>U.channel===A.channel&&U.user_id===A.user_id?{...U,remark:L}:U))}catch{n.error(a("channels.operationFailed"))}},C=async(A,L)=>{try{await Kt.updateUsername(A.channel,A.user_id,L),i(j=>j.map(U=>U.channel===A.channel&&U.user_id===A.user_id?{...U,username:L}:U))}catch{n.error(a("channels.operationFailed"))}},x=async(A,L)=>{const j=`${A.channel}:${A.user_id}`;d(j);try{await Gl[L]([{channel:A.channel,user_id:A.user_id}]),n.success(a(SC[L])),await y()}catch{n.error(a("channels.operationFailed"))}finally{d(null)}},I=async A=>{p(!0);try{await Gl[A](P),n.success(a("channels.batchSuccess",{count:P.length})),k([]),await y()}catch{n.error(a("channels.operationFailed"))}finally{p(!1)}},R=[{title:a("channels.channel"),dataIndex:"channel",key:"channel",width:100,fixed:"left",render:A=>c.jsx(mt,{title:Pt(A,a),children:c.jsxs(oa,{size:4,children:[c.jsx(ba,{channelKey:A,size:16}),c.jsx("span",{children:Pt(A,a)})]})})},{title:a("channels.username"),dataIndex:"username",key:"username",width:120,render:(A,L)=>c.jsx(_a,{editable:{onChange:j=>C(L,j),text:A||""},children:A||c.jsx("span",{style:{color:"#bbb"},children:"-"})})},{title:a("channels.userId"),dataIndex:"user_id",key:"user_id",width:160,ellipsis:{showTitle:!1},render:A=>c.jsxs(oa,{size:4,children:[c.jsx(_a,{ellipsis:{tooltip:A},style:{maxWidth:120},children:A}),c.jsx(_a,{copyable:{text:A}})]})},{title:a("channels.firstMessage"),dataIndex:"first_message",key:"first_message",width:160,ellipsis:!0,render:A=>c.jsx(mt,{title:A,children:c.jsx("span",{children:A||"-"})})},{title:a("channels.remark"),dataIndex:"remark",key:"remark",width:130,render:(A,L)=>c.jsx(_a,{editable:{onChange:j=>w(L,j),text:A||""},children:A||c.jsx("span",{style:{color:"#bbb"},children:"-"})})},{title:a("channels.time"),dataIndex:"timestamp",key:"timestamp",width:150,render:A=>
15A?new Date(A*1e3).toLocaleString():"-"},{title:a("channels.actions"),key:"actions",width:200,fixed:"right",render:(A,L)=>{const j=`${L.channel}:${L.user_id}`,U=l===j;return c.jsxs(oa,{size:0,children:[c.jsx(Se,{type:"text",size:"small",loading:U,onClick:()=>x(L,"approve"),style:{color:"#52c41a",padding:"0 4px"},children:a("channels.approve")}),c.jsx(Se,{type:"text",size:"small",danger:!0,loading:U,onClick:()=>x(L,"deny"),style:{padding:"0 4px"},children:a("channels.deny")}),c.jsx(Se,{type:"text",size:"small",loading:U,onClick:()=>x(L,"dismiss"),style:{padding:"0 4px"},children:a("channels.dismiss")})]})}}],_=m.length>0;return c.jsxs(gm,{width:920,title:a("channels.pendingApprovals"),open:e,onClose:t,destroyOnHidden:!0,children:[c.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12},children:[c.jsx(Nt,{mode:"multiple",allowClear:!0,placeholder:a("channels.filterByChannel"),value:g,onChange:A=>{b(A),k([])},style:{minWidth:200},options:T.map(A=>({label:Pt(A,a),value:A}))}),c.jsxs(oa,{children:[_&&c.jsx(_a,{type:"secondary",style:{fontSize:13},children:a("channels.selectedCount",{count:m.length})}),c.jsx(En,{title:a("channels.batchApproveConfirm",{count:m.length}),onConfirm:()=>I("approve"),disabled:!_,children:c.jsx(Se,{type:"primary",size:"small",icon:c.jsx(Md,{}),disabled:!_,loading:u,children:a("channels.batchApprove")})}),c.jsx(En,{title:a("channels.batchDenyConfirm",{count:m.length}),onConfirm:()=>I("deny"),disabled:!_,children:c.jsx(Se,{size:"small",icon:c.jsx(fm,{}),disabled:!_,loading:u,children:a("channels.batchDeny")})}),c.jsx(En,{title:a("channels.batchDismissConfirm",{count:m.length}),onConfirm:()=>I("dismiss"),disabled:!_,children:c.jsx(Se,{danger:!0,size:"small",icon:c.jsx(bm,{}),disabled:!_,loading:u,children:a("channels.batchDismiss")})})]})]}),c.jsx(km,{dataSource:S,columns:R,rowKey:A=>`${A.channel}:${A.user_id}`,rowSelection:{selectedRowKeys:m,onChange:A=>k(A)},size:"small",loading:s,pagination:{pageSize:10,showSizeChanger:!1},scroll:{x:1050},locale:{emptyText:c.jsx("div",{style:{padding:"48px 0"},children:a("channels.noPendingApprovals")})}})]})}const wC=Object.freeze(Object.defineProperty({__proto__:null,PendingApprovalsDrawer:CC},Symbol.toStringTag,{value:"Module"})),PC=Ne.memo(function({channelKey:t,onClick:a,iconUrl:n}){const{t:o}=ve(),i=Pt(t,o),s=r=>{(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),a())};return c.jsxs("div",{className:ue.availableItem,onClick:a,onKeyDown:s,role:"button",tabIndex:0,children:[c.jsx(ba,{channelKey:t,size:24,iconUrl:n}),c.jsx("span",{className:ue.availableItemName,children:i}),c.jsx("span",{className:ue.availableItemAction,children:o("channels.enableAction")})]})}),AC=Object.freeze(Object.defineProperty({__proto__:null,ChannelAvailableItem:PC},Symbol.toStringTag,{value:"Module"}));async function MC(e){if(navigator.clipboard&&window.isSecureContext){await navigator.clipboard.writeText(e);return}const t=document.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.style.position="absolute",t.style.left="-9999px",document.body.appendChild(t);let a=!1;try{t.focus(),t.select(),a=document.execCommand("copy")}finally{document.body.removeChild(t)}if(!a)throw new Error("Failed to copy text")}function DC(e){return(e.output||[]).flatMap(a=>a.role!=="assistant"?[]:a.type!=="message"?[]:typeof a.content=="string"?[a.content]:Array.isArray(a.content)?a.content.flatMap(n=>n.type==="text"&&typeof n.text=="string"?[n.text]:n.type==="refusal"&&typeof n.refusal=="string"?[n.refusal]:[]):[]).filter(Boolean).join(`
16
17`).trim()}function Yu(e){return typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(t=>t.type==="text").map(t=>t.text||"").join(`
18`):""}function xC(e){var a,n,o,i;const t=(i=(o=(n=(a=e==null?void 0:e.cards)==null?void 0:a[0])==null?void 0:n.data)==null?void 0:o.input)==null?void 0:i[0];return t?Yu(t):""}function RC(e){if(!e)return"";const t=e<1e12?e*1e3:e,a=new Date(t),n=new Date,o=a.getHours().toString().padStart(2,"0"),i=a.getMinutes().toString().padStart(2,"0"),s=a.getSeconds().toString().padStart(2,"0"),r=`${o}:${i}:${s}`;if(a.getFullYear()===n.getFullYear()&&a.getMonth()===n.getMonth()&&a.getDate()===n.getDate())return r;const d=(a.getMonth()+1).toString().padStart(2,"0"),u=a.getDate().toString().padStart(2,"0");return a.getFullYear()===n.getFullYear()?`${d}-${u} ${r}`:`${a.getFullYear()}-${d}-${u} ${r}`}function IC(){return new Response(JSON.stringify({error:"Model not configured",message:"Please configure a model first"}),{status:400,headers:{"Content-Type":"application/json"}})}function _C(e){return e.split("/").map(t=>{if(!t)return t;try{return decodeURIComponent(t)}catch{return t}}).join("/")}function Ha(e){const t="/files/preview/",a=e.indexOf(t);if(a!==-1){let n=e.slice(a+t.length);const o=n.indexOf("?");o!==-1&&(n=n.slice(0,o));const i=n.indexOf("#");if(i!==-1&&(n=n.slice(0,i)),n){const s=_C(n);return/^[a-zA-Z]:[\\/]/.test(s)||s.startsWith("/")?s:`/${s}`}}return e}function LC(e){const t={...e};return t.type==="image"&&typeof t.image_url=="string"&&(t.image_url=Ha(t.image_url)),t.type==="file"&&typeof t.file_url=="string"&&(t.file_url=Ha(t.file_url)),t.type==="audio"&&typeof t.data=="str
18ing"&&(t.data=Ha(t.data)),t.type==="video"&&typeof t.video_url=="string"&&(t.video_url=Ha(t.video_url)),t}function Ua(e){return e?e.startsWith("http://")||e.startsWith("https://")||e.startsWith("data:")?e:(e.startsWith("file://")&&(e=e.replace("file://","")),_e.filePreviewUrl(e.startsWith("/")?e:`/${e}`)):""}function Xu(){const e=document.activeElement instanceof HTMLElement?document.activeElement.closest('[class*="sender"]'):null,t=e==null?void 0:e.querySelector("textarea");if(t instanceof HTMLTextAreaElement)return t;const a=Array.from(document.querySelectorAll('[class*="sender"] textarea'));return a.find(n=>n.offsetParent!==null)??a[a.length-1]??null}function EC(e){if(!(e instanceof HTMLElement))return null;const t=e.closest('[class*="sender"]');if(!t)return null;if(e instanceof HTMLTextAreaElement)return e;if(!(e.isContentEditable||e.getAttribute("contenteditable")==="true"))return null;const n=t.querySelector("textarea");return n instanceof HTMLTextAreaElement?n:null}function Zu(e,t){var o;const a=(o=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,"value"))==null?void 0:o.set;a?a.call(e,t):e.value=t,e.selectionStart=e.selectionEnd=t.length;const n=new Event("input",{bubbles:!0});e.dispatchEvent(n)}function FC(e){const t=Xu();return!t||t.value!==e?!1:(Zu(t,""),!0)}const OC=Object.freeze(Object.defineProperty({__proto__:null,buildModelError:IC,clearSubmittedSenderInput:FC,copyText:MC,extractCopyableText:DC,extractTextFromMessage:xC,extractUserMessageText:Yu,formatMessageTime:RC,getActiveSenderTextarea:Xu,getSenderTextareaFromTarget:EC,normalizeContentUrls:LC,setTextareaValue:Zu,toDisplayUrl:Ua,toStoredName:Ha},Symbol.toStringTag,{value:"Module"}));let BC=0;function Vl(e,t){return(e==null?void 0:e.agentId)===t.agentId&&e.sessionId===t.sessionId&&e.revision===t.revision}const Ge=ft((e,t)=>({snapshot:null,setSnapshot:a=>e({snapshot:a}),activeTurn:null,beginTurn:(a,n)=>{const o={agentId:a,sessionId:n,revision:++BC};return e(i=>({activeTurn:o,snapshot:i.snapshot})),o},setSnapshotForTurn:(a,n)=>Vl(t().activeTurn,n)?(e({snapshot:a}),!0):!1,isTurnActive:a=>Vl(t().activeTurn,a),invalidateTurn:()=>e({activeTurn:null,snapshot:null}),activeMaxInputLength:null,setActiveMaxInputLength:a=>e({activeMaxInputLength:a})})),NC=Object.freeze(Object.defineProperty({__proto__:null,useTurnUsageStore:Ge},Symbol.toStringTag,{value:"Module"})),Ni="qwenpaw_turn_usage",ae=(e,t)=>{if(!e||typeof e!="object")return 0;const a=e[t];return typeof a=="number"&&Number.isFinite(a)?a:0};function Wl(e){if(!e||typeof e!="object")return null;const t=e,a=t.usage,n=t.context_usage,o=a&&typeof a=="object"?a:null,i=n&&typeof n=="object"?n:null,s=ae(o,"total_tokens")||ae(o,"prompt_tokens")+ae(o,"completion_tokens"),r=!!o&&s>0,l=!!i&&ae(i,"estimated_tokens")>0;return!r&&!l?null:{usage:r?o:null,context_usage:l?i:null}}function ep(e){if(!e||typeof e!="object")return null;const t=e,a=Wl(t[Ni]);if(a)return a;const n=t.metadata;return n&&typeof n=="object"?Wl(n[Ni]):null}function tp(e){var t;for(let a=e.length-1;a>=0;a--){const n=ep((t=e[a])==null?void 0:t.metadata);if(n)return n}return null}function pn(e){if(!e)return null;const t=e.usage,a=e.context_usage,n=t&&typeof t=="object"&&(ae(t,"total_tokens")>0||ae(t,"prompt_tokens")+ae(t,"completion_tokens")>0),o=a&&typeof a=="object"&&ae(a,"estimated_tokens")>0;return!n&&!o?null:{usage:n?t:null,context_usage:o?a:null}}function Qt(e){const t=e==null?void 0:e.find(a=>(a==null?void 0:a.code)==="AgentScopeRuntimeResponseCard");return(t==null?void 0:t.data)??null}function ap(e){const t=e.filter(a=>a.role==="assistant");for(let a=t.length-1;a>=0;a--){const n=Qt(t[a].cards);if(!n)continue;const o=pn(n);if(o)return o}return null}function HC(e){const t=e.filter(a=>a.role==="assistant");if(t.length){for(let a=t.length-1;a>=0;a--){const n=Qt(t[a].cards);if(!n)continue;const o=pn(n);if(!o||!o.context_usage)return t[a]}for(let a=t.length-1;a>=0;a--)if(Qt(t[a].cards))return t[a]}}function np(e,t){var l;const a=(l=e.current)==null?void 0:l.messages;if(!a)return!1;const n=HC(a.getMessages()??[]);if(!n)return!1;const o=Qt(n.cards);if(!o)return!1;const i=pn(o);if(i&&ae(i.usage,"total_tokens")===ae(t.usage,"total_tokens")&&ae(i.usage,"cache_read_tokens")===ae(t.usage,"cache_read_tokens")&&ae(i.usage,"cache_eligible_input_tokens")===ae(t.usage,"cache_eligible_input_tokens")&&ae(i.usage,"session_cache_read_tokens")===ae(t.usage,"session_cache_read_tokens")&&ae(i.usage,"session_cache_eligible_input_tokens")===ae(t.usage,"session_cache_eligible_input_tokens")&&ae(i.context_usage,"estimated_tokens")===ae(t.context_usage,"estimated_tokens"))return!0;const s=JSON.parse(JSON.stringify(n)),r=Qt(s.cards);return r?(t.usage&&(r.usage=t.usage),t.context_usage&&(r.context_usage=t.context_usage),Qi.flushSync(()=>{a.updateMessage(s)}),!0):!1}const UC=50,qC=40;function op(e,t,a){const n=()=>!a||Ge.getState().isTurnActive(a),o=()=>n()&&np(e,t);if(!n()||o())return;let i=0;const s=()=>{n()&&(o()||i>=qC||(i+=1,window.setTimeout(s,UC)))};window.setTimeout(s,0)}function jC(e,t){var i;const a=(i=e.current)==null?void 0:i.messages;if(!a||t<=0)return;const n=a.getMessages()??[];for(let s=n.length-1;s>=0;s--){const r=n[s];if(r.role!=="assistant")continue;const l=Qt(r.cards);if(!l)continue;const d=pn(l);if(!(d!=null&&d.context_usage))continue;const u=ae(d.context_usage,"estimated_tokens");if(ae(d.context_usage,"max_input_length")===t)return;const p=Math.min(u/t*100,100),m=JSON.parse(JSON.stringify(r)),k=Qt(m.cards);if(!k)return;const g={estimated_tokens:u,max_input_length:t,context_usage_ratio:p};k.context_usage=g,Qi.flushSync(()=>{a.updateMessage(m)}),Ge.getState().setSnapshot({usage:d.usage,context_usage:g});return}const o=Ge.getState().snapshot;if(o!=null&&o.context_usage&&ae(o.context_usage,"max_input_length")!==t){const s=ae(o.context_usage,"estimated_tokens"),r=Math.min(s/t*100,100);Ge.getState().setSnapshot({usage:o.usage,context_usage:{estimated_tokens:s,max_input_length:t,context_usage_ratio:r}})}}function zl(e){const t=[];let a=e;for(;;){const n=a.indexOf(`
19
20`);if(n<0)break;const o=a.slice(0,n);a=a.slice(n+2);for(const i of o.split(`
21`))i.startsWith("data: ")&&t.push(i.slice(6))}return{events:t,rest:a}}function Kl(e){if(!e.includes("turn_usage"))return null;try{return VC(JSON.parse(e))}catch{return null}}function GC(e,t,a){if(!e.body)return e;const n=new TextDecoder;let o="",i=null;const s=e.body.pipeThrough(new TransformStream({transform(r,l){l.enqueue(r),o+=n.decode(r,{stream:!0});const d=zl(o);o=d.rest;for(const u of d.events){const p=Kl(u);p&&(i=p)}},flush(){o+=n.decode();const r=zl(`${o}
22
23`);for(const l of r.events){const d=Kl(l);d&&(i=d)}if(i){let l=!0;a?l=Ge.getState().setSnapshotForTurn(i,a):Ge.getState().setSnapshot(i),l&&op(t,i,a)}}}));return new Response(s,{status:e.status,statusText:e.statusText,headers:e.headers})}function VC(e){if(e.type!=="turn_usage")return null;const t=e.usage,a=e.context_usage,n=ae(t,"total_tokens")||ae(t,"prompt_tokens")+ae(t,"completion_tokens"),o=t&&typeof t=="object"&&n>0,i=a&&typeof a=="object"&&ae(a,"estimated_tokens")>0;return!o&&!i?null:{usage:o?t:null,context_usage:i?a:null}}const WC=Object.freeze(Object.defineProperty({__proto__:null,TURN_USAGE_META_KEY:Ni,extractLatestSnapshotFromCards:ap,extractTurnUsageFromBackendMetadata:ep,extractTurnUsageFromOutputMessages:tp,patchContextMaxInputLength:jC,patchLastResponseCardUsage:np,readTurnUsageFromResponseCardData:pn,schedulePatchLastResponseCardUsage:op,wrapChatResponseUsageStream:GC},Symbol.toStringTag,{value:"Module"})),ip="qwenpaw_client_message_id";function zC(e){const t=new Uint8Array(e);crypto.getRandomValues(t);let a="";for(const n of t)a+=(n%36).toString(36);return a}function KC(){var e;return((e=crypto.randomUUID)==null?void 0:e.call(crypto))??`${Date.now()}-${zC(16)}`}function aB(e,t){const a=typeof e.metadata=="object"&&e.metadata!==null?e.metadata:{};return{...e,metadata:{...a,[ip]:t}}}const Os=ft((e,t)=>
23({sessions:[],lastUpdated:0,_setLibrarySessions:null,syncFromLibrary:(a,n)=>{e({sessions:a,lastUpdated:Date.now(),_setLibrarySessions:n})},syncSessions:a=>{var n,o;e({sessions:a,lastUpdated:Date.now()}),(o=(n=t())._setLibrarySessions)==null||o.call(n,a)}}));function Gt(e){Os.getState().syncSessions(e)}We.subscribe((e,t)=>{e.selectedAgent!==t.selectedAgent&&Os.setState({sessions:[],lastUpdated:Date.now()})});const Ft="default",bt="console",$n="New Chat",$C="tool",lo="user",sp="assistant",QC="plugin_call_output",rp="AgentScopeRuntimeResponseCard";function JC(e){var n,o;Ge.getState().invalidateTurn();const t=ap(e),a=Ge.getState().activeMaxInputLength;if(t!=null&&t.context_usage&&typeof a=="number"&&a>0){const i=t.context_usage.estimated_tokens,s={estimated_tokens:i,max_input_length:a,context_usage_ratio:Math.min(i/a*100,100)};for(let r=e.length-1;r>=0;r--){const l=e[r];if(l.role!==sp)continue;const d=(n=l.cards)==null?void 0:n.find(u=>(u==null?void 0:u.code)===rp);if((o=d==null?void 0:d.data)!=null&&o.context_usage){d.data.context_usage=s;break}}Ge.getState().setSnapshot({usage:t.usage,context_usage:s});return}Ge.getState().setSnapshot(t)}function lp(e){const t=new Uint8Array(e);crypto.getRandomValues(t);let a="";for(const n of t)a+=(n%36).toString(36);return a}function Hi(){return`${Date.now()}-${lp(9)}`}const dp=e=>{if(!e||typeof e!="string")return 0;const t=new Date(e.replace(" ","T")).getTime();return Number.isNaN(t)?0:Math.floor(t/1e3)},co=e=>{var t;return dp((t=e.metadata)==null?void 0:t.timestamp)},cp=e=>{var t;return dp((t=e.metadata)==null?void 0:t.finished_at)},Ui=e=>typeof e=="string"?e:Array.isArray(e)?e.filter(t=>t.type==="text").map(t=>t.text||"").filter(Boolean).join(`
24`):String(e||""),YC=e=>{if(!e||typeof e!="object")return;const t=e.metadata;if(!t||typeof t!="object")return;const a=t[ip];return typeof a=="string"?a:void 0};function XC(e){return e.type==="image"&&e.image_url?{...e,image_url:Ua(e.image_url)}:e.type==="audio"&&e.data?{...e,data:Ua(e.data)}:e.type==="video"&&e.video_url?{...e,video_url:Ua(e.video_url)}:e.type==="file"&&(e.file_url||e.file_id)?{...e,file_url:Ua(e.file_url||e.file_id),file_name:e.filename||e.file_name||"file"}:e}function up(e){if(typeof e=="string")return[{type:"text",text:e,status:"created"}];if(!Array.isArray(e))return[{type:"text",text:String(e||""),status:"created"}];const t=e.map(XC).map(a=>({...a,status:"created"}));return t.length===0?[{type:"text",text:"",status:"created"}]:t}function pp(e){return typeof e=="string"||!Array.isArray(e)?e:e.map(t=>t.type==="file"?{...t,file_name:t.filename||t.file_name||"file"}:t)}const mp=e=>({...e,role:e.type===QC&&e.role==="system"?$C:e.role,metadata:e.metadata??null});function uo(e){const t=up(e.content);return{id:e.id||Hi(),role:"user",cards:[{code:"AgentScopeRuntimeRequestCard",data:{created_at:co(e),input:[{role:"user",type:"message",content:t,metadata:e.metadata??null}]}}]}}const hp=e=>{const t=Math.floor(Date.now()/1e3),a=e.reduce((l,d)=>Math.max(l,d.sequence_number||0),0),n=co(e[0]),o=co(e[e.length-1]),i=e.reduce((l,d)=>Math.max(l,cp(d)),0),s=e.map(l=>({...l,content:pp(l.content)})),r=tp(e);return{id:Hi(),role:sp,cards:[{code:rp,data:{id:`response_${Hi()}`,output:s,object:"response",status:"completed",created_at:n||t,sequence_number:a+1,error:null,completed_at:i||o||t,usage:(r==null?void 0:r.usage)??null,context_usage:(r==null?void 0:r.context_usage)??null}}],msgStatus:"finished"}},gp=e=>{const t=[],a=e.length;let n=0;for(;n<a;)if(e[n].role===lo)t.push(uo(e[n++]));else{const o=n;for(;n<a&&e[n].role!==lo;)n++;const i=e.slice(o,n).map(mp);i.length&&t.push(hp(i))}return t},ZC=e=>({id:e.id,name:e.name||$n,sessionId:e.session_id,userId:e.user_id,channel:e.channel,messages:[],meta:e.meta||{},status:e.status??"idle",createdAt:e.created_at??null,updatedAt:e.updated_at??null,lastFinishedAt:e.last_finished_at??null,pinned:e.pinned??!1,source:e.source??"chat",groupId:e.group_id??null,parentSessionId:e.parent_session_id??null,rootSessionId:e.root_session_id??null,archived:e.archived??!1,archivedAt:e.archived_at??null}),Je=e=>/^\d+-[a-z0-9]+$/.test(e),fp=e=>e.status==="running",bp=(e,t)=>{const a=e.find(i=>i.id===t&&i.realId);if(a!=null&&a.realId)return{list:e,realId:a.realId};let n=e.find(i=>i.sessionId===t&&!i.realId&&i.id!==t);if(n||(n=e.find(i=>i.id===t&&!i.realId)),!n)return{list:e,realId:null};if(Je(n.id))return{list:e,realId:null};const o=n.id;return n.realId=o,n.id=t,{list:[n,...e.filter(i=>i!==n)],realId:o}},Bs="qwenpaw_pending_user_msg_";function Mn(e,t){try{const a=typeof t=="string"?t:JSON.stringify(t);sessionStorage.setItem(`${Bs}${e}`,a)}catch{}}function Jo(e){try{const t=sessionStorage.getItem(`${Bs}${e}`);if(!t)return null;try{const a=JSON.parse(t);if(a&&typeof a=="object"&&"text"in a)return a}catch{}return{text:t}}catch{return null}}function Dn(e){try{sessionStorage.removeItem(`${Bs}${e}`)}catch{}}const ca=class ca{constructor(){V(this,"sessionList",[]);V(this,"_prevReturnedList",null);V(this,"preferredChatId",null);V(this,"lastActiveChatId",null);V(this,"isSessionSwitching",!1);V(this,"switchAbortController",null);V(this,"userInitiatedCreate",!1);V(this,"sessionResultCache",new Map);V(this,"convertedSessionCache",new Map);V(this,"activeOwner",{agentId:"",generation:0});V(this,"sessionListRequest",null);V(this,"resolvePromise",null);V(this,"sessionRequests",new Map);V(this,"onSessionIdResolved",null);V(this,"onSessionRemoved",null);V(this,"onSessionSelected",null);V(this,"lastNavigatedChatId",null);
24V(this,"onSessionCreated",null);V(this,"lastSelectedIds",new Set)}startNewSwitch(){var a;(a=this.switchAbortController)==null||a.abort();const t=new AbortController;return this.switchAbortController=t,this.isSessionSwitching=!0,t}getCachedConvertedSession(t,a){const n=this.convertedSessionCache.get(t);return n?Date.now()-n.timestamp>ca.CONVERTED_CACHE_TTL?(this.convertedSessionCache.delete(t),null):a&&(!n.updatedAt||a>n.updatedAt)?(this.convertedSessionCache.delete(t),null):(this.convertedSessionCache.delete(t),this.convertedSessionCache.set(t,n),n.session):null}setCachedConvertedSession(t,a,n){if(this.convertedSessionCache.size>=ca.CONVERTED_CACHE_MAX){const o=this.convertedSessionCache.keys().next().value;o&&this.convertedSessionCache.delete(o)}this.convertedSessionCache.set(t,{session:a,timestamp:Date.now(),updatedAt:n})}invalidateConvertedCache(t){this.convertedSessionCache.delete(t)}async preloadSession(t,a){const n=this.getActiveOwner();try{const o=await this.getSession(t,a);if(!this.isActiveOwner(n))throw new DOMException("Aborted","AbortError");const s=o.realId||null,r={session:o,owner:n};return this.sessionResultCache.set(t,r),s&&this.sessionResultCache.set(s,r),setTimeout(()=>{this.sessionResultCache.get(t)===r&&this.sessionResultCache.delete(t),s&&this.sessionResultCache.get(s)===r&&this.sessionResultCache.delete(s)},3e3),{session:o,realId:s}}catch(o){throw this.isActiveOwner(n)?(o instanceof DOMException&&o.name==="AbortError"||(this.isSessionSwitching=!1),o):new DOMException("Aborted","AbortError")}}finishSessionSwitch(){this.isSessionSwitching=!1,this.switchAbortController=null}setActiveAgent(t){var a;return this.activeOwner.agentId===t?this.activeOwner:(this.activeOwner={agentId:t,generation:this.activeOwner.generation+1},this.sessionListRequest=null,this.resolvePromise=null,this.sessionRequests.clear(),this.sessionResultCache.clear(),this.convertedSessionCache.clear(),this.sessionList=[],this._prevReturnedList=null,this.lastSelectedIds.clear(),this.isSessionSwitching=!1,(a=this.switchAbortController)==null||a.abort(),this.switchAbortController=null,this.activeOwner)}getActiveOwner(){return this.activeOwner}isActiveOwner(t){return t.agentId===this.activeOwner.agentId&&t.generation===this.activeOwner.generation}applySessionView(t,a){this.isActiveOwner(a)&&(this.updateWindowVariables(t),JC(t.messages??[]))}resetForTests(){this.activeOwner={agentId:"",generation:0},this.sessionListRequest=null,this.resolvePromise=null,this.sessionRequests.clear(),this.sessionResultCache.clear(),this.convertedSessionCache.clear(),this.sessionList=[],this._prevReturnedList=null,this.lastSelectedIds.clear(),this.preferredChatId=null,this.lastActiveChatId=null,this.lastNavigatedChatId=null,this.isSessionSwitching=!1,this.switchAbortController=null,this.userInitiatedCreate=!1,this.onSessionIdResolved=null,this.onSessionRemoved=null,this.onSessionSelected=null,this.onSessionCreated=null}setLastUserMessage(t,a,n,o){!t||!a||(this.invalidateConvertedCache(t),n&&n.length>0?Mn(t,{text:a,content:n,clientMessageId:o}):o?Mn(t,{text:a,clientMessageId:o}):Mn(t,a))}discardLastUserMessage(t,a){if(!t)return;const n=Jo(t);n&&(a&&n.clientMessageId&&n.clientMessageId!==a||Dn(t))}patchLastUserMessage(t,a,n){var r,l,d,u,p,m,k,g,b,y;const o=Jo(n);if(!o||!o.text)return a||Dn(n),!1;if(!a){let T="",S;for(let w=t.length-1;w>=0;w--){if(t[w].role!==lo)continue;const C=(p=(u=(d=(l=(r=t[w])==null?void 0:r.cards)==null?void 0:l[0])==null?void 0:d.data)==null?void 0:u.input)==null?void 0:p[0];T=Ui(C==null?void 0:C.content),S=YC(C==null?void 0:C.metadata);break}if(o.clientMessageId?S===o.clientMessageId:T.trim()===o.text.trim())return Dn(n),!1}const i=o.content??[{type:"text",text:o.text}],s=t[t.length-1];return(s==null?void 0:s.role)===lo?Ui((y=(b=(g=(k=(m=s==null?void 0:s.cards)==null?void 0:m[0])==null?void 0:k.data)==null?void 0:g.input)==null?void 0:b[0])==null?void 0:y.content)||(s.cards=uo({content:i}).cards):t.push(uo({content:i})),!0}createEmptySession(t,a){return this.isActiveOwner(a)&&(window.currentSessionId=t,window.currentUserId=Ft,window.currentChannel=bt,Ge.getState().setSnapshot(null)),{id:t,name:$n,sessionId:t,userId:Ft,channel:bt,messages:[],meta:{}}}updateWindowVariables(t){window.currentSessionId=t.sessionId||"",window.currentUserId=t.userId||Ft,window.currentChannel=t.channel||bt}resetWindowIdentity(){window.currentSessionId="",window.currentUserId=Ft,window.currentChannel=bt}findSession(t){return this.sessionList.find(a=>a.id===t||a.realId===t)}getRealIdForSession(t){var a;return((a=this.findSession(t))==null?void 0:a.realId)??null}getEffectiveSessionId(t,a){return a??this.getRealIdForSession(t)??t}trackNavigatedSession(t,a,n){this.lastActiveChatId=t,this.lastNavigatedChatId=t,a&&n&&!Je(t)&&a(n,t)}isUnresolvedLocalSession(t){if(!Je(t))return!1;const a=this.findSession(t);return!!a&&!a.realId}getBackendSessionId(t){var a;return((a=this.findSession(t))==null?void 0:a.sessionId)||t}getSessionIdentity(){const t=this.lastActiveChatId?this.findSession(this.lastActiveChatId):void 0;if(t!=null&&t.userId)return{sessionId:t.sessionId||"",userId:t.userId,channel:t.channel||bt};const a=window.currentSessionId||"",n=a?this.sessionList.find(o=>o.sessionId===a||o.id===a):void 0;return n!=null&&n.userId?{sessionId:n.sessionId||"",userId:n.userId,channel:n.channel||bt}:{sessionId:Je(a)?a:"",userId:Ft,channel:bt}}applyChatsToSessionList(t){const a=this.sessionList[0],n=a&&Je(a.id)&&!a.realId?a:null,o=t.filter(r=>r.id&&r.id!=="undefined"&&r.id!=="null").map(ZC).reverse(),i=new Set;if(this.sessionList=o.map(r=>{const l=r;let d=this.sessionList.find(p=>{if(i.has(p.id))return!1;const m=p;return p.id===r.id||m.realId!=null&&m.realId===r.id});if(d||(d=this.sessionList.find(p=>i.has(p.id)?!1:p.sessionId===l.sessionId)),!d)return r;i.add(d.id);const u={...r};return d.realId&&(u.id=d.id,u.realId=d.realId),d.generating&&l.status!=="idle"&&(u.generating=d.generating),u}),n&&!i.has(n.id)&&(this.sessionList=[n,...this.sessionList]),this.preferredChatId){const r=this.preferredChatId;this.preferredChatId=null;let l=this.sessionList.findIndex(d=>d.id===r);if(l<0&&Je(r)&&(l=this.sessionList.findIndex(d=>d.sessionId===r),l>=0)){const d=this.sessionList[l];d.realId=d.id,d.id=r}if(l>0){const[d]=this.sessionList.splice(l,1);this.sessionList.unshift(d)}}if(this._prevReturnedList&&this.isSessionListEqual(this._prevReturnedList,this.sessionList))return this._prevReturnedList;const s=[...this.sessionList];return this._prevReturnedList=s,s}isSessionListEqual(t,a){if(t.length!==a.length)return!1;for(let n=0;n<t.length;n++){const o=t[n],i=a[n];if(o.id!==i.id||o.name!==i.name||o.status!==i.status||o.updatedAt!==i.updatedAt||o.lastFinishedAt!==i.lastFinishedAt||o.createdAt!==i.createdAt||o.pinned!==i.pinned||o.generating!==i.generating||o.realId!==i.realId||o.sessionId!==i.sessionId||o.userId!==i.userId||o.channel!==i.channel||o.archivedAt!==i.archivedAt||o.archived!==i.archived||o.source!==i.source||o.groupId!==i.groupId||o.parentSessionId!==i.parentSessionId||o.rootSessionId!==i.rootSessionId)return!1}return!0}async getSessionList(){if(this.sessionListRequest&&this.isActiveOwner(this.sessionListRequest.owner))return this.sessionListRequest.promise;const t=this.getActiveOwner(),a={owner:t};return a.promise=(async()=>{try{const n=await ua.listChats({archived:!1,include_app_owned:!1}
24);return this.isActiveOwner(t)?this.applyChatsToSessionList(n):this._prevReturnedList??[...this.sessionList]}finally{this.sessionListRequest===a&&(this.sessionListRequest=null)}})(),this.sessionListRequest=a,a.promise}async getSession(t,a){var l;const n=this.getActiveOwner(),o=this.sessionResultCache.get(t);if(o&&this.isActiveOwner(o.owner))return o.session;const i=this.sessionRequests.get(t);if(i&&this.isActiveOwner(i.owner))return i.promise;const s=this._doGetSession(t,a,n),r={promise:s,owner:n};this.sessionRequests.set(t,r);try{const d=await s,p=d.realId||null;return this.isActiveOwner(n)&&!this.lastSelectedIds.has(t)&&(this.lastSelectedIds.clear(),this.lastSelectedIds.add(t),p&&this.lastSelectedIds.add(p),(l=this.onSessionSelected)==null||l.call(this,t,p)),d}finally{this.sessionRequests.get(t)===r&&this.sessionRequests.delete(t)}}async fetchAndBuildSession(t,a,n,o,i){if(!(n!=null&&n.generating)){const m=this.getCachedConvertedSession(a,n==null?void 0:n.updatedAt);if(m)return m.id=t,n!=null&&n.name&&(m.name=n.name),this.applySessionView(m,i),m}const r=await ua.getChat(a,{signal:o,include_app_owned:!1});if(o!=null&&o.aborted)throw new DOMException("Aborted","AbortError");const l=fp(r),d=gp(r.messages||[]),u=this.patchLastUserMessage(d,l,a),p={id:t,name:(n==null?void 0:n.name)||$n,sessionId:(n==null?void 0:n.sessionId)||t,userId:(n==null?void 0:n.userId)||Ft,channel:(n==null?void 0:n.channel)||bt,messages:d,meta:(n==null?void 0:n.meta)||{},realId:n==null?void 0:n.realId,generating:l};return!l&&!u&&this.isActiveOwner(i)&&this.setCachedConvertedSession(a,p,(n==null?void 0:n.updatedAt)??null),this.applySessionView(p,i),p}async _doGetSession(t,a,n){var o;if(!t||t==="undefined"||t==="null")return this.isActiveOwner(n)&&Ge.getState().setSnapshot(null),{id:t||"",name:"",sessionId:"",userId:Ft,channel:bt,messages:[],meta:{}};if(Je(t)){const i=this.findSession(t);if(i!=null&&i.realId)try{return await this.fetchAndBuildSession(t,i.realId,i,a,n)}catch{return this.applySessionView(i,n),i}if(i&&this.resolvePromise){await this.resolvePromise;const s=this.findSession(t);if(s!=null&&s.realId)try{return await this.fetchAndBuildSession(t,s.realId,s,a,n)}catch{return this.applySessionView(s,n),s}}return i?(this.applySessionView(i,n),i):this.createEmptySession(t,n)}try{return await this.fetchAndBuildSession(t,t,this.findSession(t),a,n)}catch(i){if((o=i.message)!=null&&o.includes("Chat not found")){const s=this.createEmptySession(t,n);return s.id=t,s}throw i}}resolveAndNotify(t,a){var i;if(!this.isActiveOwner(a))return;const{list:n,realId:o}=bp(this.sessionList,t);if(this.sessionList=n,o){Gt(this.sessionList);const s=Jo(t);s&&(Mn(o,s),Dn(t)),(i=this.onSessionIdResolved)==null||i.call(this,t,o)}}triggerResolve(t){if(!Je(t))return;const a=this.findSession(t);if(!a||a.realId)return;const n=this.getActiveOwner();this.sessionListRequest=null;const o=this.getSessionList().then(()=>this.resolveAndNotify(t,n)).finally(()=>{this.resolvePromise===o&&(this.resolvePromise=null)});this.resolvePromise=o}async updateSession(t){const{messages:a,...n}=t,o=this.sessionList.findIndex(i=>i.id===n.id);return o>-1?this.sessionList[o]={...this.sessionList[o],...n}
24:await this.getSessionList(),[...this.sessionList]}async createSession(t){var s,r;const a=this.userInitiatedCreate;this.userInitiatedCreate=!1;const n=this.sessionList.find(l=>Je(l.id)&&!l.realId);if(n)return t.id=n.id,a&&((s=this.onSessionCreated)==null||s.call(this,n.id)),[...this.sessionList];if(!a&&this.lastActiveChatId&&!Je(this.lastActiveChatId)){const l=this.findSession(this.lastActiveChatId);return l&&(t.id=l.id),[...this.sessionList]}const o=`${Date.now()}-${lp(7)}`,i=this.createEmptySession(o,this.getActiveOwner());return i.name=t.name||$n,this.sessionList.unshift(i),t.id=o,(r=this.onSessionCreated)==null||r.call(this,o),[...this.sessionList]}async removeSession(t){var r;if(!t.id)return[...this.sessionList];const{id:a}=t,n=this.findSession(a),o=(n==null?void 0:n.realId)??(Je(a)?null:a);o&&await ua.deleteChat(o),o&&this.invalidateConvertedCache(o),n!=null&&n.realId&&this.invalidateConvertedCache(n.realId);const i=(n==null?void 0:n.id)??a;this.sessionList=this.sessionList.filter(l=>l.id!==i);const s=(n==null?void 0:n.realId)??a;return(r=this.onSessionRemoved)==null||r.call(this,s),[...this.sessionList]}};V(ca,"CONVERTED_CACHE_MAX",10),V(ca,"CONVERTED_CACHE_TTL",300*1e3);let qi=ca;const ie=new qi;ie.setActiveAgent(We.getState().selectedAgent);We.subscribe(e=>{ie.setActiveAgent(e.selectedAgent)});const ew={convertMessages:gp,buildUserCard:uo,buildResponseCard:hp,toOutputMessage:mp,normalizeOutputMessageContent:pp,contentToRequestParts:up,extractTextFromContent:Ui,parseTimestamp:co,parseFinishedAt:cp,isLocalTimestamp:Je,isGenerating:fp,resolveRealId:bp},tw=Object.freeze(Object.defineProperty({__proto__:null,__test__:ew,default:ie},Symbol.toStringTag,{value:"Module"})),ji="qwenpaw:message-queue:";function Gi(e){return`${ji}${e}`}function aw(e){try{const t=Gi(e);let a=localStorage.getItem(t);if(!a)try{const n=sessionStorage.getItem(t);n&&(localStorage.setItem(t,n),sessionStorage.removeItem(t),a=n)}catch{}if(a){const n=JSON.parse(a);return Array.isArray(n)?{items:n,runState:"idle"}:n}}catch{}return null}function dt(e,t,a){try{t.length>0?localStorage.setItem(Gi(e),JSON.stringify({items:t,runState:a})):localStorage.removeItem(Gi(e))}catch{}}let nw=0;function ow(){return"mq-"+Date.now().toString(36)+"-"+(++nw).toString(36)}let La=null;function kp(){if(La)return La;if(typeof BroadcastChannel>"u")return null;try{La=new BroadcastChannel("qwenpaw:queue")}catch{La=null}return La}function Tt(e){const t=kp();if(t)try{t.postMessage(e)}catch{}}function yp(){return typeof navigator>"u"?null:navigator.locks??null}async function nB(e,t){const a=yp();if(!a)return await t();try{return await a.request(`qwenpaw:queue-send:${e}`,{ifAvailable:!0},async o=>o?await t():null)}catch{return null}}function oB(e,t,a){const n=yp();return n?n.request(`qwenpaw:queue-owner:${e}`,{mode:"exclusive",signal:a},async o=>{o&&(a.aborted||(t(),await new Promise(i=>{if(a.aborted){i();return}a.addEventListener("abort",()=>i(),{once:!0})})))}).then(()=>{}).catch(()=>{}):(t(),Promise.resolve())}const iw=50,qa=ft((e,t)=>({queues:{},runStates:{},currentSendingId:null,lastMigratedTo:null,enqueue:(a,n)=>{var l;const o=t().queues[a]??[];if(o.length>=iw)return;let i;try{const d=sessionStorage.getItem("qwenpaw-agent-storage")||localStorage.getItem("qwenpaw-agent-storage");if(d){const u=JSON.parse(d);i=((l=u==null?void 0:u.state)==null?void 0:l.selectedAgent)||void 0}}catch{}const s=window.currentSessionId||void 0,r={id:ow(),clientMessageId:KC(),text:n.text,attachments:n.attachments,images:n.images,mentions:n.mentions,quote:n.quote,agentId:i,backendSessionId:s,userId:n.userId,channel:n.channel,status:"pending",retryCount:0,createdAt:Date.now()};e(d=>{const u=[...o,r],p={...d.queues,[a]:u};return dt(a,u,t().runStates[a]??"idle"),Tt({type:"enqueue",sessionId:a,items:u}),{queues:p}})},remove:(a,n)=>{e(o=>{const s=(o.queues[a]??[]).filter(l=>l.id!==n),r={...o.queues,[a]:s};return dt(a,s,t().runStates[a]??"idle"),Tt({type:"remove",sessionId:a,items:s}),{queues:r}})},edit:(a,n,o)=>{e(i=>{const r=(i.queues[a]??[]).map(d=>d.id===n?{...d,text:o}:d),l={...i.queues,[a]:r};return dt(a,r,t().runStates[a]??"idle"),Tt({type:"edit",sessionId:a,items:r}),{queues:l}})},reorder:(a,n)=>{e(o=>{const i={...o.queues,[a]:n};return dt(a,n,t().runStates[a]??"idle"),Tt({type:"reorder",sessionId:a,items:n}),{queues:i}})},clear:a=>{e(n=>{const o={...n.queues};delete o[a];const i={...n.runStates};return delete i[a],dt(a,[],"idle"),Tt({type:"clear",sessionId:a,items:[]}),{queues:o,runStates:i}})},migrateQueue:(a,n)=>{a!==n&&e(o=>{const i=o.queues[a]??[],r=[...o.queues[n]??[],...i],l={...o.queues,[n]:r};delete l[a];const d={...o.runStates};!d[n]&&d[a]&&(d[n]=d[a]),delete d[a];const u=d[n]??"idle";return dt(n,r,u),dt(a,[],"idle"),Tt({type:"migrate",sessionId:a,toSessionId:n,items:r}),{queues:l,runStates:d,lastMigratedTo:n}})},setItemStatus:(a,n,o,i)=>{e(s=>{const l=(s.queues[a]??[]).map(u=>u.id===n?{...u,status:o,errorMessage:i,retryCount:u.retryCount+(o==="failed"?1:0)}:u),d={...s.queues,[a]:l};return dt(a,l,t().runStates[a]??"idle"),Tt({type:"setItemStatus",sessionId:a,items:l}),{queues:d}})},setRunState:(a,n)=>{e(i=>({runStates:{...i.runStates,[a]:n}}));const o=t().queues[a]??[];dt(a,o,n),Tt({type:"runState",sessionId:a,runState:n})},getRunState:a=>t().runStates[a]??"idle",setCurrentSendingId:a=>{e({currentSendingId:a})},consumeMigratedTo:()=>
24{const a=t().lastMigratedTo;return a!==null&&e({lastMigratedTo:null}),a},getQueue:a=>t().queues[a]??[],persistToStorage:a=>{const n=t().queues[a]??[];dt(a,n,t().runStates[a]??"idle")},loadFromStorage:a=>{const n=aw(a);e(n?o=>({queues:{...o.queues,[a]:n.items},runStates:{...o.runStates,[a]:n.runState==="paused"?"paused":"idle"}}):o=>{if(!(a in o.queues))return o;const i={...o.queues};return delete i[a],{queues:i}})},applyRemoteItems:(a,n)=>{e(o=>{const i={...o.queues};return n.length===0?delete i[a]:i[a]=n,{queues:i}})},applyRemoteRunState:(a,n)=>{e(o=>({runStates:{...o.runStates,[a]:n}}))}}));if(typeof window<"u"){const e=kp();e&&e.addEventListener("message",t=>{const a=t.data;if(!a||typeof a!="object")return;const n=qa.getState();if(a.type==="migrate"){n.applyRemoteItems(a.sessionId,[]),a.toSessionId&&a.items&&n.applyRemoteItems(a.toSessionId,a.items);return}if(a.type==="runState"&&a.runState){qa.getState().applyRemoteRunState(a.sessionId,a.runState);return}a.items&&n.applyRemoteItems(a.sessionId,a.items)}),window.addEventListener("storage",t=>{if(!t.key||!t.key.startsWith(ji))return;const a=t.key.slice(ji.length),n=qa.getState();if(t.newValue==null){n.applyRemoteItems(a,[]);return}try{const o=JSON.parse(t.newValue),i=Array.isArray(o)?o:o.items??[];n.applyRemoteItems(a,i),!Array.isArray(o)&&o.runState==="paused"&&qa.getState().applyRemoteRunState(a,"paused")}catch{}})}const sw="index-module__contextMenu__EqTZr",rw="index-module__menuItem__xUJ9T",lw="index-module__danger__2VteC",dw="index-module__disabled__ukK5G",cw="index-module__menuIcon__osLml",uw="index-module__menuLabel__EFrCh",pw="index-module__divider__9z5HR",Ot={contextMenu:sw,menuItem:rw,danger:lw,disabled:dw,menuIcon:cw,menuLabel:uw,divider:pw};function mw({visible:e,x:t,y:a,items:n,onClose:o}){const i=h.useRef(null),s=h.useCallback(()=>{if(!i.current||!e)return;const r=i.current,l=r.getBoundingClientRect(),d=window.innerWidth,u=window.innerHeight;let p=t,m=a;t+l.width>d&&(p=d-l.width-8),a+l.height>u&&(m=u-l.height-8),r.style.left=`${Math.max(8,p)}px`,r.style.top=`${Math.max(8,m)}px`},[t,a,e]);return h.useEffect(()=>{if(!e)return;requestAnimationFrame(s);const r=u=>{i.current&&!i.current.contains(u.target)&&o()},l=()=>o(),d=u=>{u.key==="Escape"&&o()};return document.addEventListener("mousedown",r),document.addEventListener("scroll",l,!0),document.addEventListener("keydown",d),window.addEventListener("resize",o),()=>{document.removeEventListener("mousedown",r),document.removeEventListener("scroll",l,!0),document.removeEventListener("keydown",d),window.removeEventListener("resize",o)}},[e,o,s]),e?tm.createPortal(c.jsx("div",{ref:i,className:Ot.contextMenu,style:{left:t,top:a},children:n.map(r=>r.divider?c.jsx("div",{className:Ot.divider},r.key):c.jsxs("div",{className:`${Ot.menuItem} ${r.danger?Ot.danger:""} ${r.disabled?Ot.disabled:""}`,onClick:l=>{var d;l.stopPropagation(),!r.disabled&&((d=r.onClick)==null||d.call(r),o())},children:[r.icon&&c.jsx("span",{className:Ot.menuIcon,children:r.icon}),c.jsx("span",{className:Ot.menuLabel,children:r.label})]},r.key))}),document.body):null}function vp(){const[e,t]=Ne.useState({visible:!1,x:0,y:0}),a=h.useCallback(o=>{o.preventDefault(),o.stopPropagation(),t({visible:!0,x:o.clientX,y:o.clientY})},[]),n=h.useCallback(()=>{t(o=>({...o,visible:!1}))},[]);return{...e,show:a,hide:n}}function $l(e,t){if(e.length!==t.length)return!1;for(let a=0;a<e.length;a++){const n=e[a],o=t[a];if(n.id!==o.id||n.name!==o.name||n.updatedAt!==o.updatedAt||n.lastFinishedAt!==o.lastFinishedAt||n.pinned!==o.pinned||n.generating!==o.generating||n.status!==o.status||n.archived!==o.archived||n.groupId!==o.groupId||n.source!==o.source)return!1}return!0}const da=e=>{if(e.realId)return e.realId;const t=e.id;return/^\d+-[a-z0-9]+$/.test(t)?null:t},hw=e=>{if(!e)return"";const t=new Date(e);if(isNaN(t.getTime()))return"";const a=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${a(t.getMonth()+1)}-${a(t.getDate())} ${a(t.getHours())}:${a(t.getMinutes())}:${a(t.getSeconds())}`};function Tp(e,t,a){const{t:n}=ve(),{message:o}=dn(),{active:i,currentSessionId:s,onSessionClick:r}=a,l=We(D=>
24D.selectedAgent),[d,u]=h.useState(!0),[p,m]=h.useState(null),[k,g]=h.useState(null),[b,y]=h.useState(""),T=vp(),[S,P]=h.useState(null),w=h.useRef([]),C=h.useCallback(async()=>{const D=ie.getActiveOwner();try{const N=await ie.getSessionList();if(!ie.isActiveOwner(D))return;const H=N;t(H),Gt(H)}catch(N){console.error("useSessionListData: failed to fetch sessions",N)}},[t]);h.useEffect(()=>{if(!i)return;let D=!1;const N=ie.getActiveOwner();(async()=>{u(!0);try{const O=await ie.getSessionList();if(!D&&ie.isActiveOwner(N)){const q=O;$l(w.current,q)||(w.current=q,t(q),Gt(q))}}catch(O){console.error("useSessionListData: failed to fetch sessions",O)}finally{D||u(!1)}})();const M=setInterval(async()=>{if(!ie.isSessionSwitching)try{const O=await ie.getSessionList();if(!D&&ie.isActiveOwner(N)){const q=O;$l(w.current,q)||(w.current=q,t(q),Gt(q))}}catch{}},3e3);return()=>{D=!0,clearInterval(M)}},[i,t,l]);const x=h.useMemo(()=>e.filter(D=>{const N=D.id??"";return!(/^\d+-[a-z0-9]+$/.test(N)&&!D.realId)}),[e]),I=h.useMemo(()=>[...x].filter(D=>!D.archived).sort((D,N)=>{const H=D.updatedAt??D.createdAt??"",M=N.updatedAt??N.createdAt??"";return!H&&!M?0:H?M?M<H?-1:M>H?1:0:-1:1}),[x]),R=h.useCallback(D=>{D!==s&&(m(D),r(D))},[s,r]);h.useEffect(()=>{m(null)},[s]),h.useEffect(()=>{const D=()=>m(null);return window.addEventListener("qwenpaw:sidebar-switch-done",D),()=>window.removeEventListener("qwenpaw:sidebar-switch-done",D)},[]);const _=h.useCallback(async D=>{var K;const N=ie.getActiveOwner(),H=e.find(pe=>pe.id===D),M=H?da(H):null;M&&await _e.deleteChat(M),localStorage.removeItem(`approval_level-${D}`);const O=qa.getState();if(O.clear(D),M&&M!==D&&O.clear(M),!ie.isActiveOwner(N))return;(K=ie.onSessionRemoved)==null||K.call(ie,M??D);const q=await ie.getSessionList();ie.isActiveOwner(N)&&(t(q),Gt(q),s&&(q.some(ge=>ge.id===s||ge.realId===s)||window.dispatchEvent(new CustomEvent("qwenpaw:sidebar-new-chat"))))},[e,s,t]),A=h.useCallback((D,N)=>{g(D),y(N)},[]),L=h.useCallback(D=>{y(D)},[]),j=h.useCallback(async()=>{if(!k)return;const D=ie.getActiveOwner(),N=e.find(O=>O.id===k),H=N?da(N):null,M=b.trim();H&&M&&await _e.updateChat(H,{name:M}),g(null),y(""),ie.isActiveOwner(D)&&await C()},[k,b,e,C]),U=h.useCallback(()=>{g(null),y("")},[]),z=h.useCallback(async D=>{const N=ie.getActiveOwner(),H=e.find(q=>q.id===D),M=H?da(H):null;if(!M)return;const O=!!(H!=null&&H.archived);try{if(O?await _e.unarchiveChat(M):await _e.archiveChat(M),!ie.isActiveOwner(N))return;o.success(O?n("sessions.archive.unarchiveSuccess","Chat unarchived"):n("sessions.archive.successHint")),await C(),!O&&s&&(D===s||M===s)&&window.dispatchEvent(new CustomEvent("qwenpaw:sidebar-new-chat"))}catch(q){console.error("Failed to toggle archive status:",q),o.error(n("sessions.archive.failed","Failed to update archive status"))}},[e,s,C,o,n]),W=h.useCallback(async(D,N)=>{const H=ie.getActiveOwner(),M=e.find(q=>q.id===D),O=M?da(M):null;if(O)try{if(await _e.updateChat(O,{pinned:N}),!ie.isActiveOwner(H))return;await C()}catch(q){console.error("Failed to update conversation pin:",q),o.error(n("chat.contextMenu.pinFailed","Could not update pinned state"))}},[o,C,e,n]),Q=h.useCallback((D,N)=>{P(D),T.show(N)},[T]),he=h.useMemo(()=>{if(!S)return[];const D=e.find(N=>N.id===S);return[{key:"open",label:n("chat.contextMenu.open","Open"),onClick:()=>R(S)},{key:"rename",label:n("chat.contextMenu.rename","Rename"),onClick:()=>A(S,(D==null?void 0:D.name)||"New Chat")},{key:"pin",label:D!=null&&D.pinned?n("chat.contextMenu.unpin","Unpin"):n("chat.contextMenu.pin","Pin"),onClick:()=>W(S,!(D!=null&&D.pinned))},{key:"archive",label:D!=null&&D.archived?n("sessions.archive.unaction","Unarchive"):n("sessions.archive.action","Archive"),onClick:()=>z(S)},{key:"divider-1",label:"",divider:!0},{key:"delete",label:n("chat.contextMenu.delete","Delete"),danger:!0,onClick:()=>_(S)}]},[S,e,n,R,A,z,W,_]);return{sortedSessions:I,loading:d,switchingSessionId:p,editingSessionId:k,editValue:b,t:n,handleSessionClick:R,handleEditStart:A,handleDelete:_,handleArchiveToggle:z,handlePinToggle:W,handleEditChange:L,handleEditSubmit:j,handleEditCancel:U,handleItem
24ContextMenu:Q,contextMenu:T,contextMenuItems:he,refreshSessions:C}}const gw=Object.freeze(Object.defineProperty({__proto__:null,ContextMenu:mw,formatCreatedAt:hw,getBackendId:da,getChannelLabel:Pt,useContextMenu:vp,useSessionListData:Tp},Symbol.toStringTag,{value:"Module"}));function Sp(e){const t=e.match(/^\/chat\/(.+)$/);return t==null?void 0:t[1]}const Ql="/chat";function Jl(e){return e?`${Ql}/${e}`:Ql}function fw(e){if(!e)return"older";const t=new Date(e);if(isNaN(t.getTime()))return"older";const a=new Date,n=new Date(a.getFullYear(),a.getMonth(),a.getDate()),o=new Date(t.getFullYear(),t.getMonth(),t.getDate()),i=Math.floor((n.getTime()-o.getTime())/(1e3*60*60*24));return i<=0?"today":i<7?"week":i<30?"month":"older"}function bw(e,t){return t?e.findIndex(a=>{var n,o;return a.kind==="session"&&(((n=a.session)==null?void 0:n.id)===t||((o=a.session)==null?void 0:o.realId)===t)}):-1}const kw="default",yw="cron",vw="subagents";function Cp(e){return e.source==="cron"?yw:e.source==="subagent"?vw:kw}function Ns(e){return e.groupId?e.groupId:Cp(e)}function Tw(e,t){return e.map(a=>a.kind==="default"&&a.name==="Uncategorized"?{...a,name:t.default}:a.kind==="cron"?{...a,name:t.cron}:a.kind==="subagents"?{...a,name:t.subagents}:a)}function Sw(e,t){const a=new Map,n=new Set(t.map(s=>s.id));for(const s of e){const r=Ns(s),l=n.has(r)?r:Cp(s),d=a.get(l)??[];d.push(s),a.set(l,d)}const o=[],i=[...t].sort((s,r)=>+(s.kind==="cron"||s.kind==="subagents")-+(r.kind==="cron"||r.kind==="subagents")||(s.kind!=="custom"&&r.kind!=="custom"?+(s.kind==="subagents")-+(r.kind==="subagents"):0)||Number(r.pinned)-Number(s.pinned)||s.order-r.order);for(const s of i)o.push({group:s,sessions:a.get(s.id)??[]});return o}function Cw(e){const t={pinned:[],today:[],week:[],month:[],older:[]};for(const a of e){const n=a.pinned?"pinned":fw(a.updatedAt??a.createdAt);t[n].push(a)}return["pinned","today","week","month","older"].filter(a=>t[a].length>0).map(a=>({key:a,sessions:t[a]}))}function ww(e,t){for(let a=Math.min(t,e.length-1);a>=0;a-=1)if(e[a].kind==="groupHeader")return a===t?null:a;return null}const wp="qwenpaw_collapsed_chat_groups_v3",Pw="cron",Aw="subagents";function Mw(){try{const e=localStorage.getItem(wp);if(e){const t=JSON.parse(e);if(Array.isArray(t))return new Set(t)}}catch{}return new Set([Pw,Aw])}function Yl(e){try{localStorage.setItem(wp,JSON.stringify([...e]))}catch{}}function Dw(){const[e,t]=h.useState(Mw),a=h.useCallback(o=>{t(i=>{const s=new Set(i);return s.has(o)?s.delete(o):s.add(o),Yl(s),s})},[]),n=h.useCallback(o=>{t(i=>{if(!i.has(o))return i;const s=new Set(i);return s.delete(o),Yl(s),s})},[]);return{collapsedGroups:e,toggleGroup:a,expandGroup:n}}function xw(e,t,a){const n=h.useRef(null);h.useEffect(()=>{if(!e){n.current=null;return}if(n.current===e)return;const o=t.find(i=>i.id===e||i.realId===e);o&&(n.current=e,a(Ns(o)))},[e,a,t])}function Rw(e=!0){const t=We(m=>m.selectedAgent),[a,n]=h.useState([]),[o,i]=h.useState(!0),s=h.useCallback(async()=>{const m=await _e.listGroups();n(m)},[]);h.useEffect(()=>{if(!e)return;let m=!1;return i(!0),_e.listGroups().then(k=>{m||n(k)}).catch(k=>{console.error("Failed to load chat groups:",k)}).finally(()=>{m||i(!1)}),()=>{m=!0}},[e,t]);const r=h.useCallback(async m=>{await _e.createGroup(m),await s()},[s]),l=h.useCallback(async(m,k)=>{await _e.updateGroup(m,{name:k}),await s()},[s]),d=h.useCallback(async(m,k)=>{await _e.updateGroup(m,{pinned:k}),await s()},[s]),u=h.useCallback(async m=>{await _e.deleteGroup(m),await s()},[s]),p=h.useCallback(async m=>{const k=await _e.reorderGroups(m);n(k)},[]);return{groups:a,loading:o,refreshGroups:s,createGroup:r,renameGroup:l,pinGroup:d,deleteGroup:u,reorderGroups:p}}const Iw="sessionItem-module__item__8PjKA",_w="sessionItem-module__disabled__-ieAg",Lw="sessionItem-module__drawer__J6BHU",Ew="sessionItem-module__moreBtn__9AQIi",Fw="sessionItem-module__iconPlaceholder__ANJOP",Ow="sessionItem-module__active__KYgJT",Bw="sessionItem-module__editing__CtOg-",Nw="sessionItem-module__content__LJUj6",Hw="sessionItem-module__dropdownOpen__z-NE5",Uw="sessionItem-module__sidebar__IXYlU",qw="sessionItem-module__statusSlot__Sf6iH",jw="sessionItem-module__name__jlj9a",Gw="sessionItem-module__titleRow__9dEps",Vw="sessionItem-module__statusWrap__2uLsL",Ww="sessionItem-module__statusDot__cgOkd",zw="sessionItem-module__statusDotIdle__08m-o",Kw="sessionItem-module__statusDotActive__zP8qF",$w="sessionItem-module__chatStatusBreathe__Y0ZX8",Qw="sessionItem-module__statusDotUnseen__4C1P-",Jw="sessionItem-module__runningDot__Ne3pE",Yw="sessionItem-module__sidebarStatusBreathe__1F80a",Xw="sessionItem-module__unseenDot__HI3Io",Zw="sessionItem-module__idleDot__2McQ5",eP="sessionItem-module__metaRow__LFmE0",tP="sessionItem-module__time__iMJzP",aP="sessionItem-module__channelTag__-gywT",nP="sessionItem-module__channelTagText__Zyog3",oP="sessionItem-module__sourceTag__nf1s3",iP="sessionItem-module__sourceIcon__ZOmt0",sP="sessionItem-module__dragHint__qfNUX",rP="sessionItem-module__pinMark__-4nsr",lP="sessionItem-module__pinButton__A195a",dP="sessionItem-module__actions__-mb--",cP="sessionItem-module__actionButton__OoTnW",uP="sessionItem-module__renameInput__AxSC5",Z={item:Iw,disabled:_w,drawer:Lw,moreBtn:Ew,iconPlaceholder:Fw,active:Ow,editing:Bw,content:Nw,dropdownOpen:Hw,sidebar:Uw,statusSlot:q
24w,name:jw,titleRow:Gw,statusWrap:Vw,statusDot:Ww,statusDotIdle:zw,statusDotActive:Kw,chatStatusBreathe:$w,statusDotUnseen:Qw,runningDot:Jw,sidebarStatusBreathe:Yw,unseenDot:Xw,idleDot:Zw,metaRow:eP,time:tP,channelTag:aP,channelTagText:nP,sourceTag:oP,sourceIcon:iP,dragHint:sP,pinMark:rP,pinButton:lP,actions:dP,actionButton:cP,renameInput:uP},pP=({sessionId:e,name:t,channelKey:a,channelLabel:n,chatStatus:o,generating:i,unseenResult:s=!1,archived:r,pinned:l=!1,source:d,groupId:u,groups:p=[],time:m,active:k,disabled:g,editing:b,editValue:y,variant:T,onClick:S,onEdit:P,onDelete:w,onArchive:C,onPin:x,onMove:I,onEditChange:R,onEditSubmit:_,onEditCancel:A})=>{const{t:L}=ve(),j=h.useRef(null),[U,z]=h.useState(!1),W=h.useRef(!1),Q=i===!0||o==="running",he=d==="subagent",D=d==="cron",N=D?L("chat.groups.cronShort","Cron"):L("chat.groups.subagentShort","Subagent"),H=!Q&&!!o,M=H&&s,O=Q?L("chat.statusInProgress"):M?L("chat.statusUnseenResult","New result"):L("chat.statusIdle"),q=h.useCallback(()=>{g||b||S==null||S(e)},[g,b,S,e]),K=h.useCallback(()=>{P==null||P(e,t),setTimeout(()=>{var J;return(J=j.current)==null?void 0:J.focus()},50)},[P,e,t]),pe=h.useCallback(()=>{const J=(y??"").trim();J&&J!==t?_==null||_():A==null||A()},[y,t,_,A]),ge=h.useMemo(()=>[{key:"rename",icon:c.jsx(Dd,{size:14}),label:L("chat.contextMenu.rename","Rename"),onClick:K},{key:"pin",icon:l?c.jsx(xd,{size:14}):c.jsx(Qa,{size:14}),label:l?L("chat.contextMenu.unpin","Unpin"):L("chat.contextMenu.pin","Pin"),onClick:()=>x==null?void 0:x(e,!l)},{key:"move",icon:c.jsx(ym,{size:14}),label:L("chat.contextMenu.moveToGroup","Move to group"),children:p.map(J=>({key:`move-${J.id}`,label:J.name,disabled:J.id===u,onClick:()=>I==null?void 0:I(e,J.id)}))},{key:"archive",icon:c.jsx(vm,{size:14}),label:r?L("sessions.archive.unaction","Unarchive"):L("sessions.archive.action","Archive"),onClick:()=>C==null?void 0:C(e)},{type:"divider"},{key:"delete",icon:c.jsx(Rd,{size:14}),label:L("chat.contextMenu.delete","Delete"),danger:!0,onClick:()=>w==null?void 0:w(e)}],[r,l,e,L,C,x,w,u,p,I,K]),te=[Z.item,Z[T],k?Z.active:"",g?Z.disabled:"",b?Z.editing:"",U?Z.dropdownOpen:""].filter(Boolean).join(" "),ze=c.jsxs("div",{className:te,"data-pinned":l,onClick:q,role:"button",tabIndex:0,children:[T==="drawer"&&c.jsx("div",{className:Z.iconPlaceholder}),!b&&T==="sidebar"&&c.jsxs("span",{className:Z.statusSlot,children:[Q&&c.jsx("span",{className:Z.runningDot}),M&&c.jsx("span",{className:Z.unseenDot}),H&&!M&&c.jsx("span",{className:Z.idleDot})]}),c.jsxs("div",{className:Z.content,children:[b?c.jsx(Ct,{ref:j,autoFocus:!0,size:"small",value:y,className:Z.renameInput,onChange:J=>R==null?void 0:R(J.target.value),onCompositionStart:()=>{W.current=!0},onCompositionEnd:()=>{W.current=!1},onPressEnter:J=>{!J.nativeEvent.isComposing&&!W.current&&pe()},onKeyDown:J=>{J.key==="Escape"&&(J.preventDefault(),A==null||A())},onBlur:()=>{setTimeout(()=>{W.current||pe()},100)},onClick:J=>J.stopPropagation()}):c.jsx(c.Fragment,{children:T==="drawer"?c.jsxs("div",{className:Z.titleRow,children:[c.jsx("span",{className:Z.statusWrap,role:"img","aria-label":O,children:c.jsx("span",{className:`${Z.statusDot} ${Q?Z.statusDotActive:M?Z.statusDotUnseen:Z.statusDotIdle}`,"aria-hidden":!0})}),c.jsx("div",{className:Z.name,children:t||"New Chat"})]}):c.jsx("div",{className:Z.name,children:t||"New Chat"})}),T==="drawer"&&c.jsxs("div",{className:Z.metaRow,children:[m&&c.jsx("span",{className:Z.time,children:m}),(he||D)&&c.jsxs("span",{className:Z.sourceTag,children:[D?c.jsx(oi,{size:11}):c.jsx(Ut,{size:11}),c.jsx("span",{children:N})]}),(a||n)&&c.jsxs("span",{className:Z.channelTag,title:n||a,children:[a?c.jsx(ba,{channelKey:a,size:14}):null,n?c.jsx("span",{className:Z.channelTagText,children:n}):null]})]})]}),!b&&T==="sidebar"&&a&&c.jsx("span",{className:Z.channelTag,title:n||a,children:c.jsx(ba,{channelKey:a,size:14})}),!b&&T==="sidebar"&&(he||D)&&c.jsx("span",{className:Z.sourceIcon,title:N,children:D?c.jsx(oi,{size:13}):c.jsx(Ut,{size:13})}),!b&&l&&c.jsx("span",{className:Z.pinMark,title:L("chat.group.pinned","Pinned"),children:c.jsx(Qa,{size:11})}),!b&&c.jsx("span",{className:Z.dragHint,title:L("chat.groups.dragSessionHint","Press and hold to move this conversation"),"aria-hidden":!0,
24children:c.jsx(Id,{size:12})}),!b&&c.jsx(ha,{menu:{items:ge},trigger:["click"],placement:"bottomRight",onOpenChange:z,children:c.jsx("span",{className:Z.moreBtn,onClick:J=>J.stopPropagation(),children:c.jsx(_d,{size:14})})})]});return c.jsx(ha,{menu:{items:ge},trigger:["contextMenu"],children:ze})},mP=Ne.memo(pP),hP="SessionGroupHeader-module__header__AdsH7",gP="SessionGroupHeader-module__more__Ay3Cs",fP="SessionGroupHeader-module__source__mdq5w",bP="SessionGroupHeader-module__pinned__m-oX-",kP="SessionGroupHeader-module__chevron__-tU0e",yP="SessionGroupHeader-module__kindIcon__tWEOY",vP="SessionGroupHeader-module__pinMark__Dl1FF",TP="SessionGroupHeader-module__lockMark__H0-Ck",SP="SessionGroupHeader-module__collapsed__aiYov",CP="SessionGroupHeader-module__label__fSuIX",wP="SessionGroupHeader-module__count__BElX5",PP="SessionGroupHeader-module__managed__IPfq5",AP="SessionGroupHeader-module__renameInput__cQ-UA",Ue={header:hP,more:gP,source:fP,pinned:bP,chevron:kP,kindIcon:yP,pinMark:vP,lockMark:TP,collapsed:SP,label:CP,count:wP,managed:PP,renameInput:AP};function MP({group:e,count:t,collapsed:a,canMoveUp:n=!1,canMoveDown:o=!1,onToggle:i,onRename:s,onPin:r,onDelete:l,onMoveUp:d,onMoveDown:u}){const{t:p}=ve(),m=e.kind==="cron",k=e.kind==="subagents",g=m||k,[b,y]=h.useState(!1),[T,S]=h.useState(e.name),P=()=>{const C=T.trim();y(!1),C&&C!==e.name?s==null||s(C):S(e.name)},w=h.useMemo(()=>[{key:"pin",icon:e.pinned?c.jsx(xd,{size:13}):c.jsx(Qa,{size:13}),label:e.pinned?p("chat.groups.unpin","Unpin group"):p("chat.groups.pin","Pin group"),onClick:()=>r==null?void 0:r(!e.pinned)},{type:"divider"},{key:"rename",icon:c.jsx(Dd,{size:13}),label:p("chat.groups.rename","Rename"),onClick:()=>{S(e.name),y(!0)}},{key:"up",icon:c.jsx(Tm,{size:13}),label:p("chat.groups.moveUp","Move up"),disabled:!n,onClick:d},{key:"down",icon:c.jsx(Sm,{size:13}),label:p("chat.groups.moveDown","Move down"),disabled:!o,onClick:u},...e.kind==="custom"?[{type:"divider"},{key:"delete",icon:c.jsx(Rd,{size:13}),label:p("chat.groups.delete","Delete group"),danger:!0,onClick:l}]:[]],[o,n,e.kind,e.name,e.pinned,l,u,d,r,p]);return c.jsxs("div",{className:`${Ue.header} ${g?Ue.source:""} ${e.pinned?Ue.pinned:""} ${!g&&!b?Ue.managed:""}`,role:"button",tabIndex:0,title:g?p(m?"chat.groups.cronHint":"chat.groups.subagentsHint",m?"Conversations created by scheduled tasks":"Conversations created by child agents"):void 0,onClick:i,onKeyDown:C=>{C.target===C.currentTarget&&(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),i())},children:[c.jsx("span",{className:`${Ue.chevron} ${a?Ue.collapsed:""}`,children:c.jsx(bo,{size:13})}),g&&c.jsx("span",{className:Ue.kindIcon,children:m?c.jsx(oi,{size:13}):c.jsx(Ut,{size:13})}),b?c.jsx(Ct,{autoFocus:!0,size:"small",className:Ue.renameInput,value:T,onChange:C=>S(C.target.value),onPressEnter:P,onBlur:P,onClick:C=>C.stopPropagation(),onKeyDown:C=>{C.key==="Escape"&&(S(e.name),y(!1))}}):c.jsx("span",{className:Ue.label,children:e.name}),c.jsx("span",{className:Ue.count,children:t}),e.pinned&&!g&&c.jsx("span",{className:Ue.pinMark,title:p("chat.groups.pinned","Pinned group"),children:c.jsx(Qa,{size:11})}),g&&c.jsx("span",{className:Ue.lockMark,title:p("chat.groups.fixedLast","Fixed at the bottom"),children:c.jsx(Cm,{size:11})}),!g&&!b&&c.jsx(ha,{menu:{items:w,onClick:({domEvent:C})=>C.stopPropagation()},trigger:["click"],children:c.jsx("button",{className:Ue.more,"aria-label":p("chat.groups.manage","Manage group"),onClick:C=>C.stopPropagation(),children:c.jsx(_d,{size:14})})})]})}const DP="SessionDateHeader-module__header__ZZ4hm",xP="SessionDateHeader-module__line__CWRGl",Xl={header:DP,line:xP};function RP({dateGroup:e,label:t}){return c.jsxs("div",{className:Xl.header,"data-date-group":e,children:[c.jsx("span",{children:t}),c.jsx("span",{className:Xl.line})]})}const IP="SessionGroupDnd-module__draggable__ijooJ",_P="SessionGroupDnd-module__dragging__Z-IEI",LP="SessionGroupDnd-module__dropActive__V-PTX",EP="SessionGroupDnd-module__overlay__NxXzk",po={draggable:IP,dragging:_P,dropActive:LP,overlay:EP},Pp=h.createContext({active:!1,overGroupId:null});function FP({active:e}){const{measureDroppableContainers:t}=Vh();return h.useLayoutEffect(()=>{e&&t([])},[e,t]),null}function OP({children:e,onMove:t,onDragStateChange:a}){const n=Nh(er(Uh,{activationConstraint:{delay:220,tolerance:6}}),er(Hh,{activationConstraint:{delay:300,tolerance:8}})),[o,i]=h.useState(null),s=h.useRef(null),[r,l]=h.useState(null),d=h.useCallback(g=>{const b=g.active.data.current;s.current=b,i(b),l(null),a(!0)},[a]),u=h.useCallback(g=>{var y,T;const b=(T=(y=g.over)==null?void 0:y.data.current)==null?void 0:T.groupId;l(typeof b=="string"?b:null)},[]),p=h.useCallback(()=>{s.current=null,i(null),l(null),a(!1)},[a]),m=h.useCallback(g=>{var T,S;const b=s.current,y=(S=(T=g.over)==null?void 0:T.data.current)==null?void 0:S.groupId;s.current=null,i(null),l(null),a(!1),b&&typeof y=="string"&&y!==b.groupId&&t(b.sessionId,y)},[a,t]),k=h.useMemo(()=>({active:o!==null,overGroupId:r}),[o,r]);return c.jsxs(qh,{sensors:n,measuring:{droppable:{strategy:jh.Always}},onDragStart:d,onDragOver:u,onDragCancel:p,onDragEnd:m,children:[c.jsx(FP,{active:o!==null}),c.jsx(Pp.Provider,{value:k,children:e}),c.jsx(Gh,{children:o?c.jsxs("div",{className:po.overlay,children:[c.jsx(Id,{size:14}),c.jsx("span",{children:o.label})]}):null})]})}function Yo({id:e,groupId:t,children:a,style:n,className:o=""}){const{active:i,overGroupId:s}=h.useContext(Pp),{setNodeRef:r}=Fh({id:e,data:{groupId:t}}
24);return c.jsx("div",{ref:r,style:n,className:`${o} ${i&&s===t?po.dropActive:""}`,children:a})}function BP({sessionId:e,groupId:t,label:a,children:n}){const{attributes:o,isDragging:i,listeners:s,setNodeRef:r,transform:l}=Oh({id:`session:${e}`,data:{sessionId:e,groupId:t,label:a}});return c.jsx("div",{ref:r,className:`${po.draggable} ${i?po.dragging:""}`,style:{transform:Bh.Translate.toString(l)},onPointerDownCapture:d=>{d.target.closest("button, input, textarea, [role='menuitem']")&&d.stopPropagation()},...o,...s,children:n})}const NP="qwenpaw-session-attention";function Vi(e,t){return`${e}:${t.realId||t.id}`}function HP(e,t,a){if(!a.lastFinishedAt)return!1;const n=Vi(t,a);if(!Object.prototype.hasOwnProperty.call(e,n))return!1;const o=e[n];if(!o)return!0;const i=Date.parse(a.lastFinishedAt),s=Date.parse(o);return Number.isFinite(i)&&Number.isFinite(s)&&i>s}const Xo=ft()(Su(e=>({seenFinishedAt:{},initializeSessions:(t,a)=>e(n=>{let o=!1;const i={...n.seenFinishedAt};for(const s of a){const r=Vi(t,s);Object.prototype.hasOwnProperty.call(i,r)||(i[r]=s.lastFinishedAt??null,o=!0)}return o?{seenFinishedAt:i}:n}),markSeen:(t,a)=>{if(!a.lastFinishedAt)return;const n=Vi(t,a);e(o=>o.seenFinishedAt[n]===a.lastFinishedAt?o:{seenFinishedAt:{...o.seenFinishedAt,[n]:a.lastFinishedAt??null}})}}),{name:NP,partialize:e=>({seenFinishedAt:e.seenFinishedAt})}));function Zl(e,t){return e.id===t||e.realId===t}function UP(e,t,a){const n=Xo(r=>r.seenFinishedAt),o=Xo(r=>r.initializeSessions),i=Xo(r=>r.markSeen);h.useEffect(()=>{o(e,t)},[e,o,t]);const s=h.useCallback(()=>{if(!a||document.visibilityState!=="visible")return;const r=t.find(l=>Zl(l,a));r&&i(e,r)},[e,a,i,t]);return h.useEffect(()=>(s(),document.addEventListener("visibilitychange",s),()=>document.removeEventListener("visibilitychange",s)),[s]),h.useMemo(()=>{const r=new Set;for(const l of t){const d=!!a&&document.visibilityState==="visible"&&Zl(l,a);HP(n,e,l)&&(d||r.add(l.id))}return r},[e,a,n,t])}const qP="sidebarSessionList-module__sessionList__MddC4",jP="sidebarSessionList-module__sessionListHeader__-6oLb",GP="sidebarSessionList-module__newChatBtn__KHYuq",VP="sidebarSessionList-module__searchContainer__WLPhG",WP="sidebarSessionList-module__searchInput__OF0aC",zP="sidebarSessionList-module__createGroupBtn__2opEX",KP="sidebarSessionList-module__groupInput__W6W7s",$P="sidebarSessionList-module__scroll__1xGqV",QP="sidebarSessionList-module__stickyGroupHeader__Xll1i",JP="sidebarSessionList-module__loadingState__70-ft",YP="sidebarSessionList-module__emptyState__39Djr",XP="sidebarSessionList-module__historyHeader__9GpVE",ZP="sidebarSessionList-module__historyLabel__400kK",eA="sidebarSessionList-module__historyChevron__ys0t5",Ie={sessionList:qP,sessionListHeader:jP,newChatBtn:GP,searchContainer:VP,searchInput:WP,createGroupBtn:zP,groupInput:KP,scroll:$P,stickyGroupHeader:QP,loadingState:JP,emptyState:YP,historyHeader:XP,historyLabel:ZP,historyChevron:eA},ed=42,tA=42,aA=24;function Ap({row:e,data:t}){const a=t.groups.filter(o=>o.kind!=="cron"&&o.kind!=="subagents"&&o.pinned===e.group.pinned),n=a.findIndex(o=>o.id===e.group.id);return c.jsx(MP,{group:e.group,count:e.count,collapsed:e.collapsed,canMoveUp:n>0,canMoveDown:n>=0&&n<a.length-1,onToggle:()=>t.toggleGroup(e.group.id),onRename:o=>t.renameGroup(e.group.id,o),onPin:o=>t.pinGroup(e.group.id,o),onDelete:()=>t.deleteGroup(e.group.id),onMoveUp:()=>t.moveGroup(e.group.id,-1),onMoveDown:()=>t.moveGroup(e.group.id,1)})}const nA=Ne.memo(function({index:t,style:a,data:n}){var d;const o=n.flatRows[t];if(!o)return null;if(o.kind==="groupHeader")return c.jsx(Yo,{id:`group:${o.group.id}`,groupId:o.group.id,style:a,children:c.jsx(Ap,{row:o,data:n})});if(o.kind==="dateHeader")return c.jsx(Yo,{id:`date:${o.groupId}:${o.dateGroup}`,groupId:o.groupId,style:a,children:c.jsx(RP,{dateGroup:o.dateGroup,label:o.label})});const i=o.session,s=((d=i.channel)==null?void 0:d.trim())||"",r=s?Pt(s,n.t):void 0,l=n.editingSessionId===i.id;return c.jsx(Yo,{id:`session-target:${i.id}`,groupId:o.groupId,style:a,children:c.jsx(BP,{sessionId:i.id,groupId:o.groupId,label:i.name||"New Chat",children:c.jsx(mP,{variant:"sidebar",sessionId:i.id,name:i.name||"New Chat",channelKe
24y:s||void 0,channelLabel:r,chatStatus:i.status,generating:i.generating,unseenResult:n.unseenSessionIds.has(i.id),archived:i.archived,pinned:i.pinned,source:i.source,groupId:o.groupId,groups:n.groups,active:i.id===n.currentSessionId||!!n.currentSessionId&&i.realId===n.currentSessionId,disabled:!1,editing:l,editValue:l?n.editValue:void 0,onClick:n.handleSessionClick,onEdit:n.handleEditStart,onDelete:n.handleDelete,onArchive:n.handleArchiveToggle,onPin:n.handlePinToggle,onMove:n.handleMove,onEditChange:n.handleEditChange,onEditSubmit:n.handleEditSubmit,onEditCancel:n.handleEditCancel})})})});function oA({onNewChat:e,onSessionClick:t}={}){const{t:a}=ve(),{message:n}=dn(),o=We(G=>G.selectedAgent),i=Ji(),s=Sp(i.pathname)??void 0,[r,l]=h.useState(""),[d,u]=h.useState(!1),[p,m]=h.useState(!1),{collapsedGroups:k,toggleGroup:g,expandGroup:b}=Dw(),{groups:y,createGroup:T,renameGroup:S,pinGroup:P,deleteGroup:w,reorderGroups:C}=Rw(!0),[x,I]=h.useState(!1),[R,_]=h.useState(""),A=h.useMemo(()=>Tw(y,{default:a("chat.groups.uncategorized","Uncategorized"),cron:a("chat.groups.cron","Scheduled tasks"),subagents:a("chat.groups.subagents","Subagents")}),[y,a]),j=Os(G=>G.sessions),U=h.useCallback(G=>{Gt(G)},[]),z=h.useCallback(G=>{t?t(G):window.dispatchEvent(new CustomEvent("qwenpaw:sidebar-select-session",{detail:{sessionId:G}}))},[t]),{sortedSessions:W,loading:Q,editingSessionId:he,editValue:D,handleSessionClick:N,handleEditStart:H,handleDelete:M,handleArchiveToggle:O,handlePinToggle:q,handleEditChange:K,handleEditSubmit:pe,handleEditCancel:ge,refreshSessions:te}=Tp(j,U,{active:!0,currentSessionId:s,onSessionClick:z}),ze=UP(o,W,s),J=h.useCallback(async(G,X,Oe=!0)=>{const Be=j.find(we=>we.id===G),He=Be?da(Be):null;if(He)try{await _e.updateChat(He,{group_id:X}),await te(),Oe&&b(X);const we=A.find(et=>et.id===X);n.success(a("chat.groups.moveSuccess","Moved to {{name}}",{name:(we==null?void 0:we.name)??""}))}catch(we){console.error("Failed to move conversation:",we),n.error(a("chat.groups.moveFailed","Could not move the conversation"))}},[b,n,te,j,a,A]),Rt=h.useCallback((G,X)=>{J(G,X,!1)},[J]),Ze=h.useCallback(async()=>{const G=R.trim();G&&(await T(G),I(!1),_(""))},[T,R]),Ke=h.useCallback(G=>{Yi.confirm({title:a("chat.groups.deleteTitle","Delete this group?"),content:a("chat.groups.deleteHint","Conversations will return to their built-in group."),okButtonProps:{danger:!0},onOk:async()=>{await w(G),await te()}})},[w,te,a]),$e=h.useCallback(async(G,X)=>{const Oe=y.find(Re=>Re.id===G);if(!Oe||Oe.kind==="cron"||Oe.kind==="subagents")return;const Be=y.filter(Re=>Re.kind!=="cron"&&Re.kind!=="subagents"&&Re.pinned===Oe.pinned),He=Be.findIndex(Re=>Re.id===G),we=He+X;if(He<0||we<0||we>=Be.length)return;const et=[...y],Aa=et.findIndex(Re=>Re.id===G),Ma=et.findIndex(Re=>Re.id===Be[we].id);[et[Aa],et[Ma]]=[et[Ma],et[Aa]],await C(et.map(Re=>Re.id))},[y,C]),mn=h.useCallback(()=>{e?e():window.dispatchEvent(new CustomEvent("qwenpaw:sidebar-new-chat"))},[e]),st=h.useMemo(()=>{const G=r.trim().toLowerCase();return G?W.filter(X=>(X.name||"New Chat").toLowerCase().includes(G)):W},[W,r]),Ca=h.useMemo(()=>r.trim()?null:Sw(W,A),[W,r,A]);xw(s,W,b);const Me=h.useMemo(()=>{if(r.trim())return st.map(X=>({kind:"session",session:X,groupId:Ns(X)}));if(!Ca)return[];const G=[];for(const X of Ca){const Oe=p||k.has(X.group.id);if(G.push({kind:"groupHeader",group:X.group,count:X.sessions.length,collapsed:Oe}),!Oe)for(const Be of Cw(X.sessions)){G.push({kind:"dateHeader",groupId:X.group.id,dateGroup:Be.key,label:a(`chat.group.${Be.key}`)});for(const He of Be.sessions)G.push({kind:"session",session:He,groupId:X.group.id})}}return G},[Ca,k,p,r,st,a]),Jt=h.useCallback(G=>{const X=Me[G];return X?X.kind==="groupHeader"?tA:X.kind==="dateHeader"?aA:ed:ed},[Me]),[vt,It]=h.useState(0),[hn,Do]=h.useState(0),Yt=h.useRef(null),Xt=h.useRef(null);h.useEffect(()=>{var G;p&&((G=Xt.current)==null||G.scrollTo(0))},[p]),h.useEffect(()=>{var G;(G=Xt.current)==null||G.resetAfterIndex(0)},[Me]);const gn=h.useRef(null);h.useEffect(()=>{var X;if(!s||gn.current===s)return;const G=bw(Me,s);G<0||(gn.current=s,(X=Xt.current)==null||X.scrollToItem(G,"smart"))},[s,Me,vt]);const fn=h.useCallback(G=>{if(Yt.current&&(Yt.current.disconnect(),Yt.current=null),!G)return;const X=new ResizeObserver(Be=>{for(const He of Be){const we=He.contentRect.height;we>0&&It(we)}});X.observe(G),Yt.current=X;const Oe=G.clientHeight;Oe>0&&It(Oe)},[]),wa=h.useMemo(()=>({flatRows:Me,unseenSessionIds:ze,currentSessionId:s,editingSessionId:he,editValue:D,t:a,handleSessionClick:N,handleEditStart:H,handleDelete:M,handleArchiveToggle:O,handlePinToggle:q,handleMove:J,handleEditChange:K,handleEditSubmit:pe,handleEditCancel:ge,toggleGroup:g,groups:A,renameGroup:S,pinGroup:P,deleteGroup:Ke,moveGroup:$e}),[Me,ze,s,he,D,a,N,H,M,O,q,J,K,pe,ge,g,A,S,P,Ke,$e]),Pa=h.useMemo(()=>
24{if(r.trim()||p)return null;const G=ww(Me,hn);return G===null?null:Me[G]},[Me,p,r,hn]);return c.jsxs("div",{className:Ie.sessionList,children:[c.jsxs("div",{className:Ie.sessionListHeader,children:[c.jsxs("button",{className:Ie.newChatBtn,onClick:mn,children:[c.jsx(wm,{size:14}),c.jsx("span",{children:a("chat.newChatTooltip")})]}),c.jsxs("button",{className:Ie.historyHeader,onClick:()=>u(G=>!G),children:[c.jsx("span",{className:Ie.historyLabel,children:a("chat.conversationHistory","Conversation History")}),c.jsx("span",{className:Ie.historyChevron,style:{transform:d?"rotate(-90deg)":"rotate(0deg)"},children:c.jsx(bo,{size:12})})]}),!d&&c.jsxs("div",{className:Ie.searchContainer,children:[c.jsx(Ct,{size:"small",allowClear:!0,placeholder:a("chat.sessionPanel.searchConversations","Search…"),value:r,onChange:G=>l(G.target.value),className:Ie.searchInput}),x?c.jsx(Ct,{autoFocus:!0,size:"small",className:Ie.groupInput,placeholder:a("chat.groups.namePlaceholder","Group name"),value:R,onChange:G=>_(G.target.value),onPressEnter:()=>void Ze(),onBlur:()=>{R.trim()||I(!1)}}):c.jsxs("button",{className:Ie.createGroupBtn,onClick:()=>I(!0),children:[c.jsx(Pm,{size:13}),c.jsx("span",{children:a("chat.groups.create","New group")})]})]})]}),!d&&c.jsxs("div",{className:Ie.scroll,ref:fn,children:[Q&&W.length===0&&c.jsx("div",{className:Ie.loadingState,children:c.jsx(nn,{size:"small"})}),!Q&&W.length===0&&c.jsx("div",{className:Ie.emptyState,children:a("chat.sessionPanel.noConversations","No conversations")}),W.length>0&&vt>0&&c.jsxs(OP,{onMove:Rt,onDragStateChange:m,children:[Pa&&c.jsx("div",{className:Ie.stickyGroupHeader,children:c.jsx(Ap,{row:Pa,data:wa})}),c.jsx(LT,{ref:Xt,height:vt,width:"100%",itemCount:Me.length,itemSize:Jt,itemData:wa,className:Ie.list,overscanCount:10,onItemsRendered:({visibleStartIndex:G})=>Do(G),children:nA})]})]})]})}const ka=[{key:"en",label:"English",icon:c.jsx(Ro,{})},{key:"zh",label:"简体中文",icon:c.jsx(Am,{})},{key:"ja",label:"日本語",icon:c.jsx(Mm,{})},{key:"ru",label:"Русский",icon:c.jsx(Dm,{})},{key:"pt-BR",label:"Português (Brasil)",icon:c.jsx(xm,{})},{key:"id",label:"Bahasa Indonesia",icon:c.jsx(Ro,{})},{key:"vi",label:"Tiếng Việt",icon:c.jsx(Ro,{})}],Ea="qwenpaw_sidebar_mode",Mp=ft(e=>({mode:(()=>{try{return localStorage.getItem(Ea)==="simple"?"simple":"full"}catch{return"full"}})(),toggleMode:()=>e(t=>{const a=t.mode==="simple"?"full":"simple";try{a==="simple"?localStorage.setItem(Ea,"simple"):localStorage.removeItem(Ea)}catch{}return{mode:a}}),setMode:t=>{try{t==="simple"?localStorage.setItem(Ea,"simple"):localStorage.removeItem(Ea)}catch{}e({mode:t})}})),iA="desktop",td="qpDesktop";function Vt(){return Is()||sA()}function sA(){var e;return typeof window>"u"?!1:typeof((e=window.__TAURI_INTERNALS__)==null?void 0:e.invoke)=="function"}function Dt(){if(typeof window>"u")return!1;if(Vt())return!0;try{if(sessionStorage.getItem(td)==="1")return!0;if(new URLSearchParams(window.location.search).get(iA)==="1")return sessionStorage.setItem(td,"1"),!0}catch{}return!1}const Hs="qwenpaw.closeWindowAction";function Dp(){var t;const e=(t=Us())==null?void 0:t.getItem(Hs);return e==="minimize-to-tray"||e==="quit"?e:null}function xp(e){var t;(t=Us())==null||t.setItem(Hs,e)}function rA(){var e;(e=Us())==null||e.removeItem(Hs)}function Us(){return typeof window>"u"?null:window.localStorage}const lA="sidebarSettingsPanel-module__panel__JhHrx",dA="sidebarSettingsPanel-module__row__rR-YE",cA="sidebarSettingsPanel-module__label__N9Iln",uA="sidebarSettingsPanel-module__options__Q40R-",pA="sidebarSettingsPanel-module__optBtn__ZMvz6",mA="sidebarSettingsPanel-module__optBtnActive__aIANo",hA="sidebarSettingsPanel-module__optBtnBlock__EWyzJ",gA="sidebarSettingsPanel-module__optLabel__MeXQw",fA="sidebarSettingsPanel-module__modeActions__tJMCq",bA="sidebarSettingsPanel-module__desktopModeBtn__vLMFX",le={panel:lA,row:dA,label:cA,options:uA,optBtn:pA,optBtnActive:mA,optBtnBlock:hA,optLabel:gA,modeActions:fA,desktopModeBtn:bA},kA=new Set(ka.map(e=>e.key));function yA({onClose:e}){const{t,i18n:a}=ve(),{themeMode:n,setThemeMode:o}=un(),{mode:i,toggleMode:s}=Mp(),[r,l]=Ne.useState(()=>Vt()?Dp()??"ask":"ask"),d=a.resolvedLanguage||a.language,u=kA.has(d)?d:d.split("-")[0],p=g=>{a.changeLanguage(g),localStorage.setItem("language",g),Po.updateLanguage(g).catch(()=>{})},m=g=>{g==="ask"?rA():xp(g),l(g)},k=[{key:"light",label:t("theme.light","Light"),icon:c.jsx(Ld,{size:14})},{key:"dark",label:t("theme.dark","Dark"),icon:c.jsx(Ed,{size:14})},{key:"system",label:t("theme.system","System"),icon:c.jsx(Rm,{size:14})}];return c.jsxs("div",{className:le.panel,children:[c.jsxs("div",{className:le.row,children:[c.jsx("span",{className:le.label,children:t("sidebar.settings.language","Language")}),c.jsx("div",{className:le.options,children:ka.map(({key:g,label:b,icon:y})=>c.jsx("button",{title:b,className:`${le.optBtn} ${u===g?le.optBtnActive:""}`,onClick:()=>p(g),children:Ne.cloneElement(y,{size:14})},g))})]}),c.jsxs("div",{className:le.row,children:[c.jsx("span",{className:le.label,children:t("sidebar.settings.theme","Theme")}),c.jsx("div",{className:le.options,children:k.map(({key:g,label:b,icon:y})=>c.jsxs("button",{title:b,className:`${le.optBtn} ${n===g?le.optBtnActive:""}`,onClick:()=>o(g),children:[y,c.jsx("span",{className:le.optLabel,children:b})]},g))})]}),Vt()?c.jsxs("div",{className:le.row,children:[c.jsx("span",{className:le.label,children:t("desktop.closeWindow.preference","Close Window")}),c.jsx(Nt,{size:"small",style:{width:"100%"},value:r,onChange:m,options:[{value:"ask",label:t("desktop.closeWindow.askEveryTime","Ask every time")},{value:"minimize-to-tray",label:t("desktop.closeWindow.minimizeToTray","Minim
24ize to Tray")},{value:"quit",label:t("desktop.closeWindow.quitApp","Quit App")}]})]}):null,c.jsxs("div",{className:le.row,children:[c.jsx("span",{className:le.label,children:t("sidebar.settings.mode","Mode")}),c.jsxs("div",{className:le.modeActions,children:[c.jsx("button",{className:`${le.optBtn} ${le.optBtnBlock}`,onClick:()=>{s(),e==null||e()},children:i==="simple"?c.jsxs(c.Fragment,{children:[c.jsx(Im,{size:14}),c.jsx("span",{className:le.optLabel,children:t("sidebar.fullMode","Full Mode")})]}):c.jsxs(c.Fragment,{children:[c.jsx(Fd,{size:14}),c.jsx("span",{className:le.optLabel,children:t("sidebar.simpleMode","Simple Mode")})]})}),c.jsxs("button",{className:`${le.optBtn} ${le.optBtnBlock} ${le.desktopModeBtn}`,onClick:()=>{e==null||e(),window.location.assign(Mu(window.location.pathname))},children:[c.jsx(_m,{size:14}),c.jsx("span",{className:le.optLabel,children:t("sidebar.settings.desktopMode","Desktop Mode")})]})]})]})]})}function ad(e){if(typeof e.msg!="string"||!e.msg)return null;if(!Array.isArray(e.loc))return e.msg;const t=e.loc.filter(a=>a!=="body").filter(a=>["string","number"].includes(typeof a)).join(".");return t?`${t}: ${e.msg}`:e.msg}function vA(e,t){if(!e||typeof e!="object")return t;const a=e.detail;if(typeof a=="string"&&a)return a;if(Array.isArray(a)){const n=a.map(o=>o&&typeof o=="object"?ad(o):null).filter(o=>!!o);if(n.length)return n.join("; ")}if(a&&typeof a=="object"){const n=ad(a);if(n)return n}return t}async function Qn(e,t){const a=await e.json().catch(()=>null);return vA(a,t)}const mo={login:async(e,t)=>{const a=await fetch(ee("/auth/login"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,password:t})});if(!a.ok)throw new Error(await Qn(a,"Login failed"));return a.json()},register:async(e,t)=>{const a=await fetch(ee("/auth/register"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,password:t})});if(!a.ok)throw new Error(await Qn(a,"Registration failed"));return a.json()},getStatus:async()=>{const e=await fetch(ee("/auth/status"));if(!e.ok)throw new Error("Failed to check auth status");return e.json()},updateProfile:async(e,t,a)=>{const n=localStorage.getItem("qwenpaw_auth_token")||"",o=await fetch(ee("/auth/update-profile"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({current_password:e,new_username:t||null,new_password:a||null})});
24if(!o.ok)throw new Error(await Qn(o,"Update failed"));return o.json()}},xn="qwenpaw.inbox.approvalWobble",Zo="qwenpaw:inbox-wobble-change";function TA(){const[e,t]=h.useState(()=>localStorage.getItem(xn)!=="false");h.useEffect(()=>{const n=()=>t(localStorage.getItem(xn)!=="false");return window.addEventListener(Zo,n),()=>window.removeEventListener(Zo,n)},[]);const a=h.useCallback(()=>{const n=localStorage.getItem(xn)==="false";localStorage.setItem(xn,String(n)),t(n),window.dispatchEvent(new CustomEvent(Zo))},[]);return[e,a]}const SA="index-module__mainLayout__jHQWK",CA="index-module__header__qmg3x",wA="index-module__showOnMobile__udMfd",PA="index-module__headerDivider__C5ILI",AA="index-module__hideOnMobile__wUYe6",MA="index-module__sider__s7Q1a",DA="index-module__agentScopedSection__0AEgL",xA="index-module__agentSelectorContainer__vk6CU",RA="index-module__stickyChatButton__1p80X",IA="index-module__stickyChatButtonActive__Yu3hb",_A="index-module__sideMenu__P7Tt2",LA="index-module__siderSimple__2gs-k",EA="index-module__siderCollapsed__4nqyY",FA="index-module__collapseToggleContainer__QEzlB",OA="index-module__logoWrapper__zQ9Ty",BA="index-module__logoImg__H5Vmp",NA="index-module__logoDivider__1Vjff",HA="index-module__versionBadge__JPPwl",UA="index-module__versionBadgeClickable__-1uiu",qA="index-module__versionBadgeDefault__nJdj3",jA="index-module__authActions__OBfp9",GA="index-module__authBtn__r5GZ2",VA="index-module__authBtnCollapsed__bsMAM",WA="index-module__accountIdentity__7ihrp",zA="index-module__runtimeRecovery__B-G55",KA="index-module__inboxShake__boL-5",$A="index-module__collapseToggle__vMkfM",QA="index-module__simpleAgentPanel__ms5P5",JA="index-module__simpleNavItems__mNQ5o",YA="index-module__simpleAgentDisclosure__lXv3-",XA="index-module__simpleAgentDisclosureLine__YhVPQ",ZA="index-module__simpleAgentDisclosureHandle__ARACo",eM="index-module__simpleAgentFunctionsMotion__flqf8",tM="index-module__simpleInboxItem__M2oe-",aM="index-module__simpleChatItem__RT9bn",nM="index-module__simpleInboxIcon__bA9lV",oM="index-module__simpleInboxUnreadDot__V-onX",iM="index-module__simpleNavItem__YGnt7",sM="index-module__simpleNavItemActive__pXran",rM="index-module__collapsedNav__vM5lc",lM="index-module__collapsedNavPinned__w-Lpm",dM="index-module__collapsedNavScroll__5bock",cM="index-module__collapsedNavItem__eUr-y",uM="index-module__collapsedNavItemActive__QyWbW",pM="index-module__updateModal__kPU1l",mM="index-module__updateModalBanner__weLWx",hM="index-module__updateModalBannerLeft__o140S",gM="index-module__updateModalVersionTag__FzKu4",fM="index-module__updateModalBannerTitle__8pDjy",bM="index-module__updateModalBody__szhpQ",kM="index-module__updateModalSpinWrapper__aaDh5",yM="index-module__updateViewReleasesBtn__C843u",vM="index-module__codeBlock__rBJMZ",TM="index-module__codeBlockInner__0zAp7",SM="index-module__codeInline__It5di",CM="index-module__copyBtn__aE6rx",wM="index-module__copyBtnCopied__QWHLu",PM="index-module__copyBtnDefault__nVQsA",F={mainLayout:SA,header:CA,showOnMobile:wA,headerDivider:PA,hideOnMobile:AA,sider:MA,agentScopedSection:DA,agentSelectorContainer:xA,stickyChatButton:RA,stickyChatButtonActive:IA,sideMenu:_A,siderSimple:LA,siderCollapsed:EA,collapseToggleContainer:FA,logoWrapper:OA,logoImg:BA,logoDivider:NA,versionBadge:HA,versionBadgeClickable:UA,versionBadgeDefault:qA,authActions:jA,authBtn:GA,authBtnCollapsed:VA,accountIdentity:WA,runtimeRecovery:zA,inboxShake:KA,collapseToggle:$A,simpleAgentPanel:QA,simpleNavItems:JA,simpleAgentDisclosure:YA,simpleAgentDisclosureLine:XA,simpleAgentDisclosureHandle:ZA,simpleAgentFunctionsMotion:eM,simpleInboxItem:tM,simpleChatItem:aM,simpleInboxIcon:nM,simpleInboxUnreadDot:oM,simpleNavItem:iM,simpleNavItemActive:sM,collapsedNav:rM,collapsedNavPinned:lM,collapsedNavScroll:dM,collapsedNavItem:cM,collapsedNavItemActive:uM,updateModal:pM,updateModalBanner:mM,updateModalBannerLeft:hM,updateModalVersionTag:gM,updateModalBannerTitle:fM,updateModalBody:bM,updateModalSpinWrapper:kM,updateViewReleasesBtn:yM,codeBlock:vM,codeBlockInner:TM,codeInline:SM,copyBtn:CM,copyBtnCopied:wM,copyBtnDefault:PM};
24function nd(e){return h.useSyncExternalStore(cn,()=>je.snapshot(e))}function iB(){return h.useSyncExternalStore(cn,()=>je.snapshot())}function Rp(){return h.useSyncExternalStore(cn,()=>ot.snapshot())}function $t({name:e,kind:t,children:a}){const n=h.useSyncExternalStore(cn,()=>$a.snapshot(e));if(t==="replace"){const i=n.find(r=>r.kind==="replace");if(!i)return c.jsx(c.Fragment,{children:a});const s=i.render(a);return s==null?c.jsx(c.Fragment,{children:a}):c.jsx(od,{slot:e,pluginId:i.source,children:s})}const o=n.filter(i=>i.kind==="fill");return c.jsxs(c.Fragment,{children:[a,o.map(i=>c.jsx(od,{slot:e,pluginId:i.source,children:i.render()},i.registrationId))]})}class od extends Ne.Component{constructor(){super(...arguments);V(this,"state",{errored:!1})}static getDerivedStateFromError(){return{errored:!0}}componentDidCatch(a){ke.record({kind:"slot.error",targetId:this.props.slot,pluginId:this.props.pluginId,detail:a.message,timestamp:Date.now()})}render(){return this.state.errored?this.props.fallback??null:this.props.children}}function Ip(e,t){if(e==null)return null;if(h.isValidElement(e))return e;if(typeof e=="function"||typeof e=="object"&&e.$$typeof!==void 0)return h.createElement(e,{size:t});const a={fontSize:t};return c.jsx("span",{style:a,children:e})}function _p(e){return typeof e=="function"?e():e}function Lp(e,t){if(!e)return;const a=t.find(n=>n.id===e);return a==null?void 0:a.path}function Wi(e,t){const{collapsed:a,iconSize:n=16,decorateLabel:o,getItemClassName:i}=t;return e.filter(s=>{var r;return((r=s.visible)==null?void 0:r.call(s))!==!1}).map(s=>{const r=s,l=a?null:_p(r.label),d=o?o(r,l):l,u={key:r.id,label:d,icon:Ip(r.icon,n),className:i==null?void 0:i(r)};if(r.__children&&r.__children.length>0){const p=r.__children.filter(m=>{var k;return((k=m.visible)==null?void 0:k.call(m))!==!1});u.children=Wi(p,t)}return u})}function Rn(e,t,a){const n=[],o=i=>{var s;for(const r of i){const l=r;if(((s=l.visible)==null?void 0:s.call(l))===!1||l.divider)continue;if(l.isGroup||l.__children&&l.__children.length>0){o(l.__children??[]);continue}const d=Lp(l.route,t);!d&&!l.href||n.push({key:l.id,icon:Ip(l.icon,a),label:_p(l.label),path:d??"",href:l.href})}};return o(e),n}function Ep(e,t){for(const a of e){const n=a;if(n.id===t)return n;if(n.__children){const o=Ep(n.__children,t);if(o)return o}}}function id(e){return e.filter(t=>{const a=t;return a.isGroup||a.__children&&a.__children.length>0}).map(t=>t.id)}const AM=new Set(["core.workspace","core.acp","core.agent-config","core.agent-stats"]);function Fp(e,t){if((t==null?void 0:t.workspace_ui)!==!1)return e;const a=!!(t.native_skills_ui||t.qwenpaw_skills_projection||t.provider_skills_discovery),n=!!t.native_tools_ui,o=!!(t.native_mcp_ui||t.qwenpaw_mcp_projection||t.provider_mcp_discovery),i=a||n||o;return e.flatMap(s=>{if(AM.has(s.id))return[];if(s.id==="core.agent-group"&&!i)return[];if(s.id==="core.skills"&&!a)return[];if(s.id==="core.tools"&&!n)return[];if(s.id==="core.mcp"&&!o)return[];const r=s;return r.__children?[{...r,__children:Fp(r.__children,t)}]:[s]})}async function de(e,t){const a=Sa(),n=await fetch(ee(e),{...t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`,...t==null?void 0:t.headers}});if(n.status===401)throw tn(),window.location.assign("/login"),new Error("Authentication expired");if(!n.ok)throw new Error(await Qn(n,`Request failed with ${n.status}`));if(n.status!==204)return n.json()}function In(e,t){var o;const a=new URLSearchParams;t.page&&a.set("page",String(t.page)),t.pageSize&&a.set("page_size",String(t.pageSize)),(o=t.query)!=null&&o.trim()&&a.set("q",t.query.trim()),Object.entries(t).forEach(([i,s])=>{["page","pageSize","query"].includes(i)||s!==void 0&&s!==""&&a.set(i,String(s))});const n=a.toString();return n?`${e}?${n}`:e}const pa={getHealth:()=>de("/hub/healthz"),me:()=>de("/hub/me"),changePassword:e=>de("/hub/me/password",{method:"POST",body:JSON.stringify({new_password:e})}),restartOwnRuntime:()=>de("/hub/me/runtime/restart",{method:"POST"}),listRuntimes:(e={})=>de(In("/hub/runtimes",e)),createRuntime:(e,t=!1)=>de("/hub/runtimes",{method:"POST",body:JSON.stringify({runtime_id:e,auto_start:t})}),startRuntime:e=>de(`/hub/runtimes/${e}/start`,{method:"POST"}),stopRuntime:e=>de(`/hub/runtimes/${e}/stop`,{method:"POST"}),rebuildRuntime:e=>de(`/hub/runtimes/${e}/rebuild`,{method:"POST"}),disableRuntime:e=>de(`/hub/runtimes/${e}/disable`,{method:"POST"}),deleteRuntime:e=>de(`/hub/runtimes/${e}`,{method:"DELETE"}),listUsers:(e={})=>de(In("/hub/admin/users",e)),createUser:(e,t,a)=>de("/hub/admin/users",{method:"POST",body:JSON.stringify({username:e,password:t,role:a})}),updateUser:(e,t)=>de(`/hub/admin/users/${e}`,{method:"PATCH",body:JSON.stringify(t)}),getSettings:()=>de("/hub/admin/settings"),updateSettings:(e,t)=>de("/hub/admin/settings",{method:"PUT",body:JSON.stringify({revision:e,config:t})}),getDockerImages:()=>de("/hub/images"),listDockerImagePulls:()=>de("/hub/images/pulls"),pullDockerImage:e=>de("/hub/images/pulls",{method:"POST",body:JSON.stringify({reference:e})}),listCredentials:(e={})=>de(In("/hub/credentials",e)),putCredential:(e,t,a)=>de("/hub/credentials",{method:"PUT",body:JSON.stringify({scope:e,name:t,value:a})}),deleteCredential:(e,t)=>de(`/hub/credentials/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{method:"DELETE"}),getOverview:()=>de("/hub/admin/overview"),listAuditEvents:(e={})=>de(In("/hub/admin/audit",e))},{Sider:MM}=Ja,Op="(max-width: 768px)";function sd(){return typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia(Op).matches}const DM=6e3,rd=new Set(["core.files","core.inbox","core.marketplace","core.cron-jobs","core.agent-config","core.models"]);function ld(e){const t=[];for(const a of e){const n=a;if(n.__children&&n.__children.length>
240)for(const o of n.__children)rd.has(o.id)&&t.push(o);else rd.has(n.id)&&t.push(n)}return t}function xM({selectedKey:e,hubMode:t=!1}){const a=Cd(),n=Ji(),{t:o}=ve(),{message:i}=dn(),{isDark:s}=un(),r=Sp(n.pathname),l=Jl(r),[d,u]=h.useState(!1),[p,m]=h.useState(!1),[k,g]=h.useState(""),[b,y]=h.useState(!1),[T,S]=h.useState(!1),[P,w]=h.useState(!1),[C]=Lt.useForm(),[x,I]=h.useState(sd),[R,_]=h.useState(!1),[A,L]=h.useState(sd),[j,U]=h.useState(!1),z=ov(),[W,Q]=h.useState(!1),[he,D]=h.useState(!1),[N,H]=h.useState(!1),[M]=TA(),O=h.useRef(new Set),q=h.useRef(new Set),{mode:K}=Mp(),{selectedAgent:pe,agents:ge}=We(),te=ge.find(E=>E.id===pe),ze=h.useMemo(()=>{var E;return te?{...te.backend_capabilities,workspace_ui:te.backend==="qwenpaw"?((E=te.backend_capabilities)==null?void 0:E.workspace_ui)??!0:!1}:void 0},[te]),J=nd("primary.agentScoped"),Rt=nd("primary.settings"),Ze=Rp(),Ke=h.useMemo(()=>{const E=Fp(J,ze);return K==="simple"?ld(E):E},[ze,J,K]),$e=h.useMemo(()=>K==="simple"?ld(Rt):Rt,[Rt,K]),mn=h.useMemo(()=>K!=="simple"?[]:[...Rn(Ke,Ze,16),...Rn($e,Ze,16)],[Ke,$e,Ze,K]),st=mn.find(E=>E.key==="core.inbox"),Ca=mn.filter(E=>E.key!=="core.inbox");h.useEffect(()=>{mo.getStatus().then(async E=>{if(u(E.enabled),E.mode==="hub"){const Y=await pa.me();m(Y.role==="admin"),g(Y.username)}}).catch(()=>{})},[]),h.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const E=window.matchMedia(Op),Y=()=>{L(E.matches),I(E.matches)};return Y(),E.addEventListener("change",Y),()=>{E.removeEventListener("change",Y)}},[]),h.useEffect(()=>{const E=async()=>{var fe;try{const[De,Zt]=await Promise.all([ua.getInboxEvents({unread_only:!0,limit:1}),ua.getPushMessages()]),bn=(((fe=De==null?void 0:De.events)==null?void 0:fe.length)||0)>
240,_t=(Zt==null?void 0:Zt.pending_approvals)||[],rt=new Set(_t.map(xo=>xo.request_id));O.current=rt;const Yp=rt.size>0&&[...rt].some(xo=>!q.current.has(xo));H(Yp),Q(bn),D(rt.size>0)}catch{}};E();const Y=window.setInterval(()=>{E()},DM);return()=>window.clearInterval(Y)},[]),h.useEffect(()=>{let E=!1;return(async()=>{try{const Y=await ie.getSessionList();!E&&Y.length>0&&Gt(Y)}catch{}})(),()=>{E=!0}},[]);const Me=W||he,Jt=he?"var(--app-error)":"var(--app-accent-hover)",vt=N&&M,It=h.useCallback(()=>{q.current=new Set(O.current),H(!1)},[]),hn=h.useCallback(E=>{const Y=E==null?void 0:E.closest("li");Y&&Y.addEventListener("mouseenter",It)},[It]),Do=(E,Y)=>E.id!=="core.inbox"||Y==null?Y:c.jsx("span",{ref:hn,children:c.jsx(Nd,{dot:Me,color:Jt,offset:[5,7],children:c.jsx("span",{children:Y})})}),Yt=E=>{if(E.id==="core.inbox"&&vt)return F.inboxShake},Xt=h.useMemo(()=>Wi(Ke,{collapsed:x,decorateLabel:Do,getItemClassName:Yt}),[Ke,x,W,he,vt]),gn=h.useMemo(()=>Wi($e,{collapsed:x}),[$e,x]),fn=h.useMemo(()=>[...id(Ke),...id($e)],[Ke,$e]),wa=h.useMemo(()=>{const E={key:"core.chat",icon:c.jsx(Ks,{size:18}),path:l,label:o("nav.chat")},Y=De=>c.jsxs("span",{style:{position:"relative",display:"inline-flex"},children:[De??c.jsx(ii,{size:18}),Me&&c.jsx("span",{style:{position:"absolute",top:-1,right:-3,width:6,height:6,borderRadius:"50%",background:Jt}})]});return[E,...Rn(Ke,Ze,18),...Rn($e,Ze,18)].map(De=>De.key==="core.inbox"?{...De,icon:Y(De.icon)}:De)},[Ke,$e,Ze,l,o,Me,Jt]),Pa=(E,Y)=>{const fe=Ep(Y,E);if(fe!=null&&fe.href){window.open(fe.href,"_blank","noopener,noreferrer");return}const De=Lp(fe==null?void 0:fe.route,Ze);De&&a(De)},G=h.useCallback(()=>{n.pathname.startsWith("/chat")?window.dispatchEvent(new CustomEvent("qwenpaw:sidebar-new-chat")):(sessionStorage.setItem("qwenpaw_pending_new_chat","1"),a("/chat"))},[n.pathname,a]),X=h.useCallback(E=>{const Y=ie.getEffectiveSessionId(E),fe=Jl(Y);a(fe)},[a]),Oe=async E=>{var De,Zt;const Y=((De=E.newUsername)==null?void 0:De.trim())||void 0,fe=((Zt=E.newPassword)==null?void 0:Zt.trim())||void 0;if(E.newPassword&&!fe){i.error(o("account.passwordEmpty"));return}if(E.newUsername&&!Y){i.error(o("account.usernameEmpty"));return}if(!t&&!Y&&!fe){i.warning(o("account.nothingToUpdate"));return}S(!0);try{if(t){if(!fe){i.warning(o("account.passwordRequired"));return}await pa.changePassword(fe)}else await mo.updateProfile(E.currentPassword||"",Y,fe);i.success(o("account.updateSuccess")),y(!1),C.resetFields(),tn(),window.location.href="/login"}catch(bn){const _t=bn instanceof Error?bn.message:"";let rt=o("account.updateFailed");_t.includes("password is incorrect")?rt=o("account.wrongPassword"):_t.includes("Nothing to update")||_t.includes("cannot be empty")?rt=o("account.nothingToUpdate"):_t&&(rt=_t),i.error(rt)}finally{S(!1)}},Be=async()=>{w(!0);try{await pa.restartOwnRuntime(),i.success(o("account.runtimeRestartSuccess")),window.location.reload()}catch(E){i.error(E instanceof Error?E.message:o("account.runtimeRestartFailed"))}finally{w(!1)}},He=e==="core.chat",we=wa.find(E=>E.key==="core.chat"),et=wa.filter(E=>E.key!=="core.chat"),Aa=E=>{const Y=E.key==="core.chat"?He:e===E.key;return c.jsx(mt,{title:E.label,placement:"right",children:c.jsx("button",{type:"button","aria-label":typeof E.label=="string"?E.label:void 0,className:`${F.collapsedNavItem} ${Y?F.collapsedNavItemActive:""}${E.key==="core.inbox"&&vt?` ${F.inboxShake}`:""}`,onClick:()=>{E.href?window.open(E.href,"_blank","noopener,noreferrer"):a(E.path)},onMouseEnter:E.key==="core.inbox"?It:void 0,children:E.icon})},E.key)},Ma=(K==="simple"||A)&&!x,Re=x?A?56:72:K==="simple"&&!A?280:240;return c.jsxs(MM,{width:Re,className:`${F.sider}${x?` ${F.siderCollapsed}`:""}${Ma?` ${F.siderSimple}`:""}`,children:[x?c.jsxs("nav",{className:F.collapsedNav,children:[we&&c.jsx("div",{className:F.collapsedNavPinned,children:Aa(we)}),c.jsx("div",{className:F.collapsedNavScroll,children:et.map(Aa)})]}):Ma?c.jsxs(c.Fragment,{children:[c.jsxs("div",{className:`${F.agentScopedSection} ${F.simpleAgentPanel}`,children:[c.jsx("div",{className:F.agentSelectorContainer,children:c.jsx(Dl,{collapsed:x})}),c.jsxs("button",{type:"button",className:`${F.simpleNavItem} ${F.simpleChatItem} ${He?F.simpleNavItemActive:""}`,onClick:()=>a(l),children:[c.jsx(Lm,{size:16}),c.jsx("span",{children:o("nav.chat")}
24)]}),st&&c.jsxs("button",{type:"button",className:`${F.simpleNavItem} ${F.simpleInboxItem} ${e===st.key?F.simpleNavItemActive:""}${vt?` ${F.inboxShake}`:""}`,onMouseEnter:It,onClick:()=>{st.href?window.open(st.href,"_blank","noopener,noreferrer"):a(st.path)},children:[c.jsxs("span",{className:F.simpleInboxIcon,children:[st.icon??c.jsx(ii,{size:16}),Me&&c.jsx("span",{className:F.simpleInboxUnreadDot,style:{background:Jt}})]}),c.jsx("span",{children:st.label})]}),c.jsxs("button",{type:"button",className:F.simpleAgentDisclosure,"aria-expanded":j,"aria-controls":"simple-agent-functions","aria-label":o("sidebar.toggleAgentNavigation","Expand or collapse agent navigation"),onClick:()=>U(E=>!E),children:[c.jsx("span",{className:F.simpleAgentDisclosureLine}),c.jsx(Sl.span,{className:F.simpleAgentDisclosureHandle,animate:{rotate:j?180:0},transition:z?{duration:0}:{duration:.22,ease:[.22,.78,.24,1]},children:c.jsx(bo,{size:14})}),c.jsx("span",{className:F.simpleAgentDisclosureLine})]}),c.jsx(Qk,{initial:!1,children:j&&c.jsx(Sl.div,{id:"simple-agent-functions",className:F.simpleAgentFunctionsMotion,initial:z?!1:{height:0,opacity:0,y:-4},animate:{height:"auto",opacity:1,y:0},exit:{height:0,opacity:0,y:-4},transition:z?{duration:0}:{duration:.24,ease:[.22,.78,.24,1]},children:c.jsx("div",{className:F.simpleNavItems,children:Ca.map(E=>{const Y=e===E.key;return c.jsxs("button",{className:`${F.simpleNavItem} ${Y?F.simpleNavItemActive:""}`,onClick:()=>{E.href?window.open(E.href,"_blank","noopener,noreferrer"):a(E.path)},children:[E.icon,c.jsx("span",{children:E.label})]},E.key)})})},"simple-agent-functions")})]}),c.jsx(oA,{onNewChat:G,onSessionClick:X})]}):c.jsxs(c.Fragment,{children:[c.jsxs("div",{className:F.agentScopedSection,children:[c.jsxs("div",{className:F.agentSelectorContainer,children:[c.jsx(Dl,{collapsed:x}),c.jsxs("button",{className:`${F.stickyChatButton}${He?` ${F.stickyChatButtonActive}`:""}`,onClick:()=>a(l),children:[c.jsx(Ks,{size:16}),c.jsx("span",{children:o("nav.chat")})]})]}),c.jsx($t,{name:"sider.top",kind:"fill"}),c.jsx($s,{mode:"inline",selectedKeys:[e],openKeys:fn,onClick:({key:E})=>Pa(String(E),Ke),items:Xt,theme:s?"dark":"light",className:F.sideMenu})]}),c.jsx($s,{mode:"inline",selectedKeys:[e],openKeys:fn,onClick:({key:E})=>Pa(String(E),$e),items:gn,theme:s?"dark":"light",className:F.sideMenu}),c.jsx($t,{name:"sider.bottom",kind:"fill"})]}),d&&!x&&c.jsxs("div",{className:F.authActions,children:[p&&c.jsx(Se,{type:"text",icon:c.jsx(Em,{size:16}),onClick:()=>a("/hub/admin"),block:!0,className:F.authBtn,children:o("hub.brand.title")}),c.jsx(Se,{type:"text",icon:c.jsx(Fm,{size:16}),onClick:()=>{C.resetFields(),y(!0)},block:!0,className:`${F.authBtn} ${x?F.authBtnCollapsed:""}`,children:!x&&o("account.title")}),c.jsx(Se,{type:"text",icon:c.jsx(Fd,{size:16}),onClick:()=>{tn(),window.location.href="/login"},block:!0,className:`${F.authBtn} ${x?F.authBtnCollapsed:""}`,children:!x&&o("login.logout")})]}),c.jsxs("div",{className:F.collapseToggleContainer,children:[c.jsx(Od,{open:R,onOpenChange:_,placement:x?"rightBottom":"topRight",trigger:"click",content:c.jsx(yA,{onClose:()=>_(!1)}),children:c.jsx(Se,{type:"text",icon:c.jsx(Om,{size:18}),className:F.collapseToggle})}),c.jsx(Se,{type:"text",icon:x?c.jsx(Bm,{size:20}):c.jsx(Nm,{size:20}),onClick:()=>I(!x),className:F.collapseToggle})]}),c.jsx(Yi,{open:b,onCancel:()=>y(!1),title:o("account.title"),footer:null,destroyOnHidden:!0,centered:!0,children:c.jsxs(Lt,{form:C,layout:"vertical",onFinish:Oe,children:[t?c.jsxs("div",{className:F.accountIdentity,children:[c.jsx("span",{children:o("account.username")}),c.jsx("strong",{children:k})]}):c.jsxs(c.Fragment,{children:[c.jsx(Lt.Item,{name:"currentPassword",label:o("account.currentPassword"),rules:[{required:!0,message:o("account.currentPasswordRequired")}],children:c.jsx(Ct.Password,{})}),c.jsx(Lt.Item,{name:"newUsername",label:o("account.newUsername"),children:c.jsx(Ct,{placeholder:o("account.newUsernamePlaceholder")})})]}),c.jsx(Lt.Item,{name:"newPassword",label:o("account.newPassword"),rules:t?[{required:!0,message:o("account.passwordRequired")},{min:8,message:o("hub.validation.passwordMin")}]:void 0,children:c.jsx(Ct.Password,{placeholder:o(t?"account.hubPasswordPlaceholder":"account.newPasswordPlaceholder")})}),c.jsx(Lt.Item,{name:"confirmPassword",label:o("account.confirmPassword"),dependencies:["newPassword"],rules:[({getFieldValue:E})=>({validator(Y,fe){return!fe&&!E("newPassword")||fe===E("newPassword")?Promise.resolve():Promise.reject(new Error(o("account.passwordMismatch")))}})],children:c.jsx(Ct.Password,{placeholder:o("account.confirmPasswordPlaceholder")})}),c.jsx(Lt.Item,{children:c.jsx(Se,{type:"primary",htmlType:"submit",loading:T,block:!0,children:o("account.save")})}),t&&c.jsxs("div",{className:F.runtimeRecovery,children:[c.jsx(Hm,{}),c.jsx("strong",{children:o("account.runtimeTitle")}),c.jsx("p",{children:o("account.runtimeDescription")}),c.jsx(En,{title:o("account.runtimeRestartConfirmTitle"),description:o("account.runtimeRestartConfirmDescription"),onConfirm:Be,okText:o("account.runtimeRestart"),cancelText:o("common.cancel"),children:c.jsx(Se,{icon:c.jsx(Bd,{size:16}),loading:P,block:!0,children:o("account.runtimeRestart")})})]})]})})]})}const RM="index-module__languageDropdown__ksvpo",IM={languageDropdown:RM},_M=new Set(ka.map(e=>e.key));function LM({persistRemotely:e=!0}){const{i18n:t}=ve(),a=t.resolvedLanguage||t.language,n=_M.has(a)?a:a.split("-")[0],o=r=>{t.changeLanguage(r),localStorage.setItem("language",r),e&&Po.updateLanguage(r).cat
24ch(l=>console.error("Failed to save language preference:",l))},i=ka.map(({key:r,label:l})=>({key:r,label:l,onClick:()=>o(r)})),s=Object.fromEntries(ka.map(({key:r,icon:l})=>[r,l]));return c.jsx(Um,{menu:{items:i,selectedKeys:[n]},placement:"bottomRight",overlayClassName:IM.languageDropdown,children:c.jsx(Se,{icon:s[n],type:"text"})})}const EM="index-module__toggleBtn__wswjC",FM="index-module__themeDropdown__y8JWd",dd={toggleBtn:EM,themeDropdown:FM},cd={light:c.jsx(Ld,{}),dark:c.jsx(Ed,{}),system:c.jsx(qm,{})};function OM(){const{themeMode:e,isDark:t,setThemeMode:a}=un(),{t:n}=ve(),o=[{key:"light",label:n("theme.light"),onClick:()=>a("light")},{key:"dark",label:n("theme.dark"),onClick:()=>a("dark")},{key:"system",label:n("theme.system"),onClick:()=>a("system")}],i=e==="system"?cd.system:cd[t?"dark":"light"];return c.jsx(ha,{menu:{items:o,selectedKeys:[e]},placement:"bottomRight",overlayClassName:dd.themeDropdown,children:c.jsx(Se,{className:dd.toggleBtn,type:"text",icon:i})})}function Bp({node:e,href:t,children:a,...n}){return c.jsx("a",{...n,href:t,onClick:o=>{o.preventDefault(),t&&Es(t)},style:{cursor:"pointer",...n.style},children:a})}const sB={a:Bp},BM="https://pypi.org/pypi/qwenpaw/json",ud="https://github.com/agentscope-ai/QwenPaw",NM=3600*1e3,Ao=e=>e.startsWith("zh")?"zh":"en",HM=e=>`https://qwenpaw.agentscope.io/docs/intro?lang=${Ao(e)}`,UM=e=>`https://qwenpaw.agentscope.io/docs/faq?lang=${Ao(e)}`,pd=e=>`https://qwenpaw.agentscope.io/release-notes?lang=${Ao(e)}`,qM=e=>`https://qwenpaw.agentscope.io/docs/functiondemo?lang=${Ao(e)}`,jM=e=>!/(\d)(a|alpha|b|beta|rc|c|dev)\d*/i.test(e),md=(e,t)=>{const a=s=>{const r=s.match(/\.post(\d+)$/i),l=r?Number(r[1]):0,d=s.replace(/\.post\d+$/i,""),u=d.match(/^(.+?)(a|alpha|b|beta|rc|c)(\d*)$/i);let p=d,m=0,k=0;if(u){p=u[1];const b=u[2].toLowerCase();m=b==="a"||b==="alpha"?-3:b==="b"||b==="beta"?-2:-1,k=u[3]?Number(u[3]):0}return[...p.split(/[.\-]/).map(b=>Number(b)||0),m,k,l]},n=a(e),o=a(t),i=Math.max(n.length,o.length);for(let s=0;s<i;s++){const r=(n[s]??0)-(o[s]??0);if(r!==0)return r}return 0},_n={zh:`### QwenPaw如何更新
25
26要更新 QwenPaw 到最新版本,可根据你的安装方式选择对应方法:
27
281. 如果你使用的是一键安装脚本,直接重新运行安装命令即可自动升级。
29
302. 如果你是通过 pip 安装,在终端中执行以下命令升级:
31
32\`\`\`
33qwenpaw update
34\`\`\`
35
363. 如果你是从源码安装,进入项目目录并拉取最新代码后重新安装:
37
38\`\`\`
39cd QwenPaw
40git pull origin main
41cd console && npm ci && npm run build
42cd .. && mkdir -p src/qwenpaw/console
43cp -R console/dist/. src/qwenpaw/console/
44pip install -e .
45\`\`\`
46
474. 如果你使用的是 Docker,拉取最新镜像并重启容器:
48
49\`\`\`
50docker pull agentscope/qwenpaw:latest
51docker run -p 127.0.0.1:8088:8088 -v qwenpaw-data:/app/working -v qwenpaw-secrets:/app/working.secret -v qwenpaw-backups:/app/working.backups agentscope/qwenpaw:latest
52\`\`\`
53
54升级后重启服务 qwenpaw app。`,ru:`### Как обновить QwenPaw
55
56Чтобы обновить QwenPaw, выберите способ в зависимости от типа установки:
57
581. Если вы устанавливали через однострочный скрипт, повторно запустите установщик для обновления.
59
602. Если устанавливали через pip, выполните:
61
62\`\`\`
63qwenpaw update
64\`\`\`
65
663. Если устанавливали из исходников, получите последние изменения и переустановите:
67
68\`\`\`
69cd QwenPaw
70git pull origin main
71cd console && npm ci && npm run build
72cd .. && mkdir -p src/qwenpaw/console
73cp -R console/dist/. src/qwenpaw/console/
74pip install -e .
75\`\`\`
76
774. Если используете Docker, загрузите новый образ и перезапустите контейнер:
78
79\`\`\`
80docker pull agentscope/qwenpaw:latest
81docker run -p 127.0.0.1:8088:8088 -v qwenpaw-data:/app/working -v qwenpaw-secrets:/app/working.secret -v qwenpaw-backups:/app/working.backups agentscope/qwenpaw:latest
82\`\`\`
83
84After upgrading, restart the service with \`qwenpaw app\`.`,en:`### How to update QwenPaw
85
86To update QwenPaw, use the method matching your installation type:
87
881. If installed via one-line script, re-run the installer to upgrade.
89
902. If installed via pip, run:
91
92\`\`\`
93qwenpaw update
94\`\`\`
95
963. If installed from source, pull the latest code and reinstall:
97
98\`\`\`
99cd QwenPaw
100git pull origin main
101cd console && npm ci && npm run build
102cd .. && mkdir -p src/qwenpaw/console
103cp -R console/dist/. src/qwenpaw/console/
104pip install -e .
105\`\`\`
106
1074. If using Docker, pull the latest image and restart the container:
108
109\`\`\`
110docker pull agentscope/qwenpaw:latest
111docker run -p 127.0.0.1:8088:8088 -v qwenpaw-data:/app/working -v qwenpaw-secrets:/app/working.secret -v qwenpaw-backups:/app/working.backups agentscope/qwenpaw:latest
112\`\`\`
113
114After upgrading, restart the service with \`qwenpaw app\`.`};var hd;(function(e){e.WINDOW_RESIZED="tauri://resize",e.WINDOW_MOVED="tauri://move",e.WINDOW_CLOSE_REQUESTED="tauri://close-requested",e.WINDOW_DESTROYED="tauri://destroyed",e.WINDOW_FOCUS="tauri://focus",e.WINDOW_BLUR="tauri://blur",e.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",e.WINDOW_THEME_CHANGED="tauri://theme-changed",e.WINDOW_CREATED="tauri://window-created",e.WINDOW_SUSPENDED="tauri://suspended",e.WINDOW_RESUMED="tauri://resumed",e.WEBVIEW_CREATED="tauri://webview-created",e.DRAG_ENTER="tauri://drag-enter",e.DRAG_OVER="tauri://drag-over",e.DRAG_DROP="tauri://drag-drop",e.DRAG_LEAVE="tauri://drag-leave"})(hd||(hd={}));async function GM(e,t){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(e,t),await Fe("plugin:event|unlisten",{event:e,eventId:t})}async function zi(e,t,a){var n;const o=(n=void 0)!==null&&n!==void 0?n:{kind:"Any"};return Fe("plugin:event|listen",{event:e,target:o,handler:JS(t)}).then(i=>async()=>GM(e,i))}
114async function VM(){return Dt()?Fe("check_desktop_update"):null}async function WM(){Dt()&&await Fe("install_desktop_update")}async function zM(){Dt()&&await Fe("download_desktop_update")}async function KM(){Dt()&&await Fe("install_downloaded_update")}async function $M(){return Dt()?Fe("check_cached_update"):null}async function QM(e){const t=[],a=async(o,i)=>{i&&t.push(await zi(o,s=>i(s.payload)))},n=o=>o?()=>o():void 0;return await Promise.all([a("update:check-start",n(e.onCheckStart)),a("update:download-progress",e.onDownloadProgress),a("update:install-start",n(e.onInstallStart)),a("update:download-done",e.onDownloadDone),a("update:error",e.onError)]),()=>{t.forEach(o=>o())}}const Np=h.createContext(null),JM=5e3;function ei(e){return typeof e=="string"?e:e instanceof Error?e.message:JSON.stringify(e)}function YM({children:e}){const[t,a]=h.useState("idle"),[n,o]=h.useState(!1),[i,s]=h.useState(!1),[r,l]=h.useState(!1),[d,u]=h.useState(""),[p,m]=h.useState(""),[k,g]=h.useState(0),[b,y]=h.useState(null),[T,S]=h.useState(0),[P,w]=h.useState(null),C=h.useRef([]);h.useEffect(()=>{if(!Dt())return;let U=!1;return $M().then(z=>{U||!z||(u(z),s(!0),l(!0),a("downloaded"),o(!0))}).catch(()=>{}),VM().then(z=>{var W;U||!z||(u(Q=>Q||z.version),m(((W=z.body)==null?void 0:W.trim())??""),s(!0),l(!!z.supportsLaterInstall))}).catch(z=>{console.warn("[updates] desktop update check failed",z)}),()=>{U=!0}},[]);const x=h.useCallback(U=>{const z=Date.now();C.current.push({t:z,downloaded:U.downloaded}),C.current=C.current.filter(D=>z-D.t<=JM);const W=C.current[0],Q=W?(z-W.t)/1e3:0,he=W?U.downloaded-W.downloaded:0;a("downloading"),g(U.downloaded),y(U.total??null),S(Q>0?Math.max(0,he/Q):0)},[]),I=h.useCallback(U=>{C.current=[],o(U),a("checking"),g(0),y(null),S(0),w(null)},[]);h.useEffect(()=>{if(!Dt())return;let U=null,z=!1;return QM({onCheckStart:()=>a("checking"),onDownloadProgress:x,onInstallStart:()=>a("installing"),onDownloadDone:W=>{a("downloaded"),u(W.version)},onError:W=>{a("failed"),w(W)}}).then(W=>{z?W():U=W}),()=>{z=!0,U==null||U()}},[x]);const R=h.useCallback(async()=>{I(!1);try{await WM()}catch(U){a("failed"),w({stage:"check",kind:"other",message:ei(U)})}},[I]),_=h.useCallback(async()=>{I(!0);try{await zM()}catch(U){a("failed"),w({stage:"check",kind:"other",message:ei(U)})}},[I]),A=h.useCallback(async()=>{o(!1),a("installing"),w(null);try{await KM()}catch(U){a("failed"),o(!1),w({stage:"install",kind:"other",message:ei(U)})}},[]),L=h.useCallback(()=>{a("idle"),w(null),o(!1)},[]),j=h.useMemo(()=>({phase:t,isBackground:n,hasUpdate:i,supportsLaterInstall:r,version:d,body:p,downloaded:k,total:b,throughputBps:T,error:P,startInstall:R,startBackgroundDownload:_,installDownloaded:A,retry:R,dismissFailure:L}),[t,n,i,r,d,p,k,b,T,P,R,_,A,L]);return c.jsx(Np.Provider,{value:j,children:e})}function qs(){const e=h.useContext(Np);if(!e)throw new Error("useDesktopUpdate must be used inside <DesktopUpdateProvider>");return e}const{Header:XM}=Ja;function ZM({code:e}){const[t,a]=h.useState(!1),n=()=>{navigator.clipboard.writeText(e).then(()=>{a(!0),setTimeout(()=>a(!1),2e3)})};return c.jsxs("div",{className:F.codeBlock,children:[c.jsx("code",{className:F.codeBlockInner,children:e}),c.jsx("button",{className:`${F.copyBtn} ${t?F.copyBtnCopied:F.copyBtnDefault}`,onClick:n,title:"Copy",children:t?c.jsx(Md,{}):c.jsx(Ym,{})})]})}function eD(){var he;const{t:e,i18n:t}=ve(),{isDark:a,setThemeMode:n}=un(),o=qs(),i=Dt(),[s,r]=h.useState(""),[l,d]=h.useState(""),[u,p]=h.useState(!1),[m,k]=h.useState(""),g=h.useRef([]);h.useEffect(()=>{ua.getVersion().then(D=>r((D==null?void 0:D.version)??"")).catch(()=>{})},[]);const b=()=>{if(!i)return;const D=Date.now(),N=D-3e3;g.current=g.current.filter(H=>H>N),g.current.push(D),g.current.length>=8&&(g.current=[],Fe("open_devtools").then(()=>Ys.success("DevTools opened")).catch(H=>{const M=H instanceof Error?H.message:typeof H=="string"?H:JSON.stringify(H);console.error("Failed to open DevTools:",M),Ys.error(`DevTools error: ${M}`)}))};h.useEffect(()=>{i||fetch(BM).then(D=>D.json()).then(D=>{var pe,ge;const N=(D==null?void 0:D.releases)??{},H=Object.entries(N).filter(([te])=>jM(te)).map(([te,ze])=>{const Rt=ze.map(Ze=>
114Ze.upload_time_iso_8601).filter(Boolean).sort().pop();return{version:te,uploadTime:Rt||""}});H.sort((te,ze)=>{const J=new Date(ze.uploadTime).getTime()-new Date(te.uploadTime).getTime();return J!==0?J:md(ze.version,te.version)});const O=H.map(te=>te.version)[0]??((pe=D==null?void 0:D.info)==null?void 0:pe.version)??"",q=(ge=H.find(te=>te.version===O))==null?void 0:ge.uploadTime,K=!!q&&new Date(q)<=new Date(Date.now()-NM);d(K?O:"")}).catch(()=>{})},[i]);const y=i?o.hasUpdate:!!s&&!!l&&md(l,s)>0,T=i?o.version:l,S=[{key:"tutorial",icon:c.jsx(jm,{}),label:e("header.tutorial"),onClick:()=>_(HM(t.language))},{key:"featureDemos",icon:c.jsx(Gm,{}),label:e("header.featureDemos"),onClick:()=>_(qM(t.language))},{key:"changelog",icon:c.jsx(Vm,{}),label:e("header.changelog"),onClick:()=>_(pd(t.language))},{key:"faq",icon:c.jsx(Qs,{}),label:e("header.faq"),onClick:()=>_(UM(t.language))}],P=[{key:"github",icon:c.jsx(Js,{}),label:e("header.github"),onClick:()=>_(ud)}],w=[{key:"language",label:e("sidebar.settings.language"),children:ka.map(({key:D,label:N})=>({key:D,label:N,onClick:()=>{t.changeLanguage(D),localStorage.setItem("language",D)}}))},{key:"theme",label:e("sidebar.settings.theme"),children:[{key:"light",label:e("theme.light"),onClick:()=>n("light")},{key:"dark",label:e("theme.dark"),onClick:()=>n("dark")},{key:"system",label:e("theme.system"),onClick:()=>n("system")}]},{type:"divider"},...S,...P],C=()=>{var M,O;k(""),p(!0);const D=(M=t.language)!=null&&M.startsWith("zh")?"zh":(O=t.language)!=null&&O.startsWith("ru")?"ru":"en";if(i){k(o.body||e("sidebar.updateModal.desktopInstallHint",{version:o.version}));return}const N=D==="zh"?"zh":"en",H=`https://qwenpaw.agentscope.io/docs/faq.${N}.md`;fetch(H,{cache:"no-cache"}).then(q=>q.ok?q.text():Promise.reject()).then(q=>{const K=/###\s*QwenPaw如何更新[\s\S]*?(?=\n###|$)/,pe=/###\s*How to update QwenPaw[\s\S]*?(?=\n###|$)/,ge=q.match(N==="zh"?K:pe);k(ge&&D!=="ru"?ge[0].trim():_n[D]??_n.en)}).catch(()=>{k(_n[D]??_n.en)})},x=()=>{p(!1),o.startInstall()},I=()=>{p(!1),o.startBackgroundDownload()},R=()=>{o.installDownloaded()},_=D=>{Es(D)},A=i&&o.isBackground&&(o.phase==="checking"||o.phase==="downloading"),L=i&&o.phase==="downloaded",j=i&&o.phase==="installing",U=i&&o.isBackground&&o.phase==="failed",z=A&&o.phase==="downloading"&&o.total?Math.min(99,Math.round(o.downloaded/o.total*100)):void 0,W=z!==void 0?`${e("sidebar.updateModal.backgroundDownloading")} ${z}%`:e("sidebar.updateModal.backgroundDownloading"),Q=(he=o.error)!=null&&he.message?`${e("sidebar.updateModal.backgroundFailed")}: ${o.error.message}`:e("sidebar.updateModal.backgroundFailed");return c.jsxs(c.Fragment,{children:[c.jsxs(XM,{className:F.header,children:[c.jsxs("div",{className:F.logoWrapper,onClick:b,children:[c.jsx($t,{name:"header.logo",kind:"replace",children:c.jsx("img",{src:a?"/logo-dark.svg":"/logo-light.svg",alt:"QwenPaw",className:F.logoImg})}),c.jsx("div",{className:F.logoDivider}),s&&c.jsx(Nd,{dot:!!y&&!L&&!A,color:"rgba(255, 157, 77, 1)",offset:[4,28],children:c.jsxs("span",{className:`${F.versionBadge} ${y||L?F.versionBadgeClickable:F.versionBadgeDefault}`,onClick:()=>{L||y&&C()},children:["v",s]})}),A&&c.jsx(mt,{title:W,children:c.jsx(Wm,{spin:!0,style:{marginLeft:6,fontSize:14,color:"rgba(255, 157, 77, 1)"}})}),L&&c.jsx(Od,{content:c.jsxs("div",{style:{textAlign:"center"},children:[c.jsx("p",{style:{marginBottom:12},children:e("sidebar.updateModal.readyToInstallHint",{version:o.version})}),c.jsx(ct,{type:"primary",size:"small",onClick:R,loading:j,children:e("sidebar.updateModal.restartNow")})]}),title:e("sidebar.updateModal.readyToInstall"),trigger:"click",children:c.jsx(mt,{title:e("sidebar.updateModal.readyToInstall"),children:c.jsx(zm,{style:{marginLeft:6,fontSize:14,color:"#52c41a"}})})}),U&&c.jsx(mt,{title:Q,children:c.jsx(Km,{style:{marginLeft:6,fontSize:14,color:"#ff4d4f",cursor:"pointer"},onClick:()=>void o.startBackgroundDownload()})})]}),c.jsx($t,{name:"header.left",kind:"fill"}),c.jsxs(oa,{size:"middle",children:[c.jsx($t,{name:"header.right",kind:"fill"}),S.length>0&&c.jsx(ha,{menu:{items:S},children:c.jsxs(ct,{type:"text",className:F.hideOnMobile,children:[e("header.resources")," ",c.jsx($m,{})]})}),c.jsx(mt,{title:e("header.github"),children:c.jsx(ct,{type:"text",icon:c.jsx(Js,{}),onClick:()=>_(ud),className:F.hideOnMobile,children:e("header.github")})}),c.jsx("div",{className:F.headerDivider}),c.jsx("span",{className:F.hideOnMobile,children:c.jsx(LM,{})}),c.jsx("span",{className:F.hideOnMobile,children:c.jsx(OM,{})}),c.jsx(ha,{menu:{items:w},placement:"bottomRight",children:c.jsx(ct,{type:"text",icon:c.jsx(Qs,{}),className:F.showOnMobile,title:e("header.resources")})})]})]}),c.jsxs(Qm,{title:null,open:u,onCancel:()=>p(!1),footer:[c.jsx(ct,{onClick:()=>p(!1),children:e("common.close")},"close"),i&&o.supportsLaterInstall?c.jsx(ct,{onClick:I,children:e("sidebar.updateModal.updateLater")},"later"):null,i?c.jsx(ct,{type:"primary",className:F.updateViewReleasesBtn,onClick:x,children:e("sidebar.updateModal.installDesktopUpdate")},"install"):c.jsx(ct,{type:"primary",className:F.updateViewReleasesBtn,onClick:()=>_(pd(t.language)),children:e("sidebar.updateModal.viewReleases")}
114,"releases")].filter(Boolean),width:960,className:F.updateModal,children:[c.jsx("div",{className:F.updateModalBanner,children:c.jsxs("div",{className:F.updateModalBannerLeft,children:[c.jsxs("span",{className:F.updateModalVersionTag,children:[c.jsx(Jm,{}),"Version ",T||s]}),c.jsx("div",{className:F.updateModalBannerTitle,children:e("sidebar.updateModal.title",{version:T||s})})]})}),c.jsx("div",{className:F.updateModalBody,children:m?c.jsx(Wh,{remarkPlugins:[zh],components:{a:Bp,code({node:D,className:N,children:H,...M}){var K,pe,ge,te;const O=/language-(\w+)/.exec(N||"");return((pe=(K=D==null?void 0:D.position)==null?void 0:K.start)==null?void 0:pe.line)!==((te=(ge=D==null?void 0:D.position)==null?void 0:ge.end)==null?void 0:te.line)||O?c.jsx(ZM,{code:String(H).replace(/\n$/,"")}):c.jsx("code",{className:F.codeInline,...M,children:H})}},children:m}):c.jsx("div",{className:F.updateModalSpinWrapper,children:c.jsx(nn,{})})})]})]})}const Hp=h.createContext(void 0);function tD({children:e}){const[t,a]=h.useState([]);return c.jsx(Hp.Provider,{value:{approvals:t,setApprovals:a},children:e})}function aD(){const e=h.useContext(Hp);if(!e)throw new Error("useApprovalContext must be used within ApprovalProvider");return e}const nD="index-module__wrap__wP7Ot",oD="index-module__bubble__H4Y3q",iD="index-module__icon__8y7eW",sD="index-module__text__yY78f",rD="index-module__close__B5Obh",Fa={wrap:nD,bubble:oD,icon:iD,text:sD,close:rD},lD=2500,dD=8e3,cD=500,uD="• ";function pD(){const[e,t]=h.useState([]),a=h.useRef(null),n=h.useRef(new Set),o=h.useRef(document.title),i=h.useRef(null),{setApprovals:s}=aD(),r=l=>{t(d=>d.filter(u=>u.id!==l))};return h.useEffect(()=>{o.current=document.title},[]),h.useEffect(()=>{const l={current:""},d=()=>{Ju.getPushMessages().then(u=>{var b;if(u!=null&&u.pending_approvals){const y=JSON.stringify(u.pending_approvals);y!==l.current&&(l.current=y,s(u.pending_approvals))}if(!((b=u==null?void 0:u.messages)!=null&&b.length))return;const p=n.current;p.size>cD&&p.clear();const m=[],k=Date.now();for(const y of u.messages)p.has(y.id)||(p.add(y.id),m.push({...y,dismissAt:k+dD}));if(m.length===0)return;const g=m.slice(-2);t(y=>[...y,...g].slice(-4))}).catch(()=>{})};return d(),a.current=setInterval(d,lD),()=>{a.current&&clearInterval(a.current)}},[]),h.useEffect(()=>{if(e.length===0)return;const l=setInterval(()=>{const d=Date.now();t(u=>{const p=u.filter(m=>m.dismissAt>d);return p.length===u.length?u:p})},500);return()=>clearInterval(l)},[e.length]),h.useEffect(()=>{if(e.length===0||!document.hidden||i.current)return;const l=o.current;let d=!0;return i.current=setInterval(()=>{document.title=d?`${uD}${l}`:l,d=!d},800),()=>{i.current&&(clearInterval(i.current),i.current=null),document.title=l}},[e.length]),h.useEffect(()=>{const l=()=>{document.visibilityState==="visible"&&(i.current&&(clearInterval(i.current),i.current=null),document.title=o.current)};return document.addEventListener("visibilitychange",l),()=>document.removeEventListener("visibilitychange",l)},[]),e.length===0?null:c.jsx("div",{className:Fa.wrap,role:"region","aria-label":"Cron messages",children:e.map(l=>c.jsxs("div",{className:Fa.bubble,children:[c.jsx(Xm,{size:18,className:Fa.icon,"aria-hidden":!0}),c.jsx("p",{className:Fa.text,title:l.text,children:l.text}),c.jsx("button",{type:"button",className:Fa.close,onClick:()=>r(l.id),"aria-label":"Close",children:c.jsx(Zm,{size:14})})]},l.id))})}const mD=1500;function hD(e,t){const a=e.some(n=>n.startup_status==="pending"||n.startup_status==="starting");h.useEffect(()=>{if(!a)return;let n=!1,o;const i=()=>{o=window.setTimeout(async()=>{try{await t()}catch{}finally{n||i()}},mD)};return i(),()=>{n=!0,o!==void 0&&window.clearTimeout(o)}},[a,t])}function gD(){const e=We(a=>a.agents),t=We(a=>a.refreshAgents);return hD(e,t),null}const fD={save:"Save",reset:"Reset",cancel:"Cancel",confirm:"Confirm",apply:"Apply",delete:"Delete",edit:"Edit",create:"Create",upload:"Upload",download:"Download",refresh:"Refresh",retry:"Retry",search:"Search",enable:"Enable",disable:"Disable",enabled:"Enabled",disabled:"Disabled",preview:"Preview",raw:"Raw",view:"View",content:"Content",loading:"Loading...",saving:"Saving...",copy:"Copy",copied:"Copied to clipboard",copyFailed:"Failed to copy to clipboard",contentPlaceholder:"Enter content...",help:"Help",close:"Close",back:"Back",actions:"Actions",total:"Total {{count}}",clear:"Clear",paste:"Paste",yes:"Yes",no:"No"},bD={closeWindow:{title:"Close Window",description:"What would you like to do when closing the window? Quitting the app stops all running tasks and scheduled jobs.",remember:"Remember my choice",showWindow:"Show Window",minimizeToTray:"Minimize to Tray",quitApp:"Quit App",preference:"Close Window",askEveryTime:"Ask every time"}}
114,kD={title:"Failed to load page",subTitle:"This may be caused by a network issue or an application update.",genericTitle:"Something went wrong",genericSubTitle:"An unexpected error occurred while rendering this page.",reload:"Reload"},yD={backToList:"Back",subtitle:"Manage installed apps, or expand your workspace from official and community channels.",myApps:"My Apps",officialApps:"Official Apps",appMarket:"App Market",browseOfficialApps:"Browse Official Apps",browseMarket:"Browse App Market",officialAppsEmpty:"No official apps yet",searchOfficial:"Search official apps...",installedCount:"{{count}} apps",clearFilters:"Clear filters",moreActions:"More actions",openApp:"Open app",noDescription:"No description",search:"Search apps...",allCategories:"All",noApps:"No apps installed yet",noResults:"No apps match your search",loadFailed:"Failed to load apps. Please retry.",appNotLoaded:"This app is not loaded yet.",appLoadFailed:"The app failed to load. You can retry without affecting other apps.",uninstall:"Uninstall",uninstallConfirmTitle:"Uninstall app?",uninstallConfirmContent:'This will delete the app directory of "{{name}}". This cannot be undone.',uninstallSuccess:"App uninstalled",uninstallFailed:"Uninstall failed",installing:"Installing",installSuccess:"Installed",installFailed:"Install failed",installedStatus:"Installed",update:"Update",searchMarket:"Search app market...",marketFilters:"App market filters",filterAll:"All",trending:"Trending",marketEmpty:"No apps found",loadMore:"Load more",noMoreApps:"No more apps",install:"Install",details:"Details",featured:"Featured",aboutApp:"About App",exitApp:"Exit App",moreOptions:"More Options",backToListHint:"Back to app list (ESC)",version:"Version",id:"ID",category:"Category",description:"Description"},vD={connected:"Connected",disconnected:"Disconnected",notConnected:"Not connected",comingSoon:"Coming soon",connect:"Connect with ChatGPT",disconnect:"Disconnect",apiKeyAuthenticated:"Authenticated with API key",chatGptAuthenticated:"Connected with ChatGPT",cliAuthenticated:"{{type}} CLI authenticated"},TD={chat:"Chat",files:"Files",control:"Control",channels:"Channels",sessions:"Sessions",inbox:"Inbox",apps:"Apps",cronJobs:"Cron Jobs",heartbeat:"Heartbeat",agent:"Workspace",workspace:"Files",skills:"Skills",skillPool:"Skill Pool",marketplace:"Extension",market:"Skill Market",tools:"Tools",mcp:"MCP",acp:"ACP",agentConfig:"Configuration",agents:"Agent Management",settings:"Settings",models:"Models",environments:"Environments",offloadPolicy:"Tool Offload",security:"Security",tokenUsage:"Token Usage",agentStats:"Agent Statistics",voiceTranscription:"Voice Transcription",debug:"Debug",plugins:"Plugins",backups:"Backups",pluginManager:"Plugin Manager"},SD={console:"Console",appStore:"App Store",appStoreDesc:"Install or remove desktop apps",arrangeDesktop:"Clean up desktop",approvalActionFailed:"Action failed, please retry",booting:"Starting up…",changeWallpaper:"Change wallpaper",clearAll:"Clear all",closeApp:"Close",currentSpace:"Current space",currentSpaceLabel:"Current space: {{name}}",currentAppLabel:"Current app: {{name}}",desktopApps:"Desktop apps",finder:"Desktop",focusApp:"Focus",install:"Install",installed:"installed",installedApp:"Installed",installedApps:"Installed apps",launchpad:"Launchpad",moveDockLeft:"Move left",moveDockRight:"Move right",missionControl:"Mission Control",noInstalledApps:"No apps installed",noNotifications:"No notifications",noOpenWindows:"No open windows in this space",noSettings:"No settings available",notInstalled:"not installed",notifications:"Notifications",notificationSummary:"Approvals {{approvals}} · Inbox {{inbox}}",notifyApproval:"Approval",notifyInbox:"Inbox",openApp:"Open",keepInDock:"Keep in Dock",removeFromDock:"Remove from Dock",refreshDesktop:"Refresh desktop",appMarket:"App Market",appMarketRefresh:"Refresh",appMarketSearch:"Search apps...",appMarketEmpty:"No apps found",appMarketUnavailable:"The app market is currently unavailable. Please try again later.",appMarketInstall:"Install",appMarketDetails:"Details",appMarketDeveloper:"Developer",appMarketDownloads:"Downloads",appInstalled:"App installed successfully",a
114ppInstallFailed:"App installation failed",appCompatibilityWarningTitle:"App Compatibility Warning",appCompatibilityWarningContent:"This app is labeled for QwenPaw {{labels}}. Your QwenPaw version is {{version}}. Installing it may cause errors. Continue?",appCompatibilityWarningConfirm:"Install anyway",appCompatibilityUnverified:"Compatibility with your QwenPaw version is unverified.",restoreAll:"Restore all",returnToConsole:"Return to console",desktopMode:"Desktop mode",qwenpawMenu:"QwenPaw menu",restoredAll:"Restored all apps",sortBy:"Sort by",sortFree:"Free arrangement",sortName:"Name",sortType:"Type",systemSettings:"System Settings",uninstall:"Uninstall",uninstallConfirmTitle:"Uninstall app?",uninstallFailed:"Uninstall failed",uninstalledApp:"Uninstalled",update:"Update",wallpaper:"Wallpaper",windows:"windows"},CD={newVersion:"New version available: v{{version}}, click to upgrade",updateModal:{title:"New version available: v{{version}}",viewReleases:"View Releases",installDesktopUpdate:"Update Now",desktopInstallHint:"QwenPaw Desktop {{version}} is ready to install. The app will restart after the update.",checking:"Checking for updates…",checkingHint:"Confirming the latest release",downloading:"Downloading update",downloadingTo:"Updating to version {{version}}",downloadProgress:"{{done}} / {{total}} · {{rate}}",installing:"Installing update",willRestart:"The app will restart automatically when done.",stepPrepare:"Prepare",stepDownloading:"Download",stepInstalling:"Install",failedTitle:"Update failed",back:"Back",retry:"Retry",errors:{network:"Couldn't reach the update server. Check your internet and try again.",signature:"Update file signature invalid. Try downloading again.",appLocation:"QwenPaw is running from a read-only macOS location. Move QwenPaw.app to the Applications folder, launch it from there, then try updating again.",other:"Update failed."},updateLater:"Download in Background",backgroundDownloading:"Downloading in background…",readyToInstall:"Update ready",readyToInstallHint:"v{{version}} update is downloaded. Restart to install and launch the new version.",restartNow:"Update Now",backgroundFailed:"Background download failed"},settings:{language:"Language",theme:"Theme",mode:"Mode",desktopMode:"Desktop Mode"},simpleMode:"Simple Mode",fullMode:"Full Mode",toggleAgentNavigation:"Expand or collapse agent navigation"},wD={title:"Debug",desc:"View the backend daemon log file to help diagnose issues. Logs refresh automatically while this page is open.",level:{all:"All"},backend:{title:"Backend logs",autoRefresh:"Auto refresh",newestFirst:"Newest first",updatedAt:"Updated at",path:"Log file",notFound:"Backend log file was not found yet.",placeholder:"Backend log output will appear here.",loadFailed:"Failed to load backend logs",searchPlaceholder:"Search backend logs..."},actions:{refreshBackend:"Refresh backend logs",refreshSuccess:"Logs refreshed",copyBackend:"Copy backend logs"}},PD={title:"Inbox",tabApprovals:"Approvals",tabPushMessages:"Push Messages",tabHarvests:"AI Harvest",summaryApprovals:"Approvals",summaryPushUnread:"Unread Push",summaryHarvests:"Harvests",from:"From:",heartbeatSuccess:"Heartbeat completed successfully",heartbeatTimeout:"Heartbeat timed out",heartbeatCancelled:"Heartbeat was cancelled",heartbeatFailed:"Heartbeat failed",skillAutoSyncTitle:"Skill auto-sync",skillBuiltinAutoUpdateTitle:"Built-in skill auto-update",skillPoolSender:"Skill Pool",skillAutoSynced:'Skill "{{skill}}" changed — auto-synced to: {{agents}}',skillAutoSyncFailed:'Skill "{{skill}}" auto-sync failed for: {{agents}}',skillBuiltinUpdated:'Built-in "{{skill}}" updated in the Pool: {{from}} → {{to}}',skillBuiltinUpdateFailed:'Built-in "{{skill}}" could not update in the Pool',skillBuiltinSynced:'"{{skill}}" synced to: {{agents}}',skillBuiltinSyncFailed:'"{{skill}}" could not sync to: {{agents}}',requestedBy:"By",markRead:"Mark Read",markAllRead:"Mark All Read",markAllReadNoUnread:"No unread messages",markAllReadSuccess:"Marked {{count}} messages as read",selectAllCurrentPage:"Select current page",selectedItems:"{{count}} selected",batchDeleteButton:"Batch Delete",batchOperation:"Batch",exitBatch:"Exit Batch",batchDeleteConfirm:"Delete {{count}} selected push messages?",batchDeleteSuccess:"Deleted {{count}} push messages",pushCronHeader:"Cron Job: {{name}}",viewDetails:"View Details",deleteMessageConfirm:"Delete this push message?",viewAll:"View All",read:"Read",approve:"Approve",reject:"Reject",ready:"Ready",harvestNow:"Harvest Now",createHarvest:"Create Harvest",createFirstHarvest:"Create Your First Harvest",createSuccess:"Harvest created successfully",emptyApprovals:"No pending approvals",emptyPush:"No push messages",wobbleEnable:"Enable approval wobble notification",wobbleDisable:"Disable approval wobble notification",emptyHarvests:"No harvests yet",statusReadyToHarvest:"Ready to Harvest",statusGrowing:"Growing",harvestedTimes:"Harvested {{count}} times",harvestSuccessRate:"Success Rate {{rate}}%",messageDetailComingSoon:"Message detail view - Coming soon!",harvestSettingsComingSoon:"Harvest settings - Coming soon!",messageDetailTitle:"Execution Detail",detailCronTitle:"Cron Job: {{name}}",detailHeartbeatTitle:"Heartbeat",messageNotFound:"Message not found",detailTaskName:"Task Name",detailTaskId:"Task ID",detailStatus:"Status",detailSeverity:"Severity",detailAgent:"Agent",detailSource:"Source",detailSourceCronJob:"Cron Job",detailSourceHeartbeat:"Heartbeat",detailTrigger:"Trigger",detailDuration:"Duration",detailExecutedAt:"Executed At",detailReceivedAt:"Received At",detailRunId:"Run ID",detailContent:"Output",detailPayload:"Payload",detailExecutionTrace:"Execution Trace",detailTraceEmpty:"No execution trace available",mailDetailSender:"Sender",mailDetailSubject:"Subject",mailDetailDate:"Mail time",mailDetailBody:"Body preview",mailDetailProcess:"Processing steps",filterByAgent:"Filter by agent",filterBySourceType:"Filter by source",sourceTypeCron:"Cron",sourceTypeHeartbeat:"Heartbeat",sourceTypeMemory:"Memory",sourceTypeMail:"Mail",mailAccessControl:"Mail Access Control",pendingSenders:"Pending Senders",senderLists:"Sender Lists",addSender:"Add Sender",domainWildcardHint:"Supports domain wildcards, e.g. *@example.com",invalidAddress:"Invalid email address. Use a format like [email protected] or *@domain.com",whitelist:"Whitelist",blacklist:"Blacklist",approveSender:"Approve",deny:"Block",dismiss:"Dismiss",batchApprove:"Batch Approve",batchDeny:"Batch Block",batchDismiss:"Batch Dismiss",batchRemove:"Batch Remove",confirmApprove:"Approve selected senders?",confirmDeny:"Deny selected senders?",confirmDismiss:"Dismiss selected senders?",confirmRemove:"Confirm remove?",removeSuccess:"Removed successfully",addedToAllAgents:"Added and synced to all agents",senderAddress:"Sender Address",displayName:"Sender Name",emailSubject:"Subject",bodyPreview:"Body Preview",selectAgent:"Select Agent",allAgents:"All Agents",time:"Time",remark:"Remark",actions:"Actions",optional:" (optional)",required:" (required)"},AD={title:"ACP",loading:"Loading ACP configuration...",builtin:"Built-in",custom:"Custom",create:"Add Custom Agent",createTitle:"Create ACP Agent",createSuccess:"ACP agent created",editTitle:"Edit ACP Configuration",agentKey:"Agent Key",agentKeyRequired:"Please enter an agent key",agentKeyInvalid:"Agent key can only contain letters, numbers, underscores, and hyphens",agentKeyExists:"This agent key already exists",enabled:"Enabled",command:"Command",commandRequired:"Please enter a command",args:"Arguments",argsHelp:"One argument per line",env:"Environment Variables",envHelp:"Use KEY=VALUE format on each line",envInvalidLine:"Invalid environment variable format: {{line}}",trusted:"Trusted",toolParseMode:"Tool Parse Mode",toolParseModeRequired:"Please select a tool parse mode",stdioBufferLimit:"Stdio Buffer Limit",stdioBufferLimitHelp:"Maximum stdio line buffer size in bytes for the ACP subprocess.",stdioBufferLimitRequired:"Please enter a stdio buffer limit",stdioBufferLimitMin:"Stdio buffer limit must be at least 1 byte",docs:"Setup Docs",docsHelp:'Open the ACP integration docs and jump to the "How to configure external runners" section',notSet:"Not set",configSaved:"ACP configuration saved",configFailed:"Failed to save ACP configuration",deleteTitle:"Delete {{name}}",deleteConfirm:"Delete this ACP agent? This action cannot be undone.",deleteSuccess:"ACP agent deleted",deleteFailed:"Failed to delete ACP agent",n
114odeSettings:"Node Settings",nodePath:"Node path",chooseOtherNode:"Choose another Node...",selectNodePath:"Select Node path",nodePathPrompt:"Enter the node executable path",nodeSaved:"Node settings saved",nodeLoadFailed:"Failed to load Node settings",nodeSaveFailed:"Node path is unavailable",nodeRuntime:{bundled:"Bundled Node",system:"System Node",custom:"Custom Node"},nodeRuntimeReason:{systemNodeMissing:"System Node was not detected",nodeMissing:"Node path does not exist",npxMissing:"npx was not found",versionCheckFailed:"Version check failed",unavailable:"Unavailable"}},MD={title:"Voice Transcription",description:"Configure how incoming audio and voice messages are handled.",saveSuccess:"Audio mode saved",saveFailed:"Failed to save audio mode",audioModeLabel:"Audio Mode",audioModeDescription:"Choose how voice messages from channels (Discord, Telegram, etc.) are processed before being sent to the model.",modeAuto:"Auto (Recommended)",modeAutoDesc:"Transcribe audio to text using the selected transcription provider, then send the text to the model. If transcription is unavailable or disabled, a file-uploaded placeholder is shown instead. Audio is never sent directly to the model in this mode. Works with all models.",modeNative:"Native Audio",modeNativeDesc:"Send the audio file directly to the model without transcription. This is the only mode that sends audio to the model. Only works with specific audio-capable models (e.g. gpt-4o-audio). Most models do not support this and will reject the message.",ffmpegReady:"ffmpeg is installed. Audio conversion is available for native mode.",ffmpegMissing:"ffmpeg is not installed.",ffmpegMissingDesc:"Native audio mode requires ffmpeg to convert audio formats (e.g. .ogg to .wav). Install ffmpeg as a system package to enable this mode.",providerTypeLabel:"Transcription Provider",providerTypeDescription:"Choose the transcription backend. Select Disabled if you do not need voice transcription.",providerTypeDisabled:"Disabled",providerTypeDisabledDesc:"No transcription. Voice messages will show a file-uploaded placeholder.",providerTypeWhisperApi:"Whisper API",providerTypeWhisperApiDesc:"Use an OpenAI-compatible Whisper API endpoint from a configured provider (e.g. OpenAI, Ollama).",providerTypeLocalWhisper:"Local Whisper",providerTypeLocalWhisperDesc:"Run transcription locally using the openai-whisper Python library. Requires both ffmpeg and openai-whisper to be installed.",localWhisperReady:"Local Whisper is ready. Both ffmpeg and openai-whisper are installed.",localWhisperMissing:"Local Whisper is not ready. Missing dependencies must be installed.",localWhisperMissingDesc:"ffmpeg: {{ffmpeg}} | openai-whisper: {{whisper}}. Install missing dependencies: ffmpeg (system package) and openai-whisper (uv pip install openai-whisper, or install QwenPaw with the [whisper] extra).",providerLabel:"Whisper API Provider",providerDescription:"Select which provider to use for audio transcription via the Whisper API. Only providers with a Whisper-compatible endpoint are shown.",providerPlaceholder:"Select a provider...",noProvidersWarning:"No transcription-capable providers found. Configure an OpenAI provider to enable voice transcription.",transcriptionInfoTitle:"How transcription works",transcriptionInfoDesc:"Whisper API transcription uses an OpenAI-compatible /v1/audio/transcriptions endpoint. This requires a configured provider with a Whisper-compatible endpoint — for example, an OpenAI provider. Select a specific provider above to enable transcription.",transcriptionInfoDescLocal:"Local Whisper transcription runs the openai-whisper library directly on your machine. It requires both ffmpeg (for audio decoding) and the openai-whisper Python package to be installed. No API key or network connection is needed. Install with: uv pip install 'qwenpaw[whisper]'."},DD={title:"Backups",description:"Backup and restore agent workspaces and configurations.",create:"Create Backup",import:"Import",export:"Export",restore:"Restore",delete:"Delete",batchDelete:"Delete Selected",batchDeleteConfirm:"Are you sure you want to delete {{count}} backup(s)? This action cannot be undone.",deleteConfirm:"Are you sure you want to delete this backup? This action cannot be undone.",name:"Name",createdAt:"Created",scopeSummary:"Scope",descriptionLabel:"Description",noBackups:"No backups yet. Create one to backup your current configuration.",loadFailed:"Failed to load backups",createTitle:"Create Backup",backupMode:"Backup Mode",fullBackup:"Full Backup",fullBackupDesc:"Backup everything including all agent workspaces, global settings, skill pool, and secrets",customBackup:"Custom Backup",partialBackup:"Parti
114al Backup",partialBackupDesc:"Customize what to backup",nameRequired:"Backup name is required",namePlaceholder:"Enter backup name",descriptionPlaceholder:"Optional description...",scopeAgents:"Agent Workspaces",scopeGlobalConfig:"Global Settings",scopeSkillPool:"Skill Pool",scopeSecrets:"Secrets",scopeSecretsHint:"Includes model provider secrets (API keys), environment variables, and other sensitive information",securityNotice:"This backup may contain sensitive credentials. Agent workspaces include channel credentials (bot tokens, app secrets, etc.), and model provider secrets include API keys. Do not share backup files with others.",searchPlaceholder:"Search backups by name or ID...",total:"Total {{count}}",agentsPlaceholder:"Select agent workspaces (leave empty for all)",selectAll:"Select All",deselectAll:"Deselect All",createSuccess:"Backup created successfully",createFailed:"Failed to create backup",restoreTitle:"Restore Backup",restoreScope:"Restore Scope",restoreFullWarning:"Full restore will completely replace all contents of the current instance (including all agents, global config, skill pool, and secrets). This action cannot be undone. Related features will be unavailable during restore. Please restart the service after restoration is complete.",agentGroupExisting:"Existing",agentGroupNew:"New",agentExists:"Exists",agentNew:"New",agentActionReplace:"Overwrite",agentActionAdd:"New",agentColumnName:"Agent",agentColumnWorkspace:"Workspace",agentTotal:"{{count}} agents total",noAgentsInBackup:"No agent workspaces in this backup",loadingAgents:"Loading agent list...",agentSearchPlaceholder:"Search by name or ID...",agentSearchTotal:"{{count}} of {{total}} agents",restoreCustomSummary:"{{existing}} existing · {{added}} new selected",defaultWorkspaceDirUnused:"No new agents selected",otherOptions:"Other Options",defaultWorkspaceDirDefault:"<Default path>/{{aid}}",restoreWarningModify:"Restoring will modify current configurations. This action cannot be undone.",restoreWarningRestart:"Related features will be unavailable during restore. Please restart the service after restoration is complete.",preRestoreBackupTitle:"Create Pre-Restore Backup",preRestoreBackupContent:"The restore operation is irreversible. Would you like to create a backup of the current state first? This allows you to rollback if any issues occur during restoration.",preRestoreBackupYes:"Yes, create backup first",preRestoreBackupNo:"No, restore directly",preRestoreBackupDesc:"Auto-created backup before restore",preRestoreBackupFailed:"Failed to create pre-restore backup",preRestoreBackupSuccess:"Pre-restore backup created successfully, ID: {{id}}",creatingPreRestoreBackup:"Creating pre-restore backup...",skipAndRestore:"Skip and continue to restore",restoreConfirm:"I confirm that I want to restore this backup",restoreMode:"Restore Mode",restoreModeFull:"Full Restore",restoreModeFullDesc:"Completely replace all contents of the current instance, including all agents, global config, skill pool and secrets",restoreModeCustom:"Custom Restore",restoreModeCustomDesc:"Select the contents to restore, such as specific agents, config, etc.; existing agents not included in this restore will be preserved",restoreModeFullDisabled:"Full backup only",defaultWorkspaceDir:"Agent Default Workspace Directory",defaultWorkspaceDirPlaceholder:"Leave empty to use ~/.qwenpaw/workspaces",defaultWorkspaceDirHint:"If the agent's original workspace path does not exist, the agent will be saved under <default path>/<agent ID>. If it exists, the agent's original workspace path will be used.",restoreStrategy:"Restore strategy",restoreStrategyPreserve:"Preserve local security and MCP",restoreStrategyPreserveDesc:"Keep this instance's security guards and MCP configuration.",restoreStrategyRestore:"Restore these settings from backup",restoreStrategyRestoreDesc:"Use the backup's security and MCP configuration.",restoreSuccess:"Backup restored successfully. Please restart the service.",restoreSuccessPreserved:"Backup restored successfully. Preserved local settings: {{keys}}. Please restart the service.",restoreSuccessWithBackup:"Backup restored successfully. Pre-restore backup ID: {{preRestoreId}}. Please restart the service.",restoreFailed:"Failed to restore backup",restoreTimedOut:"Restore is still running or took longer than 5 minutes. Check the backup size, disk space, and service logs before trying again.",restoreTargetBusy:"Restore failed because these directories are still in use. Close the browser or process using them, then retry. If they remain locked, restart the system and try again.",detailLoa
114dFailed:"Failed to load backup details; restore is unavailable",trustLocalBanner:"Local backup - full restore by default",trustForeignBanner:"Imported backup - local security and MCP are preserved by default",trustLegacyBanner:"Legacy backup - trust confirmation is required before restore",trustForeignTitle:"Trust this backup?",trustLegacyTitle:"Trust legacy backup?",unknownBackupName:"Backup archive",trustForeignDesc:"This backup was not signed by this instance. Only continue if you trust the source; local security and MCP settings will be preserved by default when restored.",trustLegacyDesc:"This older backup has no local signature. Only continue if you trust where it came from; this instance will sign it before restore.",deleteSuccess:"Backup(s) deleted successfully",deleteFailed:"Failed to delete backup(s)",exportFailed:"Failed to export backup",exportWarningTitle:"Sensitive Information Warning",exportWarningContent:"This backup may contain sensitive credential information. Agent workspaces contain channel credentials (such as bot tokens, app secrets, etc.), and model provider secrets contain API Keys. Do not share backup files with others.",exportConfirm:"Confirm Export",importTitle:"Import Backup",importSuccess:"Backup imported successfully",importFailed:"Failed to import backup",importConflictTitle:"Backup Already Exists",importConflictDesc:"A backup with the same ID already exists. Do you want to overwrite it?",importReplace:"Overwrite",agents:"{{count}} Agent(s)",allAgents:"All Agents",globalConfig:"Global Settings",skillPool:"Skill Pool",secrets:"Secrets",selected:"{{count}} selected",fileCount:"{{count}} files",totalSize:"{{size}}",progressStarting:"Starting backup...",progressAgent:"Backing up agent {{index}} / {{total}}...",progressSaving:"Saving backup file...",progressDone:"Backup complete",localModelsNotice:"Backup files do not include local model files. For cross-device migration, you will need to re-download the required local models on the target device."},xD={nav:"Checkpoints",title:"State Checkpoints",auto:"Auto",autoEnabled:"Automatic checkpoints enabled",autoDisabled:"Automatic checkpoints disabled",refresh:"Refresh checkpoints",snapshot:"Snapshot",snapshotCreated:"Snapshot created",graph:"Graph",checkpoint:"Checkpoint",type:"Type",commit:"Commit",createdAt:"Created",session:"Session",channel:"Channel",parent:"Parent",details:"Checkpoint details",search:"Search query, name, session, or SHA",allTypes:"All types",allSessions:"All sessions",showingLatest:"Latest {{count}} shown",loadFailed:"Unable to load checkpoints",retry:"Retry",more:"More actions",noMatches:"No checkpoints match these filters.",empty:"No state checkpoints yet. Your version history will appear here.",kind:{auto:"Auto",snapshot:"Snapshot",safety:"Safety",commit:"Commit"},summary:{total:"checkpoints"},snapshotDialog:{title:"Create snapshot",session:"Session",name:"Name",placeholder:"Optional snapshot name"},gc:{settingsAction:"Automatic cleanup settings",settingsTitle:"Automatic cleanup settings",keepCount:"Automatic checkpoints to keep",keepDays:"Automatic checkpoint retention (days)",preRestoreDays:"Pre-restore snapshot retention (days)",settingsSaved:"Automatic cleanup settings saved",thoroughAction:"Thoroughly compact checkpoints",thoroughTitle:"Thoroughly compact checkpoints?",thoroughDescription:"Removes {{count}} checkpoint(s), ignoring auto-checkpoint retention. Session HEADs are kept.",thoroughConfirm:"Thoroughly compact",thoroughSuccess:"Removed {{count}} checkpoint(s) during thorough compaction",action:"Clean up checkpoints",title:"Clean up checkpoints using retention policy?",description:"Removes {{count}} expired checkpoint(s) under the current retention policy. Session HEADs are kept.",confirm:"Clean up",success:"Removed {{count}} checkpoint(s)"},reset:{action:"Reset checkpoint data",title:"Reset all checkpoint data?",description:"This permanently removes every checkpoint and turns automatic checkpoints off.",confirm:"Reset",success:"Checkpoint data reset"},restore:{action:"Restore",title:"Restore checkpoint",preview:"Preview restore",confirm:"Restore checkpoint",conversation:"Conversation",memory:"Memory",files:"Worksp
114ace files",refreshWarning:"The conversation will change. Refresh the conversation after the restore completes.",selectedCount:"{{count}} files selected",selectAll:"Select all changed files",delete:"Delete",restore:"Restore",noFileChanges:"No workspace file changes are needed.",success:"Checkpoint restored. Refresh the conversation to load its restored state."}},RD={title:"Files",workspacePath:"Workspace:",noFiles:"No files",coreFiles:"Core Files",coreFilesDesc:"Bootstrap persona, identity, and tool guidance.",uploadTooltip:"ZIP files only",uploadTooltipWithLimit:"ZIP files only, max {{limit}}MB",selectFile:"Select a file to edit",fileContent:"File content...",uploadSuccess:"File uploaded successfully",uploadFailed:"File upload failed",downloadPreparing:"Preparing workspace download...",downloadSuccess:"Workspace downloaded successfully",downloadFailed:"Workspace download failed",zipOnly:"Only .zip files are supported for upload",fileSizeExceeded:"File size exceeds {{limit}}MB limit. Current file: {{size}}MB",systemPromptToggleTooltip:"Enable/disable this file in system prompt",memoryFileWarning:"MEMORY.md is typically queried on-demand by the agent using tools. Loading it into the system prompt may cause the context to become too long.",configUpdated:"System prompt configuration updated",configUpdateFailed:"Failed to update system prompt configuration",attribution:"Workspace design partly inspired by the OpenClaw project — thank you! 🐾",saveSuccess:"Saved successfully",saveFailed:"Save failed",saving:"Saving...",saved:"Saved",unsaved:"Unsaved"},ID=JSON.parse(`{"parent":"Settings","agents":"Agents","management":"Agent Management","pageDescription":"Create, configure, and manage multiple AI agents with custom workspaces and identities.","name":"Name","id":"ID","description":"Description","workspace":"Workspace Path","create":"Create Agent","createTitle":"Create New Agent","createSuccess":"Agent created successfully","createFailed":"Failed to create agent","edit":"Edit","editTitle":"Edit Agent - {{name}}","updateSuccess":"Agent updated successfully","updateFailed":"Failed to update agent","delete":"Delete","deleteConfirm":"Confirm Delete Agent","deleteConfirmDesc":"Agent will be unavailable after deletion, but workspace files will be kept","deleteSuccess":"Agent deleted successfully","deleteFailed":"Failed to delete agent","selectAgent":"Select Agent","defaultDisplayName":"Default Agent","currentWorkspace":"Current Agent","switchSuccess":"Agent switched successfully","switchFailed":"Failed to switch agent","loadFailed":"Failed to load agent list","loadConfigFailed":"Failed to load agent config","saveFailed":"Failed to save agent","idRequired":"Please enter agent ID","idLabel":"Agent ID (optional)","idHelp":"Leave empty to auto-generate. Only letters, digits, hyphens and underscores allowed.","idPattern":"ID can only contain letters, numbers, underscores and hyphens","idPlaceholder":"e.g.: my-agent","nameRequired":"Please enter agent name","namePlaceholder":"e.g.: My Agent","descriptionPlaceholder":"Briefly describe this agent's purpose...","workspaceHelp":"Leave empty to auto-generate in ~/.qwenpaw/workspaces/<id>","dragHandleTooltip":"Drag to reorder agents","reorderSuccess":"Agent order saved","reorderFailed":"Failed to save agent order","defaultNotEditable":"Default agent cannot be edited","defaultNotDeletable":"Default agent cannot be deleted","disable":"Disable","enable":"Enable","disabled":"Disabled","disableConfirm":"Confirm Disable Agent","disableConfirmDesc":"The agent instance will not start after disabling, but will remain visible in the list","enableConfirm":"Confirm Enable Agent","enableConfirmDesc":"The agent will be available for switching after enabling","disableSuccess":"Agent disabled successfully","enableSuccess":"Agent enabled successfully","toggleFailed":"Failed to toggle agent state","enableAgent":"Enable {{name}}","disableAgent":"Disable {{name}}","disabledAgents":"Disabled ({{count}})","pinnedAgents":"Pinned","otherAgents":"Other agents","pinned":"Pinned","defaultPinned":"The default agent is always pinned","longPressToPin":"Press and hold to pin","longPressToUnpin":"Press and hold to unpin","pinAgent":"Pin agent","unpinAgent":"Unpin agent","pinSuccess":"Agent pinned","unpinSuccess":"Agent unpinned","pinFailed":"Failed to update pinned state","status":{"disabled":"Disabled","pending":"Waiting to start","starting":"Starting","running":"Running","failed":"Startup failed","waitUntilStarted":"Available after startup completes"},"defaultNotDisablable":"Default agent cannot be disabled","currentAgentDeleted":"Current agent has been deleted, automatically switched to default agent","currentAgentDisabled":"Current agent has been disabled, automatically switched to default agent","switchedToDefault":"Automatically switched to default agent","cannotSwitchToDisabled":"This agent is disabled, please enable it in the management page first","initialSkills":"Initial Skills","initialSkillsHelp":"Select skills to add from the pool. You can add or remove skills later.","selectAll":"All","selectBuiltin":"Builtin","
114selectNone":"None","noPoolSkills":"No skills available in pool","addSkillsToAgent":"Add Skills","backend":{"column":"Backend","eyebrow":"Agent architecture","typeTitle":"Choose how this agent works","typeDescription":"The agent type controls every Chat, Coding, and Channel conversation.","nativeTitle":"QwenPaw native agent","nativeBadge":"Native","nativeDescription":"Uses your configured LLM, Skills, tools, memory, and QwenPaw runtime.","thirdPartyTitle":"Third-party agent","thirdPartyBadge":"Third-party","thirdPartyDescription":"Uses an authorized external agent runtime instead of a QwenPaw model.","providerTitle":"Choose a third-party agent","providerDescription":"Authentication is shared on this device; projects and conversations stay isolated per agent.","codexHint":"ChatGPT OAuth · Agent workspace","qoderHint":"Qoder account or PAT · Agent workspace","account":"Codex account","qoderAccount":"Qoder account","binary":"Codex executable","binaryHelp":"Leave blank to use the Codex CLI bundled with the Python SDK or detect a standalone installation. Otherwise enter the full path to codex on macOS/Linux or codex.exe on Windows. Binaries inside the ChatGPT app or editor extensions are not supported. QwenPaw also reads CODEX_BINARY and the backend PATH.","binaryPlaceholder":"Auto-detect, or paste the Codex executable path","qoderBinary":"Qoder executable","qoderBinaryHelp":"Leave blank to use the qodercli bundled with the Python SDK or detect an existing installation. Otherwise enter the full path to qodercli on macOS/Linux or qodercli.exe on Windows. QwenPaw also reads QODERCLI_PATH and the backend PATH.","qoderBinaryPlaceholder":"Auto-detect, or paste the qodercli executable path","detect":"Detect","detectedBinary":"Codex detected","qoderDetectedBinary":"Qoder detected","apiKeyLoginHint":"You can also authenticate in a terminal with: codex login --with-api-key","qoderAuthHint":"Connect opens Qoder browser login. You can also run qodercli login or set QODER_PERSONAL_ACCESS_TOKEN before starting the backend.","qoderConnect":"Connect to Qoder","model":"Agent model","modelDefault":"Use the agent default","defaultBadge":"Default","reasoningEffort":"Reasoning effort","reasoningDefault":"Use the model default","codexNotFound":"Codex runtime not found. Install qwenpaw[codex] or provide a standalone Codex CLI.","qoderNotFound":"Qoder runtime not found. Install qwenpaw[qoder] or provide qodercli.","chatSettingsHint":"Choose the model, reasoning effort, and execution permissions from the Chat toolbar.","capabilityTitle":"QwenPaw capabilities","inheritedSkills":"Skills","inheritedMcp":"MCP servers","runtimeInherited":"Inherited at runtime · new sessions","notSupported":"Not supported by this provider","policyCompatibility":"MCP policy","toolAllowlistSupported":"Tool allowlist supported","policyLimited":"Provider limitations apply","chatModelHint":"Agent-scoped settings · applied on the next turn","appliesNextTurn":"Applies on the next turn","approvalMode":"Execution permissions","approvalPresets":{"ask":{"name":"Ask before changes","description":"Allow workspace changes and ask before elevated actions."},"read-only":{"name":"Read only","description":"Inspect files without changing them."},"workspace":{"name":"Workspace access","description":"Allow workspace changes without confirmation."},"accept-edits":{"name":"Accept edits","description":"Allow file edits while keeping other safeguards."},"plan":{"name":"Plan only","description":"Analyze and plan without changing files."},"auto":{"name":"Automatic","description":"Let Qoder decide which safe actions can run."},"full-access":{"name":"Full access","description":"Allow unrestricted local execution without confirmation."}}},"model":"Model","modelHelp":"Assign a specific LLM model to this agent. Leave empty to use the global default.","modelPlaceholder":"Use global default","noConfiguredModels":"No configured models","modelColumn":"Model","copyTooltip":"Copy agent configuration","copyDefaultTooltip":"Copy using the default agent as a template","copyTitle":"Copy Agent Configuration","copyNameLabel":"New agent name","copyOptionsLabel":"Copy content","copyOptionAgentJson":"agent.json (required)","copyOptionAgentJsonHint":"Always copies the parsed source config and resets ID, name, workspace, and channels. This is not a byte-for-byte copy of the on-disk agent.json.","copyOptionMdFiles":"AGENTS / SOUL / PROFILE / HEARTBEAT / BOOTSTRAP.md","copyOptionSkills":"skills/ + manifest","copyOptionJobs":"jobs.json","copyOptionJobsHint":"Copies job definitions only, not run history. The new agent will start running them on schedule after creation.","copySuccess":"Agent configuration copied successfully","copyFailed":"Failed to copy agent configuration","mailManagement":"Email Management","mailModeNone":"No email management","mailModePersonal":"Manage your personal mailbox","mailModeDedicated":"Provision a dedicated mailbox","mailName":"Mailbox name","mailNameOptional":"Mailbox name (optional)","mailNameDedicated":"Mailbox name (optional before registration, required afterward)","mailDomain":"Mail domain","mailPassword":"Password","mailPhone":"Phone number","mailAuthCode":"16-digit authorization code","mailAuthCodeOptional":"16-digit authorization code / app password (optional)","mailCredentialOptional":"Mailbox password (optional)","mailNameRequired":"Please enter mailbox name","mailPasswordRequired":"Please enter password","mailPhoneRequired":"Please enter phone number","mailAuthCodeRequired":"Please enter authorization code","mailAuthCodeLength":"Authorization code must be 16 characters","mailDomainRequired":"Please select a mail domain","mailDomainInvalid":"Please enter a valid mail domain, e.g. mycompany.com","mailDomainPlaceholder":"Select or enter a mail domain","mailProvider":"Mail provider","mailProviderRequired":"Please select a mail provider","mailProviderPlaceholder":"Select the provider hosting this domain","mailProviderTencentExmail":"Tencent Exmail","mailProviderAliyunQiye":"Alibaba Enterprise Mail","mailProviderNeteaseQiye":"Netease Enterprise Mail","mailCredentialLabel":"Credential","mailCredentialRequired":"Please enter the credential","mailCredentialHintAuthCode":"Enter the 16-digit authorization code generated in the mailbox settings","mailCredentialHintGmail":"Enter a Gmail app-specific password (requires 2-Step Verification enabled)","mailCredentialHintAliyun":"Enter the mailbox login password","mailCredentialHintEnterprise":"Enter the client-specific password or the mailbox login password","mailDedicatedCredentialHint":"{{credentialHint}}. Leave this blank before registration; after registration, enter it here and save to finish connecting the mailbox.","mailPushTitle":"Auto-response to new mail","mailAccessControl":"Mail Access Control","mailAccessControlTip":"When enabled, emails from unknown senders require approval before being processed","mailPushModeOff":"Off","mailPushModeRulesOnly":"Rules only","mailPushModeRulesThenAgent":"Rules + wake on demand","mailPushModeAgentAll":"Wake for every email","mailPushModeOffDesc":"Do nothing automatically for new mail","mailPushModeRulesOnlyDesc":"Process new mail with the rules below only, without waking the agent","mailPushModeRulesThenAgentDesc":"Apply rules first; wake the agent only when a wake action matches","mailPushModeAgentAllDesc":"Wake the agent for every new email and let it decide how to handle it autonomously","mailPushModeLegacySuffix":" (legacy)","mailPushFieldFrom":"Sender","mailPushFieldSubject":"Subject","mailPushFieldContent":"Content","mailPushFieldKeyword":"Keyword","mailPushActionMarkRead":"Mark as read","mailPushActionMove":"Move to folder","mailPushActionNotify":"Notify only","mailPushActionWakeAgent":"Wake agent","mailPushContainsPlaceholder":"Contains text","mailPushParamMovePlaceholder":"Target folder","mailPushParamWakePlaceholder":"Extra instruction (optional)","mailPushParamRequired":"Please enter the target folder","mailPushAddRule":"Add rule","mailPushWakeOptionInvoice":"Download and archive attachments of invoice/billing emails","mailPushWakeOptionReply":"Politely reply to inquiry emails","mailPushWakeOptionOtp":"Extract the verification code and n
114otify me","mailPushWakeOptionSummary":"Summarize key points into the inbox"}`),_D={title:"Skills",description:"Manage agent skills and capabilities.",preload:"Preload",preloadHint:"When enabled, the agent preloads this skill and does not need to find and load it during the conversation.",qwenpawManaged:"QwenPaw managed",qwenpawManagedHint:"Editable Skills projected into supported third-party agents at runtime.",providerManaged:"Third-party agent Skills",providerManagedHint:"Discovered from the current third-party agent and shown read-only.",providerOnly:"Current third-party agent only",readOnly:"Read only",noDescription:"No description provided.",providerSkillDetails:"Third-party agent Skill details",providerManagedDetailHint:"This Skill is managed by the third-party agent. QwenPaw can display and use it, but cannot modify it.",provider:"Third-party agent",scope:"Scope",statusLabel:"Status",descriptionLabel:"Description",importHub:"Upload via URL",supportedSources:"Supported sources:",importSkills:"Import Skill",enterSkillUrl:"Enter Skill URL",supportedSkillUrlSources:"Supported Skill Marketplaces:",urlExamples:"URL examples:",urlValid:"Valid URL from {{source}}",invalidUrl:"Invalid URL",clickToFill:"Click to fill in URL",invalidSkillUrlSource:"Please verify the skill URL is from a supported marketplace",type:"Type",installedFrom:"Installed from",source:"Source",path:"Path",tags:"Tags",builtin:"Built-in",custom:"Custom",addSkill:"Add Skill",createSkill:"Create Skill",viewSkill:"View Skill",editSkill:"Edit Skill",skillName:"Skill Name",skillContent:"Skill Content",pleaseInputName:"Please input skill name",pleaseInputContent:"Please input skill content",skillNamePlaceholder:"e.g., weather_query",contentPlaceholder:`[Format]
115---
116name: skill_name (required, lowercase with underscores)
117description: Brief description (required)
118---
119
120Skill implementation (Markdown format)
121
122[Example]
123---
124name: weather_query
125description: Query weather info for a city
126---
127
128## Features
129Query real-time weather data.
130
131## Usage
132User inputs city name, returns weather info.`,createSuccess:"Skill created successfully",createFailed:"Failed to create skill",deleteConfirm:"Are you sure you want to delete this skill?",deleteSuccess:"Skill deleted successfully",deleteFailed:"Failed to delete skill",batchEnable:"Enable",batchDisable:"Disable",batchEnableSuccess:"{{count}} skills enabled",batchEnablePartial:"{{enabled}} enabled, {{failed}} failed",batchEnableFailed:"Batch enable failed",batchDisableSuccess:"{{count}} skills disabled",batchDisablePartial:"{{disabled}} disabled, {{failed}} failed",batchDisableFailed:"Batch disable failed",batchDeleteTitle:"Delete {{count}} skills?",batchDeleteSuccess:"{{count}} skills deleted",batchDeletePartial:"{{deleted}} deleted, {{failed}} failed",batchDeleteFailed:"Batch delete failed",selectedCount:"{{count}} selected",updateSuccess:"Skill updated successfully",updateFailed:"Failed to update skill",frontmatterRequired:"Skills must start and end with ---",frontmatterNameRequired:"Skills missing required field : name",frontmatterDescriptionRequired:"Skills missing required field : description",editNotSupported:"Failed to edit skill",editNote:"Tip: You can edit skill content, channels, and config here.",create:"Create",optimizeWithAI:"AI Optimize",stopOptimize:"Stop",optimizeSuccess:"Skill optimized successfully",optimizeFailed:"Failed to optimize skill",noContentToOptimize:"No content to optimize",cancelImport:"Cancel Import",importCancelled:"Skill import 
132cancelled",importTimeout:"Skill import timed out. Please retry or check your network.",uploadSkill:"Upload Skill",uploadZip:"Upload via Zip",uploadSuccess:"Skill uploaded successfully",uploadFailed:"Skill upload failed",uploadNoChange:"No new skills were imported. They may already exist.",zipOnly:"Only .zip files are supported for upload",fileSizeExceeded:"File size exceeds {{limit}}MB limit. Current file: {{size}}MB",channels:"Channels",allChannels:"All",lastUpdated:"Updated",searchPlaceholder:"Filter by name",listView:"List view",gridView:"Grid view",refreshHint:"Refresh skills from disk",poolSync:"Sync Status",uploadedToPool:"Uploaded to skill pool",downloadedToWorkspace:"Downloaded to current workspace",builtinUpgradeTitle:"Upgrade Built-in Skill",builtinUpgradeContent:'A newer version of built-in skill "{{name}}" is available in the pool. Overwrite the current version?',languageSwitchTitle:"Switch Skill Language",languageSwitchContent:"The following skills have a different language version in the pool and will be overwritten:",overwriteExistingList:"The following skills already exist and will be overwritten:",nameConflict:"Name conflict detected. Suggested rename has been filled.",uploadToPoolHint:"Upload selected workspace skills to the shared local skill pool",downloadFromPool:"Load from Skill Pool",uploadToPool:"Sync to Skill Pool",selectWorkspaceSkill:"Select current workspace skill",selectPoolItem:"Select skill pool item",renameOptional:"Rename (optional)",renamePlaceholder:"Suggested rename will appear here on conflict",renameSingleOnly:"Rename is available only when exactly one skill is selected.",selectAll:"Select All",clearSelection:"Clear",downloadSkillPool:"Download Skill Pool",uploadSkillPool:"Upload Skill Pool",config:"Config",configPlaceholder:'{"KEY": "value"}',configInvalidJson:"Invalid JSON format",configSaved:"Config saved",emptyStateBadge:"New workspaces start empty",emptyStateTitle:"This agent does not have any skills yet",emptyStateText:"This is expected. New workspaces do not come with skills automatically. Download skills from the local pool or create one here to equip this agent.",emptyStateDownload:"Download from Skill Pool",emptyStateCreate:"Create First Skill",loadFailed:"Failed to load skills",refreshFailed:"Failed to refresh skills",createdSuccessfully:"Created successfully",saveFailed:"Failed to save",importFailed:"Import failed",disabledSuccessfully:"Disabled successfully",enabledSuccessfully:"Enabled successfully",operationFailed:"Operation failed",provideUrl:"Please provide a hub skill URL",validUrl:"Please enter a valid URL starting with http:// or https://",importedSkill:"Imported skill: {{name}}",batchOperation:"Batch Operation",exitBatch:"Exit Batch",noSearchResults:"No skills found matching your search",filterByTag:"Filter by tag",noTags:"No tags available",enabledSkills:"Enabled Skills",disabledSkills:"Disabled Skills",active:"active"},LD={description:"Shared local skill pool for built-in skills and workspace uploads. External hub imports such as ClawHub or LobeHub are separate.",broadcast:"Broadcast to Agents",broadcastHint:"Broadcast skills to selected agents",refreshHint:"Refresh skill pool from disk",deleteExternalConfirm:"This deletes the external skill files at {{path}} from disk.",deleteExternalBatchWarning:"Selected external skills will be permanently deleted from disk.",broadcastTitle:"Broadcast {{name}}",automation:"Automation",builtinAutoUpdate:"Auto Update",builtinAutoUpdateFlow:"Built-in package → Skill Pool",autoSyncFlow:"Skill Pool → Agent workspaces",automationBoth:"Auto Update + Sync",automationMixedHint:"Open details to choose Auto Update or Auto Sync.",automationEnableHint:"Enable Auto Update and Auto Sync.",automationDisableHint:"Disable Auto Update and Auto Sync.",automationEnabled:"Auto Update and Auto Sync enabled for {{name}}",automationDisabled:"Auto Update and Auto Sync disabled for {{name}}",automationFailed:"Failed to update automation settings",automationNeedsAttention:"Saved. {{count}} item(s) need attention; see Inbox.",autoSync:"Auto Sync",autoSyncEnableHint:"Enable Auto Sync.",autoSyncDisableHint:"Disable Auto Sync.",autoSyncEnabled:"Auto Sync enabled for {{name}}",autoSyncDisabled:"Auto Sync disabled for {{name}}",autoSyncAgentsPlaceholder:"All agents that have this skill",autoSyncAgentsHint:"Leave empty to sync existing copies, or select specific agents.",renameAffectsTitle:"Rename in agents too?",renameAffectsContent:'"{{from}}" is installed in {{count}} agent(s). Rename to "{{to}}"',importBuiltin:"Update Built-in Skills",importBuiltinHint:"Update built-in skills to the latest version",importBuiltinAlertHint:"{{count}} built-in changes need review",importBuiltinSuccess:"Built-ins imported: {{names}}",importBuiltinConflicts:"Skipped due to name conflicts: {{names}}",importBuiltinNoChanges:"No built-in changes to import",importBuiltinFailed:"Built-in import failed",importBuiltinConflictTitle:"Builtin conflicts detected",importBuiltinConflictContent:"The following built-ins differ from the current pool copy. Confirm to overwrite them from source.",sourceVersion:"Source version",currentVersion:"Current version",builtinLanguage:"Language",langDefault:"Default",langDefaultTooltip:"Keep each skill in its current language",langEn:"English",langZh:"Chinese",builtinLanguageChangeTitle:"Switch built-in language?",builtinLanguageChangeContent:'Overwrite the pool copy of "{{name}}" with the {{language}} built-in version?',builtinLanguageChangeSuccess:'"{{name}}" switched to {{language}}',builtinLanguageChangeFailed:"Failed to switch built-in language",importStatusMissing:"Missing in pool",importStatusCurrent:"Already current",importStatusOutdated:"Outdated",importStatusLanguageSwitchTo:"Overwrite with the {{language}} version",importStatusConflict:"Conflict",builtinNoticeSummary:"{{count}} built-in changes detected",builtinNoticeLineAdded:"Added: {{names}}",builtinNoticeLineMissing:"Missing: {{names}}",builtinNoticeLineUpdated:"Updated: {{names}}",builtinNoticeLineRemoved:"Removed: {{names}}",zipImport:"ZIP Import",create:"Create",edit:"Edit",delete:"Delete",descriptionLabel:"Description",tags:"Tags",tagsPlaceholder:"Select or type to add tags",tagTooLong:"Tag must be at most {{max}} characters",filterByTag:"Filter by tag",version:"Version",createTitle:"Create Skill Pool Item",editTitle:"Edit {{name}}",skillNamePlaceholder:"Skill name",contentPlaceholder:"SKILL.md content",nameConflict:"Name conflict detected. Suggested rename applied.",deletedFromPool:"Deleted from skill pool",deleteBuiltinConfirm:"This removes the built-in skill from the pool. You can import it again later from source.",deleteConfirm:"This removes the skill from the shared local skill pool.",deleteTitle:"Delete {{name}}?",batchDeleteTitle:"Delete {{count}} pool skills?",batchDeleteSuccess:"{{count}} pool skills deleted",batchDeletePartial:"{{deleted}} deleted, {{failed}} failed",batchDeleteFailed:"Batch delete failed",zipImportFailed:"ZIP import failed",externalHubHint:"External hub import is separate from the local Skill Pool.",imported:"Imported: {{names}}",noNewImports:"No new skills imported",allBuiltin:"All Built-in",selectWorkspaces:"Broadcast to workspace(s)",allWorkspaces:"All Worksp
132aces",optionalRename:"Optional rename",back:"Back",skillCount:"{{count}} skills",skillName:"Skill Name",status:"Status",installedFrom:"Installed from",updateBuiltin:"Update",updateConfirmTitle:"Update {{name}}",updateConfirmContent:"Update to version {{version}}? This will replace the current pool copy with the latest built-in version.",updateSuccess:"Updated successfully",updateFailed:"Update failed",broadcastSuccess:"Broadcast completed",broadcastFailed:"Broadcast failed",overwriteConfirm:"Overwrite existing skills?",overwriteTargetsContent:"The following existing targets will be overwritten:",builtinOverwriteTargetsContent:"The following built-in targets have different versions and will be overwritten:",renameAndRetry:"A skill with this name already exists. Use the suggested name?",multiConflictTitle:"Multiple Conflicts Detected",multiConflictDesc:"The following skills already exist. Please resolve conflicts individually and retry:",singleConflictRename:'"{{name}}" already exists. Rename to "{{suggested}}" to proceed?',statusUpToDate:"Up-to-date",statusSynced:"Synced",statusOutdated:"Outdated",statusNotSynced:"Not synced",statusConflict:"Conflict",renameEntry:'New name for "{{name}}":',builtin:"Built-in",custom:"Custom"},ED={title:"MCP Clients",qwenpawManaged:"QwenPaw managed",qwenpawManagedHint:"Shared control-plane configuration injected into supported third-party Agents at runtime.",providerManaged:"{{provider}} local MCP",providerManagedHint:"Discovered from the third-party agent's own configuration. These entries are read-only and remain available only to that agent.",providerOnly:"Third-party agent only",readOnly:"Read only",create:"Create Client",formatSupport:"Supported formats",standardFormat:"Standard (mcpServers wrapper)",directFormat:"Direct (key → config object)",singleFormat:"Single client (flat fields)",emptyState:"No MCP clients configured yet",loadError:"Failed to load MCP clients",createSuccess:"MCP client created successfully",createError:"Failed to create MCP client",updateSuccess:"MCP client updated successfully",updateError:"Failed to update MCP client",enableSuccess:"MCP client enabled successfully",disableSuccess:"MCP client disabled successfully",toggleError:"Failed to toggle MCP client status",deleteConfirm:"Are you sure you want to delete this MCP client?",deleteSuccess:"MCP client deleted successfully",deleteError:"Failed to delete MCP client",maskedFieldHint:"Sensitive fields are masked with ***. In-place edits on masked values are not supported — replace with the full new value to modify.",tools:"Tools & Permissions",noTools:"No tools available from this MCP server",toolsLoadError:"Failed to load tools from MCP server",toolsConnecting:"MCP server is still connecting, please try again in a moment",toolSchema:"Description & Parameters",access:{title:"Access",button:"Access",summary:"MCP access policy",clientSection:"Overall Access",toolSection:"Tool Access",default:"Default",sourceType:"Source",sourceValue:"Source Value",sourceValueAllChannels:"All Channels",subjectType:"Object",subjectValue:"Object Value",effectLabel:"Policy",source:{channel:"Channel"},subjectTypeOption:{all:"All",user:"User"},sourceValuePlaceholder:{channel:"console / dingtalk"},subjectValuePlaceholder:"e.g. alice",subjectValuePlaceholderSelectedSource:"user ID in selected source",subjectValuePlaceholderScoped:"{{source}} user ID",subjectValueAll:"All",recentUserPlaceholder:"User ID is scoped to the selected source; type or select again",noRecentUsers:"No recent users for this source; type a user ID manually",ambiguousUserSourceWarning:"User IDs are scoped by source. Select a specific channel to avoid cross-channel matches.",unknownUserValueWarning:"This user ID is not in recent active users. Saving is allowed.",validation:{missingUserValue:"Select a specific source and enter a valid user ID.",ambiguousUserSource:"User rules must target a specific channel, not all channels.",unknownUserValue:"This user ID is not in recent active users. Saving is allowed."},addRule:"Add Rule",deleteRule:"Delete Rule",noClientRules:"No rules",noRules:"No rules, uses default policy",inherit:"Inherit ({{effect}})",stale:"Not found",disabledTools:"This MCP client is disabled; saved access rules can still be edited.",discardTitle:"Discard unsaved changes?",discardContent:"Unsaved access policy changes will be lost.",loadError:"Failed to load MCP access policy",saveSuccess:"MCP access policy saved",saveError:"Failed to save MCP access policy",unmanagedRules:"{{count}} advanced rule(s)",effect:{allow:"Allow",ask:"Ask",deny:"Deny"}},tab:{json:"JSON Import",form:"Form Mode"},form:{key:"Client Key",keyPlaceholder:"my-mcp-server",keyRequired:"Client key is required",name:"Display Name",namePlaceholder:"My MCP Server",n
132ameRequired:"Display name is required",transport:"Transport",url:"Server URL",urlRequired:"URL is required for remote MCP servers",command:"Command",commandRequired:"Command is required for stdio transport",args:"Arguments (space or newline separated)",description:"Description",descriptionPlaceholder:"Optional description",env:"Environment Variables",envPlaceholder:"KEY=VALUE (one per line)"},oauth:{enableOAuth:"Use OAuth Authorization",manage:"OAuth",authorized:"Authorized",notAuthorized:"Not Authorized",expired:"Token Expired",failed:"Authorization Failed",waiting:"Waiting for authorization...",authorize:"Authorize",reauthorize:"Re-authorize",revoke:"Revoke",startFailed:"Failed to start OAuth flow",authFailed:"OAuth authorization failed",popupBlocked:"Popup was blocked by the browser. Please allow popups and try again.",windowClosed:"Authorization window was closed. Please try again.",noUrl:"Please enter a server URL first",noClientKey:"Please create the client first",showAdvanced:"Advanced options",hideAdvanced:"Hide advanced options",clientId:"Client ID (optional)",clientIdPlaceholder:"Leave empty to use Dynamic Client Registration",scope:"Scope (optional)",scopePlaceholder:"openid profile email",authEndpoint:"Authorization Endpoint (override)",tokenEndpoint:"Token Endpoint (override)",endpointHint:"Leave empty to auto-discover from the MCP server. Fill in to skip discovery."}},FD={title:"Heartbeat",description:"Run HEARTBEAT.md at a fixed interval for self-checks. By default runs silently without affecting current conversations, or optionally send replies to the last chat channel.",enabled:"Enable heartbeat",every:"Interval",everyRequired:"Required",everyMin:"Must be at least 1",timeoutSeconds:"Execution timeout (seconds)",timeoutRequired:"Required",timeoutMin:"Must be at least 1",timeoutMax:"Must be at most 3600",unitMinutes:"Minutes",unitHours:"Hours",target:"Reply target",targetMain:"Silent mode (default, no channel output)",targetLast:"Send to last chat channel",targetInbox:"Send to inbox",activeHours:"Active hours (optional)",activeStart:"Start time",activeEnd:"End time",loadFailed:"Failed to load heartbeat config",saveSuccess:"Saved successfully; heartbeat hot-reloaded",saveFailed:"Failed to save heartbeat config",runNow:"Run Now",runNowSuccess:"Heartbeat triggered. Check Inbox or target channel shortly.",runNowFailed:"Failed to trigger heartbeat run"},OD={title:"Cron Jobs",description:"Create and manage scheduled tasks that automatically execute at specified times. ",createJob:"Create Job",createFromTemplate:"Create From Template",editJob:"Edit Job",templateModalTitle:"Choose a Task Template",templateModalDescription:"Pick a built-in template and tweak key parameters in the drawer before saving.",useTemplate:"Use Template",templateTagPersonal:"Personal",templateTagTeam:"Team",templateTagReminder:"Reminder",templateTagCalendar:"Calendar",templateTagCalendarRecommended:"Calendar Recommended",confirmDelete:"Confirm Delete",deleteConfirm:"Are you sure you want to delete this Cron Job?",okText:"OK",cancelText:"Cancel",deleteText:"Delete",id:"Job ID",name:"Job Name",enabled:"Status",saveResultToInbox:"Save result to Inbox",saveResultToInboxTooltip:"When enabled, successful executions with successful delivery are stored in Inbox. Delivery failures are always written to Inbox as fallback.",scheduleType:"Schedule Type",scheduleFilterAll:"All Schedule Types",scheduleTypeRecurring:"Recurring",scheduleTypeOnce
132:"Scheduled",scheduleCron:"Schedule (Cron)",scheduleCronLabel:"Schedule (Cron)",onceRunAt:"Run At",repeatEnabled:"Repeat",repeatEnabledTooltip:"Enable recurring schedule from this start time",repeatFrequency:"Repeat Frequency",repeatEveryDays:"Repeat Every (days)",repeatEveryPrefix:"Every",repeatEverySuffix:"day(s)",repeatEndType:"End Repeat",repeatEndNever:"Never",repeatEndUntil:"End on date",repeatEndCount:"Limited count",repeatUntil:"End Date",repeatCount:"Run Count",scheduleTimezone:"Timezone",cronType:"Frequency",cronTypeHourly:"Hourly",cronTypeDaily:"Daily",cronTypeWeekly:"Weekly",cronTypeCustom:"Custom",cronTime:"Time",cronDaysOfWeek:"Days of Week",cronDayMon:"Monday",cronDayTue:"Tuesday",cronDayWed:"Wednesday",cronDayThu:"Thursday",cronDayFri:"Friday",cronDaySat:"Saturday",cronDaySun:"Sunday",cronCustomExpression:"Cron Expression",taskText:"Message content",action:"Action",disable:"Disable",executeNow:"Execute Now",edit:"Edit",delete:"Delete",totalItems:"Total {{count}} items",perPage:"/ page",pleaseInputId:"Please input job ID",pleaseInputName:"Please input job name",pleaseInputCron:"Please input cron expression",pleaseSelectScheduleType:"Please select schedule type",pleaseInputRunAt:"Please select run time",pleaseInputRepeatEveryDays:"Please enter repeat interval (days)",pleaseSelectRepeatEndType:"Please select end condition",pleaseInputRepeatUntil:"Please select end date",pleaseInputRepeatCount:"Please enter run count",validation:{cronRequired:"Cron expression is required for recurring schedules.",runAtRequired:"Execution time is required for one-time schedules.",repeatUntilRequired:'Please select an end date when using "End on date".',repeatCountRequired:'Please provide a run count when using "Limited count".',repeatUntilAfterRunAt:"The end date must be later than the execution time. Please choose an end date after the execution time.",textRequired:"Message content is required when task type is text.",requestRequired:"Request content is required when task type is agent.",invalidCronExpression:"Invalid cron expression. Please use a 5-field cron format."},pleaseSelectTaskType:"Please select task type",pleaseInputRequest:"Please input request content",pleaseInputMessageContent:"Please enter message content",pleaseInputChannel:"Please input target channel",pleaseInputUserId:"Please input target user ID",pleaseInputSessionId:"Please input target session ID",jobIdPlaceholder:"e.g., daily-report-job",jobNamePlaceholder:"e.g., Daily Morning Report",selectTimezone:"Select timezone",taskDescriptionPlaceholder:"For simple text tasks, enter the message body to send...",invalidJsonFormat:"Invalid JSON format",jsonFormatRequired:"JSON format required",taskType:"Task Type",text:"Message content",requestInput:"Request Content",requestSessionId:"Request Session ID",requestUserId:"Request User ID",dispatchChannel:"Target Channel",dispatchTargetUserId:"Target User ID",dispatchTargetSessionId:"Target Session ID",dispatchMode:"Delivery Mode",silentDelivery:"Silent delivery",runtimeShareSession:"Share Session",runtimeMaxConcurrency:"Max Concurrency",runtimeTimeoutSeconds:"Timeout (seconds)",runtimeMisfireGraceSeconds:"Misfire Grace (seconds)",runtimeToolSafety:"Tool Approval Check",idTooltip:"System-generated, non-editable, unique UUID assigned at task creation.",nameTooltip:"A friendly name to help you identify this job.",cronTooltip:"Define when the task should run",cronExample:"Common examples: '0 9 * * *' = 9 AM daily | '*/30 * * * *' = every 30 min | '0 */2 * * *' = every 2 hours | '0 0 * * 0' = Sunday midnight",cronHelper:"New to Cron expressions?",cronHelperLink:"Use online generator",timezoneTooltip:"Timezone for the cron schedule. Default: UTC",taskTypeTooltip:"Choose 'text' for simple message tasks, or 'agent' for complex agent workflows.",textTooltip:"Simple message task: this is the actual message body. Required when task type is 'text'.",requestInputTooltip:"Message content in JSON format. This is what the agent will receive and process. Required when task type is 'agent'.",requestInputExample:'Format: [{"role":"user","content":[{"type":"text","text":"Your message here"}]}]',requestSessionIdTooltip:"Session ID for the request context. Use 'default' if unsure.",requestUserIdTooltip:"User ID that initiates the request. Use 'system' for automated tasks.",dispatchChannelTooltip:"Target channel where the response will be sent (e.g., 'console', 'discord', 'imessage').",dispatchTargetUserIdTooltip:"User ID who will receive the response in the target channel.",dispatchTargetSessionIdTooltip:"Session ID where the response will be delivered in the target channel.",dispatchModeTooltip:"
132Choose 'stream' for real-time responses or 'final' for complete responses only.",silentDeliveryTooltip:"Run the agent task and keep its session and trace, but do not send results to the channel.",shareSessionTooltip:"When enabled, shares session with target user. When disabled, each run creates isolated context with unique run ID. Suitable for independent tasks without memory. Default: enabled",maxConcurrencyTooltip:"Maximum number of this job that can run simultaneously. Default: 1",timeoutSecondsTooltip:"Maximum execution time in seconds. Job will be terminated if exceeded.",misfireGraceSecondsTooltip:"Grace period for missed executions. If a job misses its scheduled time by more than this, it won't run.",toolSafetyTooltip:"When enabled, risky tool calls require user approval (may block unattended cron jobs). When disabled, tool calls no longer request approval; File Guard rules still apply. Default: disabled",executeNowTitle:"Execute Task Now",executeNowContent:'Are you sure you want to execute "{{name}}" now?',executeNowConfirm:"Execute Now",listView:"List View",calendarView:"Calendar View",calendarEmptyHint:"No scheduled jobs yet. Create scheduled jobs to see them on the calendar.",calendarMoreItems:"+{{count}} more",calendarDayListTitle:"Scheduled jobs on {{date}}",executionHistory:"History",historyTitle:"History - {{name}}",historyEmpty:"No execution records yet.",historyStatusSuccess:"Success",historyStatusFailed:"Failed",historyStatusRunning:"Running",historyStatusCancelled:"Cancelled",historyTriggerScheduled:"Triggered by schedule",historyTriggerManual:"Triggered manually",historyExpand:"Expand",historyCollapse:"Collapse",templates:{dailyTechNewsBrief:{title:"Daily Tech News Brief",description:"At 09:30 on weekdays, compile trending tech headlines into a short digest.",frequency:"Weekdays 09:30 (30 9 * * 1-5)"},dailyEveningReflection:{title:"Daily Evening Reflection",description:"At 20:00 on weekdays, prompt a quick reflection on work completed today.",frequency:"Weekdays 20:00 (0 20 * * 1-5)"},weekendRelaxationReminder:{title:"Weekend Relaxation Reminder",description:"On weekend mornings, push curated hot movie picks for a lighter break.",frequency:"Weekends 10:00 (0 10 * * 6,0)"},pomodoroBreakReminder:{title:"Pomodoro Break Reminder",description:"During work hours, remind every 25 minutes to hydrate or rest your eyes.",frequency:"Weekdays 09:00-17:59 every 25 min (*/25 9-17 * * 1-5)"},petCareReminder:{title:"Pet Deworming/Vaccine Reminder",description:"On the 15th each month at night, remind pet deworming or vaccine follow-up.",frequency:"Monthly on the 15th at 20:00 (0 20 15 * *)"},onceTextBirthdayReminder:{title:"Birthday Reminder",description:"Remind that xx has a birthday on Jan 1.",frequency:"Run at: 2026-01-01 09:00"},onceAgentBusinessTripPrep:{title:"Business Trip Prep",description:"Check destination weather and provide trip preparation suggestions.",frequency:"Run at: 2026-01-01 20:00"},repeatCountTextMedicineReminder:{title:"Medication Reminder (14 runs)",description:"Remind to take medicine on time for a 14-run course.",frequency:"First run: 2026-01-01 09:00 | Every 1 day | 14 runs"},repeatCountAgentDietPlan:{title:"14-Day Meal Plan",description:"Generate and send daily meal suggestions for 14 days.",frequency:"First run: 2026-01-01 08:00 | Every 1 day | 14 runs"},repeatUntilTextWeeklyMeeting:{title:"Weekly Meeting Reminder (2 months)",description:"Send a weekly meeting reminder until the configured deadline.",frequency:"First run: 2026-01-02 08:45 | Every 7 days | Until 2026-03-01"},repeatUntilAgentWeeklySummary:{title:"Pre-Meeting Weekly Summary",description:"Before each weekly meeting, summarize the last week's memory.",frequency:"First run: 2026-01-02 08:30 | Every 7 days | Until 2026-03-01"}}},BD=JSON.parse(`{"title":"Channels","description":"Manage and configure message channels","loading":"Loading channels...","configSaved":"Configuration saved successfully","configFailed":"Failed to save configuration","botConflictTitle":"Bot already in use","botConflictDescription":"This Bot is already being used by {{agents}} on the same channel. Saving anyway may cause message conflicts.","botConflictConfirm":"Save anyway","channelType":"Channel Type","status":"Status","totalItems":"Total {{count}} items","botPrefix":"Bot Prefix","showToolCalls":"Show Tool Call Information","showToolCallsTooltip":"Show tool call information to users (turn off to hide)","showToolResults":"Show Tool Result Information","showToolResultsTooltip":"Show tool result information to users (turn off to hide)","toolCallMaxLength":"Tool Call Maximum Display Length","toolResultMaxLength":"Tool Result Maximum Display Length","toolMaxLengthTooltip":"Set to 0 for unlimited length","onebotMediaBase64":"Send Local Media as Base64","onebotMediaBase64Tooltip":"Choose how media files are sent. When disabled, the file path is sent; when enabled, the file is encoded as Base64. Remote URLs remain unchanged.","onebotMediaBase64MaxMb":"Base64 File Size Limit","onebotMediaBase64MaxMbTooltip":"Media files larger than this limit are sent using their original file path.","onebotMediaBase64MaxMbRequired":"Please enter a Base64 file size limit","onebotMediaBase64MaxMbMin":"The Base64 file size limit must be at least 1 MB","onebotMediaDir":"Media Directory","onebotMediaDirTooltip":"Directory used to store downloaded media. Defaults to the media directory in the agent workspace.","onebotMediaDownloadMaxMb":"Inbound Media Size Limit","onebotMediaDownloadMaxMbTooltip":"Maximum size of each image, audio, video, or file downloaded from OneBot.","onebotMediaDownloadMaxMbRequired":"Please enter an inbou
132nd media size limit","onebotMediaDownloadMaxMbMin":"The inbound media size limit must be at least 1 MB","onebotWsHostTooltip":"Listen address of the reverse WebSocket server. Keep 127.0.0.1 so only OneBot clients on this machine can connect. Any other address exposes the port to the network and requires an access token.","onebotAccessTokenTooltip":"Shared token that the OneBot client sends in the Authorization header. Required when the listen address is not a loopback address.","onebotAccessTokenRequired":"An access token is required when the WebSocket host is not a loopback address","showThinking":"Show Thinking","showThinkingTooltip":"Show model thinking/reasoning content to users (turn off to hide)","noTextDebounce":"No-text Debounce","noTextDebounceTooltip":"When enabled, media-only messages (image/video/file) are buffered until a text message arrives, then merged. Disable to process all messages immediately. Voice messages are always processed immediately.","streamingEnabled":"Streaming Output","streamingEnabledDingtalkHint":"Only effective when message type is Card","streamingEnabledFeishuHint":"Requires enabling cardkit:card:write permission in the Feishu Open Platform permission management page","ackMessage":"Acknowledgment Message","ackMessageTooltip":"Send an instant reply when a message is received, before agent processing begins. Leave empty to disable.","ackMessagePlaceholder":"⏳ Processing...","notSet":"Not set","clickCardToEdit":"Click card to edit","settings":"Settings","channelSettings":"Channel Settings","pleaseInputDbPath":"Please input DB path","pleaseInputPollInterval":"Please input poll interval","discordBotToken":"Discord bot token","acceptBotMessages":"Accept Bot Messages","acceptBotMessagesTooltip":"When enabled, messages from other bots will be accepted","httpProxyPlaceholder":"http://127.0.0.1:18118","httpProxyAuthPlaceholder":"user:password","dbPathPlaceholder":"~/Library/Messages/chat.db","botPrefixPlaceholder":"@bot","dmPolicy":"DM Policy","dmPolicyTooltip":"Control who can interact with the bot via direct message. Open: everyone; Allowlist: authorized users only","groupPolicy":"Group Policy","groupPolicyTooltip":"Control who can interact with the bot in group chats. Open: everyone; Allowlist: authorized users only","requireMention":"Require @Mention","requireMentionTooltip":"When enabled, bot only responds in group chats when explicitly @mentioned","policyOpen":"Open","policyAllowlist":"Allowlist","allowFrom":"Allowlist Users","allowFromTooltip":"List of user IDs allowed to interact with the bot. Enable allowlist first, then DM the bot to see your ID in the deny message","allowFromPlaceholder":"Enter user ID and press Enter to add","denyMessage":"Access Denied Message","denyMessageTooltip":"Custom message shown to users when access is denied","twilioAccountSid":"Twilio Account SID","twilioAuthToken":"Twilio Auth Token","phoneNumber":"Phone Number","phoneNumberSid":"Phone Number SID","phoneNumberSidHelp":"Found under Phone Numbers → Active Numbers in the Twilio Console.","ttsProvider":"TTS Provider","ttsVoice":"TTS Voice","sttProvider":"STT Provider","language":"Language","welcomeGreeting":"Welcome Greeting","welcomeText":"Welcome Message","welcomeTextTooltip":"Message automatically sent when a user enters a single chat session with the bot for the first time that day","welcomeTextPlaceholder":"e.g. Hello! I'm QwenPaw. How can I help you?","loginWeCom":"Get WeCom QR Code","wecomSetupGuide":"When creating a bot via QR code, please select \\"Skip Authorization\\" when asked to authorize bot capabilities. If you select \\"Confirm Authorization\\", users other than the bot creator may not be able to interact with the bot.","wecomScanAuth":"Scan to Authorize","wecomAuthHint":"Scan the QR code above with WeCom to authorize. Bot ID and Secret will be filled in automatically.","wecomAuthSuccess":"WeCom bot authorized. Bot ID and Secret have been filled in.","wecomQrcodeFailed":"Failed to get WeCom QR code. Please try again.","slackBotToken":"Bot Token","slackBotTokenTooltip":"Slack Bot User OAuth Token, starts with xoxb-","slackAppToken":"App Token","slackAppTokenTooltip":"Slack App-Level Token for Socket Mode, starts with xapp-","slackProxyTooltip":"HTTP proxy URL for connecting to Slack API","dingtalkSetupGuide":"Scan the QR code with DingTalk to create a bot instantly. A DingTalk app will be created automatically and Client ID / Client Secret will be filled 
132in.","dingtalkScanAuth":"Scan to Create Bot","dingtalkGetQrcode":"Get DingTalk QR Code","dingtalkScanHint":"Scan the QR code above with DingTalk. Client ID and Client Secret will be filled in automatically after authorization.","dingtalkAuthSuccess":"DingTalk bot created. Client ID and Client Secret have been filled in.","dingtalkQrcodeFailed":"Failed to get DingTalk QR code. Please try again.","dingtalkQrcodeExpired":"QR code expired, please get a new one.","qqSetupGuide":"Use QQ to scan the QR code to authorize the bot. After scanning, the APP ID and Client Secret will be automatically retrieved and filled in.","qqScanAuth":"Scan the QR code to authorize the bot","qqGetQrcode":"Get QQ QR code","qqScanHint":"Please use QQ to scan the QR code above. Once authorization is complete, the APP ID and Client Secret will be automatically filled in.","qqAuthSuccess":"QQ bot authorization successful. The APP ID and Client Secret have been automatically filled in.","qqQrcodeFailed":"Failed to retrieve the QQ QR code; please try again later","qqQrcodeExpired":"The QR code has expired; please retrieve a new one","atSenderOnReply":"@ Sender on Reply","atSenderOnReplyTooltip":"When enabled, the bot will @mention the sender in its first reply message in group chats. Note: In card mode, @mention only works for enterprise internal members.","dingtalkEndpoint":"API Endpoint","dingtalkEndpointTooltip":"Custom API endpoint for private DingTalk deployments. Leave empty to use the official default.","cardAutoLayout":"Widescreen Card (Auto Layout)","cardAutoLayoutTooltip":"When enabled, DingTalk renders AI cards in widescreen on desktop. Only applies when the message type is card. The card template must be published.","wecomCancelled":"Authorization cancelled","wecomAuthFailed":"Authorization failed: {{msg}}","voiceSetupGuide":"Set up a Twilio account, purchase a phone number, then enter your credentials below. Find your Account SID and Auth Token on the Twilio Console dashboard. The Phone Number SID is listed under Phone Numbers → Active Numbers.","voiceSetupLink":"Open Twilio Console","sipSetupGuide":"Configure a SIP registrar (e.g. Asterisk, FreeSWITCH) and enter your SIP credentials below. In Dev mode, pyVoIP handles SIP/RTP locally. In Production mode, LiveKit SIP Server is used.","sipMode":"SIP Mode","sipModeTooltip":"Dev: pure-Python pyVoIP for local testing. Production: LiveKit SIP Server for high concurrency.","sipServer":"SIP Server","sipServerPlaceholder":"Leave empty to use built-in registrar","sipServerPlaceholderLivekit":"Not needed for LiveKit mode","sipUsername":"SIP Username","sipPassword":"SIP Password","sipPort":"SIP Port","sipTransport":"Transport","sipDashscopeApiKey":"DashScope API Key","sipDashscopeApiKeyTooltip":"API key for Aliyun DashScope STT/TTS. If empty, falls back to the DASHSCOPE_API_KEY environment variable.","livekitUrl":"LiveKit URL","livekitApiKey":"LiveKit API Key","livekitApiSecret":"LiveKit API Secret","livekitSipTrunkId":"LiveKit SIP Trunk ID","livekitRoomName":"LiveKit Room Name","livekitRoomNameTooltip":"The LiveKit room name to join and wait for SIP calls. Must match the room name in your SIP Dispatch Rule.","xiaoyiSetupGuide":"Please create an agent on Huawei Developer Platform and get AK/SK and Agent ID. AK/SK can be found in the credential management page.","filterAll":"All","builtin":"Built-in","custom":"Custom","feishuRegion":"Region","feishuRegionTooltip":"Choose Feishu for China or Lark for International","feishuChina":"Feishu (China)","feishuInternational":"Lark (International)","feishuScanGuide":"Scan the QR code with Feishu to create a bot instantly. A Feishu app will be created automatically and App ID / App Secret will be filled in.","feishuScanLogin":"Scan to Create Bot","feishuGetQrcode":"Get Feishu QR Code","feishuScanHint":"Scan the QR code above with Feishu. App ID and App Secret will be filled in automatically after authorization.","feishuAuthSuccess":"Feishu bot created. App ID and App Secret have been filled in.","feishuQrcodeExpired":"QR code expired, please get a new one.","feishuQrcodeFailed":"Failed to get Feishu QR code. Please try again.","wechatSetupGuide":"WeChat personal account Bot (iLink protocol). On first start without a Bot Token, a QR code login URL will be printed; scan to authorize. The token is saved locally for future use.","wechatContextTokenLimit":"WeChat iLink platform limitation: each user message's context_token allows a maximum of 10 reply messages. This is a hard limit enforced by the platform. It is recommended to disable thinking and tool output, or enable Message Merge to avoid exceeding the limit and causing message send failures.","
132wechatBotToken":"Bot Token","wechatBotTokenTooltip":"Bearer token obtained after QR code login. Leave empty to trigger QR code login on startup.","wechatBotTokenPlaceholder":"Auto-filled after QR login, or paste manually","wechatBotTokenFile":"Token File Path","wechatBotTokenFileTooltip":"Path to persist the bot token. Defaults to ~/.qwenpaw/wechat_bot_token","wechatMediaDir":"Media Directory","wechatMessageMerge":"Message Merge","wechatMessageMergeTooltip":"Merge multiple reply messages into fewer messages to avoid hitting the WeChat 10-message limit per context_token. When enabled with delay 0, all text replies are merged into a single message sent at the end. A positive delay (in ms) merges adjacent messages within that time window.","wechatMessageMergeDelayMs":"Merge Delay (ms)","wechatMessageMergeDelayMsTooltip":"Time window for adjacent message merging. Set to 0 to merge all messages into one final reply. A positive value (e.g. 1000) will buffer messages for that duration before sending.","wechatMessageMergeDelayMsValidation":"Please enter a valid non-negative integer","wechatScanLogin":"Scan to Login","wechatGetQrcode":"Get Login QR Code","wechatScanHint":"Scan the QR code with WeChat, then click Save","wechatQrcodeFailed":"Failed to fetch QR code, please try again","wechatLoginSuccess":"WeChat login successful, token has been filled in","wechatQrcodeExpired":"QR code expired, please get a new one","shareSessionInGroup":"Share Context in Group","shareSessionInGroupTooltip":"When enabled, all group members share the same conversation context. When disabled, each member has their own independent context.","accessControlEnabled":"Access Control","accessControlEnabledTooltip":"When enabled, only whitelisted users can interact with this bot. Unknown users will be prompted with their ID and added to the pending approval list.","accessControlDm":"DM Access Control","accessControlDmTooltip":"When enabled, only whitelisted users can interact with the bot in direct messages","accessControlGroup":"Group Access Control","accessControlGroupTooltip":"When enabled, only whitelisted users can interact with the bot in group chats","dmDisabled":"Disable DM","dmDisabledTooltip":"When enabled, the bot will completely ignore all direct messages","groupDisabled":"Disable Group","groupDisabledTooltip":"When enabled, the bot will completely ignore all group messages","manageAccessControl":"Access Control","pendingApprovals":"Pending Approvals","whitelist":"Whitelist","blacklist":"Blacklist","addUser":"Add User","addUserPlaceholder":"Enter user ID","userId":"User ID","username":"Username","channel":"Channel","firstMessage":"First Message","time":"Time","actions":"Actions","approve":"Whitelist","deny":"Blacklist","dismiss":"Dismiss","noWhitelistUsers":"No whitelist users","noBlacklistUsers":"No blacklist users","noPendingApprovals":"No pending approvals","userAdded":"User added successfully","userRemoved":"User deleted successfully","approveSuccess":"User added to whitelist","denySuccess":"User added to blacklist","dismissSuccess":"Pending entry dismissed","operationFailed":"Operation failed","remark":"Remark","usernamePlaceholder":"Enter username (optional)","remarkPlaceholder":"Enter a remark (optional)","filterByChannel":"Filter by channel","selectToOperate":"Select items to operate","selectedCount":"{{count}} selected","batchApprove":"Approve","batchDeny":"Blacklist","batchDismiss":"Dismiss","batchApproveConfirm":"Approve {{count}} selected users?","batchDenyConfirm":"Blacklist {{count}} selected users?","batchDismissConfirm":"Dismiss {{count}} selected users?","batchSuccess":"{{count}} users processed successfully","batchRemove":"Delete","batchRemoveConfirm":"Delete {{count}} selected users?","enabledSection":"Enabled","enabledCount":"{{count}}","availableSection":"Available","enableAction":"Enable","noEnabledChannels":"No enabled channels","goEnableChannels":"Enable channels"}`),ND={title:"Sessions",description:"View and manage active chat sessions",loading:"Loading sessions...",confirmDelete:"Confirm Delete",deleteConfirm:"Are you sure you want to delete this session?",batchDeleteConfirm:"Are you sure you want to delete selected {{count}} sessions?",deleteSuccess:"Session deleted successfully",deleteFailed:"Failed to delete session",batchDeleteSuccess:"Successfully deleted {{count}} session(s)",batchDeleteFailed:"Failed to batch delete sessions",saveSuccess:"Session saved successfully",saveFailed:"Failed to save session",batchDeleteButton:"Batch Delete",filterTitle:"Filter by Title",filterUserId:"Filter by User ID",filterChannel:"Filter by Channel",allChannels:"All Channels",totalItems:"Total {{count}} items",selectedItems:"Selected {{count}} items",editSession:"Edit Session",pleaseInputName:"Please input session name",sessionNamePlaceholder:"Session name",activeTab:"Active",archivedTab:"Archived",archivedAtColumn:"Archived At",archive:{action:"Archive",unaction:"Unarchive",batchAction:"Batch Archive",success:"Chat archived",successHint:"Chat archived. View in Control > Sessions > Archived.",failed:"Failed to archive",unarchiveSuccess:"Chat unarchived",unarchiveFailed:"Failed to unarchive",batchSuccess:"{{count}} chat(s) archived",batchFailed:"Failed to batch archive",batchUnaction:"Batch Unarchive",batchUnarchiveSuccess:"{{count}} chat(s) unarchived",batchUnarchiveFailed:"Failed to batch unarchive",groupLabel:"Archived ({{count}})",modalTitle:"Archived Chats",unarchiveAll:"Unarchive All",noArchived:"No archived chats"}},HD={parent:"Settings",environments:"Environment Variables",title:"Environment Variables",description:"Configure key-value environment variables for agents and skills.",key:"Key",value:"Value",variableNamePlaceholder:"VARIABLE_NAME",valuePlaceholder:"value",insertRowBelow:"Insert row below",deleteRow:"Delete row",deleteVariable:"Delete Variable",deleteConfirm:'Delete "{{name}}"?',deleteSelected:"Delete Selected",deleteSelectedConfirm:"Delete {{label}}
132?",keyRequired:"Key is required",invalidKeyFormat:"Invalid key format",duplicateKey:"Duplicate key",saveSuccess:"Environment variables saved",saveFailed:"Failed to save",deleteSuccess:'"{{name}}" deleted',deleteFailed:"Failed to delete",noVariables:"No environment variables configured yet.",addVariable:"Add Variable",loading:"Loading…",retry:"Retry",of:"of",selected:"selected",variable:"variable",variables:"variables",showValue:"Show value",hideValue:"Hide value",searchPlaceholder:"Search variables",qwenpawSettings:"QwenPaw settings",qwenpawSettingsDescription:"Known settings include defaults and locked startup values.",liveSettings:"Live settings",noLiveVariables:"No live settings match the current filter.",customSettings:"Custom variables",noCustomVariables:"No custom child-process variables yet.",editVariable:"Edit variable",applyNow:"Apply now",applyHint:"The current QwenPaw process updates immediately. Existing MCP processes must be reloaded.",applied:"Environment variable applied",appliedWithFailures:"Saved, but {{count}} MCP process could not be reloaded",resetVariable:"Reset variable",resetSuccess:"Variable reset to its system or default value",startupOnly:"Read only",readonlySettings:"Read-only settings",noReadonlyVariables:"No read-only settings match the current filter.",impactTitle:"Process impact",explicitConsumers:"{{count}} MCP process explicitly uses this variable",implicitConsumers:"{{count}} stdio MCP process may inherit it implicitly",restartMode:"Existing MCP processes",restartAffected:"Reload affected MCP processes",restartNone:"Do not reload",restartAllStdio:"Reload every stdio MCP process",readonlyReason:{startup:"Resolved when QwenPaw starts",agent_owned:"Managed by each Agent configuration",initial_default:"Used only as an Agent configuration default"},mutabilityDescription:{hot_runtime:"Read from the current QwenPaw process at the start of each operation.",hot_process:"Available through os.getenv() and inherited by future child processes.",startup_only:"Displayed for reference; it cannot be changed while QwenPaw is running.",internal:"Managed internally by QwenPaw."},variableDescriptions:{QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT:"Maximum wait for the first meaningful stream content; zero disables the watchdog.",QWENPAW_LLM_STREAM_IDLE_TIMEOUT:"Maximum wait between meaningful stream chunks; zero disables the watchdog."},source:{user:"QwenPaw",system:"System",default:"Default"}},UD={selectModel:"Select model",noConfiguredModels:"No configured models",noFreeModels:"No free models available",switchFailed:"Failed to switch model",searchModels:"Search models...",clearSearch:"Clear model search",loadingModels:"Loading models",partialLoadFailed:"Some model information could not be loaded.",retry:"Retry",noModelsFound:"No matching models found",free:"Free",vision:"Vision",freeBannerText:"Free models may have rate limits and limited availability. Refer to the provider for details.",moreProviders:"More free providers (API Key required)",proBannerText:"Showing models configured in Settings.",connectToUse:"Connect {{provider}} to use free models",configureApiKey:"Configure {{provider}} API Key to use free models",configureApiKeyTitle:"Go to Configuration",configureApiKeyConfirm:"You will be redirected to the Models page to configure {{provider}} API Key. Continue?",goToConfigure:"Go to Configure",noModelsDiscovered:"Connected. Models loading...",oauthTitle:"Connect to {{provider}}",oauthDescription:"A new browser window will open for you to authorize access to {{provider}}. Your API key will be saved automatically.",oauthContinue:"Continue",oauthWaiting:"Waiting for authorization...",oauthWaitingDescription:"Please complete the authorization in the browser window.",oauthConnected:"Successfully connected to {{provider}}",oauthFailed:"Authorization failed, please try again",oauthTimeout:"Authorization timed out, please try again",oauthModelUnavailable:"The selected model is no longer available. Review the provider's models and try again.",viewMore:"View more ({{count}})",addAndUse:"Add and use",availableToAdd:"Available to add",addFailed:"Failed to add model",hideModel:"Hide model",hiddenModels:"Hidden models ({{count}})",restoreModel:"Restore model",restore:"Restore",visibilityFailed:"Failed to update model visibility",agentModelSettings:"Agent model routing",agentSettingsLoadFailed:"Failed to load agent model settings",loadingAgentSettings:"Loading agent model settings",agentSettingsSaveFailed:"Failed to save agent model settings",agentSettingsSaved:"Agent model settings saved",saveAgentSettings:"Save routing settings",thinkingLevel:"Thinking level",thinkingUnsupported:"The active model does not advertise configurable thinking.",thinking:{inherit:"Model default",off:"Off",low:"Low",medium:"Medium",high:"High"},subagentModel:"Sub-agent model",sameAsPrimary:"Same as primary",enableFallback:"Enable model fallback",fallbackScope:"Fallback scope",configuredModels:"Configured models",freeModelsOnly:"Free models only",chooseFallback:"Choose a fallback model",moveFallbackUp:"Move {{model}} up",moveFallbackDown:"Move {{model}} down",removeFallback:"Remove {{model}}",fallbackActive:"Actual processing model: {{provider}} / {{model}}"},qD={title:"Token Usage",totalTokens:"Total Tokens",totalCalls:"LLM Calls",toolCalls:"Tool Calls",llmAndToolTrend:"LLM & Tool Calls Trend",llmAndToolTrendTooltip:"Recorded assistant turns (usage metadata) plus tool-use intents across all agents. Not Total Calls (raw API count); older sessions may show 0 recorded turns.",llmAndToolTrendLoadFailed:"Failed to load LLM & tool call trend",recordedTurnsAllAgents:"LLM Calls",byAgent:"By Agent",agent:"Agent",unattributed:"Unattributed",promptTokens:"Prompt Tokens",completionTokens:"Completion Tokens",cacheRead:"Cache-hit Tokens",cacheHitRate:"Cache Hit Rate",byModel:"By Model",byDate:"By Date",model:"Model",date:"Date",loadFailed:"Failed to load token usage",noData:"No token usage data in the selected period",modelTrend:"Model Usage Trend",tokenTypeChart:"Token Type Trend",selectAll:"Select All",allSelected:"All",itemsSelected:"{{count}} selected",selectModels:"Select models",selectTokenTypes:"Select token types"},jD={title:"Agent Statistics",totalSessions:"Total Sessions",totalMessages:"Total Messages",userMessages:"User Messages",assistantMessages:"Assistant Messages",promptTokens:"Prompt Tokens",totalInputTokens:"Total Prompt Tokens",completionTokens:"Completion Tokens",toolCalls:"Tool Calls",newSessions:"New Sessions",activeSessions:"Active Sessions",messageTrend:"Message Trend",sessionTrend:"Session Trend",tokenTrend:"Token Trend",llmAndToolTrend:"LLM & Tool Call Trend",sessionsByChannel:"Sessions by Channel",messagesByChannel:"Messages by Channel",totalSessionsTooltip:"Total chat sessions created, each session is an independent conversation context",totalMessagesTooltip:"Total messages across all sessions, including both user and assistant messages",toolCallsTooltip:"Number of times the agent decided to invoke a tool; a single LLM call may produce multiple tool-use intents",messageTrendTooltip:"Trend comparing user messages vs assistant messages",sessionTrendTooltip:"Trend comparing new sessions vs active sessions; orange bars are sessions created that day, blue bars are sessions with messages that day",llmAndToolTrendTooltip:"Trend of current-agent LLM turns vs tool-use intents",sessionsByChannelTooltip:"Distribution of sessions by messaging channel; sessions without a channel are grouped under Console",messagesByChannelTooltip:"Distribution of total messages by messaging channel",currentAgentLlmCalls:"Recorded Turns",currentAgentTokenTrendTooltip:"Prompt, completion, and cache-hit token trends from the current agent's per-turn session metadata; cache-hit tokens are a subset of prompt tokens",currentAgentPromptTokensTooltip:"Prompt tokens from the current agent's sessions in the selected period (requires per-turn usage metadata; older sessions may show 0)",currentAgentCacheHitRateTooltip:"Token-weighted cache hit rate for observed cache calls by the current agent in the selected period (cache-hit tokens / cache-eligible input tokens;
132 — when unavailable)",currentAgentCompletionTokensTooltip:"Completion tokens from the current agent's sessions in the selected period (requires per-turn usage metadata; older sessions may show 0)",currentAgentLlmCallsTooltip:"Number of assistant turns with recorded usage metadata for the current agent (not raw API call count; older sessions may show 0)",loadFailed:"Failed to load statistics",noData:"No statistics data in the selected period",retry:"Retry"},GD=JSON.parse('{"discoveryOriginApi":"API detected","discoveryOriginCatalog":"Official catalog","discoveryOriginBoth":"API + catalog","availabilityAvailable":"Available","availabilityPermissionDenied":"No permission","availabilityNotFound":"Not found","availabilityIncompatible":"Not chat compatible","availabilityRateLimited":"Rate limited","availabilityTransientError":"Temporarily unavailable","availabilityUnverified":"Unverified","modelAlreadyConfigured":"Configured","llmConfiguration":"LLM Configuration","providersTitle":"Providers","providersDescription":"Configure API keys and endpoints for each provider.","llmTitle":"Models","defaultLlm":"Default LLM","notConfiguredYet":"Not configured","llmDescription":"Set the global default LLM model from an authorized provider. You can choose a specific model for each Agent in the Chat page.","configureProvider":"Configure {{name}}","baseURL":"Base URL","apiKey":"API Key","advancedConfig":"Advanced Configuration","authMode":"Authentication Mode","authModeApiKey":"API Key (x-api-key)","authModeAuthToken":"Auth Token (Authorization: Bearer)","customHeaders":"Custom Headers","customHeadersHint":"Appended to every API request, e.g. x-app: cli","customHeaderKey":"Header Name","customHeaderValue":"Header Value","addHeader":"+ Add Header","generateConfig":"Generation Parameters","generateConfigHint":"Generation parameters expressed as a JSON object. They will be expanded and passed into the generation request (`openai.chat.completions` or `anthropic.messages`).","generateConfigInvalidJson":"Please enter valid JSON","generateConfigMustBeObject":"Generation parameters must be a JSON object","modelAdvancedConfig":"Model Advanced Config","modelGenerateConfig":"Model Generation Parameters","modelGenerateConfigHint":"Generation parameters expressed as a JSON object for this model. They will be expanded and passed into the generation request. These override provider-level advanced configuration.","modelConfigSaved":"Configuration saved for model {{name}}","modelConfigSaveFailed":"Failed to save model configuration","modelConfigLabel":"Model Config","maxTokensLabel":"Max Tokens","maxTokensHint":"Maximum output tokens per response","providerDefault":"Provider default","resetMaxTokens":"Reset to auto","maxOutputCapabilityLabel":"Model capability","unknown":"Unknown","maxInputLengthLabel":"Max Context Length","maxInputLengthHint":"Model context window size, controls context compaction threshold (≥1000)","relayReasoningLabel":"Relay Reasoning","relayReasoningHint":"Relay reasoning contents back to subsequent conversation turns","thinkingModeLabel":"Enable Thinking","thinkingModeHint":"Turn on to enable model thinking/reasoning. Turn off to disable thinking.","thinkingBudgetLabel":"Thinking Budget","thinkingBudgetHint":"Using model default thinking budget","switchToManual":"Manual","switchToAuto":"Auto","reasoningEffortLabel":"Reasoning Effort","reasoningEffortHint":"Controls reasoning depth (OpenAI-family)","protocol":"Protocol","protocolHint":"Choose the provider API protocol for this configuration.","selectProtocol":"Please select a protocol","protocolOpenAI":"OpenAI-compatible (Chat Completions)","protocolOpenAIResponse":"OpenAI-compatible (Response API)","protocolAnthropic":"Anthropic (Messages API)","currentKey":"Current: {{key}}","startsWith":"Starts with \\"{{prefix}}\\"","optionalSelfHosted":"Optional for self-hosted services","leaveBlankKeep":"Leave blank to keep current key","enterApiKey":"Enter API key ({{prefix}}...)","enterApiKeyOptional":"Enter API key (optional)","openAIEndpoint":"OpenAI endpoint, e.g. https://api.openai.com/v1","openAICompatibleEndpoint":"OpenAI-compatible endpoint, e.g. https://api.example.com (append /v1 only if your provider requires it)","azureEndpointHint":"Azure OpenAI endpoint, e.g. https://<resource>.openai.azure.com/openai/v1","anthropicEndpointHint":"Anthropic endpoint, e.g. https://api.anthropic.com","ollamaEndpointHint":"Ollama endpoint, e.g. http://localhost:11434","lmstudioEndpointHint":"LM Studio endpoint, e.g. http://localhost:1234/v1","apiEndpointHint":"API endpoint, e.g. https://api.example.com","pleaseEnterBaseURL":"Please enter the API base URL","selectBaseURL":"Select a base URL","selectBaseURLHint":"Select the regional endpoint for this provider","pleaseEnterValidURL":"Please enter a valid URL","apiKeyShouldStart":"API Key should start with \\"{{prefix}}\\"","configurationSaved":"{{name}} configuration saved","failedToSaveConfig":"Failed to save configuration","revokeAuthorization":"Revoke Authorization","revokeConfirmContent":"Are you sure you want to remove the API key for {{name}}? The current LLM model configuration will also be cleared.","revokeConfirmSimple":"Are you sure you want to remove the API key for {{name}}?","authorizationRevoked":"{{name}} authorization revoked, LLM model cleared","authorizationRevokedSimple":"{{name}} authorization revoked","failedToRevoke":"Failed to revoke authorization","active":"Active: {{provider}} / {{model}}","provider":"Provider","model":"Model","selectProvider":"Select provider (must be authorized)","selectModel":"Select a model","llmModelUpdated":"LLM Model updated","failedToSave":"Failed to save","freeModelWarningTitle":"Free Model Notice","freeModelWarningMessage":"Free models may have limited availability. Please refer to the provider\'s terms of service:","freeModelWarningDontShowAgain":"Do not show this again","saved":"Saved","save":"Save","cancel":"Cancel","loading":"Loading...","retry":"Retry","notSet":"Not set","notRequired":"Not required","available":"Available","unavailable":"Unavailable","providerAvailable":"Ready (with models)","providerNoModels":"Not Ready (no models)","providerNotConfigured":"Not Ready (not configured)","settings":"Settings","actions":"Actions","search":"Search","searchPlaceholder":"Search providers...","searchModelPlaceholder":"Search models...","custom"
132:"Custom","builtin":"Built-in","freeTierGroup":"Free Tier","paidGroup":"Paid","localCustomGroup":"Local & Custom","cloudGroup":"Cloud Providers","configuredGroup":"Configured","configuredOnline":"providers online","noConfigured":"No providers configured yet. Select one below to get started.","goConfigureBtn":"Configure a Provider","availableGroup":"Available Providers","clickToConfigure":"Click to configure","configureAction":"Configure →","endpointCount":"{{count}} endpoints","connect":"OAuth","saveApiKey":"Save","addProvider":"Add Provider","addProviderTitle":"Add Custom Provider","providerIdLabel":"Provider ID","providerIdPlaceholder":"e.g. openai, google, anthropic","providerIdHint":"Lowercase letters, digits, hyphens, underscores. Cannot be changed later.","providerNameLabel":"Display Name","providerNamePlaceholder":"e.g. OpenAI, Google Gemini","defaultBaseUrlLabel":"Default Base URL","defaultBaseUrlPlaceholder":"e.g. https://api.example.com","apiKeyPrefixLabel":"API Key Prefix (optional)","apiKeyPrefixPlaceholder":"e.g. sk-","providerCreated":"Provider \\"{{name}}\\" created","providerCreateFailed":"Failed to create provider","deleteProvider":"Delete Provider","deleteProviderConfirm":"Delete custom provider \\"{{name}}\\" and all its models? This cannot be undone.","providerDeleted":"Provider \\"{{name}}\\" deleted","providerDeleteFailed":"Failed to delete provider","disableProvider":"Disable Provider","disableProviderConfirm":"Clear API key for \\"{{name}}\\"? The provider will become unconfigured.","disableBtn":"Disable","changeApiKey":"Change","selectVariant":"Select {{name}} Variant","providerDisabled":"Provider \\"{{name}}\\" disabled","manageModels":"Models","models":"Models","manageModelsTitle":"{{provider}} — Model Management","userAdded":"User-added","addModel":"Add Model","addModels":"Add Models","autoDiscoverModels":"Auto Discover Models","addModelTitle":"Add Model to {{provider}}","modelIdLabel":"Model ID","modelIdPlaceholder":"e.g. gpt-4o, gemini-2.0-flash","modelDiscoveryUnavailableHint":"No available models were found. This provider may not support model list discovery, so please enter the model ID manually.","modelNameLabel":"Model Name","modelNameRequired":"Please enter model name","modelNamePlaceholder":"e.g. GPT-4o, Gemini 2.0 Flash","modelAdded":"Model \\"{{name}}\\" added","modelAddFailed":"Failed to add model","modelAlreadyExists":"Model ID \\"{{id}}\\" already exists","autoDiscoverModelsSuccess":"Model catalog synced. Discovered {{count}} new candidates","autoDiscoverModelsNoNew":"Model catalog synced. No new candidates found","autoDiscoverModelsFailed":"Failed to auto discover models","modelsLastSynced":"Last synced: {{time}}","modelsNeverSynced":"Models have not been synced yet","modelsSyncFailed":"Last sync failed","modelsSyncing":"Discovering model candidates...","discoveredModelsReady":"{{count}} model candidates are ready to add","addAllDiscoveredModels":"Add all available ({{count}})","discoveredModelsAdded":"Added {{count}} discovered models","discoveredModelsAddFailed":"Failed to add {{count}} models","removeModel":"Remove","removeModelConfirm":"Remove model \\"{{name}}\\" from {{provider}}?","modelRemoved":"Model \\"{{name}}\\" removed","modelRemoveFailed":"Failed to remove model","loadMore":"Load more ({{count}})","modelsCount":"{{count}} models","noModels":"No models","addModelFirst":"Please add a model first","modelList":"Model List","clearAll":"Clear All","filteredModelsLoaded":"Filtered models loaded: {{count}}","filterFailed":"Failed to filter models","clearAllModels":"Clear All Models","clearAllModelsConfirm":"Clear all {{count}} extra models? This cannot be undone.","allModelsCleared":"Cleared {{count}} models","filterModels":"Filter Models","filterByProvider":"Provider:","searchProviderPlaceholder":"Search provider name","selectAllProviders":"Select All","clearProviderSelection":"Deselect All","noMatchingProviders":"No matching providers","filterByModality":"Input Modality:","filterFreeOnly":"Free Models Only:","getModels":"Get Models","discovered":"Available Models:","add":"Add","local":"Local","localType":"Type","localEmbedded":"Embedded (in-process)","localDownloadFirst":"Model service not started","localDownloadModel":"Download Model","localModelsTitle":"{{provider}} — Local Models","localNoModels":"No downloaded models yet","localRepoI
132d":"Model Repository ID","localRepoIdRequired":"Please enter a model repository ID","localRepoIdPlaceholder":"e.g. Qwen/Qwen3-0.6B-GGUF","localFilename":"Filename (optional)","localFilenamePlaceholder":"e.g. mistral-7b.Q4_K_M.gguf","localFilenameHint":"Leave empty to auto-select the best quantization","localSource":"Source","localDownloadSuccess":"Model downloaded successfully","localDownloadFailed":"Failed to download model","localDeleteModel":"Delete Model","localDeleteConfirm":"Delete local model \\"{{name}}\\"? The model file will be removed from disk.","localModelDeleted":"Model \\"{{name}}\\" deleted","localDeleteFailed":"Failed to delete model","localDownloadPending":"Preparing to download...","localDownloading":"Downloading {{repo}}... This may take a few minutes.","localDownloadNavigateHint":"You can navigate away — the download will continue in the background.","localDownloadInProgress":"A download is already in progress","localDownloaded":"Downloaded","localNotDownloaded":"Not downloaded","localNoRecommendedModels":"This device is not powerful enough to run local models","localCancelDownloadTitle":"Cancel download","localCancelDownloadAction":"Cancel download","localCancelDownloadConfirm":"Cancel download of \\"{{repo}}\\"?","localDownloadCancelled":"Download cancelled","localCancelDownloadFailed":"Failed to cancel download","localLlamacppName":"Inference engine","localLlamacppInstallHint":"Install the local runtime before downloading or starting a model.","localInstallLlamacpp":"Install llama.cpp","localLlamacppInstallStarted":"llama.cpp download started","localLlamacppInstallSuccess":"llama.cpp installed successfully","localLlamacppInstallFailed":"Failed to install llama.cpp","localRuntimeSectionTitle":"Inference Engine","localRuntimeSectionDescription":"Powered by Llama.cpp","localRuntimeComputeHint":"CPU is used by default. For GPU acceleration, use Ollama or LM Studio.","localRuntimeInstalled":"Installed","localRuntimeUpdateAvailable":"Update available","localRuntimeUpdateAction":"Click to download the latest version","localRuntimeUpdateConfirmTitle":"Confirm llama.cpp update","localRuntimeUpdateConfirmContent":"Updating will overwrite the currently installed llama.cpp version. Confirm to start downloading and installing the latest version.","localRuntimeUpdateConfirmContentWithServer":"Updating will overwrite the currently installed llama.cpp version and stop the currently running model service ({{model}}). Confirm to start downloading and installing the latest version.","localRuntimeUnsupported":"Unsupported","localRuntimeMissing":"Missing","localServerRunningTitle":"Current local server","localServerOnline":"Running","localServerIdle":"Dead","localServerUnavailable":"Issue","localNoActiveModel":"No active model","localNoDownloadedModelsHint":"Download a suitable model before starting the local inference service.","localDownloadModelFirst":"Download the model first","localEngineInstallStateLabel":"Install","localEngineRunStateLabel":"Status","localEngineCurrentModelLabel":"Current served model","localEngineNextStepLabel":"Next step","localEngineHealthLabel":"Engine health","localEngineStatusHint":"Please download and start a suitable model from the list below","localStartServer":"Start","localStopServer":"Stop","localServerStartFailed":"Failed to start local server","localServerStopFailed":"Failed to stop local server","localServerSwitchTitle":"Switch running model","localServerSwitchConfirm":"The current server is running {{current}}. Switch to {{next}}?","localSwitchModel":"Switch","localModelPathMissing":"This downloaded model is missing a local path.","localModelsSectionTitle":"Local Models","localModelsSectionDescription":"Downloaded models can be started immediately. Only one model download and one local server instance can run at a time.","localModelsLockedHint":"Please install llama.cpp first","localAlternativeRuntimeHint":"Please try Ollama or LM Studio","localModelsCount":"Downloaded {{downloaded}} / {{total}}","localCurrentDownloadTitle":"Current download","localAdvancedConfigTitle":"Advanced Local Settings","localAdvancedConfigDescription":"The
132se settings apply to the embedded local inference runtime. Max context length changes take effect the next time the local server starts.","localAdvancedConfigSaved":"Advanced local settings saved","localAdvancedConfigSaveFailed":"Failed to save advanced local settings","localMaxContextLengthLabel":"Max Context Length","localMaxContextLengthHint":"Maximum token count for the model context window, determining how much history fits in each request. Changes take effect the next time the local server starts.","localMaxContextLengthRequired":"Please enter max context length","localMaxContextLengthMin":"Max context length must be at least {{min}}","localMaxContextLengthPlaceholder":"Enter max context length","localServerPortLabel":"Server Port","localServerPortHint":"Leave this empty to let llama.cpp bind an available port automatically. Enter a port to reuse that fixed port on future startups. Changes take effect the next time the local server starts.","localServerPortRange":"Server port must be between {{min}} and {{max}}","localServerPortPlaceholder":"Leave empty to auto-select a port","localGenerateConfigHint":"Configure local model generation parameters as a JSON object. These fields will be expanded into subsequent generation requests.","localCustomModelTitle":"Custom model download","localCustomModelHint":"Enter a model repository ID. GGUF format only.","localSourceHuggingFace":"Hugging Face","localSourceModelScope":"ModelScope","ollamaModelNamePlaceholder":"e.g. mistral:7b, qwen3:8b","testConnection":"Test Connection","testConnectionSuccess":"Connection test successful","testConnectionFailed":"Connection test failed","testConnectionFailedWithMessage":"Connection test failed: {{message}}","testConnectionError":"An error occurred while testing connection","modelTestFailed":"Model validation failed, please check if the model ID is correct","modelTestFailedConfirm":"Model connection test failed: {{message}}. Do you still want to add this model?","tagVideo":"Video","tagMultimodal":"Multimodal","tagVision":"Vision","tagText":"Text","free":"Free","probeMultimodal":"Test Multimodal","probeImage":"Image","probeVideo":"Video","probeSupported":"Supported: {{types}}","probeNotSupported":"This model does not support multimodal input","probeFailed":"Probe failed","tagNotProbed":"Not Probed","modalityVision":"Image","modalityAudio":"Audio","modalityVideo":"Video","modalityFile":"File","perMillionIn":"/1M in","perMillionOut":"/1M out"}'),VD={title:"Files",navigator:"Files navigator",source:"Source",workspace:"Workspace",agentWorkspace:"Agent workspace",profile:"Profile",memory:"Long-term Memory",daily:"Daily",digest:"Knowledge Base",memoryGraph:"Memory Graph",memoryGraphShort:"Graph",memoryGraphLoading:"Loading memory graph…",memoryGraphLoadFailed:"Failed to load the memory graph.",memoryGraphCounts:"{{nodes}} nodes · {{edges}} links",memoryGraphEmpty:"No indexed memory links yet.",memoryGraphZoomOut:"Zoom out",memoryGraphZoomIn:"Zoom in",memoryGraphFit:"Fit graph",memoryGraphAutoRotate:"Auto rotate",memoryGraphMotionReduced:"Reduced motion is enabled by the system",memoryGraphRendering:"Building the 3D scene…",memoryGraphRenderFailed:"Failed to render the 3D graph.",memoryGraphCanvasLabel:"Interactive 3D memory graph. Drag to rotate, scroll to zoom, and select a node to view details.",memoryGraphCloseDetails:"Close node details",memoryGraphRoot:"Root",memoryGraphRootDirect:"Direct file",memoryGraphOtherFile:"Other file",memoryGraphIndexed:"Indexed file",memoryGraphUnresolved:"Unresolved link",memoryGraphDirection:"Wiki link direction",memoryGraphOpenFile:"Open Markdown",memoryGraphOutbound:"Outgoing · {{count}}",memoryGraphInbound:"Incoming · {{count}}",projectDirectory:"Project directory",workspaceDirectory:"Configuration directory",switchRoot:"Switch directory",manageDirs:"Manage directories…",primaryRoot:"Primary",rootMissing:"Missing",rootsPending:"{{count}} more available after the first message",changeDirectoryTitle:"Change project directory?",changeDirectoryWarning:"Unsaved edits or pending diffs are open in this project. Changing directories will discard them.",sourceEmpty:"No files are available in this source yet.",loadMore:"Load next 200",upload:"Upload files",conflictPolicy:"Upload conflict policy",conflictRename:"Keep both",conflictRenameDescription:"Add a number to the new filename and keep the existing file.",conflictSkip:"Keep existing",conflictSkipDescription:"Skip conflicting new files and continue uploading the rest.",conflictOverwrite:"Use new file",conflictOverwriteDescription:"Replace the existing file with the new one.",uploadConflictTitle:"Files already exist",uploadConflictDescription:"These files already exist: {{files}}. Choose how to continue.",promptToggle:"Toggle whether {{name}} is included in the system prompt",addSystemPrompt:"Add from workspace",addSystemPromptTitle:"Add a system prompt file",addSystemPromptDescription:"Choose a workspace Markdown file to include in the system prompt.",searchSystemPromptFiles:"Search workspace Markdown files",noSystemPromptCandidates:"No matching files are available.",sourceControl:"Source control",preview:"Preview",htmlPreview:"HTML preview",o
132penHtmlInBrowser:"Open in browser",edit:"Edit",selectFile:"Select a file to open",closeTab:"Close tab",closeOtherTabs:"Close other tabs",closeAllTabs:"Close all tabs",openFiles:"Open files, {{count}}",openFilesLabel:"Open files",openFileCount:"{{count}} open",searchOpenFiles:"Search by file or path",noOpenFilesFound:"No matching open files",scrollTabsLeft:"Scroll tabs left",scrollTabsRight:"Scroll tabs right",agentChangedFile:"Agent changed this file",keep:"Keep",keepAll:"Keep all",undo:"Undo",undoAll:"Undo all",copySelectionToChat:"Copy selection to Chat",copyFileToChat:"Copy file to Chat",previewSize:"Preview · {{size}} bytes",backToPreview:"Back to Preview",download:"Download",downloadFailed:"File download failed",resize:"Resize Files drawer",loadFailed:"Failed to load the file. Check that it is still in the primary working directory of the current agent workspace.",previewUnavailable:"Preview is unavailable. Metadata and download remain available.",mentionInChat:"Mention in Chat",expandWorkspace:"Expand workspace",openWorkspace:"Open workspace",closeWorkspace:"Close workspace",artifactCreated:"Created",artifactModified:"Modified",artifactsExpand:"Show {{count}} more files",artifactsCollapse:"Show fewer files"},WD={agentTitle:"Agent project directory",agentDescription:"The Agent Files workspace uses this default directory.",sessionTitle:"Session project directory",pathPlaceholder:"Enter an absolute directory path",recentProjects:"Recent projects",browseDirectory:"Browse directories",noRecentProjects:"No recent projects",clearSelection:"Clear selected project",homeDirectory:"Home directory",parentDirectory:"Parent directory",refreshDirectory:"Refresh directory",restoreDefault:"Restore default",createDirectory:"Create folder",directoryNamePlaceholder:"Enter a folder name",createDirectoryFailed:"Failed to create folder",useWorkspace:"Use configuration directory",createSessionHint:"Send the first message to set a Session-specific directory.",sessionSource:"Session",agentSource:"Agent default",makePrimary:"Make primary",remove:"Remove",add:"Add",boundDirs:"Added project directories",primaryHint:"Tool calls and commands run in the primary directory by default.",primaryTag:"Primary",unbound:"No directories bound",unavailable:"Missing",alreadyBound:"Already bound",tooMany:"At most {{max}} directories can be bound.",countTitle:"Number of bound directories"},zD=JSON.parse(`{"title":"Configuration","projectDirectoryTitle":"Default project directory","projectDirectoryDescription":"The default directory used for files and commands.","projectDirectoryDefault":"Agent default","changeProjectDirectory":"Change directory","projectDirectoryWorkspaceFallback":"Using the Agent workspace","enhancedCodeCapability":"Enhanced code capability","enhancedCodeCapabilityTooltip":"Adds code-oriented tools without changing the project directory.","enhancedCodeCapabilityDescription":"Enable AST, LSP, code prompts, Git context and source control.","description":"Configure agent runtime parameters","reactAgentTitle":"ReAct Agent","llmRetryTitle":"LLM Auto Retry","llmRetryEnabled":"Enable Auto Retry","llmRetryEnabledTooltip":"Automatically retry transient LLM API failures such as rate limits, timeouts, or connection errors. Applies to new requests after saving.","llmMaxRetries":"Max Retries","llmMaxRetriesTooltip":"Maximum number of extra retry attempts for a retryable LLM request failure.","llmMaxRetriesPlaceholder":"Enter max retries","llmMaxRetriesRequired":"Max retries is required","llmMaxRetriesMin":"Max retries must be at least 1","llmBackoffBase":"Backoff Base Delay (s)","llmBackoffBaseTooltip":"Base delay before the first retry. Later retries use exponential backoff from this value.","llmBackoffBasePlaceholder":"Enter base delay","llmBackoffBaseRequired":"Backoff base delay is required","llmBackoffBaseMin":"Backoff base delay must be at least 0.1 seconds","llmBackoffCap":"Backoff Max Delay (s)","llmBackoffCapTooltip":"Maximum cap for exponential retry backoff delays.","llmBackoffCapPlaceholder":"Enter max delay","llmBackoffCapRequired":"Backoff max delay is required","llmBackoffCapMin":"Backoff max delay must be at least 0.5 seconds","llmBackoffCapGteBase":"Backoff max delay must be greater than or equal to the base delay","llmRateLimiterTitle":"LLM Rate Limiter","llmMaxConcurrent":"Max Concurrent Calls","llmMaxConcurrentTooltip":"Maximum number of LLM calls allowed in-flight at the same time. Shared across all agents; only the first initialization takes effect until restart.","llmMaxConcurrentPlaceholder":"Enter max concurrent calls","llmMaxConcurrentRequired":"Max concurrent calls is required","llmMaxConcurrentRange":"Max concurrent calls must be at least 1","llmMaxQpm":"Max QPM (Queries Per Minute)","llmMaxQpmTooltip":"Maximum requests allowed within a 60-second sliding window. Requests exceeding this limit wait before being dispatched — proactively preventing 429 rate-limit errors. 0 = disabled.","llmMaxQpmPlaceholder":"Enter max QPM (0 = unlimited)","llmMaxQpmRequired":"Max QPM is required","llmMaxQpmRange":"Max QPM must be at least 0","llmRateLimitPause":"Rate Limit Pause (s)","llmRateLimitPauseTooltip":"Default pause duration (seconds) applied globally when a 429 rate-limit response is received. Overridden by the API's Retry-After header when present.","llmRateLimitPausePlaceholder":"Enter pause duration","llmRateLimitPauseRequired":"Rate limit pause is required","llmRateLimitPauseMin":"Rate limit pause must be at least 1 second","llmRateLimitJitter":"Rate Limit Jitter (s)","llmRateLimitJitterTooltip":"Random jitter range (seconds) added on top of the pause so concurrent waiters stagger their wake-up and avoid a new burst.","llmRateLimitJitterPlaceholder":"Enter jitter range","llmRateLimitJitterRequired":"Rate limit jitter is required","llmRateLimitJitterMin":"Rate limit jitter must be at least 0 seconds","llmAcquireTimeout":"Slot Acquire Timeout (s)","llmAcquireTimeoutTooltip":"Maximum time (seconds) a caller will wait to acquire a rate-limiter slot before giving up with an error.","llmAcquireTimeoutPlaceholder":"Enter acquire timeout","llmAcquireTimeoutRequired":"Slot acquire timeout is required","llmAcquireTimeoutMin":"Slot acquire timeout must be at least 10 seconds","llmAcquireTimeoutGtPauseJitter":"Slot acquire timeout must be greater than rate limit pause + jitter","contextManagementTitle":"Context Management","memoryManagerBackend":"Long-term Memory Management Backend","memoryManagerBackendTooltip":"Backend for the memory manager. Choose remelight (local files), adbpg (cloud database), PowerContext (remote memory service), or none (disable memory).","memoryManagerBackendRestartWarning":"Switching the long-term memory management backend does not support hot reload. Save and restart QwenPaw for changes to take effect.","maxIters":"Max Iterations","maxItersTooltip":"Maximum number of reasoning-acting iterations for ReAct agent","maxItersPlaceholder":"Enter max iterations","maxItersRequired":"Max iterations is required","maxItersMin":"Max iterations must be at least 1","agentLoopTitle":"Agent Loop Settings","loopMode":{"builtIn":"Built-in","builtInNote":"Pipeline locked · Values editable","templateSectionTitle":"Loop templates","templateSectionDescription":"Choose a built-in template or add your own.","defaultTab":"Default","goalTab":"Goal","missionTab":"Mission","defaultDescription":"The standard guarded ReAct loop used outside an explicit mode.","goalDescription":"A bounded persistent loop for concrete, verifiable goals.","missionDescription":"A persistent pipeline for longer-running, multi-step missions.","gatePipeline":"Gate pipeline","repetitionTitle":"Repetition protection","repetitionDescription":"Detect repeated tool calls and intervene.","iterationTitle":"Iteration limit","iterationDescription":"Bound the number of ReAct iterations.","retryTitle":"Qualitative completion check","retryDescription":"Triggered when the agent produces a text response without tool calls.","goalTurnTitle":"Goal turn limit","goalTurnDescription":"Limit turns within one active goal.","maxGoalTurns":"Maximum goal turns","goalBudgetTitle":"Goal token budget","goalBudgetDescription":"Stop when the complete goal reaches its budget.","maxGoalTokens":"Maximum goal tokens","goalCompletionTitle":"Goal completion check","goalCompletionDescription":"Read the explicit goal status before stopping.","goalCompletionReadOnly":"Completion is controlled by the built-in goal status protocol.","missionProgressTitle":"Mission progress check","missionProgressDescription":"Continue until mission stories pass or the limit is reached.","missionProgressReadOnly":"Completion is controlled by the built-in Mission story status.","missionIterationTitle":"Mission iteration limit","missionIterationDescription":"Set the default execution limit for new Missions.","workerAttemptsTitle":"Worker attempts","workerAttemptsDescription":"Limit Worker retries after a Story fails verification.","missionVerificationTitle":"Mission verification policy","missionVerificationDescription":"Define the default verification guidance and test command.","defaultMaxMissionIterations":"Default maximum execution rounds","defaultMaxMissionIterationsTooltip":"Used when /mission does not specify --max-iterations.","maxRetriesPerStory":"Maximum retries per Story","maxRetriesPerStoryTooltip":"Worker retries after a failed or partial Verifier result.","defaultVerificationInstructions":"Verification guidance (optional)","defaultVerificationInstructionsHelp":"Natural-language guidance applied to every Mission verifier.","defaultVerificationInstructionsPlaceholder":"For example: Check Windows path handling and inspect the rendered UI.","defaultVerifyCommand":"Default test command (optional)","defaultVerifyCommandHelp":"The verifier attempts this through normal tools and permissions. /mission --verify overrides it.","defaultVerifyCommandPlaceholder":"For example: pytest -q","enableRepetitionProtection":"Enable repetition protection","removeRule":"Remove rule","custom"
132:"Custom","customDescription":"Build a saved pipeline from QwenPaw-owned gates.","duplicate":"Duplicate","delete":"Delete","displayName":"Display name","duplicateModeName":"A loop mode with this name already exists.","slashCommand":"Slash command","description":"Description","availableToAgent":"Available to this agent","runsTopToBottom":"Runs from top to bottom","addGate":"Add gate","emptyPipeline":"Add at least one Gate to make this mode available.","iterationGateTitle":"Iteration limit","iterationGateDescription":"Stop after a fixed number of loop iterations.","doomGateTitle":"Repetition protection","doomGateDescription":"Detect repeated tool calls and change strategy.","tokenGateTitle":"Token budget","tokenGateDescription":"Limit prompt and completion token usage.","timeoutGateTitle":"Loop time limit","timeoutGateDescription":"Stop at the next Loop boundary after elapsed time; running work is not interrupted.","toolBudgetGateTitle":"Tool-call budget","toolBudgetGateDescription":"Limit all calls and selected tools.","retryGateTitle":"Early-stop retry","retryGateDescription":"Prompt the agent to verify before ending.","rubricGateTitle":"Completion rubric","rubricGateDescription":"Evaluate explicit criteria and revise when needed.","qualitativeRubricTitle":"Qualitative completion check","qualitativeRubricDescription":"Check text responses without tool calls using natural-language criteria.","qualitativeRubric":"Natural-language completion criteria","qualitativeRubricHelp":"Triggered only for text responses without tool calls. The agent continues when work remains.","completionRubricTitle":"Completion signal check","completionRubricDescription":"Check text responses without tool calls for a completion signal.","completionRubricHelp":"Triggered after text responses without tool calls. The agent outputs the completion signal when done; otherwise it keeps working until the maximum evaluation rounds is reached.","completionPrompt":"Completion check prompt","completionPromptHelp":"Describe when the result is complete. QwenPaw automatically injects the completion-signal output instruction.","completionSignal":"Completion signal","completionSignalHelp":"QwenPaw injects this signal into the check prompt and instructs the agent to output only it. Matching is exact after trimming whitespace and ignoring case.","removeCriterion":"Remove criterion {{number}}","totalTokensHelp":"Maximum combined input and output tokens used by this turn.","promptTokensHelp":"Includes system instructions, conversation context, tool schemas, and tool results.","completionTokensHelp":"Maximum tokens generated by the model during this turn.","maxIterations":"Maximum iterations","historyWindow":"History window","similarityThreshold":"Similarity threshold","totalTokens":"Maximum total tokens","promptTokens":"Maximum input tokens","completionTokens":"Maximum output tokens","maxSeconds":"Maximum seconds","maxSecondsHelp":"Elapsed time is checked after the current model response or tool call completes. Running work is not interrupted.","allToolCalls":"All tool calls","perToolLimits":"Per-tool limits","toolName":"Tool name","callLimitAria":"{{name}} call limit","removeToolLimitAria":"Remove {{name}} limit","addToolLimit":"Add per-tool limit","maxRetries":"Maximum retries","retryInstruction":"Retry instruction","passThreshold":"Pass threshold","maxEvaluations":"Maximum evaluation rounds","graderError":"Grader error","stopSafely":"Stop safely","verifyOnceMore":"Verify once more","completionCriteria":"Completion criteria","criterionPlaceholder":"Describe observable completion","required":"Required","weight":"Weight","addCriterion":"Add criterion","moveGateAria":"Move {{title}}","removeGate":"Remove gate","newModeName":"New Loop Mode","defaultCustomDescription":"A custom gate pipeline.","copyName":"{{name}} Copy","createModeAria":"Create custom loop mode","createModeTitle":"Create custom loop mode","startingTemplate":"Starting template","startingPipeline":"Starting pipeline","blankPipelineHint":"Start empty and add gates later","safeTemplate":"Safe run","researchTemplate":"Budgeted research","qualityTemplate":"Quality first","blankTemplate":"Blank pipeline"},"doomLoopEnabled":"Repetition Protection","doomLoopEnabledTooltip":"Automatically intervene when the agent gets stuck repeating the same actions","doomLoopAfter":"After","doomLoopRepetitions":"identical actions","doomLoopStopAction":"Pause & Ask for Help","doomLoopWarnAction":"Send Reminder","doomLoopSimpleMode":"Simple","doomLoopAdvancedMode":"Advanced","doomLoopWindowSize":"Detection Range","doomLoopWindowSizeTooltip":"How many re
132cent actions to check for repetition","doomLoopSimilarity":"Match Sensitivity","doomLoopSimilarityTooltip":"How similar actions must be to count as repetition (lower = stricter)","doomLoopStages":"Intervention Rules","doomLoopAction":"Action","doomLoopPrompt":"Message","doomLoopPromptPlaceholder":"Reminder message or pause reason...","doomLoopAddStage":"Add Rule","iterationTitle":"Iteration Limit","iterationEnabled":"Enable Iteration Limit","iterationEnabledTooltip":"Stop the agent after a fixed number of loop turns","iterationMaxIterations":"Maximum Iterations","iterationMaxIterationsTooltip":"Maximum number of loop turns before stopping","rubricTitle":"Qualitative Completion Check","rubricEnabled":"Enable Qualitative Completion Check","rubricEnabledTooltip":"Triggered only when the agent produces a text response without tool calls.","rubricPrompt":"Natural-Language Completion Criteria","rubricPromptTooltip":"The prompt injected to ask the agent to evaluate task completion","rubricDesc":"When the agent produces a text response without tool calls, apply natural-language completion criteria and ask it to continue when work remains.","rubricPromptPlaceholder":"You did not call any tool. If the task is complete, confirm. Otherwise, continue with tool calls.","rubricMaxInterventions":"Maximum Evaluation Rounds","rubricMaxInterventionsTooltip":"Maximum completion checks for text responses without tool calls during one turn.","inLoopModes":"Enable in /goal & /mission modes","inLoopModesTooltip":"Also apply this gate when /goal or /mission loop mode is active","comingSoonEditable":"Custom configuration will be available in a future release.","simpleMode":"Simple","advancedMode":"Advanced","comingSoon":"Coming Soon","reactModeTab":"Loop Template - Default","goalModeTab":"Loop Template - Goal","missionModeTab":"Loop Template - Mission","goalModeInfoTitle":"Goal Mode vs Default","goalModeInfo":"Default mode stops after producing a reply. Goal mode keeps the agent looping toward a goal, using Rubric evaluation to determine completion. All operations run within the current agent context.","missionModeInfoTitle":"Mission Mode vs Goal Mode","missionModeInfo":"Mission mode auto-decomposes complex tasks into sub-tasks, executed by independent Worker sub-agents and verified by Verifier sub-agents. Each sub-task runs in its own context, preventing context pollution of the main session. Best for complex multi-step engineering tasks.","goalIterationGate":"Goal Iteration Gate","goalIterationGateDesc":"Limits the number of agent turns within a goal session. Tracks iteration count and token usage.","goalBudgetGate":"Token Budget Gate","goalBudgetGateDesc":"Enforces a token spending limit for the goal session. Stops the agent when budget is exceeded.","goalRubricGate":"Goal Completion Rubric","goalRubricGateDesc":"Evaluates whether the goal has been achieved by checking the session status.","goalDoomGate":"Repetition Protection","goalDoomGateDesc":"Detects repetitive patterns during goal execution and triggers intervention.","missionProgressGate":"Mission Progress Gate","missionProgressGateDesc":"Tracks PRD user story completion. Continues until all stories pass or max iterations reached.","missionIterBypass":"Iteration Bypass","missionIterBypassDesc":"Temporarily lifts the ReAct iteration limit during mission execution to allow long-running phases.","customLoopTitle":"Custom Loop Modes","customLoopDesc":"Create your own loop modes with custom gate combinations. Coming soon.","autoGenerateSessionTitle":"Auto-generate session titles","autoGenerateSessionTitleTooltip":"After the first user message in a new chat, run a short background LLM call to replace the truncated placeholder with a concise title. Costs one extra short LLM call per new chat. Turn off to keep the placeholder and skip the spend.","shellCommandTimeout":"Shell Command Timeout (s)","shellCommandTimeoutTooltip":"Default timeout in seconds for the execute_shell_command tool. The LLM can still override this per-call via the timeout parameter. Useful for long-running tasks like compilation or data processing.","shell
132CommandTimeoutPlaceholder":"Enter timeout","shellCommandTimeoutRequired":"Shell command timeout is required","shellCommandTimeoutMin":"Shell command timeout must be at least 1 second","shellCommandExecutable":"Shell Executable","shellCommandExecutableTooltip":"Path to the shell used by execute_shell_command. Linux/macOS: e.g. /bin/bash, /bin/zsh. Windows: supports powershell.exe, pwsh.exe, or POSIX-like shells such as Git Bash. When empty, falls back to the $SHELL environment variable, then to the platform default (/bin/sh on Unix, cmd.exe on Windows).","shellCommandExecutablePlaceholder":"e.g. /bin/bash or powershell.exe (empty = auto-detect)","maxInputLength":"Max Input Length","maxInputLengthTooltip":"Maximum input length (tokens) for the model context window","maxInputLengthPlaceholder":"Enter max input length","maxInputLengthRequired":"Max input length is required","maxInputLengthMin":"Max input length must be at least 1000","contextCompactRatio":"Compaction Threshold Ratio","contextCompactRatioTooltip":"Compaction is triggered when the context length reaches this fraction of the max context length","contextCompactRatioRequired":"Context compact ratio is required","contextCompactThreshold":"Compaction Threshold (tokens)","contextCompactThresholdTooltip":"Auto-calculated from max context length × compaction ratio. Compaction triggers when context exceeds this value.","contextCompactThresholdPlaceholder":"Auto-calculated","contextCompactReserveRatio":"Reserve Threshold Ratio","contextCompactReserveRatioTooltip":"Calculates the target recent-tail budget. Scroll also applies a minimum recent budget and a 40K cap, and always keeps the complete active turn.","contextCompactReserveRatioRequired":"Context reserve ratio is required","contextCompactReserveThreshold":"Reserve Threshold (tokens)","contextCompactReserveThresholdTooltip":"The effective target used to split the recent tail. This is a soft target; boundary messages and the complete active turn may increase the retained amount.","contextCompactReserveThresholdPlaceholder":"Auto-calculated","toolResultCompactRecentN":"Recent Tool Results Range","toolResultCompactRecentNTooltip":"Number of recent tool-result-bearing messages that use the larger recent preview limit in Native context mode","toolResultCompactRecentNRequired":"Recent tool results range is required","toolResultCompactOldThreshold":"Older Tool Result Preview Bytes","toolResultCompactOldThresholdTooltip":"Maximum preview bytes for older tool results in Native context mode.","toolResultCompactOldThresholdPlaceholder":"Enter preview byte limit","toolResultCompactOldThresholdRequired":"Older tool result preview bytes is required","toolResultCompactRecentThreshold":"Recent Tool Result Preview Bytes","toolResultCompactRecentThresholdTooltip":"Maximum preview bytes before a tool result enters agent context. In Scroll mode, this also limits each recall_history page and read_file response.","toolResultCompactRecentThresholdPlaceholder":"Enter preview byte limit","toolResultCompactRecentThresholdRequired":"Recent tool result preview bytes is required","toolResultCompactRetentionDays":"Complete Tool Result Retention Days","toolResultCompactRetentionDaysTooltip":"Independent retention period for complete tool result artifacts. After cleanup, history.db may still retain a bounded preview.","toolResultCompactRetentionDaysRequired":"Complete tool result retention days is required","historyRetentionDays":"History Retention Days","historyRetentionDaysTooltip":"Days of durable chat history to keep. Older rows are purged automatically on startup and on agent teardown.","historyRetentionDaysRequired":"History retention days is required","historyRetentionDaysForeverWarning":"Set to 0 keeps history forever — storage will grow without bound.","historyRetentionDaysLargeWarning":"A large retention window may consume significant storage.","exemptFileExtensions":"Exempt File Extensions","exemptFileExtensionsTooltip":"In Native context mode, read_file results for these extensions always use the larger recent preview limit","exemptFileExtensionsPlaceholder":".md, .txt, .json","exemptToolNames":"Exempt Tool Names","exemptToolNamesTooltip":"In Native context mode, results from these tools always use the larger recent preview limit","exemptToolNamesPlaceholder":"chat_with_agent, list_agents","language":"Agent Language","languageTooltip":"Language for agent persona files (SOUL.md, AGENTS.md, etc.). Changing this will re-copy MD files in the selected language.","languageConfirmTitle":"Change Agent Language","languageConfirmContent":"Changing the language will over
132write the following files with the new language version:\\n\\n  SOUL.md, AGENTS.md, PROFILE.md, MEMORY.md, BOOTSTRAP.md, HEARTBEAT.md\\n\\nIf you have customized any of these files, please back them up first. Your other files will not be affected.","languageConfirmOk":"Change Language","languageSaveSuccess":"Language updated successfully","languageSaveSuccessWithFiles":"Language updated, {{count}} MD file(s) copied","languageSaveFailed":"Failed to update language","saveSuccess":"Configuration saved successfully","saveFailed":"Failed to save configuration","timezone":"User Timezone","timezoneTooltip":"Used for scheduled tasks, time display, and agent context. Defaults to your system timezone.","timezoneRequired":"Please select a timezone","selectTimezone":"Select timezone","timezoneSaveSuccess":"Timezone updated successfully","timezoneSaveFailed":"Failed to update timezone","loadFailed":"Failed to load configuration","historyMaxLength":"Max History Length","historyMaxLengthTooltip":"Maximum output length (characters) for the /history command","historyMaxLengthRequired":"Max history length is required","historyMaxLengthMin":"Max history length must be at least 1000","historyMaxLengthPlaceholder":"Enter max length","contextCompactTitle":"Context Compact Config","contextCompactEnabled":"Enable Context Compaction","contextCompactEnabledTooltip":"Automatically compact the context to prevent context window overflow","tokenCountModel":"Token Count Model","tokenCountModelTooltip":"Model name used for precise token counting; set to \\"default\\" to use built-in estimation","tokenCountModelPlaceholder":"Model name or default","tokenCountUseMirror":"Use HuggingFace Mirror","tokenCountUseMirrorTooltip":"Use a HuggingFace mirror site when downloading tokenizers","tokenCountEstimateDivisor":"byte/Token Estimate Divisor","tokenCountEstimateDivisorTooltip":"Divisor for byte-based token estimation (tokens ≈ byte_length / divisor). Recommended value: 3.75 ~ 4.","tokenCountEstimateDivisorRequired":"Estimate divisor is required","tokenCountEstimateDivisorMin":"Estimate divisor must be between 2 and 5","toolResultCompactTitle":"Tool Result Compact Config","toolResultCompactEnabled":"Enable Tool Result Compaction","toolResultCompactEnabledTooltip":"Compact oversized tool call results to save context space","memorySummaryTitle":"Long-term Memory Config","memorySummaryEnabled":"Activate Memory Summary","memorySummaryEnabledTooltip":"Automatically generate and save memory summaries during context compaction","dreamCronEnabled":"Enable Dream","dreamCronEnabledTooltip":"Enable the scheduled dream-based memory optimization job","dreamCron":"Dream Schedule","dreamCronTooltip":"Cron expression for periodically optimizing long-term memories through dream state. Scheduled runs start after a random delay of 0–60 seconds to avoid simultaneous calls; use the switch above to enable or disable it","dreamCronPlaceholder":"0 23 * * *","dreamCronRequired":"Enter a cron expression when Dream is enabled","dreamCronInvalid":"Enter a valid 5-field cron expression","memoryDailyPaperTitle":"Daily Paper","memoryDailyPaperDescription":"Generate daily paper readings and a concise brief on a schedule using paper information from Hugging Face.","dailyPaperCron":"Daily Paper Schedule","dailyPaperCronTooltip":"Cron expression for Daily Paper generation. The task stays off until the switch is enabled.","dailyPaperTopics":"Topics","dailyPaperTopicsTooltip":"Optional topics to prioritize when selecting papers.","dailyPaperTopicsPlaceholder":"For example: agent memory, reinforcement learning","dailyPaperUseHfMirror":"Use Hugging Face mirror","dailyPaperUseHfMirrorDescription":"Fetch paper information through the Hugging Face mirror","dailyPaperCronPlaceholder":"0 9 * * *","dailyPaperCronRequired":"Enter a cron expression when Daily Paper is enabled","dailyPaperCronInvalid":"Enter a valid 5-field cron expression","memoryAutoFinTitle":"Auto Fin","memoryAutoFinDescription":"Research recent topic-related CLS financial news and connect it with historical memory.","autoFinDocumentation":"View guide","autoFinCron":"Auto Fin Schedule","autoFinCronTooltip":"Cron expression for Auto Fin research. The task stays off until the switch is enabled.","autoFinCronPlaceholder":"0 18 * * *","autoFinCronRequired":"Enter a cron expression when Auto Fin is enabled","autoFinCronInvalid":"Enter a valid 5-field cron expression","autoFinTopics":"Topics","autoFinTopicsTooltip":"Comma-separated topics used to filter recent CLS news.","autoFinTopicsPlaceholder":"For example: gold, AI, memory chips","autoFinWindowHours":"News window (hours)","autoFinWindowHoursTooltip":"How many hours of recent CLS telegraph news to analyze on each run.","autoFinWindowHoursPlaceholder":"24","autoFinWindowHoursRequired":"Enter the news window","autoFinWindowHoursMin":"The news window must be at least 1 hour","autoFinWindowHoursMax":"The news window cannot exceed {{max}} hours","autoFinNotifyDescription":"Send Auto Fin results to the inbox","autoFinDisclaimer":"Auto Fin does not provide market prices, returns, targets, trading signals, or investment advice.","autoMemorySearch":"Auto Memory Search (Beta)","autoMemorySearchTooltip":"Auto memory search to run on every conversation turn. Each query will automatically invoke memory search capabilities, helping QwenPaw understand you better — but this increases token consumption.","autoMaxResults":"Maximum automatic memory search results","autoMaxResultsTooltip":"Maximum number of results returned when auto memory search is enabled","autoMaxResultsRequired":"Max results is required","autoMaxResultsMin":"Max results must be at least 1","embeddingConfigTitle":"Embedding Model Config","embeddingModelTitle":"Embedding Model","embeddingBackend":"Embedding SDK Type","embeddingBackendTooltip":"SDK type used to call the embedding model","embeddingBackendPlaceholder":"Select an SDK type","embeddingApiKey":"API Key","embeddingApiKeyTooltip":"API key for the embedding provider; leave blank if no authentication is required","embeddingApiKeyPlaceholder":"Leave blank if not required","embeddingBaseUrl":"Base URL","embeddingBaseUrlTooltip":"Base URL of the embedding API. For OpenAI-compatible backends, this custom endpoint is optional; API Key and Model Name are required.","embeddingBaseUrlPlaceholder":"https://dashscope.aliyuncs.com/compatible-mode/v1","embeddingHost":"Host","embeddingHostTooltip":"Ollama host URL. Leave blank to use Ollama's default host.","embeddingHostPlaceholder":"http://localhost:11434","embeddingModelName":"Model Name","embeddingModelNameTooltip":"Embedding model name. Required for every embedding backend.","embeddingModelNamePlaceholder":"text-embedding-v4","embeddingEnableCache":"Enable Embedding Cache","embeddingEnableCacheTooltip":"Cache embedding results to reduce repeated computation","embeddingMaxCacheSize":"Max Cache Size","embeddingMaxCacheSizeTooltip":"Maximum number of entries in the embedding cache","embeddingMaxCacheSizeRequired":"Max cache size is required","embeddingUseDimensions":"Send Dimensions in Request","embeddingUseDimensionsTooltip":"Send the dimensions parameter in OpenAI-compatible embedding API requests; some services do not support this parameter","embeddingDimensions":"Embedding Dimensions","embeddingDimensionsTooltip":"Expected vector dimensions, used to validate responses and configure indexes and caches; when request dimensions are disabled, enter the model's actual output dimensions","embeddingDimensionsRequired":"Embedding dimensions is required","embeddingDimensionsMin":"Dimensions must be at least 1","embeddingMaxInputLength":"Per-Input Character Budget","embeddingMaxInputLengthTooltip":"Approximate character budget for each embedding input. Text is truncated before the request, with a more conservative estimate for CJK and other full-width characters; this is not an exact token limit","embeddingMaxInputLengthRequired":"Per-input character budget is required","embeddingMaxBatchSize":"Max Batch Size","embeddingMaxBatchSizeTooltip":"Maximum number of items in a single batch embedding request","embeddingMaxBatchSizeRequired":"Max batch size is required","embeddingHealthCheckTimeout":"Initialization Timeout","embeddingHealthCheckTimeoutTooltip":"Per-attempt timeout for the real connection test and ReMe startup embedding health check","embeddingHealthCheckTimeoutRequired":"Initialization timeout is required","embeddingTestConnection":"Test Embedding Service","embeddingTestSuccess":"Embedding service test succeeded","embeddingTestSuccessDetail":"Actual dimensions: {{dimensions}}; latency: {{latency}} ms. Save to apply this model.","embeddingTestFailed":"Embedding service test failed","embeddingTestIncomplete":"Enter a model name, the required credentials, and valid vector dimensions first.","embeddingStatusDescription":"Review the current model and verify its connection and vector output","embeddingOverviewTitle":"Embedding model hub","embeddingConfigStatus":"Configuration","embeddingCurrentModel":"Current model","embeddingConfiguredDimensions":"Configured dimensions","embeddingDimensionsUnit":"dimensional vector","embeddingVerificationStatus":"Service verification","embeddingVerified":"Verified","embeddingNotVerified":"Not verified","embeddingVerificationHint":"Click to verify the service and view dimensions and latency","embeddingVerificationMetrics":"Returned {{dimensions}} dims · {{latency}} ms","embeddingServiceTitle":"Embedding Service","embeddingServiceDescription":"Connect to the model service and define vector output","embeddingCapabilityEnabled":"Enabled","embeddingCapabilityDisabled":"Disabled","embeddingIndexTitle":"Index & Cache","embeddingIndexDescription":"Control ReMe vector storage and batching behavior","memoryPageDescription":"Let the agent extract, organize, and recall useful information from past conversations. Everyday settings apply immediately; semantic search is optional.","memoryPoweredBy":"Powered by","memoryDocumentation":"Documentation","memoryOverviewTitle":"Long-term memory hub","memoryRuntimeStatus":"Service status","memoryStatusUnknown":"Not checked","memoryStatusChecking":"Checking status","memoryStatusRunning":"Running normally","memoryStatusCheckFailed":"Status check failed","remeStatusLoading":"Reading ReMe runtime status…","remeStatusFailed":"Unable to read ReMe runtime status","remeStatusComponentsTotal":"Estimated ReMe components","remeStatusEstimated":"Combined object size of stateful components","remeStatusProcessRss":"Process memory RSS","remeStatusProcessRssHint":"Physical memory used by the QwenPaw process","remeStatusComponents":"Component details","remeStatusEstimateNote":"Component sizes are independent estimates. Shared objects may be counted more than once, so their total is not the same as process RSS.","memoryStatusNeedsAttention":"Needs attention","memoryStatusBusy":"Processing","memoryStatusStopping":"Stopping","memoryBackgroun
132dTasks":"Background jobs","memoryWorker":"Memory worker","memoryWorkerStatus":{"idle":"Idle","busy":"Processing","stopping":"Stopping","error":"Stopped unexpectedly"},"memoryQueueSummary":"{{running}} running · {{pending}} waiting","memoryQueueIdleSummary":"Idle · no pending jobs","memoryAutoRecordDisabledHint":"Automatic conversation memory is off","memoryAutoMemoryEnabledSummary":"Auto-memory enabled · runs every {{interval}} turns","memoryRuntimeActivityDescription":"Auto-memory jobs from automatic and manual actions run sequentially without blocking the current conversation","memoryLastError":"Most recent error","memoryNeverRun":"No activity yet","autoMemoryRecentTasks":"Recent auto-memory jobs","autoMemoryRecentTasksEmpty":"No auto-memory jobs yet","autoMemoryTrigger":{"periodic":"Periodic","manual":"Manual","compact":"Context compact","new":"New conversation"},"memoryTaskMessages":"{{count}} messages processed","memoryTaskNoResult":"The job has not returned content yet","memoryTaskStatus":{"pending":"Pending","running":"Processing","completed":"Completed","failed":"Failed","cancelled":"Cancelled"},"memoryResourceUsageDescription":"Estimated ReMe components and QwenPaw process memory","memoryDiagnostics":"Resources and diagnostics","memoryComponentsMetric":"Components","memoryProcessMetric":"Process","memoryDiagnosticsHint":"View component usage and runtime details","remeStatusComponent":{"embedding_store":"Embedding store","file_graph":"File graph","file_store":"File store","keyword_index":"Keyword index"},"memoryStatusDisabled":"Disabled","memoryJournalTitle":"Auto-memory","memoryJournalDescription":"Continuously extract searchable memories from conversations and external knowledge sources","memoryConversationJournalTitle":"Conversation memory","memoryExternalSourcesDevelopingLabel":"More coming","memoryExternalSourcesTitle":"External knowledge journals","dailyPaperDocumentation":"View guide","memoryAutoRecordTitle":"Enable conversation memory","memoryAutoRecordDescription":"Continuously extract new memories at the chosen interval","memoryAutoRecordFrequency":"Recording frequency (conversation turns)","memoryNotifyTitle":"Inbox notifications","memoryNotifyDescription":"Notify the inbox only when the conversation journal changes or the job fails","dailyPaperNotifyDescription":"Send Daily Paper results to the inbox","autoDreamNotifyDescription":"Notify the inbox only when memory organization changes something or the job fails","memoryOrganizeSectionTitle":"Memory organization","memoryOrganizeSectionDescription":"Periodically summarize, merge, and improve existing long-term memories","memoryOrganizeTitle":"Scheduled organization","memoryScheduledOrganizeTitle":"Enable scheduled organization","memoryScheduledOrganizeDescription":"Use the Dream job to maintain memory quality in the background","memoryRecallTitle":"Memory search tool","memorySearchSectionTitle":"Memory search","memorySearchSectionDescription":"Control on-demand search and automatic memory recall before responses","memorySearchToolTitle":"Give the agent the memory search tool","memorySearchToolDescription":"Allow the agent to call memory_search when needed","memoryAutoRecallTitle":"Enable automatic memory search (Beta)","memoryAutoRecallDescription":"Search on every turn without requiring the agent to call a tool","memoryMaintenanceEyebrow":"Maintenance & repair","memoryMaintenanceTitle":"Rebuild memory index","memoryMaintenanceDescription":"Clear and regenerate the search index. Recommended only when the index is damaged or search results are abnormal.","toolExecutionLevelTitle":"Tool Approval Mode","toolExecutionLevelTooltip":"Approval Mode","toolExecutionLevel":{"title":"Tool Approval Mode","alertMessage":"Configure approval before tool calls. File Guard rules apply independently.","strict":"Strict Mode","strictDesc":"Every tool call and external file access requires approval","smart":"Smart Mode","smartDesc":"Low-risk tool calls and external file access run automatically; medium- and high-risk operations require approval","auto":"Auto Mode","autoDesc":"Only operations matching tool and file approval rules require approval (default)","off":"Off Mode","offDesc":"Tool and file approvals are disabled"},"saveLevelSuccess":"Tool approval mode saved","saveLevelFailed":"Failed to save tool approval mode","offloadPolicy":{"title":"Tool Backgroun
132d Execution","alertMessage":"This is a global setting (settings.json), not per-agent. It controls the default action when a tool reaches its offload deadline. Users can override it from the tool control panel while a tool is running.","keepForeground":"Keep Foreground","keepForegroundDesc":"After the countdown expires, the tool continues running in the foreground without auto-offloading. Suitable for scenarios requiring real-time output monitoring.","offload":"Auto Offload to Background","offloadDesc":"After the countdown expires, the tool is automatically moved to background execution, allowing the Agent to continue processing other tasks. Suitable for long-running tools.","saveFailed":"Failed to save policy"},"maxContextLength":"Max Context Length","maxContextLengthTooltip":"Maximum token count for the model context window, determining how much history fits in each request","maxContextLengthRequired":"Max context length is required","maxContextLengthMin":"Max context length must be at least 1000","maxContextLengthPlaceholder":"Enter max context length","embeddingActivationNote":"Embedding is enabled when the selected backend has the required fields.","embeddingEnableHint":"Embedding is enabled when the selected backend has the required fields: Model Name plus API Key for OpenAI-compatible or Gemini backends; Model Name for Ollama.","rebuildMemoryIndex":"Rebuild Memory Index","rebuildMemoryIndexWarning":"This clears and rebuilds the memory search index and may consume significant CPU and memory. Use it only to repair a damaged index or abnormal search results.","rebuildMemoryIndexConfirmTitle":"Rebuild the memory index?","rebuildMemoryIndexConfirm":"CPU and memory usage may increase significantly during the rebuild. This is not recommended unless the index is damaged or needs repair.","rebuildMemoryIndexSuccess":"Memory index rebuild completed","rebuildMemoryIndexFailed":"Memory index rebuild failed: {{error}}","rebuildMemoryIndexRequired":"The Embedding configuration changed. Vector search is disabled and memory search is using BM25 until the Embedding index is rebuilt.","embeddingIndexReady":"The Embedding index matches the current configuration.","embeddingIndexStatus":"Embedding index","embeddingIndexAvailable":"Up to date","embeddingIndexDisabled":"Not enabled","embeddingIndexEnableFirst":"Enable Embedding before rebuilding","embeddingSearchModeHybrid":"Current search: Vector + BM25","embeddingSearchModeBm25":"Current search: BM25 only","embeddingSearchModeBm25Pending":"Current search: BM25 only · rebuild pending","embeddingIndexNeedsRebuild":"Rebuild required","embeddingIndexRebuilding":"Rebuilding","embeddingIndexRebuildingHint":"Memory vectors are being generated","embeddingIndexSaveFirst":"Save configuration first","embeddingIndexUnsavedHint":"Save the current changes before rebuilding the index","embeddingIndexMatchesConfig":"Matches current configuration","embeddingIndexBm25Fallback":"Vector search off · using BM25","rebuildEmbeddingIndex":"Rebuild Embedding index","rebuildEmbeddingIndexConfirmTitle":"Rebuild the Embedding index?","rebuildEmbeddingIndexConfirm":"All memory chunks will be embedded with the current configuration. Vector search remains disabled until this finishes successfully.","rebuildEmbeddingIndexSuccess":"Embedding index rebuilt","rebuildEmbeddingIndexFailed":"Embedding index rebuild failed: {{error}}","undoEmbeddingChange":"Undo change","undoEmbeddingChangeConfirmTitle":"Restore the indexed Embedding configuration?","undoEmbeddingChangeConfirm":"The last configuration matching the existing vector index will be restored.","undoEmbeddingChangeSuccess":"Indexed Embedding configuration restored","undoEmbeddingChangeFailed":"Failed to restore the Embedding configuration: {{error}}","rebuildBm25Index":"Rebuild BM25 index","rebuildBm25IndexDescription":"Recreate keyword search from the current memory chunks.","rebuildBm25IndexConfirmTitle":"Rebuild the BM25 index?","rebuildBm25IndexConfirm":"Keyword search will be rebuilt from the current memory chunks.","rebuildBm25IndexSuccess":"BM25 index rebuilt","goToLongTermMemory":"Go to long-term memory","toolResultCompactRecentGtOld":"Recent tool result preview bytes must be greater than or equal to compact preview bytes","lightContextTitle":"Context Management","remeLightMemoryTitle":"Long-term Memory","dialogPath":"Dialog Storage Path","dialogPathTooltip":"Relative path for dialog persistence storage (relative to working_dir)","dialogPathPlaceholder":"dialog","contextCompactCollapseLabel":"Context Compaction","toolResultPruningCollapseLabel":"Tool Result Pruning","visualCompactCollapseLabel":"Visual Compact","visualCompactDescription":"Compact older, longer context into visual pages to reduce input tokens. Recent conversation remains text.","visualCompactEnabled":"Enable Visual Compact","visualCompactEffort":"Compression intensity","visualCompactLow":"Low","visualCompactMedium":"Medium","visualCompactHigh":"High","visualCompactLowDescription":"Compress less content and prioritize readability.","visualCompactMediumDescription":"Balance token savings with visual readability.","visualCompactHighDescription":"Compress more eligible context and prioritize token savings.","visualCompactQualityNote":"Higher compression does not necessarily improve answer quality.","visualCompactCapabilityNote":"Only takes effect with models that support image input.","autoMemorySearchCollapseLabel":"Auto Memory Search","embeddingConfigCollapseLabel":"Embedding Model Config","summarizeWhenCompact":"Memory on Compact","summarizeWhenCompactTooltip":"Automatically generate and save memory during context compaction","inboxPushEnabled":"Memory Result Inbox Notifications","inboxPushEnabledTooltip":"Push auto-memory, auto-dream, and Daily Paper results to the inbox. Disable this to reduce inbox messages without stopping the memory jobs.","autoMemoryInterval":"Auto Memory Interval","autoMemoryIntervalTooltip":"Trigger auto memory every N user queries. 0 disables periodic auto memory. 1 means auto memory after every query. Recommended: 2-5; setting 1 requires attention to high token usage.","autoMemoryIntervalPlaceholder":"Enter 0 to disable periodic auto memory","autoMemoryIntervalRequired":"Auto memory interval is required","autoMemoryIntervalMin":"Auto memory interval must be at least 0","contextManagerBackend":"Context Manager Backend","contextManagerBackendTooltip":"Backend type for the context manager. Currently only Light is supported.","contextStrategy":"Context Strategy","contextStrategyTooltip":"How the agent manages long context. Scroll (recommended) persists evicted turns to a durable history store and recalls them on demand; Native uses in-place compression. Restart QwenPaw for changes to take effect.","contextStrategyScroll":"Scroll","contextStrategyNative":"Native","backendRestartWarning":"Switching backends does not support hot reload. Save and restart QwenPaw for changes to take effect.","adbpgMemoryTitle":"ADBPG Long-term Memory","powercontextMemoryTitle":"PowerContext Memory","powercontextConfig":{"title":"PowerContext Memory Configuration","baseUrl":"Server URL","token":"Bearer Token","scopeId":"Memory Scope","scopeIdPlaceholder":"Leave empty to use this installation's unique agent scope","scopeIdInvali
132d":"Memory scope must not contain only whitespace.","timeout":"Request Timeout","maxContextBytes":"Maximum injected context (bytes)","maxContextBytesTooltip":"Bounds the total PowerContext search result content added to one model turn."},"adbpgConfig":{"title":"ADBPG Memory Configuration","restBaseUrl":"REST Base URL","restApiKey":"REST API Key","memoryIsolation":"Memory Isolation (per-agent)","searchTimeout":"Search Timeout"}}`),KD={title:"Built-in Tools",description:"Manage built-in tools and their enabled status. Disabled tools will not be available to the agent.",emptyState:"No tools configured",loadError:"Failed to load tools",enableSuccess:"Tool enabled successfully",disableSuccess:"Tool disabled successfully",toggleError:"Failed to toggle tool status",enableAll:"Enable All",disableAll:"Disable All",enableAllSuccess:"All tools enabled",disableAllSuccess:"All tools disabled",allEnabled:"All tools are already enabled",allDisabled:"All tools are already disabled",asyncExecution:"Async Execution",asyncExecutionEnabled:"Async execution enabled",asyncExecutionDisabled:"Async execution disabled",browserUnifiedMode:"Unified Browser (Beta)",browserLegacyMode:"Legacy Compatibility Mode",browserUnifiedModeButton:"New (Beta)",browserLegacyModeButton:"Legacy (Compatible)",browserUnifiedDescription:"Use the new unified browser capabilities.",browserLegacyDescription:"Use the original browser implementation for legacy behavior.",browserRestartPending:"The service will switch to {{mode}} after restart.",configure:"Configure",configured:"Configured",requiresConfig:"Requires configuration",configSaved:"Configuration saved",configSaveError:"Failed to save configuration",webSearchProviderLabel:"Provider",webSearchApiKeyLabel:"API Key (optional)",webSearchQuotaHintBefore:"Free: 100 calls/day. Register at ",webSearchQuotaHintAfter:" for 1,000/day.",active:"active",available:"Available",noEnabled:"No tools enabled",goEnableBtn:"Go enable",configureAction:"Configure →",enableAction:"Enable →"},$D={promptTitle:"LLM Model Required — Select in Chat After Configuration",promptMessage:"Chat requires an LLM model to function. Please configure a model first, then select it from the model selector at the top of the Chat page.",configureButton:"Configure Model",skipButton:"Skip",chatDisabledTitle:"Chat Disabled",chatDisabledMessage:"Chat functionality is disabled because no model is configured. Please configure a model to enable chat.",configureNow:"Configure Model",modelNotConfigured:"Please configure a model in Settings before using chat"},QD={changelog:"Changelog",docs:"Doc",tutorial:"Tutorial",featureDemos:"Feature Demos",faq:"FAQ",github:"GitHub",resources:"Documentation",updateAvailable:"Update Available"},JD={dark:"Dark",light:"Light",system:"System"},YD={fileReference:{codeSnippet_one:"Code snippet · {{count}} line",codeSnippet_other:"Code snippet · {{count}} lines"},modelSelectTooltip:"Select model",newChatTooltip:"New chat",searchTooltip:"Search all chats",chatHistoryTooltip:"Chat history",wideModeTooltip:"Wide mode",normalModeTooltip:"Normal mode",messageDisplay:{stepsRunning:"Running… · {{count}} steps",stepsCanceled:"Canceled · {{count}} steps",stepsFailed:"Failed · {{count}} steps",stepsCompleted:"Completed {{count}} steps"},allChats:"All Chats",createNewChat:"Create New Chat",pinDrawer:"Pin",unpinDrawer:"Unpin",statusIdle:"Idle",statusInProgress:"In progress",statusUnseenResult:"New result",disclaimer:"Works for you, grows with you",greeting:"Hello, how can I help you today?",description:"I am a helpful assistant that can help you with your questions.",prompt1:"Let's start a new journey!",prompt2:"Can you tell me what skills you have?",inputPlaceholder:'"↑↓" for message navigation · "/" for quick commands',longTextUploadPrompt:"Please read the uploaded prompt file and answer it.",emptyOutputError:"The assistant returned an empty response.",commands:{clear:{description:"Clear the conversation context"},compact:{description:"Compact the conversation context; optional instruction supported"},approve:{description:"Approve the pending tool action and continue execution"},deny:{description:"Deny the pending tool action"},mission:{description:"Mission mode — Decomposes tasks into sub-agents with isolated context"},skills:{description:"List chat-available skills and expose explicit skill commands"},agents:{description:"List agents available to the current runtime"},review:{description:"Review uncommitted workspace changes with Codex"},status:{description:"Show the current agent account, model, and workspace"},plan:{description:"Create a structured plan to decompose the task into subtasks"}
132,goal:{description:"Goal loop — Agent pursues a goal continuously, auto-evaluates via Rubric"}},attachments:{tooltip:"Supports documents, images, videos, audio and more formats",tooltipImageOnly:"Current model supports image upload only",tooltipNoMultimodal:"No multimodal capability detected for current model, images or videos may not be processed correctly",fileSizeLimit:"File size limit: {{limit}}MB",fileSizeExceeded:"File size exceeds {{limit}}MB limit. Current file: {{size}}MB",multimodalDisabled:"Current model does not support file upload",multimodalWarning:"No multimodal capability detected for current model, images or videos may not be processed correctly",imageOnlyAccept:"Current model only supports image files",imageOnlyWarning:"Current model only supports images, non-image files like videos may not be processed correctly"},rateLimitHit:"The current model is rate-limited. Try switching to another free model.",modelFallbackNotice:"Switched model from {{from}} to {{to}} ({{reason}}).",turnUsagePopover:{ariaLabel:"Context usage {{contextRate}}, cache hit rate {{cacheRate}}. View usage details",turn:"This turn",turnEstimated:"This turn ~",tok:"tok",inOut:"in {{inTok}} · out {{outTok}}",contextLabel:"Context window",outerRing:"Outer ring",cacheLabel:"Cache hit rate",centerValue:"Center",cacheTokens:"hit {{readTok}} / input {{inputTok}}",manageContext:"Manage context",compact:"Compact",new:"New chat"},rateLimitMessage:"Rate limit reached. Switch to another free model:",rateLimitSwitched:"Switched to {{model}}",speech:{startRecording:"Start voice recording (Ctrl+Shift+M)",stopRecording:"Stop recording (Ctrl+Shift+M)",transcribing:"Transcribing...",transcriptionDisabled:"Transcription is disabled. Configure a provider in Settings > Voice Transcription.",transcriptionFailed:"Voice transcription failed",microphoneError:"Could not access microphone",fileTooLarge:"Recording file is too large ({{size}}MB). Maximum allowed: {{limit}}MB",recordingTooLong:"Recording exceeds duration limit ({{limit}}s)"},search:{title:"Search Chat",tooltip:"Search current chat",placeholder:"Search messages...",noResults:"No results found",resultsCount:"Found {{count}} result(s)",searching:"Searching {{progress}}...",loading:"Loading...",userMessage:"User",assistantMessage:"Assistant",titleMatch:"Title"},contextMenu:{open:"Open",rename:"Rename",pin:"Pin",unpin:"Unpin",pinFailed:"Failed to update conversation pin",moveToGroup:"Move to group",delete:"Delete"},queue:{title:"Message Queue",paused:"Paused",sendFailed:"Send failed",resume:"Resume queue",pause:"Pause queue",clear:"Clear queue",dragSort:"Drag to reorder",edit:"Edit",retry:"Retry",skip:"Skip",interruptAndSend:"Interrupt & send",delete:"Delete",file:"File",noChatWarning:"Please send a message first to create a conversation before using the queue",queueFull:"Queue is full (max {{max}} items), please send or remove some messages first",otherTabOwner:"This tab queues only; sending is handled by another tab"},group:{pinned:"Pinned",today:"Today",week:"Within 7 days",month:"Within 30 days",older:"Earlier"},groups:{create:"New group",namePlaceholder:"Group name",uncategorized:"Uncategorized",cron:"Scheduled task conversations",cronShort:"Cron",cronHint:"Separate conversations created by scheduled tasks; collapsed by default and fixed near the bottom",subagents:"Conversations with subagents",subagentShort:"Subagent",subagentsHint:"Separate conversations created for child-agent tasks; collapsed by default and fixed at the bottom",pin:"Pin group",unpin:"Unpin group",pinned:"Pinned group",fixedLast:"System group fixed at the bottom",dragSessionHint:"Press and hold a conversation, then drag it to a group",moveSuccess:"Moved to “{{name}}”",moveFailed:"Could not move the conversation. Try again.",rename:"Rename",moveUp:"Move up",moveDown:"Move down",delete:"Delete group",manage:"Manage group",deleteTitle:"Delete this group?",deleteHint:"Conversations will return to their built-in group."},sessionPanel:{searchConversations:"Search conversations…",noResults:"No results",noConversations:"No conversations yet",loadingConversations:"Loading…"},conversationHistory:"Conversation History",history:{empty:"No chat history"},sessionGroup:{today:"Today",recent:"Last 7 days",earlier:"Earlier"}},XD=JSON.parse(`{"parent":"Settings","security":"Security","title":"Security","de
132scription":"Manage security features for tools and skills.","toolGuardTitle":"Tool Guard","toolGuardDescription":"Configure security scanning for tool calls. Dangerous operations will require your explicit approval before execution.","enabled":"Enable Tool Guard","enabledTooltip":"When enabled, tool calls are scanned for dangerous patterns before execution","sandboxEnabled":"Enable Sandbox Execution","sandboxEnabledTooltip":"When enabled, shell commands with no matching rule run silently inside the sandbox. When disabled, such commands run directly without the sandbox (no approval prompt). Either way, secret-file reads and dangerous commands (e.g. rm -rf /, sudo) are still blocked or require approval.","sandboxDegradedWarning":"Sandbox is configured as enabled, but QwenPaw is not running as administrator. The sandbox will be inactive for this session. To use the sandbox, restart QwenPaw with administrator privileges.","sandboxElevatedWarning":"Sandbox is running in administrator mode","sandboxElevatedDescription":"Administrator mode sandbox may trigger antivirus software interception or cause compatibility issues. If you experience unexpected blocking or crashes, try disabling the sandbox or running QwenPaw without administrator privileges.","sandboxUnelevatedWarning":"Sandbox is running in non-administrator mode","sandboxUnelevatedDescription":"Administrator mode provides more aggressive and complete sandbox isolation, but may trigger antivirus software interception or cause compatibility issues. It is recommended for advanced users only. To enable: right-click the QwenPaw shortcut → Run as administrator, or open an elevated terminal and run \`qwenpaw app\`.","denyPathsProtection":"Deny Paths Protection","denyPathsSandboxEnhancement":"This is a sandbox enhancement feature. When running without administrator privileges, the sandbox cannot fully isolate file system access. This feature uses Windows ACLs to deny access to sensitive paths, providing an additional layer of protection.","denyPathsProtectionTooltip":"When enabled, applies system-level deny ACLs on sensitive paths (e.g. ~/.ssh, ~/.aws) for the current user. WARNING: While active, ALL programs running as your user cannot access these paths — not just QwenPaw. The protection is automatically removed when QwenPaw exits or when you disable this toggle.","denyPathsActiveMessage":"Deny paths protection is active","denyPathsActiveDescription":"The following paths are currently blocked for all processes of the current user. Disable this toggle or exit QwenPaw to restore access.","guardedTools":"Guarded Tools","guardedToolsTooltip":"Tools that require approval when dangerous patterns are detected. Leave empty to use the built-in default set.","guardedToolsPlaceholder":"Select tools or type custom tool names","deniedTools":"Denied Tools","deniedToolsTooltip":"Tools that are always rejected without asking for approval","deniedToolsPlaceholder":"Select tools to always deny","saveSuccess":"Tool guard settings saved","saveFailed":"Failed to save tool guard settings","loadFailed":"Failed to load tool guard settings","rules":{"title":"Detection Rules","description":"Rules define regex patterns that trigger security alerts. Built-in rules can be disabled; custom rules can be added, edited, or deleted.","id":"Rule ID","severity":"Severity","descriptionCol":"Description","source":"Source","actions":"Actions","builtin":"Built-in","custom":"Custom","enable":"Enable","disable":"Disable","edit":"Edit","delete":"Delete","add":"Add Rule","addTitle":"Add Custom Rule","editTitle":"Edit Custom Rule","ruleId":"Rule ID","ruleIdRequired":"Rule ID is required","duplicateId":"A rule with this ID already exists","tools":"Target Tools","toolsPlaceholder":"Leave empty to match all tools","params":"Target Parameters","paramsPlaceholder":"Leave empty to match all parameters","severityLabel":"Severity","categoryLabel":"Category","patterns":"Regex Patterns","patternsRequired":"At least one pattern is required","patternsTooltip":"One regex per line. Matched against tool parameter values (case-insensitive).","excludePatterns":"Exclude Patterns","excludePatternsTooltip":"One regex per line. If any matches, the rule is skipped for that value.","descriptionLabel":"Description","descriptionPlaceholder":"What does this rule detect?","remediationLabel":"Remediation","remediationPlaceholder":"Suggested action when this rule triggers","preview":"Preview","previewTitle":"Rule Details","actionLabel":"Action","actionApproval":"Require Approval","autoDeny":"Auto Deny","autoDenyTooltip":"When enabled, tool calls matching this rule will be automatically denied without requiring manual approval","autoDenyEnable":"Enable auto deny for this rule","autoDenyDisable":"Disable auto deny for this rule","allTools":"All tools","allParam
132s":"All parameters","descriptions":{"TOOL_CMD_CONTROL_CHARS":"Command contains non-printable control characters that could bypass security checks","TOOL_CMD_DANGEROUS_MV":"Detects 'mv' command that may move or overwrite files unexpectedly","TOOL_CMD_DANGEROUS_RM":"Detects 'rm' command that may cause data loss","TOOL_CMD_DOS_FORK_BOMB":"Detects classic Bash fork bombs and mass process termination","TOOL_CMD_FIND_DELETE":"Detects 'find -delete' command that may cause data loss","TOOL_CMD_FS_DESTRUCTION":"Detects low-level disk formatting or wiping commands","TOOL_CMD_IFS_INJECTION":"Command uses $IFS variable which could bypass security validation","TOOL_CMD_JQ_FILE_FLAGS":"jq command uses flags that could read arbitrary files or execute external code","TOOL_CMD_JQ_SYSTEM":"jq command contains system() function which can execute arbitrary shell commands","TOOL_CMD_OBFUSCATED_EXEC":"Detects execution of base64 encoded strings passed directly to a shell interpreter","TOOL_CMD_PIPE_TO_SHELL":"Detects 'curl | bash' patterns used to download and immediately execute remote payloads","TOOL_CMD_PRIVILEGE_ESCALATION":"Detects privilege escalation attempts using sudo, su, doas, pkexec, or runas","TOOL_CMD_PROCESS_KILL":"Detects process termination commands that may kill critical processes","TOOL_CMD_PROC_ENVIRON":"Command accesses /proc/*/environ which could expose sensitive environment variables","TOOL_CMD_REVERSE_SHELL":"Detects attempts to establish reverse shells or unauthorized network tunnels","TOOL_CMD_SERVICE_RESTART":"Detects service management commands that can disrupt system services","TOOL_CMD_SYSTEM_REBOOT":"Detects system reboot or shutdown commands that will terminate the host system","TOOL_CMD_SYSTEM_TAMPERING":"Detects access to cron jobs, SSH keys, or sudo permissions (including reads and modifications)","TOOL_CMD_UNICODE_WHITESPACE":"Command contains Unicode whitespace characters that could cause parsing inconsistencies","TOOL_CMD_UNSAFE_PERMISSIONS":"Detects global permission downgrades (chmod 777) or setting immutable flags","TOOL_CMD_ZSH_DANGEROUS":"Command uses Zsh-specific builtins that can bypass security checks"},"categories":{"command_injection":"Command Injection","code_execution":"Code Execution","data_exfiltration":"Data Exfiltration","path_traversal":"Path Traversal","sensitive_file_access":"Sensitive File Access","network_abuse":"Network Abuse","credential_exposure":"Credential Exposure","resource_abuse":"Resource Abuse","privilege_escalation":"Privilege Escalation","prompt_injection":"Prompt Injection","other":"Other"}},"shellEvasion":{"title":"Shell Evasion Detection","description":"Configure which shell evasion and obfuscation detection checks are enabled. These checks detect techniques that attempt to hide malicious intent from simpler regex-only detection.","checks":{"command_substitution":{"name":"Command Substitution","description":"Detects $(), backticks, process substitution, and other command substitution patterns"},"obfuscated_flags":{"name":"Obfuscated Flags","description":"Detects ANSI-C quoting, locale quoting, and empty-quote flag obfuscation"},"backslash_escaped_whitespace":{"name":"Backslash Escaped Whitespace","description":"Detects backslash-escaped spaces/tabs that can alter command parsing"},"backslash_escaped_operators":{"name":"Backslash Escaped Operators","description":"Detects backslash before shell operators (;|&<>) that can hide command structure"},"newlines":{"name":"Hidden Newlines","description":"Detects newlines and carriage returns that could separate hidden commands"},"comment_quote_desync":{"name":"Comment Quote Desync","description":"Detects quote characters inside # comments that can desync quote tracking"},"quoted_newline":{"name":"Quoted Newline","description":"Detects newlines inside quoted strings followed by #-prefixed lines that can hide arguments"}}},"fileGuard":{"title":"File Guard","description":"Protect sensitive files and directories from being accessed by agent tools. Paths added here will be blocked across all tool calls.","enableLabel":"Enable File Guard","path":"Path","actions":"Actions","add":"Add","inputPlaceholder":"Enter file or directory path (e.g. ~/.ssh/ or /etc/passwd)","empty":"No custom sensitive paths configured","directory":"Directory","removeConfirm":"Remove this path from the protected list?","duplicate":"This path is already in the list","saveSuccess":"File guard settings saved","saveFailed":"Failed to save file guard settings","loadFailed":"Failed to load file guard settings","allowPreviewOutsideWorkspace":"Allow Console Preview Outside Workspace","allowPreviewOutsideWorkspaceDesc":"Allow previewing files outside the workspace directory in console. Sensitive file protection still applies."},"allowNoAuthHosts":{"title":"Allow No Auth Hosts","warningTitle":"Security Warning","warningDescription":"IP addresses in this list can access API endpoints without authentication. By default, localhost (127.0.0.1 and ::1) are allowed for CLI access. Only add trusted IP addresses. WARNING: Adding untrusted IPs poses a serious security risk.","ipAddress":"IP Address","actions":"Actions","add":"Add","inputPlaceholder":"Enter IP address (e.g., 192.168.1.100 or ::1)","empty":"No IP addresses configured","default":"Default","removeConfirm":"Remove this IP address from the whitelist?","duplicate":"This IP address is already in the list","invali
132dIP":"Invalid IP address format","saveSuccess":"Allow no auth hosts settings saved","saveFailed":"Failed to save allow no auth hosts settings","loadFailed":"Failed to load allow no auth hosts settings"},"skillScanner":{"title":"Skill Scanner","description":"Automatically scan skills for security threats before enabling or installing. Unsafe skills can be blocked or whitelisted.","mode":"Scanner Mode","modeTooltip":"Controls how the scanner handles unsafe skills: block, warn only, or disabled","modeBlock":"Block","modeWarn":"Warn Only","modeOff":"Off","timeout":"Scan Timeout (seconds)","timeoutTooltip":"Maximum time to wait for a scan to complete (5-300 seconds)","saveSuccess":"Skill scanner settings saved","saveFailed":"Failed to save skill scanner settings","scanAlerts":{"title":"Scan Alerts","empty":"No security alerts","clearAll":"Clear All","clearConfirm":"Clear all scan alerts?","skillName":"Skill","action":"Action","actionBlocked":"Blocked","actionWarned":"Warned","time":"Time","actions":"Actions","allowSkill":"Add to Whitelist","remove":"Remove","viewFindings":"View Details"},"whitelist":{"title":"Whitelist","empty":"No skills are whitelisted","skillName":"Skill","addedAt":"Added At","contentHash":"Content Hash","actions":"Actions","remove":"Remove","removeConfirm":"Remove this skill from the whitelist?","addSuccess":"Skill added to whitelist","removeSuccess":"Skill removed from whitelist","addFailed":"Failed to add skill to whitelist","removeFailed":"Failed to remove skill from whitelist","removeWillDisable":"The skill will also be disabled after removal.","removeAndDisabled":"Skill removed from whitelist and disabled"},"scanError":{"title":"Security Issues Detected","description":"The following security issues were found:","warnDescription":"Security issues were found but the skill was still enabled (warn mode):","goToWhitelist":"Go to Whitelist","moreFindings":"{{count}} more issues not shown (see Security → Skill Scanner for the full list)."}}}`),ZD=JSON.parse('{"brand":{"title":"Hub administration","subtitle":"Local workspace","controlPlane":"Control plane"},"navigation":{"workspace":"Workspace","overview":"Operations","runtimes":"Runtimes","users":"Users","credentials":"Credentials","audit":"Audit log","settings":"System settings"},"actions":{"backToQwenPaw":"Back to QwenPaw","useLightTheme":"Use light theme","useDarkTheme":"Use dark theme","signOut":"Sign out","start":"Start","stop":"Stop","disable":"Disable","rebuild":"Rebuild","enableAndStart":"Enable and start"},"roles":{"admin":"Administrator","user":"User"},"userStates":{"active":"Active","disabled":"Disabled"},"runtimeStates":{"created":"Created","starting":"Starting","running":"Running","stopped":"Stopped","failed":"Failed"},"runtimePolicies":{"owner_allowed":"Owner can restart","admin_only":"Administrator locked"},"errors":{"actionFailed":"Action failed","createFailed":"Create failed","updateFailed":"Update failed","saveFailed":"Save failed","pullTimedOut":"Timed out waiting for the image pull"},"messages":{"runtimeCreated":"Runtime created","accountCreated":"Account created","credentialStored":"Credential stored","settingsSaved":"Hub settings saved","imagePulled":"Docker image pull completed"},"validation":{"required":"This field is required","runtimeIdInvalid":"Use 1–64 letters, numbers, dots, underscores or hyphens, starting with a letter or number","passwordMin":"Password must contain at least eight characters","credentialNameInvalid":"Use an uppercase environment variable name, such as OPENAI_API_KEY"},"runtimes":{"eyebrow":"Hub administration","title":"Runtime overview","description":"Each user has a separate runtime, with files and keys kept apart.","newRuntime":"New runtime","managed":"Managed runtimes","localBoundaries":"Local process boundaries","runningNow":"Running now","needsAttention":"{{count}} runtime needs attention","healthy":"All observed states are healthy","isolationPolicy":"Isolation policy","available":"Available","unavailable":"Unavailable","failClosed":"Fail closed","noFallback":"No unsandboxed fallback","executionBlocked":"Runtime execution is blocked","isolationTitle":"Fail-closed local isolation","isolationDescription":"The entire runtime process tree is sandboxed. If the native isolation probe fails, QwenPaw refuses to start it.","unavailableTitle":"Secure runtime backend unavailable","unavailableDescription":"{{provisioner}} is unavailable: {{reason}} Check the backend installation, running status, and system configuration, then restart QwenPaw Hub.","unavailableUserDescription":"The runtime backend is temporarily unavailable. Contact an administrator.","preflightFailed":"Security preflight failed.","localEndpoint":"Local endpoint · {{endpoint}}","provisioner":"Execution type","localExecution":"Local isolation","dockerExecution":"Docker 
132container","security":"Security","tenant":"Tenant","removeTitle":"Remove {{id}}?","removeDescription":"Registration is removed; runtime data is retained.","disableTitle":"Disable {{id}}?","disableDescription":"The process will stop and the owner cannot restart it until an administrator enables it.","rebuildTitle":"Rebuild {{id}} with the current image?","rebuildDescription":"The container will be replaced using the image in system settings. Persistent workspace, secrets, and backups are retained.","emptyTitle":"No runtimes yet","emptyDescription":"Create the first isolated local QwenPaw runtime."},"users":{"eyebrow":"Identity and access","title":"User access","description":"Create local accounts, assign administrative access and revoke sessions from one place.","addAccount":"Add account","publicRegistration":"Public registration","publicRegistrationDescription":"When disabled, only administrators can create accounts.","currentAccountProtected":"Current account protected","empty":"No users match these filters"},"credentials":{"eyebrow":"Tenant-scoped vault","title":"Credentials","description":"Store provider keys inside an explicit tenant or runtime scope. Secret values are encrypted and never returned by the API.","storeCredential":"Store credential","updated":"Updated {{date}}","deleteTitle":"Delete {{name}}?","deleteDescription":"Runtimes using this credential may stop working.","emptyTitle":"Vault is empty","emptyDescription":"Store a tenant or runtime-scoped API key.","encrypted":"Encrypted at rest; plaintext cannot be read"},"overview":{"eyebrow":"Operations cockpit","title":"Hub operations overview","description":"Understand Hub health using real runtime state, host resources and audit events.","availability":"Runtime availability","availabilityDetail":"{{running}} of {{total}} runtimes are currently online","totalRuntimes":"Total runtimes","failedCount":"{{count}} runtimes need attention","totalUsers":"Hub users","managedLocally":"Local identity and access management","hostResources":"Host resources","liveSnapshot":"Current live snapshot","memory":"Memory","dataDisk":"Data disk","recentActivity":"Recent activity","auditBacked":"Backed by the persistent audit log","systemHealthy":"All systems operational","systemDegraded":"System degraded","localIsolation":"Local isolated execution"},"table":{"searchRuntimes":"Search runtimes, owners or endpoints","searchUsers":"Search usernames or user IDs","searchCredentials":"Search credential names or scopes","searchAudit":"Search actors or resources","allStates":"All states","allOwners":"All owners","allExecutions":"All execution types","allRoles":"All roles","allUserStates":"All user states","allScopes":"All scopes","allActions":"All actions","runtime":"Runtime","status":"Status","owner":"Owner","endpoint":"Endpoint","execution":"Execution","updated":"Updated","user":"User","role":"Role","created":"Created","credential":"Credential","scope":"Scope","event":"Event","actor":"Actor","resource":"Resource","result":"Result","time":"Time","total":"{{total}} items"},"audit":{"eyebrow":"Security and governance","title":"Audit log","description":"Review who performed each Hub management action, its target, result and time. Sensitive values are never audited.","empty":"No management events yet"},"settings":{"eyebrow":"Platform configuration","title":"System settings","description":"Manage the complete Hub configuration from one audited source of truth. Changes take effect immediately and persist across restarts.","save":"Save settings","meta":"Revision {{revision}} · Updated {{date}}","tabs":{"access":"Access security","runtime":"Runtimes"},"access":{"title":"Access and registration","description":"Configure the browser-reachable Hub address and public account policy.","publicBaseUrl":"Public base URL","publicBaseUrlHint":"Used for OAuth callbacks. Leave empty only for loopback-only deployments.","registration":"Public registration","registrationHint":"When disabled, only administrators can create accounts.","defaultRole":"Default registration role","defaultRoleHint":"Self-registered accounts are always ordinary users for security."},"security":{"title":"Authentication protection","description":"Limit login and registration abuse and block addresses or networks.","ipBlacklist":"IP blacklist","ipBlacklistHint":"Supports IPv4, IPv6 and CIDR; press Enter after each value.","trustedProxyIps":"Trusted reverse proxies","trustedProxyIpsHint":"X-Forwarded-For is trusted only when sent by these addresses.","loginRateLimit":"Failed login rate limit","loginRateLimitHint":"Temporarily block repeated failed sign-in attempts from one address.","registrationRateLimit":"Registration rate limit","registrationRateLimitHint":"Restrict bursts of new account creation from one address.","maxAttempts":"Maximum attempts","windowSeconds":"Window (seconds)","blockSeconds":"Block duration (seconds)"},"runtime":{"title":"Runtime policy","description":"Select the runtime backend. Existing runtimes switch on their next restart.","provisioner":"Runtime backend","localBackend":"Local process","localBackendHint":"Runs isolated processes directly on this host.","dockerBackend":"Docker 
132container","dockerBackendHint":"Runs each account in a managed container.","backendUnavailable":"Unavailable on this host","localIsolationHint":"Local mode uses host processes and does not use any Docker image settings.","dockerIsolationHint":"Docker mode applies the image and resource policy below to every account."},"docker":{"title":"Docker policy","description":"Centrally manage the image, pull behavior, and per-container resource limits. Users cannot override these settings.","unavailable":"Docker engine is unavailable","source":"Image source","dockerHub":"Official Docker Hub","aliyunAcr":"Official Alibaba Cloud registry","custom":"Custom image","customHint":"Enter any image reference allowed by policy.","customRegistry":"Custom registry or image reference","localHost":"Local image","localHostHint":"Use an image tag already present on this host.","noLocalImages":"No tagged local images found","image":"Image and tag","selectLocalImage":"Select a local image tag","selectedImage":"Effective image","repository":"Repository","localStatus":"Local status","downloaded":"Downloaded","notDownloaded":"Not downloaded","pullPolicy":"Automatic pull policy","ifNotPresent":"Pull when missing locally","always":"Pull before the first creation","never":"Use local images only","pullImage":"Pull image now","localImages":"{{count}} local image references","resources":"Container resource limits","cpuLimit":"CPU cores","memoryLimit":"Memory (MB)","pidsLimit":"Maximum processes","shmSize":"Shared memory (MB)"},"quotas":{"title":"Global runtime capacity","description":"Each tenant owns exactly one runtime; this limits concurrent runtimes across the Hub.","maxRunningRuntimes":"Maximum running runtimes","unlimitedHint":"Empty means unlimited."}},"auditActions":{"runtime":{"create":"Created runtime","start":"Started runtime","stop":"Stopped runtime","disable":"Disabled runtime","rebuild":"Rebuilt runtime","delete":"Deleted runtime"},"image":{"pull":"Pulled Docker image"},"user":{"create":"Created user","update":"Updated user"},"credential":{"store":"Stored credential","delete":"Deleted credential"},"settings":{"update":"Updated Hub settings"},"auth":{"register":"Registered Hub user"}},"auditOutcomes":{"success":"Success","failure":"Failure"},"runtimeForm":{"title":"Create runtime","hint":"The runtime starts inside the native local sandbox. Its files, secrets and process tree stay separate from other users.","runtimeId":"Runtime ID","startImmediately":"Start immediately","submit":"Create runtime"},"userForm":{"title":"Add account","hint":"Use a temporary password with at least eight characters. The user can only access runtimes owned by their personal tenant.","username":"Username","temporaryPassword":"Temporary password","role":"Role","submit":"Create account"},"credentialForm":{"title":"Store credential","hint":"Tenant scope applies to all of your runtimes. Runtime scope is a private override for one selected process.","scope":"Scope","allRuntimes":"All my runtimes","environmentName":"Environment name","secretValue":"Secret value","submit":"Encrypt and store"}}'),ex={title:"Login to QwenPaw",registerTitle:"Create Account",firstUserHint:"Create your admin account to get started",usernamePlaceholder:"Username",passwordPlaceholder:"Password",usernameRequired:"Please enter your username",passwordRequired:"Please enter your password",submit:"Login",register:"Register",returnToSignIn:"Return to sign in",createAccount:"Create an account",failed:"Login failed, please check your credentials",registerSuccess:"Registration successful",registerFailed:"Registration failed",authNotEnabled:"Authentication is not enabled",logout:"Logout",logoutSuccess:"Logged out successfully",sessionExpired:"Session expired, please login again",unauthorized:"Unauthorized, please login",switchLanguage:"Switch language",hubDisclaimerTitle:"Self-hosted Hub notice",hubDisclaimerPoint1:"Only sign in to a Hub operated by you or an organization you trust",hubDisclaimerPoint2:"Administrators may access data stored or processed by this instance",hubDisclaimerPoint3:"The sandbox may limit some QwenPaw capabilities",hubDisclaimerAccept:"I have read and agree to the User Terms",hubDisclaimerAcceptPrefix:"I have read and agree to the ",hubTerms:"User Terms",hubLinks:"QwenPaw links",officialWebsite:"Official website",hubTermsTitle:"Qwe
132nPaw Hub User Terms",hubTermsLead:"Please read these terms before using this independently operated QwenPaw Hub instance.",hubTermsSection1Title:"1. Trusted deployment",hubTermsSection1Body:"Only use a Hub deployed by you or an organization you trust. A third-party Hub is independently operated; the QwenPaw project does not verify its identity, configuration, or security.",hubTermsSection2Title:"2. Data and administrator access",hubTermsSection2Body:"The instance operator controls the server, database, backups, logs, and runtime processes. Administrators may be technically able to access conversations, uploaded files, credentials, configuration, and runtime data stored or processed by this instance.",hubTermsSection3Title:"3. Credentials and sensitive information",hubTermsSection3Body:"Only provide credentials and data necessary for your work. Do not enter secrets into an untrusted instance. Storage, retention, backup, deletion, and incident handling policies are determined by the instance operator.",hubTermsSection4Title:"4. Sandbox and capability limits",hubTermsSection4Body:"QwenPaw runs in an isolated runtime in Hub. Host permissions, devices, local applications, network access, and other integrations may be restricted, so Hub cannot guarantee the full capabilities available in a trusted local QwenPaw installation.",hubTermsSection5Title:"5. Acceptable and authorized use",hubTermsSection5Body:"Use this service only for lawful and authorized purposes. You are responsible for your instructions, uploaded content, generated output, external service usage, and compliance with the rules of the instance operator and applicable services.",hubTermsSection6Title:"6. Availability and risk",hubTermsSection6Body:"Service availability, data protection, support, and recovery are the responsibility of the instance operator. Back up important data and review generated results before relying on them. The QwenPaw project contributors are not the operator of third-party deployments.",hubTermsEnd:"By selecting “Agree and continue”, you confirm that you trust this Hub operator and understand these data, capability, and usage boundaries.",hubTermsScrollHint:"Scroll to the bottom to continue",hubTermsAgree:"Agree and continue"},tx={title:"Account",currentPassword:"Current Password",currentPasswordRequired:"Please enter your current password",newUsername:"New Username",newUsernamePlaceholder:"Leave blank to keep current",newPassword:"New Password",newPasswordPlaceholder:"Leave blank to keep current",confirmPassword:"Confirm New Password",confirmPasswordPlaceholder:"Re-enter new password",passwordMismatch:"Passwords do not match",save:"Save Changes",updateSuccess:"Account updated successfully",updateFailed:"Failed to update account",wrongPassword:"Current password is incorrect",nothingToUpdate:"Please enter a new username or password",passwordEmpty:"Password cannot be blank",usernameEmpty:"Username cannot be blank",username:"Username",passwordRequired:"Please enter a new password",hubPasswordPlaceholder:"Enter at least eight characters",runtimeTitle:"Personal runtime",runtimeDescription:"Restart your runtime if the workspace becomes unavailable. Running tasks will be interrupted, but stored data is retained.",runtimeRestartConfirmTitle:"Restart your runtime?",runtimeRestartConfirmDescription:"Running tasks will be interrupted while the runtime starts again.",runtimeRestart:"Restart runtime",runtimeRestarting:"Restarting runtime...",runtimeRestartSuccess:"Runtime restarted",runtimeRestartFailed:"Failed to restart runtime",runtimeStoppedTitle:"Your runtime is stopped",runtimeStoppedDescription:"An administrator stopped the process. Restart it when you are ready to continue.",runtimeDisabledTitle:"Your runtime is disabled",runtimeDisabledDescription:"An administrator has blocked this runtime from starting. Contact an administrator to restore access."},ax={title:"Security Approval Required",agent:"Agent",ownerAgent:"Owner Agent",executingAgent:"Executing Agent",tool:"Tool",severity:"Severity",findings:"Findings",reason:"Reason",parameters:"Parameters",approve:"Approve",deny:"Deny",source:"Source",builtinSource:"Built-in",subSession:"Sub-Agent",approved:"Tool call approved",denied:"Tool call denied",approveFailed:"Failed to approve",denyFailed:"Failed to deny",timeoutAutoDenied:"Timed out, auto denied",acknowledge:"Got it",approvePattern:"Always Allow",strictModeHint:"Always allow is unavailable in strict mode",approveExact:"Just Once",approvalScope:"Approval scope",details:"Details"},nx={title:"Plugin Manager",description:"Install, manage, and remove plugins without restarting the service.",installed:"Installed Plugins",noPlugins:"No plugins installed yet",installBtn:"Install Plugin",publishBtn:"Publish Plugin",installTitle:"Install Plugin",dropPrimary:"Drop folder or ZIP here",dropSecondary:"or click to browse a ZIP file",orFromUrl:"or from URL",installFromUrl:"Install from URL",urlPlaceholder:"https://example.com/plugin.zip",zipOnly:"Only ZIP files can be dropped as files — drag a folder for directory install",dropFailed:"Failed to read dropped folder",restartHint:"Some plugins (e.g. hooks, monkey-patches) may require an app restart to fully take effect or be removed.",installing:"Installing...",installSuccess:"Plugin installed successfully",installFailed:"Plugin installation failed",uninstall:"Uninstall",uninstallConfirm:'Uninstall plugin "{{name}}"? This cannot be undone. Some plugins may require an app restart to be fully removed.',uninstalling:"Uninstalling...",uninstallSuccess:"Plugin uninstalled successfully",uninstallFailed:"Plugin uninstallation failed",statusLoaded:"Running",statusUnloaded:"Not loaded",type:"Type",version:"Version",author:"Author",unknown:"Unknown",noMatchingPlugins:"No plugins match the current filters",loadFailed:"Failed to load plugin list",confirmTitle:"Confirm Uninstall",officialTitle:"Official Plugins",officialDesc:"Install published plugins from the download CDN.",catalogRefresh:"Refresh",catalogEmpty:"No official plugins available (CDN catalog may be empty)",catalogLoadFailed:"Failed to load official plugin catalog",catalogInstall:"Install",catalogRe
132install:"Reinstall",catalogUpgrade:"Upgrade available",catalogUpgradeBtn:"Upgrade",catalogInstalled:"Installed",catalogSha256:"SHA256",kindBundle:"Bundle",kindTool:"Tool",filterByName:"Filter by name",filterByKind:"Filter by kind",marketTitle:"Plugin Market",marketEmpty:"No plugins found in market",marketLoadFailed:"Failed to load plugin market",marketUnavailable:"Plugin Market is currently under maintenance, please try again later",marketSearch:"Search plugins...",marketAll:"All",marketFeatured:"Featured",marketTrending:"Trending",marketCategory:"Filter by category",marketSearchResult:'Found {{count}} plugins matching "{{keyword}}"',marketDetails:"Details",marketDownloads:"Downloads",marketDeveloper:"Developer",marketSortLabel:"Sort plugins",marketSortDownloads:"Most downloaded",marketSortUpdated:"Recently updated",marketSortFavorites:"Most favorited",compatWarningTitle:"Compatibility Warning",compatWarningContent:"This plugin is labeled for QwenPaw {{labels}}. Your QwenPaw version is {{version}}. Installing it may cause errors. Are you sure you want to continue?",compatWarningConfirm:"Install anyway"},ox={title:"Coding Mode",experimental:"Experimental Feature",experimentalDesc:"Coding Mode transforms QwenPaw into a lightweight Web IDE with a code editor, file tree, Git integration, and AI-powered coding assistance.",experimentalNote:"This feature is experimental and still under active development. Some functionality may be limited or change in future updates.",confirmBtn:"Confirm",enterTooltip:"Enter Coding Mode",exitTooltip:"Exit Coding Mode",btnCode:"Code",btnChat:"Chat",selectProject:"Select Project Directory",selectProjectDesc:"Choose a project to work on, or use the default workspace",tabWorkspace:"Default Workspace",tabClone:"Clone Repository",tabLocal:"Import Local Project",tabNew:"New Project",workspaceDesc:"Use the current agent's workspace directory",cloneUrl:"Git Repository URL",cloneUrlPlaceholder:"https://github.com/user/repo.git",cloneName:"Project Name (optional)",cloneNamePlaceholder:"Leave empty to infer from URL",cloneBtn:"Start Clone",cloning:"Cloning...",localPath:"Local Directory Path",localPathPlaceholder:"/Users/yourname/my-project",localPathHint:"Enter the absolute path to your local project",openBtn:"Import",newName:"Project Name",newNamePlaceholder:"my-project",createBtn:"Create Project",switchProject:"Switch Project",currentProject:"Current Project",resetToWorkspace:"Reset to Default Workspace",dropPrimary:"Drag a folder here, or click to browse",dropSecondary:"Drag from Finder or paste a path below",pathHint:"Please enter the full absolute path (starting with / or ~)",importing:"Importing...",dropFailed:"Failed to read folder",workingDir:"Working directory",importCopyNote:"The folder will be copied into QwenPaw's managed project library. Original files will not be modified.",importCopyDesc:'Import creates a copy of the folder. The Agent works on the copy and your original files stay untouched. To work directly on the original, use "Open Directory" instead.',tabOpenDir:"Open Directory",openDirDesc:"Open an existing local directory — no files will be copied",openDirBtn:"Open This Directory",openDirLoading:"Loading...",openDirEmpty:"No subdirectories here",openDirHome:"Home",openDirRefresh:"Refresh",openDirHiddenFolders:"Hidden Folders"},ix={searchPlaceholder:"Search skills across platforms",categoryAll:"All",categoryPlaceholder:"Search category",searchResult:'Found {{count}} skills matching "{{keyword}}"',providerUnavailable:"Provider unavailable",noResults:"No results",startTyping:"Type a query above to search the market",browseHint:"Pick a category or enter a keyword to browse skills in {{providers}}",noDescription:"No description provided",browseMarket:"Browse Market",installQueue:"Install queue",clearCompleted:"Clear",retry:"Retry",status:{queued:"Queued",installing:"Installing",completed:"Done",failed:"Failed",cancelled:"Cancelled"}
132,loadMore:"Load more",noMoreResults:"No more results",detail:{title:"Skill details",version:"Version",author:"Author",sourceUrl:"Install URL",slug:"Slug",missing:"—"},stats:{downloads:"Downloads",stars:"Stars",installs:"Installs",likes:"Likes",views:"Views",category:"Category",updatedAt:"Updated"},queueMsg:{timedOut:"Install timed out",failedPrefix:"Failed: {{msg}}"}},sx={starting:"Starting backend...",checking:"Connecting to backend...",error:"Backend failed to start.",errorHint:"The backend process could not be launched. Check application logs for details.",errorDetails:"Show error details",timeout:"Backend failed to start within {{seconds}} seconds.",timeoutHint:"Backend failed to start. Please retry, or check application logs for details.",retry:"Retry"},rx={readFile:"Read {{file}}",readFileDefault:"Read file",writeFile:"Create {{file}}",writeFileDefault:"Create file",editFile:"Edit {{file}}",editFileDefault:"Edit file",appendFile:"Append {{file}}",appendFileDefault:"Append file",grepSearch:"Grep {{pattern}}",grepSearchDefault:"Grep search",globSearch:"Glob {{pattern}}",globSearchDefault:"Glob search",viewImage:"View image {{file}}",viewImageDefault:"View image",viewVideo:"View video {{file}}",viewVideoDefault:"View video",desktopScreenshot:"Screenshot desktop",sendFile:"Send {{file}}",sendFileDefault:"Send file",browserUse:"Browse {{detail}}",browserNavigate:"Browse open {{url}}",browserNavigateDefault:"Browse open page",browserClick:"Browse click",browserType:"Browse type",browserSnapshot:"Browse snapshot",browserScroll:"Browse scroll",getCurrentTime:"Get current time",setTimezone:"Set {{timezone}}",getTokenUsage:"Query token usage",memorySearch:"Search memory {{query}}",memorySearchDefault:"Search memory",listAgents:"List agents",chatWithAgent:"Chat {{agent}}",chatWithAgentDefault:"Chat agent",submitToAgent:"Submit {{agent}}{{task}}",submitToAgentDefault:"Submit task",checkAgentTask:"Check {{agent}} #{{taskId}}",checkAgentTaskAgent:"Check {{agent}}",checkAgentTaskDefault:"Check task",delegateExternalAgent:"Delegate {{runner}}",delegateExternalAgentDefault:"Delegate external agent",shell:"Run {{command}}",shellDefault:"Run command",runToolBatch:"Run workflow {{workflow}}",runToolBatchRunning:"Running saved workflow",runToolBatchProgress:"{{count}} steps",runToolBatchStepCount:"Total steps: {{count}}",formatTable:{file:"File",lineNumber:"Line",score:"Score",summary:"Summary",name:"Name",id:"ID",description:"Description",status:"Status"},loading:"Loading...",rawInputPreview:"Live raw input (last 4,096 characters)",largeOutputOmitted:"{{count}} lines omitted — copy the available output or follow its recovery instructions",largeOutputTruncated:"Output truncated for display — copy the available output or follow its recovery instructions",browserAction:{startHeaded:"Start browser (headed)",start:"Start browser",stop:"Stop browser",open:"Open {{url}}",openDefault:"Open page",navigate:"Navigate {{url}}",navigateDefault:"Navigate",navigateBack:"Go back",click:"Click {{selector}}",clickDefault:"Click element",type:"Type {{text}}",typeDefault:"Type text",snapshot:"Get snapshot",screenshot:"Screenshot {{path}}",screenshotDefault:"Screenshot",eval:"Eval {{code}}",evalDefault:"Evaluate code",runCode:"Run {{code}}",runCodeDefault:"Run code",closePage:"Close page",tabs:"Tabs {{action}}",tabsDefault:"Manage tabs",fillForm:"Fill form",fileUpload:"Upload {{filename}}",fileUploadDefault:"Upload file",fileDownload:"Download {{target}}",fileDownloadDefault:"Download file",pressKey:"Press {{key}}",pressKeyDefault:"Press key",hover:"Hover {{selector}}",hoverDefault:"Hover element",drag:"Drag",selectOption:"Select option",waitFor:"Wait for {{target}}",waitForDefault:"Wait for element",resize:"Resize {{w}}x{{h}}",resizeDefault:"Resize window",pdf:"Export PDF {{path}}",pdfDefault:"Export PDF",install:"Install",batch:"Batch"},lineBadge:{lines:"{{count}} lines",addLines:"+{{count}} lines",delLines:"-{{count}} lines",matches:"{{count}} matches",files:"{{count}} files"},inlineResult:{taskId:"Task #{{id}}",submitted:"Submitted"},execute:"Run {{tool}}",executeDefault:"Run tool",control:{title:"Tool running — offload to background?",offload:"Move to background",keep:"Keep Foreground",extendOffload:"Delay Offload",extendKill:"Extend timeout",cancel:"Cancel",autoAction:"{{seconds}}s until default action: ",noCountdown:"No countdown · Default: ",policyOffload:"Offload",policyKeep:"Keep Foreground",manage:"Manage",offloadMode:{title:"Tool running longer — about to offload",offloadNow:"Move to background now",preventOffload:"Don't auto-offload",delayOffload:"Delay offload",countdownCaption:"until auto-offload",footerNoCountdown:"No countdown · Default: offload",ringAria:"{{seconds}}s until auto-offload",toastAuto:"Moved to background automatically",preventedTitle:"Auto-offload disabled",preventedFooter:"Won't auto-offload; you can move to background or cancel"},keepMode:{title:"Tool still running in foreground",offload:"Move to background",countdownCaption:"until panel closes",footerNoCountdown:"Stays in foreground by default; you can move to background anytime",ringAria:"Panel closes in {{seconds}}s",toastDismiss:"Reminder closed; tool keeps running in foreground"},toast:{offloaded:"Tool moved to background",keepWaiting:"Continuing to wait…",extended:"Offload delayed; will remind you in +30s",killExtended:"Timeout extended by 30s",cancelled:"Tool call cancelled",cancelFailed:"Failed to cancel tool",actionFailed:"Action failed. The tool may have finished or the request was rejected.",notFound:"Tool call not found (it may have already finished).",conflict:"Action rejected (tool state changed or limit reached).",networkError:"Network error. Check your connection and try again.",bgComplete:"Backgroun
132d tool complete: {{tool}}",bgCancelled:"Background tool cancelled: {{tool}}"},hint:{completed:"Tool {{tool}} completed in background",cancelled:"Tool {{tool}} cancelled"},bgQueue:{title:"Background tasks",running:"Running",done:"Done",doneLabel:"Task completed",cancelled:"Cancelled",totalDuration:"Total",cancel:"Cancel",remove:"Remove",cancelAll:"Cancel all",clearAll:"Clear completed",cancelAllDone:"Cancelled all running tasks",clearAllDone:"Cleared completed tasks",showFinished:"Show completed",emptyRunning:"No running tasks",emptyHiddenFinished:"{{count}} completed (hidden)",scrollMore:"Scroll to view more",noOutput:"No output yet"}}},lx={error:{SENSITIVE_FILE_BLOCKED:"This file is blocked by File Guard (sensitive file protection).",OUTSIDE_WORKSPACE:'This file is outside the workspace scope. Enable "Allow Console Preview Outside Workspace" in Settings → Security → File Guard.',FORBIDDEN:"Access denied: insufficient permissions to preview this file.",NOT_FOUND:"File not found. It may have been moved or deleted. If a relative path was used, please try using an absolute path instead.",LOAD_FAILED:"Failed to load file preview.",LOAD_FAILED_DETAIL:"Failed to load file preview: {{detail}}"}},dx={budget:{low:"Low",medium:"Med",high:"High"},status:{pause:"Pause",resume:"Resume",stop:"Stop"},gotoSettings:"Agent Loop Settings",selectorTitle:"Loop mode",selectorHint:"Choose how the agent should continue",selectorAria:"Select loop mode",builtInModes:"Built-in",customModes:"Custom and plugins",starting:"Starting",running:"Running",awaiting_user:"Waiting for your reply",activePersistentDescription:"This mode remains active for the conversation until it finishes or you start over.",activeCustomDescription:"This custom mode remains active until you use /mode off, /clear, or /new.",loadError:"Some loop modes could not be loaded.",retry:"Retry",modes:{default:{name:"Default",description:"The standard guarded agent loop."},goal:{name:"Goal",description:"Work persistently toward a concrete, verifiable goal."},mission:{name:"Mission",description:"Run a structured, persistent multi-step task."}}},cx={common:fD,desktop:bD,chunkError:kD,appCenter:yD,harnesses:vD,nav:TD,os:SD,sidebar:CD,debug:wD,inbox:PD,acp:AD,voiceTranscription:MD,backup:DD,checkpoints:xD,workspace:RD,agent:ID,skills:_D,skillPool:LD,mcp:ED,heartbeat:FD,cronJobs:OD,channels:BD,sessions:ND,environments:HD,modelSelector:UD,tokenUsage:qD,agentStats:jD,models:GD,files:VD,projectDirectory:WD,agentConfig:zD,tools:KD,modelConfig:$D,header:QD,theme:JD,chat:YD,security:XD,hub:ZD,login:ex,account:tx,approval:ax,pluginManager:nx,codingMode:ox,market:ix,startup:sx,tool:rx,preview:lx,loop:dx},ux={save:"Сохранить",reset:"Сбросить",cancel:"Отмена",confirm:"Подтвердить",apply:"Применить",delete:"Удалить",edit:"Редактировать",create:"Создать",upload:"Загрузить",download:"Скачать",refresh:"Обновить",retry:"Повторить",search:"Поиск",enable:"Включить",disable:"Отключить",enabled:"Включено",disabled:"Отключено",preview:"Предпросмотр",raw:"Исходник",view:"Просмотр",content:"Содержимое",loading:"Загрузка...",saving:"Сохранение...",copy:"Копировать",copied:"Скопировано в буфер обмена",copyFailed:"Не удалось скопировать в буфер обмена",contentPlaceholder:"Введите содержимое...",help:"Справка",close:"Закрыть",actions:"Действия",total:"Всего {{count}}",clear:"Очистить",paste:"Вставить"},px={connected:"Подключено",disconnected:"Отключено",notConnected:"Не подключено",comingSoon:"Скоро",connect:"Подключить через ChatGPT",disconnect:"Отключить",apiKeyAuthenticated:"Аутентификация по API-ключу",chatGptAuthenticated:"Подключено к ChatGPT",cliAuthenticated:"{{type}} CLI аутентифицирован"},mx={closeWindow:{title:"Закрыть окно",description:"Что сделать при закрытии окна? Выход из приложения остановит все выполняющиеся задачи и запланированные задания.",remember:"Запомнить мой выбор",showWindow:"Показать окно",minimizeToTray:"Свернуть в трей",quitApp:"Выйти из приложения",preference:"Закрытие окна",askEveryTime:"Спрашивать каждый раз"}},hx={title:"Не удалось загрузить страницу",subTitle:"Возможно, это вызвано проблемой сети или обновлением приложения.",genericTitle:"Что-то пошло Ð
132½Ðµ так",genericSubTitle:"При отображении этой страницы произошла непредвиденная ошибка.",reload:"Перезагрузить"},gx={backToList:"Назад",subtitle:"Управляйте установленными приложениями или расширяйте рабочее пространство с помощью магазина приложений.",myApps:"Мои приложения",officialApps:"Официальные приложения",appMarket:"Магазин приложений",browseOfficialApps:"Открыть официальные приложения",browseMarket:"Открыть магазин приложений",officialAppsEmpty:"Официальных приложений пока нет",searchOfficial:"Поиск официальных приложений...",installedCount:"Приложений: {{count}}",clearFilters:"Сбросить фильтры",moreActions:"Другие действия",openApp:"Открыть приложение",noDescription:"Нет описания",search:"Поиск приложений...",allCategories:"Все",noApps:"Нет установленных приложений",noResults:"Нет приложений, соответствующих запросу",loadFailed:"Не удалось загрузить приложения. Повторите попытку.",appNotLoaded:"Это приложение ещё не загружено. Откройте его один раз с боковой панели и повторите попытку.",uninstall:"Удалить",uninstallConfirmTitle:"Удалить приложение?",uninstallConfirmContent:"Каталог приложения «{{name}}» будет удалён. Это действие нельзя отменить.",uninstallSuccess:"Приложение удалено",uninstallFailed:"Не удалось удалить приложение",installing:"Установка",installSuccess:"Установлено",installFailed:"Не удалось установить",installedStatus:"Установлено",update:"Обновить",searchMarket:"Поиск в магазине приложений...",marketFilters:"Фильтры магазина приложений",filterAll:"Все",trending:"Популярные",marketEmpty:"Приложения не найдены",loadMore:"Загрузить ещё",noMoreApps:"Больше приложений нет",install:"Установить",details:"Подробнее",featured:"Рекомендуемое",refreshApp:"Обновить приложение",appRefreshed:"Приложение обновлено",aboutApp:"О приложении",exitApp:"Выйти из приложения",moreOptions:"Дополнительные параметры",backToListHint:"Назад к списку приложений (ESC)",version:"Версия",id:"ID",category:"Категория",description:"Описание"},fx={chat:"Чат",files:"Файлы",control:"Управление",channels:"Каналы",sessions:"Сессии",cronJobs:"Cron-задачи",heartbeat:"Пульс",agent:"Рабочая область",workspace:"Файлы",skills:"Навыки",skillPool:"Пул навыков",marketplace:"Расширения",tools:"Инструменты",mcp:"MCP",agentConfig:"Конфигурация",settings:"Настройки",models:"Модели",environments:"Окружения",security:"Безопасность",tokenUsage:"Использование токенов",agentStats:"Статистика агента",voiceTranscription:"Транскрипция голоса",agents:"Управление агентами",debug:"Отладка",plugins:"Плагины",acp:"ACP",backups:"Резервные копии",pluginManager:"Менеджер плагинов"},bx={console:"Консоль",appStore:"App Store",appStoreDesc:"Установка и удаление настольных приложений",arrangeDesktop:"Упорядочить рабочий стол",approvalActionFailed:"Не удалось выполнить действие, повторите попытку",booting:"Запуск…",changeWallpaper:"Сменить обои",clearAll:"Очистить все",closeApp:"Закрыть",currentSpace:"Текущее пространство",currentSpaceLabel:"Текущее пространство: {{name}}",currentAppLabel:"Текущее приложение: {{name}}",desktopApps:"Настольные приложения",finder:"Рабочий стол",focusApp:"Фокус",install:"Установить",installed:"установлено",installedApp:"Установлено",installedApps:"Установленные приложения",launchpad:"Launchpad",moveDockLeft:"Переместить влево",moveDockRight:"Переместить вправо",missionControl:"Mission Control",noInstalledApps:"Нет установленных приложений",noNotifications:"Нет уведомлений",noOpenWindows:"В этом пространстве нет открытых окон",noSettings:"Нет доступных настроек",notInstalled:"не установлено",notifications:"Уведомления",notificationSummary:"Одобрения {{approvals}} · Входящие {{inbox}}",notifyApproval:"Одобрение",notifyInbox:"Входящие",openApp:"Открыть",keepInDock:"Закрепить в Dock",removeFromDock:"Удалить из Dock",refreshDesktop:"Обновить рабочий стол",appMarket:"МагаÐ
132·Ð¸Ð½ приложений",appMarketRefresh:"Обновить",appMarketSearch:"Поиск приложений...",appMarketEmpty:"Приложения не найдены",appMarketUnavailable:"Магазин приложений сейчас недоступен. Повторите попытку позже.",appMarketInstall:"Установить",appMarketDetails:"Подробнее",appMarketDeveloper:"Разработчик",appMarketDownloads:"Загрузки",appInstalled:"Приложение успешно установлено",appInstallFailed:"Не удалось установить приложение",appCompatibilityWarningTitle:"Предупреждение о совместимости приложения",appCompatibilityWarningContent:"Приложение предназначено для QwenPaw {{labels}}, а текущая версия QwenPaw — {{version}}. После установки возможны ошибки. Продолжить?",appCompatibilityWarningConfirm:"Всё равно установить",appCompatibilityUnverified:"Совместимость с текущей версией QwenPaw не подтверждена.",restoreAll:"Восстановить все",returnToConsole:"Вернуться в консоль",desktopMode:"Режим рабочего стола",qwenpawMenu:"Меню QwenPaw",restoredAll:"Все приложения восстановлены",sortBy:"Сортировать по",sortFree:"Свободное расположение",sortName:"Имя",sortType:"Тип",systemSettings:"Системные настройки",uninstall:"Удалить",uninstallConfirmTitle:"Удалить приложение?",uninstallFailed:"Не удалось удалить",uninstalledApp:"Удалено",update:"Обновить",wallpaper:"Обои",windows:"окон"},kx={title:"Отладка",desc:"Просмотр файла логов backend-демона для диагностики. Пока открыта эта страница, логи обновляются автоматически.",level:{all:"Все"},backend:{title:"Backend-логи",autoRefresh:"Автообновление",newestFirst:"Сначала новые",updatedAt:"Обновлено",path:"Файл лога",notFound:"Файл backend-логов пока не найден.",placeholder:"Здесь появится вывод backend-логов.",loadFailed:"Не удалось загрузить backend-логи",searchPlaceholder:"Поиск по backend-логам..."},actions:{refreshBackend:"Обновить backend-логи",refreshSuccess:"Логи обновлены",copyBackend:"Копировать backend-логи"}},yx=JSON.parse('{"parent":"Настройки","agents":"Агенты","management":"Управление агентами","pageDescription":"Создавайте, настраивайте и управляйте несколькими AI-агентами с пользовательскими рабочими пространствами и идентичностями.","name":"Название","id":"ID","description":"Описание","workspace":"Путь к рабочему пространству","backend":{"column":"Бэкенд","eyebrow":"Архитектура агента","typeTitle":"Выберите, как работает этот агент","typeDescription":"Тип агента определяет работу всех диалогов в Chat, Coding и Channel.","nativeTitle":"Нативный агент QwenPaw","nativeBadge":"Нативный","nativeDescription":"Использует настроенные LLM, Skills, инструменты, память и среду выполнения QwenPaw.","thirdPartyTitle":"Сторонний агент","thirdPartyBadge":"Сторонний","thirdPartyDescription":"Использует авторизованную внешнюю среду агента вместо модели QwenPaw.","providerTitle":"Выберите стороннего агента","providerDescription":"Авторизация общая для этого устройства; проекты и диалоги изолированы для каждого агента.","codexHint":"ChatGPT OAuth · Рабочая область агента","qoderHint":"Учётная запись Qoder или PAT · Рабочая область агента","account":"Учётная запись Codex","qoderAccount":"Учётная запись Qoder","binary":"Исполняемый файл Codex","binaryHelp":"Оставьте поле пустым, чтобы использовать Codex CLI из Python SDK или найти отдельную установку. При ручной настройке укажите полный путь к codex в macOS/Linux или codex.exe в Windows. Встроенные бинарные файлы приложения ChatGPT и расширений редактора не поддерживаются. QwenPaw также читает CODEX_BINARY и PATH бэкенда.","binaryPlaceholder":"Автоопределение или путь к исполняемому файлу Codex","qoderBinary":"Исполняемый файл Qoder","qoderBinaryHelp":"Оставьте поле пустым, чтобы использовать qodercli из Python SDK или найти установленную версию. При ручной настройке укажите полный путь к qodercli в macOS/Linux или qodercli.exe в Windows. QwenPaw также читает QODERCLI_PATH и PATH бэкенда.","qoderBinaryPlaceholder":"Автоопределение или путь к qodercli","detect":"Проверить","detectedBinary":"Codex обнаружен","qoderDetectedBinary":"Qoder обнаружен","apiKeyLoginHint":"Также можно выполнить аутентификацию в терминале: codex login --with-api-key","qoderAuthHint":"Подключение откроет вход Qoder в браузере. Также можно выполнить qodercli login или задать QODER_PERSONAL_ACCESS_TOKEN перед запуском бэкенда.","qoderConnect":"Подключить Qoder","model":"Модель агента","modelDefault":"Использовать модель агента по умолчанию","defaultBadge":"По умолчанию","reasoningEffort":"Уровень рассуждения","reasoningDefault":"Использовать значение модели по умолчанию","codexNotFound":"Среда выполнения Codex не найдена. Установите qwenpaw[codex] или укажите отдельный Codex CLI.","qoderNotFound":"Среда выполнения Qoder не найдена. Установите qwenpaw[qoder] или укажите qodercli.","chatSettingsHint":"Выберите модель, уровень рассуждения и разрешения на выполнение на панели Chat.","capabilityTitle":"Возможности QwenPaw","inheritedSkills":"Навыки","inheritedMcp":"Серверы MCP","runtimeInherited":"Наследуются при запуске · новые сеансы","notSupported":"Не поддерживается провайдером","policyCompatibility":"Политика MCP","toolAllowlistSupported":"Список разрешённых инструментов","policyLimited":"Действуют ограничения провайдера","chatModelHint":"Настройки агента · применяются со следующего хода","appliesNextTurn":"Применяется со следующего хода","approvalMode":"Разрешения на выполнение","approvalPresets":{"ask":{"name":"Спрашивать перед изменениями","description":"Разрешает изменения рабочей области и запрашивает подтверждение перед действиями с повышенными правами."},"read-only":{"name":"Только чтение","description":"Проверяет файлы без изменений."},"workspace":{"name":"Доступ к рабочей области","description":"Разрешает изменения рабочей области без подтверждения."},"accept-edits":{"name":"Разрешать правки","description":"Разрешает правки файлов, сохраняя остальные проверки."},"plan":{"name":"Только план","description":"Анализирует и планирует без изменения файлов."},"auto":{"name":"Автоматически","description":"Qoder сам определяет безопасные действия."}
132,"full-access":{"name":"Полный доступ","description":"Разрешает неограниченное локальное выполнение без подтверждения."}}},"create":"Создать агента","createTitle":"Создать нового агента","createSuccess":"Агент успешно создан","createFailed":"Не удалось создать агента","edit":"Редактировать","editTitle":"Редактировать агента - {{name}}","updateSuccess":"Агент успешно обновлён","updateFailed":"Не удалось обновить агента","delete":"Удалить","deleteConfirm":"Подтвердить удаление агента","deleteConfirmDesc":"После удаления агент станет недоступен, но файлы рабочего пространства будут сохранены","deleteSuccess":"Агент успешно удалён","deleteFailed":"Не удалось удалить агента","selectAgent":"Выбрать агента","defaultDisplayName":"Агент по умолчанию","currentWorkspace":"Текущий агент","switchSuccess":"Агент успешно переключён","switchFailed":"Не удалось переключить агента","loadFailed":"Не удалось загрузить список агентов","loadConfigFailed":"Не удалось загрузить конфигурацию агента","saveFailed":"Не удалось сохранить агента","idRequired":"Пожалуйста, введите ID агента","idLabel":"ID агента (необязательно)","idHelp":"Оставьте пустым для автогенерации. Допускаются только буквы, цифры, дефисы и подчёркивания.","idPattern":"ID может содержать только буквы, цифры, подчёркивания и дефисы","idPlaceholder":"например: my-agent","nameRequired":"Пожалуйста, введите название агента","namePlaceholder":"например: Мой агент","descriptionPlaceholder":"Кратко опишите назначение этого агента...","workspaceHelp":"Оставьте пустым для автоматического создания в ~/.qwenpaw/workspaces/<id>","dragHandleTooltip":"Перетащите, чтобы изменить порядок агентов","reorderSuccess":"Порядок агентов сохранён","reorderFailed":"Не удалось сохранить порядок агентов","defaultNotEditable":"Агент по умолчанию не может быть отредактирован","defaultNotDeletable":"Агент по умолчанию не может быть удалён","disable":"Отключить","enable":"Включить","disabled":"Отключён","disableConfirm":"Подтвердить отключение агента","disableConfirmDesc":"После отключения экземпляр агента не будет запущен, но останется видимым в списке","enableConfirm":"Подтвердить включение агента","enableConfirmDesc":"После включения агент будет доступен для переключения","disableSuccess":"Агент успешно отключён","enableSuccess":"Агент успешно включён","toggleFailed":"Не удалось переключить состояние агента","enableAgent":"Включить {{name}}","disableAgent":"Отключить {{name}}","disabledAgents":"Отключённые ({{count}})","pinnedAgents":"Закреплённые","otherAgents":"Другие агенты","pinned":"Закреплён","defaultPinned":"Агент по умолчанию всегда закреплён","longPressToPin":"Удерживайте для закрепления","longPressToUnpin":"Удерживайте для открепления","pinAgent":"Закрепить агента","unpinAgent":"Открепить агента","pinSuccess":"Агент закреплён","unpinSuccess":"Агент откреплён","pinFailed":"Не удалось изменить закрепление","status":{"disabled":"Отключён","pending":"Ожидает запуска","starting":"Запускается","running":"Работает","failed":"Ошибка запуска","waitUntilStarted":"Доступно после завершения запуска"},"defaultNotDisablable":"Агент по умолчанию нельзя отключить","currentAgentDeleted":"Текущий агент был удалён, автоматически переключено на агента по умолчанию","currentAgentDisabled":"Текущий агент был отключён, автоматически переключено на агента по умолчанию","switchedToDefault":"Автоматически переключено на агента по умолчанию","cannotSwitchToDisabled":"Этот агент отключён, пожалуйста, сначала включите его Ð
132½Ð° странице управления","model":"Модель","modelHelp":"Назначьте конкретную LLM-модель этому агенту. Оставьте пустым для использования глобальной модели по умолчанию.","modelPlaceholder":"Глобальная по умолчанию","noConfiguredModels":"Нет настроенных моделей","modelColumn":"Модель","initialSkills":"Начальные навыки","initialSkillsHelp":"Выберите навыки для добавления из пула. Позже можно добавить или удалить навыки.","selectAll":"Все","selectBuiltin":"Встроенные","selectNone":"Очистить","noPoolSkills":"В пуле нет доступных навыков","addSkillsToAgent":"Добавить навыки","copyTooltip":"Копировать конфигурацию агента","copyDefaultTooltip":"Копировать, используя агента по умолчанию как шаблон","copyTitle":"Копировать конфигурацию агента","copyNameLabel":"Имя нового агента","copyOptionsLabel":"Что копировать","copyOptionAgentJson":"agent.json (обязательно)","copyOptionAgentJsonHint":"Всегда копирует разобранную исходную конфигурацию и сбрасывает ID, имя, workspace и channels. Это не побайтовая копия agent.json на диске.","copyOptionMdFiles":"AGENTS / SOUL / PROFILE / HEARTBEAT / BOOTSTRAP.md","copyOptionSkills":"skills/ + manifest","copyOptionJobs":"jobs.json","copyOptionJobsHint":"Копирует только определения заданий, без истории. Новый агент начнёт выполнять их по расписанию сразу после создания.","copySuccess":"Конфигурация агента успешно скопирована","copyFailed":"Не удалось скопировать конфигурацию агента","mailManagement":"Управление почтой","mailModeNone":"Без управления почтой","mailModePersonal":"Управлять личным почтовым ящиком","mailModeDedicated":"Выделенный почтовый ящик для агента","mailName":"Имя почтового ящика","mailNameOptional":"Имя почтового ящика (необязательно)","mailDomain":"Почтовый домен","mailPassword":"Пароль","mailPhone":"Номер телефона","mailAuthCode":"16-значный код авторизации","mailNameRequired":"Введите имя почтового ящика","mailPasswordRequired":"Введите пароль","mailPhoneRequired":"Введите номер телефона","mailAuthCodeRequired":"Введите код авторизации","mailAuthCodeLength":"Код авторизации должен состоять из 16 символов","mailDomainRequired":"Выберите почтовый домен","mailDomainInvalid":"Введите корректный почтовый домен, например mycompany.com","mailDomainPlaceholder":"Выберите или введите почтовый домен","mailProvider":"Почтовый провайдер","mailProviderRequired":"Выберите почтового провайдера","mailProviderPlaceholder":"Выберите провайдера, обслуживающего этот домен","mailProviderTencentExmail":"Tencent Exmail","mailProviderAliyunQiye":"Alibaba Enterprise Mail","mailProviderNeteaseQiye":"Netease Enterprise Mail","mailCredentialLabel":"Учетные данные","mailCredentialRequired":"Введите учетные данные","mailCredentialHintAuthCode":"Введите 16-значный код авторизации, созданный в настройках почтового ящика","mailCredentialHintGmail":"Введите пароль приложения Gmail (требуется включенная двухэтапная аутентификация)","mailCredentialHintAliyun":"Введите пароль для входа в почтовый ящик","mailCredentialHintEnterprise":"Введите клиентский пароль или пароль для входа в почтовый ящик","mailPushTitle":"Автоответ на новые письма","mailAccessControl":"Контроль доступа к почте","mailAccessControlTip":"При включении письма от неизвестных отправителей требуют одобрения перед обработкой","mailPushModeOff":"Выключено","mailPushModeRulesOnly":"Только правила","mailPushModeRulesThenAgent":"Правила + пробуждение по необходимости","mailPushModeAgentAll":"Пробуждать для каждого письма","mailPushModeOffDesc":"Не обрабатывать новые письма автоматически","mailPushModeRulesOnlyDesc":"Обрабатывать новые письма только по правилам ниже, без пробуждения агента","mailPushModeRulesThenAgentDesc":"Сначала применять правила; пробуждать агента только при срабатывании действия пробуждения","mailPushModeAgentAllDesc":"Пробуждать агента для каждого нового письма и позволять ему самостоятельно решать, как его обработать","mailPushModeLegacySuffix":" (устаревший)","mailPushFieldFrom":"Отправитель","mailPushFieldSubject":"Тема","mailPushFieldContent":"Содержимое","mailPushFieldKeyword":"Ключевое слово","mailPushActionMarkRead":"Отметить прочитанным","mailPushActionMove":"Переместить в папку","mailPushActionNotify":"Только уведомить","mailPushActionWakeAgent":"Разбудить агента","mailPushContainsPlaceholder":"Содержит текст","mailPushParamMovePlaceholder":"Целевая папка","mailPushParamWakePlaceholder":"Доп. инструкция (необязательно)","mailPushParamRequired":"Укажите целевую папку","mailPushAddRule":"Добавить правило","mailPushWakeOptionInvoice":"Скачать и архивировать вложения счетов и квитанций","mailPushWakeOptionReply":"Вежливо ответить на письма с вопросами","mailPushWakeOptionOtp":"Извлечь код подтверждения и уведомить меня","mailPushWakeOptionSummary":"Кратко изложить письмо во входящие"}'),vx={nav:"Контрольные точки",title:"Контрольные точки состояния",auto:"Автоматически",autoEnabled:"Автоматические точки включены",autoDisabled:"Автоматические точки выключены",refresh:"Обновить",
132snapshot:"Снимок",snapshotCreated:"Снимок создан",graph:"Граф",checkpoint:"Контрольная точка",type:"Тип",commit:"Коммит",createdAt:"Создано",session:"Сеанс",channel:"Канал",parent:"Родитель",details:"Сведения",search:"Поиск по запросу, имени, сеансу или SHA",allTypes:"Все типы",allSessions:"Все сеансы",showingLatest:"Показано последних: {{count}}",loadFailed:"Не удалось загрузить контрольные точки",retry:"Повторить",more:"Другие действия",noMatches:"Нет точек, соответствующих фильтрам.",empty:"Контрольных точек пока нет. История версий появится здесь.",kind:{auto:"Авто",snapshot:"Снимок",safety:"Защитная",commit:"Коммит"},summary:{total:"точек"},snapshotDialog:{title:"Создать снимок",session:"Сеанс",name:"Имя",placeholder:"Необязательное имя"},gc:{settingsAction:"Настройки автоочистки",settingsTitle:"Настройки автоочистки",keepCount:"Количество автоматических точек",keepDays:"Хранение автоматических точек (дни)",preRestoreDays:"Хранение снимков перед восстановлением (дни)",settingsSaved:"Настройки автоочистки сохранены",thoroughAction:"Полное сжатие контрольных точек",thoroughTitle:"Полностью сжать контрольные точки?",thoroughDescription:"Удаляет контрольные точки ({{count}}), игнорируя хранение автоматических точек. HEAD каждого сеанса сохраняется.",thoroughConfirm:"Полностью сжать",thoroughSuccess:"При полном сжатии удалено контрольных точек: {{count}}",action:"Очистить точки",title:"Очистить точки согласно политике хранения?",description:"Удаляет просроченные контрольные точки ({{count}}) согласно текущей политике хранения. HEAD каждого сеанса сохраняется.",confirm:"Очистить",success:"Удалено: {{count}}"},reset:{action:"Сбросить данные",title:"Сбросить все данные?",description:"Все точки будут удалены навсегда, автоматическое создание будет отключено.",confirm:"Сбросить",success:"Данные сброшены"},restore:{action:"Восстановить",title:"Восстановить контрольную точку",preview:"Предпросмотр",confirm:"Восстановить",conversation:"Диалог",memory:"Память",files:"Файлы рабочей области",refreshWarning:"Диалог изменится. После восстановления обновите его.",selectedCount:"Выбрано файлов: {{count}}",selectAll:"Выбрать все изменённые файлы",delete:"Удалить",restore:"Восстановить",noFileChanges:"Изменения файлов не требуются.",success:"Точка восстановлена. Обновите диалог, чтобы загрузить состояние."}},Tx={title:"Файлы",workspacePath:"Рабочее пространство:",noFiles:"Нет файлов",coreFiles:"Основные файлы",coreFilesDesc:"Базовые файлы с описанием персоны, идентичности и инструкций по инструментам.",uploadTooltip:"Только ZIP-файлы",uploadTooltipWithLimit:"Только ZIP-файлы, максимум {{limit}} МБ",selectFile:"Выберите файл для редактирования",fileContent:"Содержимое файла...",uploadSuccess:"Файл успешно загружен",uploadFailed:"Не удалось загрузить файл",downloadPreparing:"Подготовка к скачиванию рабочего пространства...",downloadSuccess:"Рабочее пространство успешно скачано",downloadFailed:"Не удалось скачать рабочее пространство",zipOnly:"Для загрузки поддерживаются только файлы .zip",fileSizeExceeded:"Размер файла превышает лимит {{limit}} МБ. Текущий файл: {{size}} МБ",systemPromptToggleTooltip:"Включить/выключить загрузку этого файла в системный промпт",memoryFileWarning:"MEMORY.md обычно запрашивается агентом по требованию с помощью инструментов. Загрузка его в системный промпт может привести к слишком длинному контексту.",configUpdated:"Конфигурация системного промпта обновлена",configUpdateFailed:"Не удалось обновить конфигурацию системного промпта",attribution:"Дизайн рабочего пространства частично вдохновлён проектом OpenClaw — спасибо! 🐾",saveSuccess:"Сохранено успешно",saveFailed:"Не удалось сохранить"},Sx={title:"Навыки",description:"Управляйте навыками и возможностями агента.",preload:"Предзагрузка",preloadHint:"После включения агент предварительно загружает этот навык, и ему не нужно искать и загружать его во время диалога.",qwenpawManaged:"Под управлением QwenPaw",qwenpawManagedHint:"Доступны для изменения и передаются поддерживаемым сторонним агентам при запуске.",providerManaged:"Навыки стороннего агента",providerManagedHint:"Обнаружены у текущего стороннего агента и доступны только для чтения.",providerOnly:"Только текущий сторонний агент",readOnly:"Только чтение",noDescription:"Описание отсутствует.",providerSkillDetails:"Сведения о Skill стороннего агента",providerManagedDetailHint:"Этот Skill управляется сторонним агентом. QwenPaw может отображать и использовать его, но не изменять.",provider:"Сторонний агент",scope:"Область",statusLabel:"Статус",descriptionLabel:"Описание",importHub:"Загрузить по URL",supportedSources:"Поддерживаемые источники:",importSkills:"Импорт навыка",enterSkillUrl:"Введите URL навыка",supportedSkillUrlSources:"Поддерживаемые маркетплейсы навыков:",urlExamples:"Примеры URL:",urlValid:"Действительный URL от {{source}}
132",invalidUrl:"Недействительный URL",clickToFill:"Нажмите, чтобы заполнить URL",invalidSkillUrlSource:"Пожалуйста, убедитесь, что URL навыка из поддерживаемого маркетплейса",type:"Тип",installedFrom:"Установлено из",source:"Источник",path:"Путь",tags:"Теги",builtin:"Встроенный",custom:"Пользовательский",addSkill:"Добавить навык",createSkill:"Создать навык",viewSkill:"Просмотреть навык",editSkill:"Редактировать навык",skillName:"Название навыка",skillContent:"Содержимое навыка",pleaseInputName:"Пожалуйста, введите название навыка",pleaseInputContent:"Пожалуйста, введите содержимое навыка",skillNamePlaceholder:"например, weather_query",contentPlaceholder:`[Формат]
133---
134name: skill_name (обязательно, строчные буквы с подчёркиванием)
135description: Краткое описание (обязательно)
136---
137
138Реализация навыка (формат Markdown)
139
140[Пример]
141---
142name: weather_query
143description: Запрос информации о погоде для города
144---
145
146## Функции
147Запрос данных о погоде в реальном времени.
148
149## Использование
150Пользователь вводит название города, возвращается информация о погоде.`,createSuccess:"Навык успешно создан",createFailed:"Не удалось создать навык",deleteConfirm:"Вы уверены, что хотите удалить этот навык?",deleteSuccess:"Навык успешно удалён",deleteFailed:"Не удалось удалить навык",batchEnable:"Включить",batchDisable:"Отключить",batchEnableSuccess:"{{count}} навыков включено",batchEnablePartial:"{{enabled}} включено, {{failed}} не удалось",batchEnableFailed:"Не удалось выполнить пакетное включение",batchDisableSuccess:"{{count}} навыков отключено",batchDisablePartial:"{{disabled}} отключено, {{failed}} не удалось",batchDisableFailed:"Не удалось выполнить пакетное отключение",batchDeleteTitle:"Удалить {{count}} навыков?",batchDeleteSuccess:"{{count}} навыков удалено",batchDeletePartial:"{{deleted}} удалено, {{failed}} не удалось",batchDeleteFailed:"Не удалось выполнить пакетное удаление",selectedCount:"Выбрано {{count}}",selectAll:"Выбрать все",clearSelection:"Очистить",updateSuccess:"Навык успешно обновлён",updateFailed:"Не удалось обновить навык",frontmatterRequired:"Навык должен начинаться и заканчиваться ---",frontmatterNameRequired:"В навыке отсутствует обязательное поле: name",frontmatterDescriptionRequired:"В навыке отсутствует обязательное поле: description",editNotSupported:"Не удалось отредактировать навык",editNote:"Подсказка: здесь можно редактировать содержимое навыка, каналы и конфигурацию.",create:"Создать",optimizeWithAI:"AI Оптимизация",stopOptimize:"Стоп",optimizeSuccess:"Навык успешно оптимизирован",optimizeFailed:"Не удалось оптимизировать навык",noContentToOptimize:"Нет содержимого для оптимизации",cancelImport:"Отменить импорт",importCancelled:"Импорт навыка отменён",importTimeout:"Время ожидания импорта навыка истекло. Повторите попытку или проверьте сеть.",uploadSkill:"Загрузить навык",uploadZip:"Загрузить Zip",uploadSuccess:"Навык успешно загружен",uploadFailed:"Не удалось загрузить навык",uploadNoChange:"Новые навыки не были импортированы. Возможно, они уже существуют",zipOnly:"Поддерживается загрузка только .zip файлов",fileSizeExceeded:"Размер файла превышает лимит {{limit}}МБ. Текущий файл: {{size}}МБ",channels:"Применимые каналы",allChannels:"Все",lastUpdated:"Обновлено",searchPlaceholder:"Фильтр по наÐ
150·Ð²Ð°Ð½Ð¸ÑŽ",listView:"Список",gridView:"Сетка",refreshHint:"Обновить навыки с диска",poolSync:"Статус синхронизации",uploadedToPool:"Загружено в пул навыков",downloadedToWorkspace:"Скачано в текущее рабочее пространство",builtinUpgradeTitle:"Обновить встроенный навык",builtinUpgradeContent:"В пуле доступна новая версия встроенного навыка «{{name}}». Перезаписать текущую версию?",languageSwitchTitle:"Переключить язык навыка",languageSwitchContent:"Следующие навыки имеют другую языковую версию в пуле и будут перезаписаны:",overwriteExistingList:"Следующие навыки уже существуют и будут перезаписаны:",nameConflict:"Обнаружен конфликт имён. Предложенное переименование заполнено.",uploadToPool:"Синхронизировать с пулом навыков",uploadToPoolHint:"Загрузить выбранные навыки рабочего пространства в общий локальный пул навыков",downloadFromPool:"Загрузить из пула навыков",emptyStateBadge:"Новые рабочие пространства начинают пустыми",emptyStateTitle:"У этого агента ещё нет навыков",emptyStateText:"Это нормально. Новые рабочие пространства не содержат навыков автоматически. Загрузите навыки из локального пула или создайте новый навык здесь, чтобы оснастить этого агента.",emptyStateDownload:"Загрузить из пула навыков",emptyStateCreate:"Создать первый навык",selectWorkspaceSkill:"Выберите навык рабочего пространства",selectPoolItem:"Выберите элемент пула навыков",renameOptional:"Переименование (необязательно)",renamePlaceholder:"Предложенное переименование появится здесь при конфликте",renameSingleOnly:"Переименование доступно только при выборе ровно одного навыка.",downloadSkillPool:"Скачать пул навыков",uploadSkillPool:"Загрузить пул навыков",config:"Конфигурация",configPlaceholder:'{"KEY": "value"}',configInvalidJson:"Неверный формат JSON",configSaved:"Конфигурация сохранена",loadFailed:"Не удалось загрузить навыки",refreshFailed:"Не удалось обновить навыки",createdSuccessfully:"Создано успешно",saveFailed:"Не удалось сохранить",importFailed:"Не удалось импортировать",disabledSuccessfully:"Отключено успешно",enabledSuccessfully:"Включено успешно",operationFailed:"Операция не удалась",provideUrl:"Пожалуйста, укажите URL навыка хаба",validUrl:"Пожалуйста, введите действительный URL, начинающийся с http:// или https://",importedSkill:"Импортирован навык: {{name}}",batchOperation:"Пакетная операция",exitBatch:"Выйти из режима",noSearchResults:"Навыки, соответствующие вашему запросу, не найдены",filterByTag:"Фильтр по тегу",noTags:"Нет доступных тегов",enabledSkills:"Активные навыки",disabledSkills:"Неактивные навыки",active:"активно"},Cx={description:"Общий локальный пул навыков для встроенных навыков и загрузок из рабочих пространств. Внешние импорты (ClawHub, LobeHub) — отдельная функция.",broadcast:"Трансляция",broadcastHint:"Транслировать навыки пула во все или выбранные рабочие пространства",refreshHint:"Обновить пул навыков с диска",deleteExternalConfirm:"Файлы внешнего навыка в {{path}} будут удалены с диска.",deleteExternalBatchWarning:"Выбранные внешние навыки будут безвозвратно удалены с диска.",broadcastTitle:"Транслировать {{name}}",automation:"Автоматизация",builtinAutoUpdate:"Автообновление",builtinAutoUpdateFlow:"Встроенный пакет → Пул навыков",autoSyncFlow:"Пул навыков → Рабочие пространства агентов",automationBoth:"Автообновление + автосинхронизация",automationMixedHint:"Откройте подробности, чтобы выбрать автообновление или автосинхронизацию.",automationEnableHint:"Включить автообновление и автосинхронизацию.",automationDisableHint:"Отключить автообновление и автосинхронизацию.",automationEnabled:"Автообновление и автосинхронизация включены для {{name}}",automationDisabled:"Автообновление и автосинхронизация отключены для {{name}}",automationFailed:"Не удалось изменить настройки автоматизации",automationNeedsAttention:"Настройки сохранены. {{count}} пункт(а) требуют внимания; см. «Входящие».",autoSync:"Автосинхронизация",autoSyncEnableHint:"Включить автосинхронизацию.",autoSyncDisableHint:"Отключить автосинхронизацию.",autoSyncEnabled:"Автосинхронизация включена для {{name}}",autoSyncDisabled:"Автосинхронизация отключена для {{name}}",autoSyncAgentsPlaceholder:"Все агенты с этим навыком",autoSyncAgentsHint:"Оставьте поле пустым для синхронизации существующих копий или выберите агентов.",importBuiltin:"Импорт встроенных",importBuiltinHint:"Импортировать встроенные навыки из исходников в пул",importBuiltinAlertHint:"Требуют внимания {{count}} изменений встроенных навыков",importBuiltinSuccess:"Встроенные навыки импортированы: {{names}}",importBuiltinConflicts:"Пропущено из-за конфликтов имён: {{names}}",importBuiltinNoChanges:"Нет встроенных изменений для импорта",importBuiltinFailed:"Не удалось импортировать встроенные навыки",importBuiltinConflictTitle:"Обнаружены конфликты встроенных навыков",importBuiltinConflictContent:"Следующие встроенные навыки отличаются от текущих копий в пуле. Подтвердите, чтобы перезаписать их версией из исходников.",sourceVersion:"Версия в исходниках",currentVersion:"Текущая версия",builtinLanguage:"Язык",langDefault:"По умолчанию",langDefaultTooltip:"Сохранить текущий язык каждого навыка",langEn:"Английский",langZ
150h:"Китайский",builtinLanguageChangeTitle:"Сменить язык встроенного навыка?",builtinLanguageChangeContent:"Перезаписать копию «{{name}}» в пуле встроенной версией {{language}}?",builtinLanguageChangeSuccess:"«{{name}}» переключён на {{language}}",builtinLanguageChangeFailed:"Не удалось переключить язык встроенного навыка",importStatusMissing:"Отсутствует в пуле",importStatusCurrent:"Уже актуален",importStatusOutdated:"Устарел",importStatusLanguageSwitchTo:"Перезаписать версией на {{language}}",importStatusConflict:"Конфликт",builtinNoticeSummary:"Обнаружено {{count}} изменений встроенных навыков",builtinNoticeLineAdded:"Добавлено: {{names}}",builtinNoticeLineMissing:"Отсутствует: {{names}}",builtinNoticeLineUpdated:"Обновлено: {{names}}",builtinNoticeLineRemoved:"Удалено: {{names}}",zipImport:"ZIP-импорт",create:"Создать",edit:"Редактировать",delete:"Удалить",descriptionLabel:"Описание",tags:"Теги",tagsPlaceholder:"Выберите или введите теги",filterByTag:"Фильтр по тегу",version:"Версия",createTitle:"Создать элемент пула навыков",editTitle:"Редактировать {{name}}",skillNamePlaceholder:"Название навыка",contentPlaceholder:"Содержимое SKILL.md",nameConflict:"Обнаружен конфликт имён. Применено предложенное переименование.",deletedFromPool:"Удалено из пула навыков",deleteBuiltinConfirm:"Это удалит встроенный навык из пула. Позже его можно снова импортировать из исходников.",deleteConfirm:"Это удалит навык из общего локального пула навыков.",deleteTitle:"Удалить {{name}}?",batchDeleteTitle:"Удалить {{count}} навыков из пула?",batchDeleteSuccess:"{{count}} навыков из пула удалено",batchDeletePartial:"{{deleted}} удалено, {{failed}} не удалось",batchDeleteFailed:"Не удалось выполнить пакетное удаление",imported:"Импортировано: {{names}}",noNewImports:"Новые навыки не импортированы",allBuiltin:"Все встроенные",selectWorkspaces:"Транслировать в рабочее пространство",allWorkspaces:"Все рабочие пространства",optionalRename:"Необязательное переименование",back:"Назад",skillCount:"{{count}} навыков",skillName:"Название навыка",status:"Статус",installedFrom:"Установлено из",updateBuiltin:"Обновить",updateConfirmTitle:"Обновить {{name}}",updateConfirmContent:"Обновить до версии {{version}}? Текущая копия в пуле будет заменена последней встроенной версией.",updateSuccess:"Обновлено успешно",updateFailed:"Не удалось обновить",broadcastSuccess:"Трансляция завершена",broadcastFailed:"Не удалось выполнить трансляцию",overwriteConfirm:"Перезаписать существующие навыки?",overwriteTargetsContent:"Следующие существующие цели будут перезаписаны:",builtinOverwriteTargetsContent:"Следующие встроенные цели имеют другую версию и будут перезаписаны:",renameAndRetry:"Навык с таким именем уже существует. Использовать предложенное имя?",multiConflictTitle:"Обнаружено несколько конфликтов",multiConflictDesc:"Следующие навыки уже существуют. Устраните конфликты по отдельности и повторите попытку:",singleConflictRename:'"{{name}}" уже существует. Переименовать в "{{suggested}}" для продолжения?',statusUpToDate:"Актуально",statusSynced:"Синхронизировано",statusOutdated:"Устарело",statusNotSynced:"Не синхронизировано",statusConflict:"Конфликт",renameEntry:'Новое имя для "{{name}}":',builtin:"встроенный",custom:"пользовательский"},wx={title:"MCP-клиенты",qwenpawManaged:"Под управлением QwenPaw",qwenpawManagedHint:"Общая конфигурация панели управления внедряется в поддерживаемые сторонние агенты во время выполнения.",providerManaged:"Локальные MCP {{provider}}",providerManagedHint:"Обнаружены в конфигурации стороннего агента. Доступны только для чтения и только этому агенту.",providerOnly:"Только сторонний агент",readOnly:"Только чтение",create:"Создать клиент",formatSupport:"Поддерживаемые форматы",standardFormat:"Стандартный (обёртка mcpServers)",directFormat:"Прямой (ключ → объект конфигурации)",singleFormat:"Один клиент (плоские поля)",emptyState:"MCP-клиенты пока не настроены",loadError:"Не удалось загрузить MCP-клиентов",createSuccess:"MCP-клиент успешно создан",createError:"Не удалось создать MCP-клиент",updateSuccess:"MCP-клиент успешно обновлён",updateError:"Не удалось обновить MCP-клиент",enableSuccess:"MCP-клиент успешно включён",disableSuccess:"MCP-клиент успешно отключён",toggleError:"Не удалось переключить статус MCP-клиента",deleteConfirm:"Вы уверены, что хотите удалить этот MCP-клиент?",deleteSuccess:"MCP-клиент успешно удалён",deleteError:"Не удалось удалить MCP-клиент",maskedFieldHint:"Чувствительные поля скрыты ***. Редактирование скрытых значений не поддерживается — замените полным новым значением.",tools:"Инструменты и разрешения",noTools:"На этом MCP сервере нет доступных инструментов",toolsLoadError:"Не удалось загрузить инструменты с MCP сервера",toolsConnecting:"MCP сервер подключается, попробуйте через некоторое время",toolSchema:"Схема ввода",access:{title:"Доступ",button:"Доступ",summary:"Политика доступа MCP",clientSection:"Общий доступ",toolSection:"Доступ к инструменту",default:"По умолчанию",sourceType:"Источник",sourceValue:"Значение источника",sourceValueAllChannels:"Все каналы",subjectType:"Объект",subjectValue:"Значение объекта",effectLabel:"Политика",source:{channel:"Канал"},subjectTypeOption:{all:"Все",user:"Пользователь"},sourceValuePlaceholder:{channel:"console / dingtalk"},subjectValuePlaceholder:"например, alice",subjectValuePlaceholderSelectedSource:"ID пользователя в выбранном источнике",subjectValuePlaceholderScoped:"ID пользователя в {{source}}",subjectValueAll:"Все",recentUserPlaceholder:"ID пользователя относится к выбранному источнику; введите или выберите заново",noRecentUsers:"Для этого источника нет недавних пользователей; введите ID вручную",ambiguousUserSourceWarning:"ID пользователя уникален только внутри источника. Выберите конкретный канал, чтобы избежать совпадений между каналами.",unknownUserValueWarning:"Этого ID нет среди недавних активных пользователей. Сохранение разрешено.",validation:{missingUserValue:"Выберите конкретный источник и введите корректный ID пользователя.",ambiguousUserSource:"Правила для пользователя должны указ
150ывать конкретный канал, а не все каналы.",unknownUserValue:"Этого ID нет среди недавних активных пользователей. Сохранение разрешено."},addRule:"Добавить правило",deleteRule:"Удалить правило",noClientRules:"Нет правил",noRules:"Нет правил, используется политика по умолчанию",inherit:"Наследовать ({{effect}})",stale:"Не найдено",disabledTools:"Этот MCP клиент отключен; сохранённые правила доступа всё ещё можно редактировать.",discardTitle:"Отменить несохранённые изменения?",discardContent:"Несохранённые изменения политики доступа будут потеряны.",loadError:"Не удалось загрузить политику доступа MCP",saveSuccess:"Политика доступа MCP сохранена",saveError:"Не удалось сохранить политику доступа MCP",unmanagedRules:"{{count}} расширенных правил",effect:{allow:"Разрешить",ask:"Спрашивать",deny:"Запретить"}},tab:{json:"Импорт JSON",form:"Режим формы"},form:{key:"Ключ клиента",keyPlaceholder:"my-mcp-server",keyRequired:"Ключ клиента обязателен",name:"Отображаемое имя",namePlaceholder:"My MCP Server",nameRequired:"Отображаемое имя обязательно",transport:"Транспорт",url:"URL сервера",urlRequired:"URL обязателен для удалённых MCP серверов",command:"Команда",commandRequired:"Команда обязательна для транспорта stdio",args:"Аргументы (через пробел или с новой строки)",description:"Описание",descriptionPlaceholder:"Необязательное описание",env:"Переменные окружения",envPlaceholder:"KEY=VALUE (по одной на строку)"},oauth:{enableOAuth:"Использовать OAuth авторизацию",manage:"OAuth",authorized:"Авторизован",notAuthorized:"Не авторизован",expired:"Токен истёк",failed:"Ошибка авторизации",waiting:"Ожидание авторизации...",authorize:"Авторизовать",reauthorize:"Переавторизовать",revoke:"Отозвать",startFailed:"Не удалось запустить OAuth",authFailed:"OAuth авторизация не удалась",popupBlocked:"Всплывающее окно заблокировано браузером. Разрешите всплывающие окна и повторите попытку.",windowClosed:"Окно авторизации закрыто. Повторите попытку.",noUrl:"Сначала введите URL сервера",noClientKey:"Сначала создайте клиент",showAdvanced:"Дополнительные параметры",hideAdvanced:"Скрыть параметры",clientId:"Client ID (необязательно)",clientIdPlaceholder:"Оставьте пустым для динамической регистрации",scope:"Scope (необязательно)",scopePlaceholder:"openid profile email",authEndpoint:"Authorization Endpoint (переопределить)",tokenEndpoint:"Token Endpoint (переопределить)",endpointHint:"Оставьте пустым для автообнаружения. Заполните для ручного указания."}},Px={title:"Пульс",description:"Запускайте HEARTBEAT.md с фиксированным интервалом для самопроверок. По умолчанию выполняется тихо и не влияет на текущие диалоги, либо может отправлять ответы в последний канал чата.",enabled:"Включить пульс",every:"Интервал",everyRequired:"Обязательно",everyMin:"Должно быть не меньше 1",timeoutSeconds:"Таймаут выполнения (секунды)",timeoutRequired:"Обязательно",timeoutMin:"Должно быть не меньше 1",timeoutMax:"Должно быть не больше 3600",unitMinutes:"Минуты",unitHours:"Часы",target:"Цель ответа",targetMain:"Тихий режим (по умолчанию, без вывода в канал)",targetLast:"Отправлять в последний канал чата",activeHours:"Активные часы (необязательно)",activeStart:"Время начала",activeEnd:"Время окончания",loadFailed:"Не удалось загрузить конфигурацию пульса",saveSuccess:"Успешно сохранено; пульс перезагружен на лету",saveFailed:"Не удалось сохранить конфигурацию пульса",targetInbox:"Отправлять во входящие",runNow:"Запустить сейчас",runNowSuccess:"Пульс запущен. Через несколько секунд проверьте входящие или целевой канал.",runNowFailed:"Не удалось запустить выполнение пульса"},Ax=JSON.parse(`{"title":"Cron-задачи","description":"Создавайте и управляйте задачами по расписанию, которые автоматически выполняются в указанное время.","createJob":"Создать задачу","editJob":"Редактировать задачу","confirmDelete":"Подтвердить удаление","deleteConfirm":"Вы уверены, что хотите удалить эту Cron Job?","okText":"OK","cancelText":"Отмена","deleteText":"Удалить","id":"ID задачи","name":"НаÐ
150·Ð²Ð°Ð½Ð¸Ðµ задачи","enabled":"Статус","scheduleType":"Тип расписания","scheduleCron":"Расписание (Cron)","scheduleCronLabel":"Расписание (Cron)","scheduleTimezone":"Часовой пояс","cronType":"Частота","cronTypeHourly":"Каждый час","cronTypeDaily":"Ежедневно","cronTypeWeekly":"Еженедельно","cronTypeCustom":"Пользовательский","cronTime":"Время","cronDaysOfWeek":"Дни недели","cronDayMon":"Понедельник","cronDayTue":"Вторник","cronDayWed":"Среда","cronDayThu":"Четверг","cronDayFri":"Пятница","cronDaySat":"Суббота","cronDaySun":"Воскресенье","cronCustomExpression":"Cron-выражение","taskText":"Текст сообщения","action":"Действие","disable":"Отключить","executeNow":"Выполнить сейчас","edit":"Редактировать","delete":"Удалить","totalItems":"Всего {{count}} элементов","perPage":"/ стр.","pleaseInputId":"Пожалуйста, введите ID задачи","pleaseInputName":"Пожалуйста, введите название задачи","pleaseInputCron":"Пожалуйста, введите cron-выражение","pleaseSelectTaskType":"Пожалуйста, выберите тип задачи","pleaseInputRequest":"Пожалуйста, введите содержимое запроса","pleaseInputMessageContent":"Пожалуйста, введите текст сообщения","pleaseInputChannel":"Пожалуйста, введите целевой канал","pleaseInputUserId":"Пожалуйста, введите ID целевого пользователя","pleaseInputSessionId":"Пожалуйста, введите ID целевой сессии","jobIdPlaceholder":"например, daily-report-job","jobNamePlaceholder":"например, Ежедневный утренний отчёт","selectTimezone":"Выберите часовой пояс","taskDescriptionPlaceholder":"Для текстовых задач введите текст сообщения...","invali
150dJsonFormat":"Неверный формат JSON","jsonFormatRequired":"Требуется формат JSON","taskType":"Тип задачи","text":"Текст сообщения","requestInput":"Содержимое запроса","requestSessionId":"ID сессии запроса","requestUserId":"ID пользователя запроса","dispatchChannel":"Целевой канал","dispatchTargetUserId":"ID целевого пользователя","dispatchTargetSessionId":"ID целевой сессии","dispatchMode":"Режим доставки","silentDelivery":"Тихая доставка","runtimeShareSession":"Общая сессия","runtimeMaxConcurrency":"Макс. параллельность","runtimeTimeoutSeconds":"Таймаут (секунды)","runtimeMisfireGraceSeconds":"Льготный период пропуска (секунды)","runtimeToolSafety":"Проверка одобрения инструментов","idTooltip":"Генерируемый системой, нередактируемый уникальный UUID, присваиваемый при создании задачи.","nameTooltip":"Понятное имя, чтобы вам было проще найти эту задачу.","cronTooltip":"Определите, когда задача должна запускаться","cronExample":"Популярные примеры: '0 9 * * *' = ежедневно в 09:00 | '*/30 * * * *' = каждые 30 мин | '0 */2 * * *' = каждые 2 часа | '0 0 * * 0' = воскресенье, полночь","cronHelper":"Впервые работаете с cron-выражениями?","cronHelperLink":"Использовать онлайн-генератор","timezoneTooltip":"Часовой пояс для cron-расписания. По умолчанию: UTC","taskTypeTooltip":"Выберите 'text' для простых текстовых задач или 'agent' для сложных сценариев с агентом.","textTooltip":"Простая текстовая задача: здесь указывается фактический текст сообщения. Обязательно при типе задачи «text».","requestInputTooltip":"Содержимое сообщения в формате JSON. Именно это агент получит и обработает. Обязательно при типе задачи «agent».","requestInputExample":"Формат: [{\\"role\\":\\"user\\",\\"content\\":[{\\"type\\":\\"text\\",\\"text\\":\\"Ваше сообщение\\"}]}]","requestSessionIdTooltip":"ID сессии для контекста запроса. Если не уверены, используйте 'default'.","requestUserIdTooltip":"ID пользователя, который инициирует запрос. Для автоматических задач используйте 'system'.","dispatchChannelTooltip":"Целевой канал, куда будет отправлен ответ (например, 'console', 'discord', 'imessage').","dispatchTargetUserIdTooltip":"ID пользователя, который получит ответ в целевом канале.","dispatchTargetSessionIdTooltip":"ID сессии, куда будет доставлен ответ в целевом канале.","dispatchModeTooltip":"Выберите 'stream' для ответов в реальном времени или 'final' только для итоговых ответов.","silentDeliveryTooltip":"Выполнить задачу агента с сохранением сессии и трассировки, но не отправлять результат в канал.","shareSessionTooltip":"При включении используется общая сессия с целевым пользователем. При отключении каждый запуск создает изолированный контекст с уникальным ID. Подходит для независимых задач без памяти. По умолчанию: включено","maxConcurrencyTooltip":"Максимальное количество одновременно выполняемых экземпляров этой задачи. По умолчанию: 1","timeoutSecondsTooltip":"Максимальное время выполнения в секундах. При превышении задача будет остановлена.","misfireGraceSecondsTooltip":"Льготный период для пропущенных запусков. Если задача пропустила время запуска больше чем на это значение, она не будет выполнена.","toolSafetyTooltip":"При включении рискованные вызовы инструментов требуют одобрения пользователя (может блокировать автоматические задачи). При выключении вызовы не запрашивают одобрение, но правила защиты файлов продолжают действовать. По умолчанию: выключено","executeNowTitle":"Выполнить задачу сейчас","executeNowContent":"Вы уверены, что хотите выполнить «{{name}}» прямо сейчас?","executeNowConfirm":"Выполнить сейчас","createFromTemplate":"Создать из шаблона","templateModalTitle":"Выберите шаблон задачи","templateModalDescription":"Выберите встроенный шаблон и при необходимости измените ключевые параметры на панели перед сохранением.","useTemplate":"Использовать шаблон","templateTagPersonal":"Личное","templateTagTeam":"Команда","templateTagReminder":"Напоминание","templateTagCalendar":"Календарь","templateTagCalendarRecommended":"Рекомендуется для календаря","saveResultToInbox":"Сохранять результат во входящих","saveResultToInboxTooltip":"Если включено, успешные выполнения с успешной доставкой сохраняются во входящих. Ошибки доставки всегда записываются во входящие как резерв.","scheduleFilterAll":"Все типы расписания","scheduleTypeRecurring":"Повторяющаяся","scheduleTypeOnce":"Запланированная","onceRunAt":"Запуск в","repeatEnabled":"Повтор","repeatEnabledTooltip":"Включить повторяющееся расписание от этого времени начала","repeatFrequency":"Частота повтора","repeatEveryDays":"Повторять каждые (дни)","repeatEveryPrefix":"Каждые","repeatEverySuffix":"дн.","repeatEndType":"Окончание повтора","repeatEndNever":"Никогда","repeatEndUntil":"До даты","repeatEndCount":"Ограниченное число запусков","repeatUntil":"Дата оÐ
150ºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ","repeatCount":"Число запусков","pleaseSelectScheduleType":"Выберите тип расписания","pleaseInputRunAt":"Выберите время запуска","pleaseInputRepeatEveryDays":"Введите интервал повтора (дни)","pleaseSelectRepeatEndType":"Выберите условие окончания","pleaseInputRepeatUntil":"Выберите дату окончания","pleaseInputRepeatCount":"Введите число запусков","validation":{"cronRequired":"Для повторяющегося расписания требуется cron-выражение.","runAtRequired":"Для одноразового расписания требуется время выполнения.","repeatUntilRequired":"При выборе «До даты» необходимо указать дату окончания.","repeatCountRequired":"При выборе «Ограниченное число запусков» необходимо указать количество запусков.","repeatUntilAfterRunAt":"Дата окончания должна быть позже времени выполнения. Выберите дату окончания после времени выполнения.","textRequired":"При типе задачи text содержимое сообщения обязательно.","requestRequired":"При типе задачи agent содержимое запроса обязательно.","invalidCronExpression":"Некорректное cron-выражение. Используйте формат из 5 полей."},"listView":"Список","calendarView":"Календарь","calendarEmptyHint":"Запланированных задач пока нет. Создайте задачи по расписанию, чтобы увидеть их в календаре.","calendarMoreItems":"+ещё {{count}}","calendarDayListTitle":"Запланированные задачи на {{date}}","executionHistory":"История","historyTitle":"История — {{name}}","historyEmpty":"Записей о выполнении пока нет.","historyStatusSuccess":"Успех","historyStatusFailed":"Ошибка","historyStatusRunning":"Выполняется","historyStatusCancelled":"Отменено","historyTriggerScheduled":"Запуск по расписанию","historyTriggerManual":"Ручной запуск","historyExpand":"Развернуть","historyCollapse":"Свернуть","templates":{"dailyTechNewsBrief":{"title":"Дайджест технических новостей","description":"В 09:30 в будни собирать актуальные технические заголовки в краткий обзор.","frequency":"Будни 09:30 (30 9 * * 1-5)"},"dailyEveningReflection":{"title":"Вечерняя рефлексия","description":"В 20:00 в будни — короткая подсказка подвести итоги рабочего дня.","frequency":"Будни 20:00 (0 20 * * 1-5)"},"weekendRelaxationReminder":{"title":"Напоминание отдохнуть на выходных","description":"По утрам в выходные — подборка популярных фильмов для лёгкого отдыха.","frequency":"Выходные 10:00 (0 10 * * 6,0)"},"pomodoroBreakReminder":{"title":"Напоминание о перерыве (помодоро)","description":"В рабочие часы каждые 25 минут напоминать попить воды или дать глазам отдохнуть.","frequency":"Будни 09:00–17:59 каждые 25 мин (*/25 9-17 * * 1-5)"},"petCareReminder":{"title":"Питомец: глистогонное / прививка","description":"15-го числа каждого месяца вечером — напоминание о дегельминтизации или следующей прививке.","frequency":"Ежемесячно 15-го в 20:00 (0 20 15 * *)"}
150,"onceTextBirthdayReminder":{"title":"Напоминание о дне рождения","description":"Напомнить, что у xx день рождения 1 января.","frequency":"Выполнить: 2026-01-01 09:00"},"onceAgentBusinessTripPrep":{"title":"Подготовка к командировке","description":"Проверить погоду в пункте назначения и предложить рекомендации по подготовке к поездке.","frequency":"Выполнить: 2026-01-01 20:00"},"repeatCountTextMedicineReminder":{"title":"Напоминание о лекарствах (14 раз)","description":"Напоминать вовремя принимать лекарства в рамках курса из 14 запусков.","frequency":"Первый запуск: 2026-01-01 09:00 | Каждые 1 день | 14 запусков"},"repeatCountAgentDietPlan":{"title":"План питания на 14 дней","description":"Генерировать и отправлять ежедневные рекомендации по питанию в течение 14 дней.","frequency":"Первый запуск: 2026-01-01 08:00 | Каждые 1 день | 14 запусков"},"repeatUntilTextWeeklyMeeting":{"title":"Напоминание о еженедельной встрече (2 месяца)","description":"Еженедельно напоминать о встрече до установленной даты окончания.","frequency":"Первый запуск: 2026-01-02 08:45 | Каждые 7 дней | До 2026-03-01"},"repeatUntilAgentWeeklySummary":{"title":"Недельный итог перед встречей","description":"Перед каждой недельной встречей формировать рабочий итог на основе memory за последнюю неделю.","frequency":"Первый запуск: 2026-01-02 08:30 | Каждые 7 дней | До 2026-03-01"}}}`),Mx=JSON.parse('{"title":"Каналы","description":"Управление и настройка каналов сообщений","loading":"Загрузка каналов...","configSaved":"Конфигурация успешно сохранена","configFailed":"Не удалось сохранить конфигурацию","botConflictTitle":"Бот уже используется","botConflictDescription":"Этот бот уже используется агентом {{agents}} в том же канале. Сохранение может привести к конфликтам сообщений.","botConflictConfirm":"Всё равно сохранить","channelType":"Тип канала","status":"Статус","totalItems":"Всего {{count}} элементов","botPrefix":"Префикс бота","showToolCalls":"Показывать сведения о вызове инструмента","showToolCallsTooltip":"Показывать пользователям сведения о вызове инструмента (выключите, чтобы скрыть)","showToolResults":"Показывать сведения о результате инструмента","showToolResultsTooltip":"Показывать пользователям сведения о результате инструмента (выключите, чтобы скрыть)","toolCallMaxLength":"Максимальная длина отображения вызова инструмента","toolResultMaxLength":"Максимальная длина отображения результата инструмента","toolMaxLengthTooltip":"Установите 0, чтобы не ограничивать длину","onebotMediaBase64":"Отправлять локальные медиа как Base64","onebotMediaBase64Tooltip":"Выберите способ отправки медиафайлов. Если параметр выключен, отправляется путь к файлу; если включён — файл кодируется в Base64. Удалённые URL остаются без изменений.","onebotMediaBase64MaxMb":"Ограничение размера файла Base64","onebotMediaBase64MaxMbTooltip":"Медиафайлы больше этого ограничения отправляются с использованием исходного пути Ð
150º файлу.","onebotMediaBase64MaxMbRequired":"Введите ограничение размера файла Base64","onebotMediaBase64MaxMbMin":"Ограничение размера файла Base64 должно быть не менее 1 MB","onebotMediaDir":"Директория медиафайлов","onebotMediaDirTooltip":"Каталог для сохранения загруженных медиафайлов. По умолчанию используется каталог media в рабочем пространстве агента.","onebotMediaDownloadMaxMb":"Ограничение размера входящих медиа","onebotMediaDownloadMaxMbTooltip":"Максимальный размер каждого изображения, аудио, видео или файла, загружаемого из OneBot.","onebotMediaDownloadMaxMbRequired":"Введите ограничение размера входящих медиа","onebotMediaDownloadMaxMbMin":"Ограничение размера входящих медиа должно быть не менее 1 MB","onebotWsHostTooltip":"Адрес прослушивания сервера обратного WebSocket. Оставьте 127.0.0.1, чтобы подключаться могли только клиенты OneBot на этой машине. Любой другой адрес открывает порт в сеть и требует токен доступа.","onebotAccessTokenTooltip":"Общий токен, который клиент OneBot отправляет в заголовке Authorization. Обязателен, если адрес прослушивания не является локальным (loopback).","onebotAccessTokenRequired":"Токен доступа обязателен, если адрес WebSocket не является локальным (loopback)","showThinking":"Показывать рассуждения","showThinkingTooltip":"Показывать пользователям рассуждения модели (выключите, чтобы скрыть)","noTextDebounce":"Дебаунс без текста","noTextDebounceTooltip":"Если включено, сообщения только с медиа (изображения/видео/файлы) буферизуются до прихода текстового сообщения, затем объединяются. Отключите для немедленной обработки всех сообщений. Голосовые сообщения всегда обрабатываются немедленно.","streamingEnabled":"Потоковый вывод","streamingEnabledDingtalkHint":"Действует только при типе сообщения Card","streamingEnabledFeishuHint":"Необходимо включить разрешение cardkit:card:write на странице управления разрешениями открытой платформы Feishu","ackMessage":"Сообщение подтверждения","ackMessageTooltip":"Отправить мгновенный ответ при получении сообщения до начала обработки агентом. Оставьте пустым для отключения.","ackMessagePlaceholder":"⏳ Обработка...","notSet":"Не задано","clickCardToEdit":"Нажмите на карточку для редактирования","settings":"Настройки","channelSettings":"Настройки канала","pleaseInputDbPath":"Пожалуйста, введите путь к БД","pleaseInputPollInterval":"Пожалуйста, введите интервал опроса","discordBotToken":"Токен Discord-бота","acceptBotMessages":"Принимать сообщения от ботов","acceptBotMessagesTooltip":"При включении будут приниматься сообщения от других ботов","httpProxyPlaceholder":"http://127.0.0.1:18118","httpProxyAuthPlaceholder":"user:password","dbPathPlaceholder":"~/Library/Messages/chat.db","botPrefixPlaceholder":"@bot","dmPolicy":"Политика личных сообщений","dmPolicyTooltip":"Кто может взаимодействовать с ботом в личных сообщениях. Open: все; Allowlist: только авторизованные пользователи","groupPolicy":"Политика групп","groupPolicyTooltip":"Кто может взаимодействовать с ботом в групповых чатах. Open: все; Allowlist: только авторизованные пользователи","requireMention":"Требовать @упоминание","requireMentionTooltip":"Бот отвечает в групповых чатах только при явном @упоминании","policyOpen":"Open","policyAllowlist":"Allowlist","allowFrom":"Пользователи allowlist","allowFromTooltip":"Список ID пользователей, которым разрешено взаимодействовать с ботом. Включите белый список, затем напишите боту в ЛС — ваш ID будет в сообщении об отказе","allowFromPlaceholder":"Введите ID пользователя и нажмите Enter, чтобы добавить","denyMessage":"Сообщение об отказе","denyMessageTooltip":"Пользовательское сообщение для пользователей, которым отказан доступ","twilioAccountSid":"Twilio Account SID","twilioAuthToken":"Twilio Auth Token","phoneNumber":"Номер телефона","phoneNumberSid":"Phone Number SID","phoneNumberSidHelp":"Можно найти в разделе Phone Numbers → Active Numbers в Twilio Console.","ttsProvider":"TTS-провайдер","ttsVoice":"TTS-голос","sttProvider":"STT-провайдер","language":"Язык","welcomeGreeting":"Приветственное сообщение","voiceSetupGuide":"Создайте аккаунт Twilio, купите номер телефона и затем введите данные ниже. Account SID и Auth Token находятся на панели Twilio Console. Phone Number SID указан в разделе Phone Numbers → Active Numbers.","voiceSetupLink":"Открыть Twilio Console","sipSetupGuide":"Настройте SIP-регистратор (например, Asterisk, FreeSWITCH) и введите учётные данные SIP ниже. В режиме Dev pyVoIP обрабатывает SIP/RTP локально. Ð
150’ режиме Production используется LiveKit SIP Server.","sipMode":"Режим SIP","sipModeTooltip":"Dev: Python pyVoIP для локального тестирования. Production: LiveKit SIP Server для высокой нагрузки.","sipServer":"SIP-сервер","sipServerPlaceholder":"Оставьте пустым для встроенного регистратора","sipServerPlaceholderLivekit":"Не требуется для режима LiveKit","sipUsername":"Имя пользователя SIP","sipPassword":"Пароль SIP","sipPort":"Порт SIP","sipTransport":"Транспорт","sipDashscopeApiKey":"DashScope API Key","sipDashscopeApiKeyTooltip":"API-ключ для Aliyun DashScope STT/TTS. Если пусто, используется переменная окружения DASHSCOPE_API_KEY.","livekitUrl":"LiveKit URL","livekitApiKey":"LiveKit API Key","livekitApiSecret":"LiveKit API Secret","livekitSipTrunkId":"LiveKit SIP Trunk ID","livekitRoomName":"Имя комнаты LiveKit","livekitRoomNameTooltip":"Имя комнаты LiveKit для ожидания SIP-вызовов. Должно совпадать с именем комнаты в правиле SIP Dispatch Rule.","loginWeCom":"Получить QR-код WeCom","wecomSetupGuide":"При создании бота через QR-код, на этапе авторизации возможностей бота выберите «Пропустить авторизацию». Если выбрать «Подтвердить авторизацию», другие пользователи, кроме создателя бота, могут не иметь возможности взаимодействовать с ботом.","wecomScanAuth":"Сканировать для авторизации","wecomAuthHint":"Отсканируйте QR-код выше с помощью WeCom для авторизации. Bot ID и Secret будут заполнены автоматически.","wecomAuthSuccess":"Бот WeCom авторизован. Bot ID и Secret заполнены автоматически.","wecomQrcodeFailed":"Не удалось получить QR-код WeCom. Попробуйте ещё раз.","slackBotToken":"Bot Token","slackBotTokenTooltip":"Slack Bot User OAuth Token, начинается с xoxb-","slackAppToken":"App Token","slackAppTokenTooltip":"Slack App-Level Token для Socket Mode, начинается с xapp-","slackProxyTooltip":"URL HTTP-прокси для подключения к Slack API","dingtalkSetupGuide":"Отсканируйте QR-код в DingTalk для мгновенного создания бота. Приложение DingTalk будет создано автоматически, а Client ID и Client Secret будут заполнены.","dingtalkScanAuth":"Сканировать для создания бота","dingtalkGetQrcode":"Получить QR-код DingTalk","dingtalkScanHint":"Отсканируйте QR-код выше с помощью DingTalk. Client ID и Client Secret будут заполнены автоматически после авторизации.","dingtalkAuthSuccess":"Бот DingTalk создан. Client ID и Client Secret заполнены автоматически.","dingtalkQrcodeFailed":"Не удалось получить QR-код DingTalk. Попробуйте ещё раз.","dingtalkQrcodeExpired":"QR-код истёк. Получите новый.","qqSetupGuide":"Отсканируйте QR-код с помощью QQ, чтобы авторизовать бота. После сканирования APP ID и Client Secret будут автоматически получены и введены в поле.","qqScanAuth":"Отсканируйте штрихкод, чтобы авторизовать бота","qqGetQrcode":"Получить QR-код QQ","qqScanHint":"Отсканируйте QR-код выше с помощью QQ. После завершения авторизации APP ID и Client Secret будут автоматически введены в поле.","qqAuthSuccess":"Авторизация бота QQ прошла успешно, APP ID и Client Secret уже введены в поле.","qqQrcodeFailed":"Не удалось получить QR-код QQ. Попробуйте позже.","qqQrcodeExpired":"Срок действия QR-кода истек. Пожалуйста, получите новый.","atSenderOnReply":"@ отправителя при ответе","atSenderOnReplyTooltip":"При включении бот будет упоминать отправителя в первом сообщении ответа в групповых чатах. Примечание: в режиме карточек @упоминание работает только для внутренних сотрудников организации.","dingtalkEndpoint":"API Endpoint","dingtalkEndpointTooltip":"Пользовательский API-адрес для приватного развёртывания DingTalk. Оставьте пустым для использования официального адреса по умолчанию.","cardAutoLayout":"Широкоформатная карточка (автораскладка)","cardAutoLayoutTooltip":"При включении DingTalk отображает AI-карточки в широком формате на десктопе. Действует только при типе сообщения card. Шаблон карточки должен быть опубликован.","wecomCancelled":"Авторизация отменена","wecomAuthFailed":"Ошибка авторизации: {{msg}}","filterAll":"Все","builtin":"Встроенные","custom"
150:"Пользовательские","feishuRegion":"Регион","feishuRegionTooltip":"Выберите Feishu для Китая или Lark для международного использования","feishuChina":"Feishu (Китай)","feishuInternational":"Lark (Международный)","feishuScanGuide":"Отсканируйте QR-код в Feishu для мгновенного создания бота. Приложение Feishu будет создано автоматически, а App ID и App Secret будут заполнены.","feishuScanLogin":"Сканировать для создания бота","feishuGetQrcode":"Получить QR-код Feishu","feishuScanHint":"Отсканируйте QR-код выше с помощью Feishu. App ID и App Secret будут заполнены автоматически после авторизации.","feishuAuthSuccess":"Бот Feishu создан. App ID и App Secret заполнены автоматически.","feishuQrcodeExpired":"QR-код истёк. Получите новый.","feishuQrcodeFailed":"Не удалось получить QR-код Feishu. Попробуйте ещё раз.","wechatSetupGuide":"Бот для личного аккаунта WeChat (протокол iLink). При первом запуске без Bot Token будет выведена ссылка на QR-код для авторизации. Токен сохраняется локально для дальнейшего использования.","wechatContextTokenLimit":"Ограничение платформы WeChat iLink: context_token каждого сообщения пользователя позволяет отправить максимум 10 ответных сообщений. Это жёсткое ограничение платформы. Рекомендуется отключить вывод размышлений и инструментов или включить функцию объединения сообщений, чтобы избежать превышения лимита и ошибок отправки.","wechatBotToken":"Bot Token","wechatBotTokenTooltip":"Bearer-токен, полученный после входа по QR-коду. Оставьте пустым для запуска процедуры входа при старте.","wechatBotTokenPlaceholder":"Заполняется автоматически после QR-входа или введите вручную","wechatBotTokenFile":"Путь к файлу токена","wechatBotTokenFileTooltip":"Путь для сохранения Bot Token. По умолчанию: ~/.qwenpaw/wechat_bot_token","wechatMediaDir":"Директория медиафайлов","wechatMessageMerge":"Объединение сообщений","wechatMessageMergeTooltip":"Объединяет несколько ответных сообщений для отправки меньшим количеством, чтобы не превышать лимит WeChat в 10 сообщений на context_token. При задержке 0 все текстовые ответы объединяются в одно сообщение в конце запроса. Положительная задержка (в мс) объединяет соседние сообщения в указанном временном окне.","wechatMessageMergeDelayMs":"Задержка объединения (мс)","wechatMessageMergeDelayMsTooltip":"Временное окно для объединения соседних сообщений. Значение 0 объединяет все сообщения в один финальный ответ. Положительное значение (напр. 1000) буферизует сообщения в течение указанного периода перед отправкой.","wechatMessageMergeDelayMsValidation":"Введите допустимое неотрицательное целое число","wechatScanLogin":"Войти через QR-код","wechatGetQrcode":"Получить QR-код для входа","wechatScanHint":"Отсканируйте QR-код в WeChat, затем нажмите Сохранить","wechatQrcodeFailed":"Не удалось получить QR-код, попробуйте снова","wechatLoginSuccess":"Вход через WeChat выполнен, токен заполнен","wechatQrcodeExpired":"QR-код истёк, получите новый","shareSessionInGroup":"Общий контекст в группе","
150shareSessionInGroupTooltip":"Если включено, все участники группы используют общий контекст разговора. Если выключено, у каждого участника независимый контекст.","accessControlEnabled":"Контроль доступа","accessControlEnabledTooltip":"При включении только пользователи из белого списка могут взаимодействовать с ботом. Неизвестным пользователям отображается их ID и они добавляются в список ожидания.","accessControlDm":"Контроль доступа в ЛС","accessControlDmTooltip":"При включении только пользователи из белого списка могут общаться с ботом в личных сообщениях","accessControlGroup":"Контроль доступа в группах","accessControlGroupTooltip":"При включении только пользователи из белого списка могут общаться с ботом в групповых чатах","dmDisabled":"Отключить ЛС","dmDisabledTooltip":"При включении бот будет полностью игнорировать все личные сообщения","groupDisabled":"Отключить группы","groupDisabledTooltip":"При включении бот будет полностью игнорировать все групповые сообщения","manageAccessControl":"Контроль доступа","pendingApprovals":"Ожидают одобрения","whitelist":"Белый список","blacklist":"Чёрный список","addUser":"Добавить","addUserPlaceholder":"Введите ID пользователя","userId":"ID пользователя","username":"Имя пользователя","channel":"Канал","firstMessage":"Первое сообщение","time":"Время","actions":"Действия","approve":"Белый список","deny":"Чёрный список","dismiss":"Отклонить","noWhitelistUsers":"Нет пользователей в белом списке","noBlacklistUsers":"Нет пользователей в чёрном списке","noPendingApprovals":"Нет ожидающих одобрения","userAdded":"Пользователь добавлен","userRemoved":"Пользователь удалён","approveSuccess":"Добавлен в белый список","denySuccess":"Добавлен в чёрный список","dismissSuccess":"Отклонено","operationFailed":"Операция не удалась","remark":"Примечание","usernamePlaceholder":"Введите имя пользователя (необязательно)","remarkPlaceholder":"Введите примечание (необязательно)","filterByChannel":"Фильтр по каналу","selectToOperate":"Выберите элементы для операции","selectedCount":"Выбрано: {{count}}","batchApprove":"Одобрить","batchDeny":"В чёрный список","batchDismiss":"Удалить","batchApproveConfirm":"Одобрить {{count}} пользователей?","batchDenyConfirm":"Добавить {{count}} пользователей в чёрный список?","batchDismissConfirm":"Удалить {{count}} пользователей?","batchSuccess":"{{count}} пользователей обработано","batchRemove":"Удалить","batchRemoveConfirm":"Удалить {{count}} выбранных пользователей?","enabledSection":"Активированные","enabledCount":"{{count}}","availableSection":"Доступные","enableAction":"Активировать","noEnabledChannels":"Нет активированных каналов","goEnableChannels":"Активировать каналы"}'),Dx={title:"Сессии",description:"Просмотр и управление активными чат-сессиÑ
150Ð¼Ð¸",loading:"Загрузка сессий...",confirmDelete:"Подтвердить удаление",deleteConfirm:"Вы уверены, что хотите удалить эту сессию?",batchDeleteConfirm:"Вы уверены, что хотите удалить выбранные сессии ({{count}})?",deleteSuccess:"Сессия успешно удалена",deleteFailed:"Не удалось удалить сессию",batchDeleteSuccess:"Успешно удалено сессий: {{count}}",batchDeleteFailed:"Не удалось массово удалить сессии",saveSuccess:"Сессия успешно сохранена",saveFailed:"Не удалось сохранить сессию",batchDeleteButton:"Массовое удаление",filterTitle:"Фильтр по названию",filterUserId:"Фильтр по ID пользователя",filterChannel:"Фильтр по каналу",allChannels:"Все каналы",totalItems:"Всего {{count}} элементов",selectedItems:"Выбрано {{count}} элементов",editSession:"Редактировать сессию",pleaseInputName:"Пожалуйста, введите название сессии",sessionNamePlaceholder:"Название сессии",activeTab:"Активные",archivedTab:"Архив",archivedAtColumn:"Дата архивации",archive:{action:"Архивировать",unaction:"Разархивировать",batchAction:"Архивировать выбранные",batchUnaction:"Разархивировать выбранные",success:"Чат архивирован",successHint:"Чат архивирован. Смотрите в Панель управления > Сессии > Архив.",failed:"Не удалось архивировать",unarchiveSuccess:"Чат разархивирован",unarchiveFailed:"Не удалось разархивировать",batchSuccess:"{{count}} чат(ов) архивировано",batchFailed:"Не удалось архивировать выбранные",batchUnarchiveSuccess:"{{count}} чат(ов) разархивировано",batchUnarchiveFailed:"Не удалось разархивировать выбранные",groupLabel:"Архив ({{count}})",modalTitle:"Архивированные чаты",unarchiveAll:"Разархивировать все",noArchived:"Нет архивированных чатов"}},xx={parent:"Настройки",environments:"Переменные окружения",title:"Переменные окружения",description:"Настройка переменных окружения (ключ-значение) для агентов и навыков.",key:"Ключ",value:"Значение",variableNamePlaceholder:"VARIABLE_NAME",valuePlaceholder:"value",insertRowBelow:"Вставить строку ниже",deleteRow:"Удалить строку",deleteVariable:"Удалить переменную",deleteConfirm:"Удалить «{{name}}»?",deleteSelected:"Удалить выбранные",deleteSelectedConfirm:"Удалить {{label}}
150?",keyRequired:"Ключ обязателен",invalidKeyFormat:"Неверный формат ключа",duplicateKey:"Дубликат ключа",saveSuccess:"Переменные окружения сохранены",saveFailed:"Не удалось сохранить",deleteSuccess:"«{{name}}» удалено",deleteFailed:"Не удалось удалить",noVariables:"Переменные окружения пока не настроены.",addVariable:"Добавить переменную",loading:"Загрузка…",retry:"Повторить",of:"из",selected:"выбрано",variable:"переменная",variables:"переменных",showValue:"Показать значение",hideValue:"Скрыть значение",searchPlaceholder:"Поиск переменных",liveSettings:"Настройки реального времени",noLiveVariables:"Нет изменяемых настроек, соответствующих фильтру.",customSettings:"Пользовательские переменные",noCustomVariables:"Пользовательские переменные пока не добавлены.",editVariable:"Изменить переменную",applyNow:"Применить",applyHint:"Текущий процесс QwenPaw обновится сразу. Работающие MCP необходимо перезагрузить.",applied:"Переменная окружения применена",appliedWithFailures:"Сохранено, но не удалось перезагрузить процессов MCP: {{count}}",resetVariable:"Сбросить переменную",resetSuccess:"Восстановлено системное значение или значение по умолчанию",readonlySettings:"Настройки только для чтения",noReadonlyVariables:"Нет настроек только для чтения, соответствующих фильтру.",impactTitle:"Влияние на процессы",explicitConsumers:"Процессов MCP, явно использующих переменную: {{count}}",implicitConsumers:"Процессов stdio MCP, которые могут унаследовать её: {{count}}",restartMode:"Работающие MCP",restartAffected:"Перезагрузить затронутые MCP",restartNone:"Не перезагружать",restartAllStdio:"Перезагрузить все stdio MCP",readonlyReason:{startup:"Определяется при запуске QwenPaw",agent_owned:"Управляется настройками каждого агента",initial_default:"Только начальное значение настройки агента"},mutabilityDescription:{hot_runtime:"Читается из текущего процесса QwenPaw в начале каждой операции.",hot_process:"Доступно через os.getenv() и наследуется будущими дочерними процессами.",startup_only:"Только для справки; нельзя изменить во время работы QwenPaw.",internal:"Управляется QwenPaw внутренне."},variableDescriptions:{QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT:"Максимальное ожидание первого значимого содержимого потока; 0 отключает контроль.",QWENPAW_LLM_STREAM_IDLE_TIMEOUT:"Максимальное ожидание между значимыми фрагментами потока; 0 отключает контроль."},source:{user:"QwenPaw",system:"Система",default:"По умолчанию"}},Rx={title:"Использование токенов",totalTokens:"Всего токенов",totalCalls:"Вызовы LLM",toolCalls:"Вызовы инструментов",llmAndToolTrend:"Динамика вызовов LLM и инструментов",llmAndToolTrendTooltip:"Ходы ассистента с метаданными usage и намерения вызова инструментов по всем агентам. Это не Total Calls (сырые API-вызовы);
150 в старых сессиях ходы могут быть 0.",llmAndToolTrendLoadFailed:"Не удалось загрузить динамику вызовов LLM и инструментов",recordedTurnsAllAgents:"Вызовы LLM",byAgent:"По агентам",agent:"Агент",unattributed:"Без атрибуции",promptTokens:"Входные токены",completionTokens:"Выходные токены",cacheRead:"Токены попадания в кэш",cacheHitRate:"Попадание в кэш",byModel:"По модели",byDate:"По дате",model:"Модель",date:"Дата",loadFailed:"Не удалось загрузить данные об использовании токенов",noData:"Нет данных об использовании токенов за выбранный период",modelTrend:"Тренд использования моделей",tokenTypeChart:"Тренд типов токенов",selectAll:"Выбрать все",allSelected:"Все",itemsSelected:"Выбрано: {{count}}",selectModels:"Выберите модели",selectTokenTypes:"Выберите типы токенов"},Ix={title:"Статистика агента",totalSessions:"Всего сессий",totalMessages:"Всего сообщений",userMessages:"Сообщения пользователя",assistantMessages:"Сообщения ассистента",promptTokens:"Входные токены",totalInputTokens:"Всего входных токенов",completionTokens:"Выходные токены",toolCalls:"Вызовы инструментов",newSessions:"Новые сессии",activeSessions:"Активные сессии",messageTrend:"Динамика сообщений",sessionTrend:"Динамика сессий",tokenTrend:"Динамика токенов",llmAndToolTrend:"Динамика вызовов LLM и инструментов",sessionsByChannel:"Сессии по каналам",messagesByChannel:"Сообщения по каналам",totalSessionsTooltip:"Всего созданных чат-сессий. Каждая сессия — независимый контекст разговора",totalMessagesTooltip:"Всего сообщений во всех сессиях, включая сообщения пользователя и ассистента",toolCallsTooltip:"Количество решений агента вызвать инструмент. Один вызов LLM может породить несколько намерений использования инструментов",messageTrendTooltip:"Сравнение сообщений пользователя и ассистента по дням",sessionTrendTooltip:"Сравнение новых и активных сессий по дням. Оранжевые столбцы — созданные в этот день сессии, синие — сессии с сообщениями в этот день",llmAndToolTrendTooltip:"Сравнение LLM-ходов текущего агента и намерений использования инструментов",sessionsByChannelTooltip:"Распределение сессий по каналам. Сессии без канала по умолчанию группируются в Console",messagesByChannelTooltip:"Распределение общего количества сообщений по каналам",currentAgentLlmCalls:"Записанные ходы",currentAgentTokenTrendTooltip:"Динамика входных, выходных и попавших в кэш токенов текущего агента по метаданным за ход; токены попадания в кэш входят во входные токены",currentAgentPromptTokensTooltip:"Промпт-токены текущего агента по его сессиям за выбранный период (нужны метаданные использования за ход; в старых сессиях может быть 0)",currentAgentCacheHitRateTooltip:"Взвешенная по токенам доля попаданий в кэш для наблюдаемых вызовов текущего агента за выбранный период (токены попадания в кэш / кэшируемые входные токены; — если данных нет)",currentAgentCompletionTokensTooltip:"Токены завершения текущего агента по его сессиÑ
150Ð¼ за выбранный период (нужны метаданные использования за ход; в старых сессиях может быть 0)",currentAgentLlmCallsTooltip:"Число ходов ассистента с записанными метаданными использования у текущего агента (не число сырых API-вызовов; в старых сессиях может быть 0)",loadFailed:"Не удалось загрузить статистику",noData:"Нет статистических данных за выбранный период",retry:"Повторить"},_x={selectModel:"Выбрать модель",noConfiguredModels:"Нет настроенных моделей",noFreeModels:"Нет доступных бесплатных моделей",switchFailed:"Не удалось переключить модель",searchModels:"Поиск моделей...",noModelsFound:"Подходящие модели не найдены",free:"Бесплатно",vision:"Видение",freeBannerText:"Бесплатные модели могут иметь лимиты использования и работать нестабильно. Подробности уточняйте у провайдера.",moreProviders:"Больше бесплатных провайдеров (нужен API Key)",proBannerText:"Показаны модели, настроенные в разделе Настройки.",connectToUse:"Подключить {{provider}} для бесплатных моделей",configureApiKey:"Настроить API Key {{provider}} для бесплатных моделей",configureApiKeyTitle:"Перейти к настройке",configureApiKeyConfirm:"Вы будете перенаправлены на страницу моделей для настройки API Key {{provider}}. Продолжить?",goToConfigure:"Перейти",noModelsDiscovered:"Подключено. Загрузка моделей...",oauthTitle:"Подключиться к {{provider}}",oauthDescription:"Откроется новое окно браузера для авторизации доступа к {{provider}}. API-ключ будет сохранён автоматически.",oauthContinue:"Продолжить",oauthWaiting:"Ожидание авторизации...",oauthWaitingDescription:"Пожалуйста, завершите авторизацию в окне браузера.",oauthConnected:"Успешно подключено к {{provider}}",oauthFailed:"Авторизация не удалась, попробуйте снова",oauthTimeout:"Время авторизации истекло, попробуйте снова",viewMore:"Показать ещё ({{count}})"},Lx=JSON.parse('{"discoveryOriginApi":"Обнаружено через API","discoveryOriginCatalog":"Официальный каталог","discoveryOriginBoth":"API + каталог","availabilityAvailable":"Доступна","availabilityPermissionDenied":"Нет доступа","availabilityNotFound":"Не найдена","availabilityIncompatible":"Несовместима с чатом","availabilityRateLimited":"Ограничение частоты","availabilityTransientError":"Временно недоступна","availabilityUnverified":"Не проверена","modelAlreadyConfigured":"Настроена","llmConfiguration":"Конфигурация LLM","providersTitle":"Провайдеры","providersDescription":"Настройте API-ключи и endpoints для каждого провайдера.","llmTitle":"Модели","defaultLlm":"LLM по умолчанию","llmDescription":"Здесь задается глобальная модель LLM по умолчанию у авторизованного провайдера. Для конкретного Agent модель можно выбрать отдельно на странице Chat.","configureProvider":"Настроить {{name}}","baseURL":"Базовый URL","apiKey":"API-ключ","advancedConfig":"Расширенная конфигурация","authMode":"Режим аутентификации","authModeApiKey":"API Key (x-api-key)","authModeAuthToken":"Auth Token (Authorization: Bearer)","customHeaders":"Пользовательские заголовки","customHeadersHint":"Добавляются к каждому запросу API, например x-app: cli","customHeaderKey":"Название заголовка","customHeaderValue":"Значение заголовка","addHeader":"+ Добавить заголовок","generateConfig":"Параметры генерации","generateConfigHint":"Параметры генерации в формате JSON будут развёрнуты и переданы в запрос на генерацию (`openai.chat.completions` или `anthropic.messages`).","generateConfigInvalidJson":"Пожалуйста, введите корректный JSON","generateConfigMustBeObject":"Параметры генерации должны быть JSON-объектом","modelAdvancedConfig":"Расширенная конфигурация модели","modelGenerateConfig":"Параметры генерации модели","modelGenerateConfigHint":"Параметры генерации в формате JSON для этой модели. Они будут развёрнуты и переданы в запрос на генерацию. Имеют приоритет над расширенной конфигурацией провайдера.","modelConfigSaved":"Конфигурация модели {{name}} сохранена","modelConfigSaveFailed":"Не удалось сохранить конфигурацию модели","modelConfigLabel":"Конфигурация модели","maxTokensLabel":"Макс. токенов","maxTokensHint":"Максимальное количество выходных токенов на ответ","maxInput
150LengthLabel":"Макс. длина контекста","maxInputLengthHint":"Размер контекстного окна модели, управляет порогом сжатия контекста (≥1000)","relayReasoningLabel":"Передавать рассуждения","relayReasoningHint":"Передавать содержимое рассуждений в последующие ходы диалога","thinkingModeLabel":"Включить мышление","thinkingModeHint":"Включите для активации мышления/рассуждения. Выключите для отключения мышления.","thinkingBudgetLabel":"Бюджет мышления","thinkingBudgetHint":"Используется бюджет мышления по умолчанию","switchToManual":"Вручную","switchToAuto":"Авто","reasoningEffortLabel":"Глубина рассуждения","reasoningEffortHint":"Управляет глубиной рассуждения (семейство OpenAI)","protocol":"Протокол","protocolHint":"Выберите протокол API провайдера для этой конфигурации.","selectProtocol":"Пожалуйста, выберите протокол","protocolOpenAI":"OpenAI-совместимый (Chat Completions)","protocolOpenAIResponse":"OpenAI-совместимый (Response API)","protocolAnthropic":"Anthropic (Messages API)","currentKey":"Текущий: {{key}}","startsWith":"Начинается с «{{prefix}}»","optionalSelfHosted":"Необязательно для self-hosted сервисов","leaveBlankKeep":"Оставьте пустым, чтобы сохранить текущий ключ","enterApiKey":"Введите API-ключ ({{prefix}}...)","enterApiKeyOptional":"Введите API-ключ (необязательно)","openAIEndpoint":"OpenAI endpoint, например https://api.openai.com/v1","openAICompatibleEndpoint":"OpenAI-совместимый endpoint, например https://api.example.com (добавляйте /v1 только если ваш провайдер этого требует)","azureEndpointHint":"Azure OpenAI endpoint, например https://<resource>.openai.azure.com/openai/v1","anthropicEndpointHint":"Anthropic endpoint, например https://api.anthropic.com","ollamaEndpointHint":"Ollama endpoint, например http://localhost:11434","lmstudioEndpointHint":"LM Studio endpoint, например http://localhost:1234/v1","apiEndpointHint":"API endpoint, например https://api.example.com","pleaseEnterBaseURL":"Пожалуйста, введите базовый URL API","selectBaseURL":"Выберите базовый URL","selectBaseURLHint":"Выберите региональную конечную точку этого провайдера","pleaseEnterValidURL":"Пожалуйста, введите корректный URL","apiKeyShouldStart":"API-ключ должен начинаться с «{{prefix}}»","configurationSaved":"Конфигурация {{name}} сохранена","failedToSaveConfig":"Не удалось сохранить конфигурацию","revokeAuthorization":"Отозвать авторизацию","revokeConfirmContent":"Вы уверены, что хотите удалить API-ключ для {{name}}? Текущая конфигурация LLM-модели также будет очищена.","revokeConfirmSimple":"Вы уверены, что хотите удалить API-ключ для {{name}}?","authorizationRevoked":"Авторизация {{name}} отозвана, LLM-модель очищена","authorizationRevokedSimple":"Авторизация {{name}} отозвана","failedToRevoke":"Не удалось отозвать авторизацию","active":"Активно: {{provider}} / {{model}}","provider":"Провайдер","model":"Модель","selectProvider":"Выберите провайдера (должен быть авторизован)","selectModel":"Выберите модель","llmModelUpdated":"LLM-модель обновлена","failedToSave":"Не удалось сохранить","freeModelWarningTitle":"Уведомление о бесплатной модели","freeModelWarningMessage":"Бесплатные модели могут работать нестабильно. Подробности смотрите в условиях провайдера:","freeModelWarningDontShowAgain":"Больше не показывать","saved":"Сохранено","save":"Сохранить","cancel":"Отмена","loading":"Загрузка...","retry":"Повторить","notSet":"Не задано","notRequired":"Не требуется","available":"Доступно","unavailable":"Недоступно","providerAvailable":"Готово (есть модели)","providerNoModels":"Не готово (нет моделей)","search":"Поиск","searchPlaceholder":"Поиск провайдеров...","searchModelPlaceholder":"Поиск моделей...","providerNotConfigured":"Не готово (не настроено)","settings":"Настройки","actions":"Действия","custom"
150:"Пользовательский","builtin":"Встроенный","freeTierGroup":"Бесплатный уровень","paidGroup":"Платные","localCustomGroup":"Локальные и пользовательские","endpointCount":"{{count}} конечных точек","connect":"OAuth","saveApiKey":"Сохранить","addProvider":"Добавить провайдера","addProviderTitle":"Добавить пользовательского провайдера","providerIdLabel":"ID провайдера","providerIdPlaceholder":"например: openai, google, anthropic","providerIdHint":"Строчные буквы, цифры, дефисы и подчёркивания. Нельзя изменить позже.","providerNameLabel":"Отображаемое имя","providerNamePlaceholder":"например: OpenAI, Google Gemini","defaultBaseUrlLabel":"Базовый URL по умолчанию","defaultBaseUrlPlaceholder":"например: https://api.example.com","apiKeyPrefixLabel":"Префикс API-ключа (необязательно)","apiKeyPrefixPlaceholder":"например: sk-","providerCreated":"Провайдер «{{name}}» создан","providerCreateFailed":"Не удалось создать провайдера","deleteProvider":"Удалить провайдера","deleteProviderConfirm":"Удалить пользовательского провайдера «{{name}}» и все его модели? Это действие нельзя отменить.","providerDeleted":"Провайдер «{{name}}» удалён","providerDeleteFailed":"Не удалось удалить провайдера","manageModels":"Модели","models":"Модели","manageModelsTitle":"{{provider}} — Управление моделями","userAdded":"Добавлено пользователем","addModel":"Добавить модель","addModels":"Добавить модели","autoDiscoverModels":"Автообнаружение моделей","addModelTitle":"Добавить модель в {{provider}}","modelIdLabel":"ID модели","modelIdPlaceholder":"например: gpt-4o, gemini-2.0-flash","modelDiscoveryUnavailableHint":"Доступные модели не найдены. Возможно, этот провайдер не поддерживает получение списка моделей, поэтому введите ID модели вручную.","modelNameLabel":"Название модели","modelNameRequired":"Пожалуйста, введите название модели","modelNamePlaceholder":"например: GPT-4o, Gemini 2.0 Flash","modelAdded":"Модель «{{name}}» добавлена","modelAddFailed":"Не удалось добавить модель","modelAlreadyExists":"Модель с ID \\"{{id}}\\" уже существует","autoDiscoverModelsSuccess":"Автообнаружение завершено. Добавлено моделей: {{count}}","autoDiscoverModelsNoNew":"Автообнаружение завершено. Новых моделей не найдено","autoDiscoverModelsFailed":"Не удалось автоматически обнаружить модели","removeModel":"Удалить","removeModelConfirm":"Удалить модель «{{name}}» из {{provider}}?","modelRemoved":"Модель «{{name}}» удалена","modelRemoveFailed":"Не удалось удалить модель","loadMore":"Загрузить ещё ({{count}})","modelsCount":"{{count}} моделей","noModels":"Нет моделей","addModelFirst":"Сначала добавьте модель","modelList":"Список моделей","clearAll":"Очистить всё","filteredModelsLoaded":"Загружено отфильтрованных моделей: {{count}}","filterFailed":"Не удалось отфильтровать модели","clearAllModels":"Очистить все модели","clearAllModelsConfirm":"Удалить все дополнительные модели (всего {{count}})? Это действие нельзя отменить.","allModelsCleared":"Число удаленных моделей: {{count}}","filterModels":"Фильтровать модели","filterByProvider":"Провайдер:","searchProviderPlaceholder":"Поиск по Ð
150½Ð°Ð·Ð²Ð°Ð½Ð¸ÑŽ провайдера","selectAllProviders":"Выбрать все","clearProviderSelection":"Снять все","noMatchingProviders":"Нет подходящих провайдеров","filterByModality":"Модальность ввода:","filterFreeOnly":"Только бесплатные модели:","getModels":"Получить модели","discovered":"Доступные модели:","add":"Добавить","local":"Локальные","localType":"Тип","localEmbedded":"Встроенная (в процессе)","localDownloadFirst":"Сервис модели не запущен","localDownloadModel":"Скачать модель","localModelsTitle":"{{provider}} — Локальные модели","localNoModels":"Пока нет скачанных моделей","localRepoId":"ID репозитория модели","localRepoIdRequired":"Пожалуйста, введите ID репозитория модели","localRepoIdPlaceholder":"например: Qwen/Qwen3-0.6B-GGUF","localFilename":"Имя файла (необязательно)","localFilenamePlaceholder":"например: mistral-7b.Q4_K_M.gguf","localFilenameHint":"Оставьте пустым для автоматического выбора лучшей квантизации","localSource":"Источник","localDownloadSuccess":"Модель успешно скачана","localDownloadFailed":"Не удалось скачать модель","localDeleteModel":"Удалить модель","localDeleteConfirm":"Удалить локальную модель «{{name}}»? Файл модели будет удалён с диска.","localModelDeleted":"Модель «{{name}}» удалена","localDeleteFailed":"Не удалось удалить модель","localDownloadPending":"Подготовка к загрузке...","localDownloading":"Загрузка {{repo}}... Это может занять несколько минут.","localDownloadNavigateHint":"Вы можете перейти на другую страницу — загрузка продолжится в фоне.","localDownloadInProgress":"Загрузка уже выполняется","localDownloaded":"Загружено","localNotDownloaded":"Не загружено","localNoRecommendedModels":"Текущая конфигурация устройства слишком слабая для запуска локальных моделей","localCancelDownloadTitle":"Отменить загрузку","localCancelDownloadAction":"Отменить загрузку","localCancelDownloadConfirm":"Отменить загрузку «{{repo}}»?","localDownloadCancelled":"Загрузка отменена","localCancelDownloadFailed":"Не удалось отменить загрузку","localLlamacppName":"Движок инференса","localLlamacppInstallHint":"Сначала установите локальную среду, затем можно скачивать или запускать модель.","localInstallLlamacpp":"Установить llama.cpp","localLlamacppInstallStarted":"Загрузка llama.cpp началась","localLlamacppInstallSuccess":"llama.cpp успешно установлен","localLlamacppInstallFailed":"Не удалось установить llama.cpp","localRuntimeSectionTitle":"Inference Engine","localRuntimeSectionDescription":"Powered by Llama.cpp","localRuntimeComputeHint":"По умолчанию используется CPU. Если нужна GPU-акселерация, используйте Ollama или LM Studio.","localRuntimeInstalled":"Установлен","localRuntimeUpdateAvailable":"Доступно обновление","localRuntimeUpdateAction":"Нажмите, чтобы скачать последнюю версию","localRuntimeUpdateConfirmTitle":"Подтвердите обновление llama.cpp","localRuntimeUpdateConfirmContent":"Обновление перезапишет текущую установленную версию llama.cpp. Подтвердите, чтобы начать загрузку и установку последней версии.","localRuntimeUpdate
150ConfirmContentWithServer":"Обновление перезапишет текущую установленную версию llama.cpp и остановит запущенный сервис модели ({{model}}). Подтвердите, чтобы начать загрузку и установку последней версии.","localRuntimeUnsupported":"Не поддерживается","localRuntimeMissing":"Не установлен","localServerRunningTitle":"Текущий локальный сервер","localServerOnline":"Работает","localServerIdle":"Недоступен","localServerUnavailable":"Ошибка","localNoActiveModel":"Нет активной модели","localNoDownloadedModelsHint":"Сначала скачайте подходящую модель, а затем запускайте локальный сервис инференса.","localDownloadModelFirst":"Сначала скачайте модель","localEngineInstallStateLabel":"Установка","localEngineRunStateLabel":"Статус","localEngineCurrentModelLabel":"Текущая обслуживаемая модель","localEngineNextStepLabel":"Следующий шаг","localEngineHealthLabel":"Состояние движка","localEngineStatusHint":"Скачайте и запустите подходящую модель из списка ниже","localStartServer":"Запустить","localStopServer":"Остановить","localServerStartFailed":"Не удалось запустить локальный сервер","localServerStopFailed":"Не удалось остановить локальный сервер","localServerSwitchTitle":"Переключить запущенную модель","localServerSwitchConfirm":"Сейчас запущена модель {{current}}. Переключить на {{next}}?","localSwitchModel":"Переключить","localModelPathMissing":"Для этой загруженной модели отсутствует локальный путь.","localModelsSectionTitle":"Локальные модели","localModelsSectionDescription":"Загруженные модели можно запускать сразу. Одновременно может выполняться только одна загрузка модели и один локальный сервер.","localModelsLockedHint":"Сначала установите llama.cpp","localAlternativeRuntimeHint":"Попробуйте использовать Ollama или LM Studio","localModelsCount":"Загружено {{downloaded}} / {{total}}","localCurrentDownloadTitle":"Текущая загрузка","localAdvancedConfigTitle":"Расширенные настройки локальной модели","localAdvancedConfigDescription":"Эти настройки применяются к встроенному локальному рантайму инференса. Изменения максимальной длины контекста вступят в силу при следующем запуске локального сервера.","localAdvancedConfigSaved":"Расширенные настройки локальной модели сохранены","localAdvancedConfigSaveFailed":"Не удалось сохранить расширенные настройки локальной модели","localMaxContextLengthLabel":"Макс. длина контекста","localMaxContextLengthHint":"Максимальное число токенов в контекстном окне модели, определяющее, сколько истории помещается в каждый запрос. Изменения вступят в силу при следующем запуске локального сервера.","localMaxContextLengthRequired":"Укажите макс. длину контекста","localMaxContextLengthMin":"Макс. длина контекста должна быть не меньше {{min}}","localMaxContextLengthPlaceholder":"Введите макс. длину контекста","localServerPortLabel":"Порт сервера","localServerPortHint":"Оставьте поле пустым, чтобы llama.cpp автоматически выбрал свободный порт при запуске. Укажите порт, если хотите использовать фиксированный порт при следующих запусках. Изменения вступят в силу при следующем запуске локального сервера.","localServerPortRange":"Порт сервера должен быть в диапазоне от {{min}} до {{max}}","localServerPortPlaceholder":"Оставьте пустым для автовыбора порта","localGenerateConfigHint":"Настройте параметры генерации локальной модели в виде JSON-объекта. Они будут развёрнуты в последующие запросы генерации.","localCustomModelTitle":"Загрузка пользовательской модели","localCustomModelHint":"Введите ID репозитория модели. Поддерживается только GGUF.","localSourceHuggingFace":"Hugging Face","localSourceModelScope":"ModelScope","ollamaModelNamePlaceholder":"например: mistral:7b, qwen3:8b","testConnection":"Проверить подключение","testConnectionSuccess":"Проверка подключения прошла успешно","testConnectionFailed":"Проверка подключения не удалась","testConnectionFailedWithMessage":"Проверка подключения не удалась: {{message}}","testConnectionError":"Произошла ошибка при проверке подключения","discoverModels":"Обнаружить модели","discoverModelsFailed":"Не удалось обнаружить модели","ollamaFetchModelsFailed":"Не удалось получить список моделей Ollama. Проверьте подробности ошибки.","modelTestFailed":"Проверка модели не пройдена, проверьте корректность ID модели","modelTestFailedConfirm":"Тест подключения модели не пройден: {{message}}. Всё равно добавить эту модель?","autoDiscoveredAndAdded":"Автоматически обнаружено {{count}} моделей и добавлено {{added}} новых","autoDiscoveredNoNew":"Автоматически обнаружено {{count}} моделей; список моделей уже актуален","autoDiscoverFailed":"Автоматическое обнаружение моделей не удалось; вы можете добавить модели вручную","tagImage":"Изображение","tagVideo":"Видео","tagTextOnly":"Только текст","tagMultimodal":"Мультимодальность","tagVision":"Зрение","tagText":"Текст","free":"Бесплатно","tagNotProbed":"Не проверено","probeMultimodal":"Тест мультимодальности","probeImage":"Изображение","probeVideo":"Видео","probeSupported":"Поддерживается: {{types}}","probeNotSupported":"Эта модель не поддерживает мультимодальный ввод","probeFailed":"Ошибка проверки","modalityVision":"Изображение","modalityAudio":"Аудио","modalityVideo":"Видео","modalityFile":"Файл","modalityText":"Только текст","perMillionIn":"/1M вх.","perMillionOut":"/1M исх."}'),Ex={title:"Файлы",navigator:"Навигатор файлов",source:"Источник",workspace:"Рабочее пространство",profile:"Профиль",memory:"Долговременная память",daily:"Дневник",digest:"База знаний",memoryGraph:"Граф памяти",memoryGraphShort:"Граф",memoryGraphLoading:"Загрузка графа памяти…",memoryGraphLoadFailed:"Не удалось загрузить граф памяти.",memoryGraphCounts:"Узлов: {{nodes}} · связей: {{edges}}",memoryGraphEmpty:"Индексированные связи памяти отсутствуют.",memoryGraphZoomOut:"Уменьшить",memoryGraphZoomIn:"Увеличить",memoryGraphFit:"Показать весь граф",memoryGraphRoot:"Корневой узел",memoryGraphRootDirect:"Связанный файл",memoryGraphOtherFile:"Другой файл",memoryGraphIndexed:"Индексированный файл",memoryGraphUnresolved:"Неразрешённая ссылка",memoryGraphDirection:"Направление Wiki-ссылки",memoryGraphOpenFile:"Открыть Markdown",memoryGraphOutbound:"Исходящие · {{count}}
150",memoryGraphInbound:"Входящие · {{count}}",projectDirectory:"Каталог проекта",workspaceDirectory:"Каталог конфигурации",switchRoot:"Переключить каталог",manageDirs:"Управление каталогами…",primaryRoot:"Основной",rootMissing:"Отсутствует",rootsPending:"Ещё {{count}} станут доступны после первого сообщения",sourceEmpty:"В этом источнике пока нет файлов.",loadMore:"Загрузить следующие 200",upload:"Загрузить файлы",conflictPolicy:"Политика конфликтов загрузки",conflictRename:"Сохранить оба",conflictRenameDescription:"Добавить номер к новому имени и сохранить существующий файл.",conflictSkip:"Сохранить существующий",conflictSkipDescription:"Пропустить новые файлы с конфликтом и загрузить остальные.",conflictOverwrite:"Использовать новый",conflictOverwriteDescription:"Заменить существующий файл новым.",uploadConflictTitle:"Найдены файлы с одинаковыми именами",uploadConflictDescription:"Эти файлы уже существуют: {{files}}. Выберите действие.",promptToggle:"Включить или исключить {{name}} из системного промпта",addSystemPrompt:"Добавить из рабочей области",addSystemPromptTitle:"Добавить файл системного промпта",addSystemPromptDescription:"Выберите Markdown-файл рабочей области для системного промпта.",searchSystemPromptFiles:"Поиск Markdown-файлов рабочей области",noSystemPromptCandidates:"Подходящих файлов нет.",sourceControl:"Управление исходным кодом",preview:"Предпросмотр",edit:"Изменить",selectFile:"Выберите файл для открытия",closeTab:"Закрыть вкладку",closeOtherTabs:"Закрыть другие вкладки",closeAllTabs:"Закрыть все вкладки",openFiles:"Открытые файлы: {{count}}",openFilesLabel:"Открытые файлы",openFileCount:"Открыто: {{count}}",searchOpenFiles:"Поиск по файлу или пути",noOpenFilesFound:"Открытые файлы не найдены",scrollTabsLeft:"Прокрутить вкладки влево",scrollTabsRight:"Прокрутить вкладки вправо",agentChangedFile:"Агент изменил этот файл",keep:"Сохранить",keepAll:"Сохранить всё",undo:"Отменить",undoAll:"Отменить всё",copySelectionToChat:"Копировать выделение в чат",copyFileToChat:"Копировать файл в чат",previewSize:"Предпросмотр · {{size}} байт",backToPreview:"Назад к предпросмотру",download:"Скачать",downloadFailed:"Не удалось скачать файл",resize:"Изменить ширину панели файлов",loadFailed:"Не удалось загрузить файл. Убедитесь, что он находится в основном рабочем каталоге рабочей области текущего агента.",previewUnavailable:"Предпросмотр недоступен. Метаданные и скачивание остаются доступны.",mentionInChat:"Упомянуть в чате",expandWorkspace:"Развернуть пространство",openWorkspace:"Открыть рабочее пространство",closeWorkspace:"Закрыть рабочее пространство"},Fx={agentTitle:"Каталог проекта агента",sessionTitle:"Каталог проекта сеанса",pathPlaceholder:"Введите абсолютный путь",recentProjects:"Недавние проекты",browseDirectory:"Обзор каталогов",noRecentProjects:"Нет недавних проектов",clearSelection:"Очистить выбранный проект",homeDirectory:"Домашний каталог",parentDirectory:"Родительский каталог",refreshDirectory:"Обновить каталог",restoreDefault:"Сбросить к умолчанию",createDirectory:"Создать папку",directoryNamePlaceholder:"Введите имя папки",createDirectoryFailed:"Не удалось создать папку",useWorkspace:"Использовать каталог конфигурации",createSessionHint:"Каталог сеанса можно задать после первого сообщения.",sessionSource:"Сеанс",agentSource:"Агент",makePrimary:"Сделать основным",remove:"Удалить",add:"Добавить",boundDirs:"Добавленные каталоги проекта",primaryHint:"Вызовы инструментов и команды по умолчанию выполняются в основном каталоге.",primaryTag:"Основной",unbound:"Каталоги не привязаны",unavailable:"Отсутствует",alreadyBound:"Уже привязан",tooMany:"Можно привязать не более {{max}} каталогов.",countTitle:"Число привязанных каталогов"},Ox=JSON.parse('{"title":"Конфигурация","projectDirectoryTitle":"Каталог проекта по умолчанию","projectDirectoryDescription":"Каталог по умолчанию для файлов и команд.","projectDirectoryDefault":"По умолчанию для агента","changeProjectDirectory":"Изменить каталог","projectDirectoryWorkspaceFallback":"Используется пространство агента","enhancedCodeCapability":"Расширенные возможности кода","enhancedCodeCapabilityTooltip":"Добавляет инструменты кода без смены каталога проекта.","enhancedCodeCapabilityDescription":"Включает AST, LSP, кодовые подсказки, Git-контекст и управление исходным кодом.","description":"Настройка параметров выполнения агента","reactAgentTitle":"Агент ReAct","llmRetryTitle":"Автоповтор LLM","llmRetryEnabled":"Включить автоповтор","llmRetryEnabledTooltip":"Автоматически повторять временные ошибки LLM API, такие как лимиты, таймауты и проблемы соединения. Применяется к новым запросам после сохранения.","llmMaxRetries":"Макс. число повторов","llmMaxRetriesTooltip":"Максимальное количество дополнительных повторов при временной ошибке LLM.","llmMaxRetriesPlaceholder":"Введите макс. число повторов","llmMaxRetriesRequired":"Требуется указать макс. число повторов","llmMaxRetriesMin":"Макс. число повторов должно быть не меньше 1","llmBackoffBase":"Базовая задержка backoff (с)","llmBackoffBaseTooltip":"Базовая задержка перед первой повторной попыткой. Дальше используется экспоненциальный backoff.","llmBackoffBasePlaceholder":"Введите базовую задержку","llmBackoffBaseRequired":"Требуется указать базовую задержку backoff","llmBackoffBaseMin":"Базовая задержка backoff должна быть не меньше 0.1 секунды","llmBackoffCap":"Макс. задержка backoff (с)","llmBackoffCapTooltip":"Максимальный предел задержки для экспоненциального backoff.","llmBackoffCapPlaceholder":"Введите макс. задержку","llmBackoffCapRequired":"Требуется указать макс. задержку backoff","llmBackoffCapMin":"Макс. задержка backoff должна быть не меньше 0.5 секунды","llmBackoffCapGteBase":"Макс. задержка backoff должна быть не меньше базовой задержки","llmRateLimiterTitle":"Ограничитель скорости LLM","llmMaxConcurrent":"Макс. одновременных запросов","llmMaxConcurrentTooltip":"Максимальное число одновременно выполняемых LLM-запросов. Общее для всех агентов; вступает в силу при первой инициализации и после перезапуска.","llmMaxConcurrentPlaceholder":"Введите макс. число одновременных запросов","llmMaxConcurrentRequired":"Требуется указать макс. число одновременных запросов","llmMaxConcurrentRange":"Макс. число одновременных запросов должно быть не менее 1","llmMaxQpm":"Макс. запросов в минуту (QPM)","llmMaxQpmTooltip":"Максимальное число запросов в 
15060-секундном скользящем окне. Запросы, превышающие лимит, ожидают перед отправкой — это предотвращает ошибки 429. 0 = без ограничений.","llmMaxQpmPlaceholder":"Введите макс. QPM (0 = без ограничений)","llmMaxQpmRequired":"Требуется указать макс. QPM","llmMaxQpmRange":"Макс. QPM должен быть не менее 0","llmRateLimitPause":"Пауза при лимите (с)","llmRateLimitPauseTooltip":"Длительность паузы (в секундах) при получении ответа 429. Переопределяется заголовком Retry-After от API.","llmRateLimitPausePlaceholder":"Введите длительность паузы","llmRateLimitPauseRequired":"Требуется указать паузу при лимите","llmRateLimitPauseMin":"Пауза при лимите должна быть не менее 1 секунды","llmRateLimitJitter":"Диапазон джиттера (с)","llmRateLimitJitterTooltip":"Случайный диапазон джиттера (в секундах), добавляемый к паузе для разбивки одновременных пробуждений.","llmRateLimitJitterPlaceholder":"Введите диапазон джиттера","llmRateLimitJitterRequired":"Требуется указать диапазон джиттера","llmRateLimitJitterMin":"Диапазон джиттера должен быть не менее 0 секунд","llmAcquireTimeout":"Таймаут получения слота (с)","llmAcquireTimeoutTooltip":"Максимальное время ожидания слота ограничителя скорости перед ошибкой.","llmAcquireTimeoutPlaceholder":"Введите таймаут получения слота","llmAcquireTimeoutRequired":"Требуется указать таймаут получения слота","llmAcquireTimeoutMin":"Таймаут получения слота должен быть не менее 10 секунд","llmAcquireTimeoutGtPauseJitter":"Таймаут получения слота должен быть больше суммы паузы и джиттера","contextManagementTitle":"Управление контекстом","memoryManagerBackend":"Бэкенд управления долговременной памятью","memoryManagerBackendTooltip":"Тип бэкенда менеджера памяти. Выберите remelight (локальные файлы), adbpg (облачная база данных), PowerContext (удалённый сервис памяти) или none (отключить память).","memoryManagerBackendRestartWarning":"Смена бэкенда управления долговременной памятью не поддерживает горячую перезагрузку. Сохраните и перезапустите QwenPaw для применения изменений.","maxIters":"Макс. итераций","maxItersTooltip":"Максимальное число итераций рассуждение-действие для агента ReAct","maxItersPlaceholder":"Введите макс. число итераций","maxItersRequired":"Требуется указать макс. число итераций","maxItersMin":"Макс. число итераций должно быть не меньше 1","agentLoopTitle":"Настройки Loop агента","loopMode":{"builtIn":"Встроенный","builtInNote":"Порядок заблокирован · Значения доступны","templateSectionTitle":"Шаблоны Loop","templateSectionDescription":"Выберите встроенный шаблон или добавьте свой.","defaultTab":"По умолчанию","goalTab":"Цель","missionTab":"Миссия","defaultDescription":"Стандартный защищённый ReAct Loop вне явного режима.","goalDescription":"Ограниченный постоянный Loop для проверяемых целей.","missionDescription":"Постоянный процесс для длительных многоэтапных миссий.","gatePipeline":"Цепочка Gate","repetitionTitle":"Защита от повторов","repetitionDescription":"Обнаруживает повторные вызовы инструментов и вмешивается.","iterationTitle":"Лимит итераций","iterationDescription":"Ограничивает число итераций ReAct.","retryTitle":"Качественная проверка завершения","retryDescription":"Срабатывает только для текстового ответа без вызовов инструментов.","goalTurnTitle":"Лимит ходов цели","goalTurnDescription":"Ограничивает ходы внутри активной цели.","maxGoalTurns":"Максимум ходов цели","goalBudgetTitle":"Бюджет токенов цели","goalBudgetDescription":"Останавливает цель при достижении бюджета.","maxGoalTokens":"Максимум токенов цели","goalCompletionTitle":"Проверка завершения цели","goalCompletionDescription":"Читает явный статус цели перед остановкой.","goalCompletionReadOnly":"Завершение контролируется встроенным протоколом цели.","missionProgressTitle":"Проверка прогресса миссии","missionProgressDescription":"Продолжает до успеха всех историй или лимита.","missionProgressReadOnly":"Завершение определяется встроенным статусом Mission Story.","missionIterationTitle":"Лимит итераций Mission","missionIterationDescription":"Задайте стандартный лимит выполнения для новых Mission.","workerAttemptsTitle":"Попытки Worker","workerAttemptsDescription":"Ограничьте повторы Worker после неудачной проверки Story.","missionVerificationTitle":"Политика проверки Mission","missionVerificationDescription":"Задайте стандартные инструкции проверки и тестовую команду.","defaultMaxMissionIterations":"Максимум раундов выполнения по умолчанию","defaultMaxMissionIterationsTooltip":"Используется, если /mission не задаёт --max-iterations.","maxRetriesPerStory":"Максимум повторов для Story","maxRetriesPerStoryTooltip":"Повторы Worker после результата FAIL или PARTIAL от Verifier.","defaultVerificationInstructions":"Инструкции по проверке (необязательно)","defaultVerificationInstructionsHelp":"Инструкции на естественном языке для каждого Mission Verifier.","defaultVerificationInstructionsPlaceholder":"Например: проверьте пути Windows и фактический интерфейс.","defaultVerifyCommand":"Тестовая команда по умолчанию (необязательно)","defaultVerifyCommandHelp":"Verifier запускает её обычными инструментами и с обычными разрешениями. /mission --verify переопределяет значение.","defaultVerifyCommandPlaceholder":"Например: pytest -q","enableRepetitionProtection":"Включить защиту от повторов","removeRule":"Удалить правило","custom"
150:"Пользовательский","customDescription":"Создайте сохраняемую цепочку из встроенных Gate QwenPaw.","duplicate":"Дублировать","delete":"Удалить","displayName":"Отображаемое имя","duplicateModeName":"Режим Loop с таким именем уже существует.","slashCommand":"Slash-команда","description":"Описание","availableToAgent":"Доступен этому агенту","runsTopToBottom":"Выполняется сверху вниз","addGate":"Добавить Gate","emptyPipeline":"Добавьте хотя бы один Gate, чтобы режим стал доступен.","iterationGateTitle":"Лимит итераций","iterationGateDescription":"Остановка после заданного числа итераций Loop.","doomGateTitle":"Защита от повторов","doomGateDescription":"Обнаруживает повторные вызовы и меняет стратегию.","tokenGateTitle":"Бюджет токенов","tokenGateDescription":"Ограничивает токены запроса и ответа.","timeoutGateTitle":"Лимит времени Loop","timeoutGateDescription":"Остановка на следующей границе Loop без прерывания текущей операции.","toolBudgetGateTitle":"Бюджет вызовов инструментов","toolBudgetGateDescription":"Ограничивает все и выбранные вызовы.","retryGateTitle":"Проверка ранней остановки","retryGateDescription":"Просит агента проверить результат перед завершением.","rubricGateTitle":"Критерии завершения","rubricGateDescription":"Оценивает явные критерии и запускает исправление.","qualitativeRubricTitle":"Качественная проверка завершения","qualitativeRubricDescription":"Проверяет текстовые ответы без вызовов инструментов по критериям на естественном языке.","qualitativeRubric":"Критерии завершения на естественном языке","qualitativeRubricHelp":"Срабатывает только для текстовых ответов без вызовов инструментов и продолжает работу, если она не завершена.","completionRubricTitle":"Проверка сигнала завершения","completionRubricDescription":"Проверяет сигнал завершения в текстовом ответе без вызовов инструментов.","completionRubricHelp":"Срабатывает после текстовых ответов без вызовов инструментов. По завершении агент выводит сигнал; иначе продолжает работу до достижения максимального числа проверок.","completionPrompt":"Промпт проверки завершения","completionPromptHelp":"Опишите, когда результат считается завершённым. QwenPaw автоматически добавит инструкцию вывода сигнала завершения.","completionSignal":"Сигнал завершения","completionSignalHelp":"QwenPaw добавляет этот сигнал и требование вывести только его в промпт проверки. Loop завершается только при полном совпадении без учёта регистра и крайних пробелов.","removeCriterion":"Удалить критерий {{number}}","totalTokensHelp":"Максимум входных и выходных токенов вместе за этот ход.","promptTokensHelp":"Включает системные инструкции, контекст, схемы инструментов и их результаты.","completionTokensHelp":"Максимум токенов, создаваемых моделью за этот ход.","maxIterations":"Максимум итераций","historyWindow":"Окно истории","similarityThreshold":"Порог сходства","totalTokens":"Максимум всех токенов","promptTokens":"Максимум входных токенов","completionTokens":"Максимум выходных токенов","maxSeconds":"Максимум секунд","maxSecondsHelp":"Время проверяется после завершения текущего ответа модели или вызова инструмента. Выполняемая операция не прерывается.","allToolCalls":"Все вызовы инструментов","perToolLimits":"Лимиты по инструментам","toolName":"Имя инструмента","callLimitAria":"Лимит вызовов {{name}}","removeToolLimitAria":"Удалить лимит {{name}}","addToolLimit":"Добавить лимит инструмента","maxRetries":"Максимум повторов","retryInstruction":"Инструкция повтора","passThreshold":"Порог прохождения","maxEvaluations":"Максимум раундов оценки","graderError":"Ошибка оценщика","stopSafely":"Безопасно остановить","verifyOnceMore":"Проверить ещё раз","completionCriteria":"Критерии завершения","criterionPlaceholder":"Опишите наблюдаемый результат","required":"Обязательно","weight":"Вес","addCriterion":"Добавить критерий","moveGateAria":"Переместить {{title}}","removeGate":"Удалить Gate","newModeName":"Новый режим Loop","defaultCustomDescription":"Пользовательская цепочка Gate.","copyName":"{{name}} — копия","createModeAria":"Создать режим Loop","createModeTitle":"Создать пользовательский режим Loop","startingTemplate":"Ð
150Ð°Ñ‡Ð°Ð»ÑŒÐ½Ñ‹Ð¹ шаблон","startingPipeline":"Начальный конвейер","blankPipelineHint":"Начните с пустого режима и добавьте гейты позже","safeTemplate":"Безопасный запуск","researchTemplate":"Исследование с бюджетом","qualityTemplate":"Приоритет качества","blankTemplate":"Пустая цепочка"},"doomLoopEnabled":"Защита от повторений","doomLoopEnabledTooltip":"Автоматическое вмешательство, когда агент застревает на повторении одних и тех же действий","doomLoopAfter":"После","doomLoopRepetitions":"одинаковых действий","doomLoopStopAction":"Пауза и запрос помощи","doomLoopWarnAction":"Отправить напоминание","doomLoopSimpleMode":"Простой","doomLoopAdvancedMode":"Расширенный","doomLoopWindowSize":"Диапазон обнаружения","doomLoopWindowSizeTooltip":"Сколько последних действий проверять на повторение","doomLoopSimilarity":"Чувствительность совпадения","doomLoopSimilarityTooltip":"Насколько похожими должны быть действия для обнаружения повтора (ниже = строже)","doomLoopStages":"Правила вмешательства","doomLoopAction":"Действие","doomLoopPrompt":"Сообщение","doomLoopPromptPlaceholder":"Текст напоминания или причина паузы...","doomLoopAddStage":"Добавить правило","iterationTitle":"Лимит итераций","iterationEnabled":"Включить лимит итераций","iterationEnabledTooltip":"Остановить агента после фиксированного числа циклов","iterationMaxIterations":"Максимум итераций","iterationMaxIterationsTooltip":"Максимальное число циклов до остановки","rubricTitle":"Качественная проверка завершения","rubricEnabled":"Включить качественную проверку завершения","rubricEnabledTooltip":"Срабатывает только для текстового ответа без вызовов инструментов.","rubricPrompt":"Критерии завершения на естественном языке","rubricPromptTooltip":"Промпт для запроса оценки завершённости задачи","rubricDesc":"Для текстового ответа без вызовов инструментов применяет критерии завершения на естественном языке и просит продолжить, если работа осталась.","rubricPromptPlaceholder":"Вы не вызвали ни одного инструмента. Если задача завершена, подтвердите. В противном случае продолжайте с вызовами инструментов.","rubricMaxInterventions":"Максимум раундов оценки","rubricMaxInterventionsTooltip":"Максимальное число проверок завершения текстовых ответов без вызовов инструментов за один ход.","inLoopModes":"Включить в режимах /goal и /mission","inLoopModesTooltip":"Также применять, когда активен режим /goal или /mission","comingSoonEditable":"Пользовательская настройка будет доступна в будущем выпуске.","simpleMode":"Простой","advancedMode":"Расширенный","comingSoon":"Скоро","reactModeTab":"Шаблон Loop - По умолчанию","goalModeTab":"Шаблон Loop - Goal","missionModeTab":"Шаблон Loop - Mission","goalModeInfoTitle":"Режим Goal vs По умолчанию","goalModeInfo":"Режим по умолчанию останавливается после ответа. Режим Goal заставляет агента циклически работать над целью, используя Rubric-оценку для определения завершения. Все операции выполняются в текущем контексте агента.","missionModeInfoTitle":"Режим Mission vs Goal","missionModeInfo":"Режим Mission автоматически разбивает сложные задачи на подзадачи, выполняемые независимыми Worker-агентами и проверяемые Verifier-агентами. Каждая подзадача выполняется в собственном контексте, не загрязняя историю основной сессии.","goalIterationGate":"Шлюз итераций цели","goalIterationGateDesc":"Ограничивает количество ходов агента в сессии цели, отслеживая итерации и использование токенов.","goalBudgetGate":"Шлюз бюджета токенов","goalBudgetGateDesc":"Устанавливает лимит расхода токенов для сессии цели. Останавливает агента при превышении бюджета.","goalRubricGate":"Рубрика завершения цели","goalRubricGateDesc":"Оценивает, достигнута ли цель, проверяя статус сессии.","goalDoomGate":"Защита от повторений","goalDoomGateDesc":"Обнаруживает повторяющиеся паттерны во время выполнения цели и инициирует вмешательство.","missionProgressGate":"Шлюз прогресса миссии","missionProgressGateDesc":"Отслеживает завершение пользовательских историй PRD. Продолжает до прохождения всех историй или достижения максимума итераций.","missionIterBypass":"Обход итераций","missionIterBypassDesc":"Временно снимает ограничение итераций ReAct во время выполнения миссии для длительных фаз.","customLoopTitle":"Пользовательские режимы цикла","customLoopDesc":"Создавайте свои режимы цикла с пользовательскими комбинациями шлюзов. Скоро.","autoContinueOnTextOnly":"Автопродолжение при только тексте","autoContinueOnTextOnlyTooltip":"Если шаг рассуждения завершился только текстом без вызова инструментов, вставляется подсказка и выполняется ещё один проход с той же политикой инструментов, чтобы реже обрывались многошаговые задачи. Выключите для прежнего поведения. При включении возможен рост расхода токенов.","autoGenerateSessionTitle":"Автогенерация заголовков сессий","autoGenerateSessionTitleTooltip":"После первого пользовательского сообщения в новом чате фоновая задача делает короткий LLM-вызов и заменяет усечённую заглушку на лаконичный заголовок. На каждый новый чат приходится один дополнительный короткий LLM-вызов. Отключите, чтобы оставить заглушку и не тратить токены.","shell
150CommandTimeout":"Тайм-аут shell-команды (с)","shellCommandTimeoutTooltip":"Тайм-аут по умолчанию (в секундах) для инструмента execute_shell_command. LLM может переопределить это значение для каждого вызова через параметр timeout. Полезно для длительных задач, таких как компиляция или обработка данных.","shellCommandTimeoutPlaceholder":"Введите тайм-аут","shellCommandTimeoutRequired":"Тайм-аут shell-команды обязателен","shellCommandTimeoutMin":"Тайм-аут shell-команды должен быть не менее 1 секунды","shellCommandExecutable":"Исполняемый файл shell","shellCommandExecutableTooltip":"Путь к shell, используемому execute_shell_command. Linux/macOS: например, /bin/bash, /bin/zsh. Windows: поддерживаются powershell.exe, pwsh.exe или POSIX-совместимые shell (например, Git Bash). Если пусто, используется переменная окружения $SHELL, затем платформенный shell по умолчанию (/bin/sh для Unix, cmd.exe для Windows).","shellCommandExecutablePlaceholder":"напр. /bin/bash или powershell.exe (пусто = автоопределение)","maxInputLength":"Макс. длина входа","maxInputLengthTooltip":"Максимальная длина входа (токены) для окна контекста модели","maxInputLengthPlaceholder":"Введите макс. длину входа","maxInputLengthRequired":"Требуется указать макс. длину входа","maxInputLengthMin":"Макс. длина входа должна быть не меньше 1000","contextCompactRatio":"Коэффициент сжатия контекста","contextCompactRatioTooltip":"Доля контекста для сжатия при заполнении","contextCompactRatioRequired":"Требуется указать коэффициент сжатия контекста","contextCompactThreshold":"Порог сжатия контекста","contextCompactThresholdTooltip":"Порог сжатия контекста (токены), автоматически вычисляется из макс. длины входа и коэффициента сжатия","contextCompactThresholdPlaceholder":"Автоматически","contextCompactReserveRatio":"Коэффициент резерва контекста","contextCompactReserveRatioTooltip":"Доля контекста для резерва при сжатии","contextCompactReserveRatioRequired":"Требуется указать коэффициент резерва контекста","contextCompactReserveThreshold":"Порог резерва контекста","contextCompactReserveThresholdTooltip":"Порог резерва контекста (токены), автоматически вычисляется из макс. длины входа и коэффициента резерва","contextCompactReserveThresholdPlaceholder":"Автоматически","toolResultCompactRecentN":"recent_n результатов инструментов","toolResultCompactRecentNTooltip":"Количество результатов инструментов для использования порога недавних сообщений","toolResultCompactRecentNRequired":"recent_n результатов инструментов обязательно","toolResultCompactOldThreshold":"Макс. символов для результатов инструментов за пределами recent_n","toolResultCompactOldThresholdTooltip":"Результаты инструментов за пределами recent_n, превышающие этот лимит, будут сжаты","toolResultCompactOldThresholdPlaceholder":"Введите порог символов","toolResultCompactOldThresholdRequired":"Макс. символов для результатов за пределами recent_n обязательно","toolResultCompactRecentThreshold":"Макс. символов для результатов инструментов в пределах recent_n","toolResultCompactRecentThresholdTooltip":"Результаты инструментов в пределах recent_n, превышающие этот лимит, будут сжаты. Также задаёт максимальное количество байт, возвращаемых за один вызов read_file. Должно быть больше или равно порогу для старых сообщений","toolResultCompactRecentThresholdPlaceholder":"Введите порог символов","toolResultCompactRecentThresholdRequired":"Макс. символов для результатов в пределах recent_n обязательно","toolResultCompactRetentionDays":"Дни хранения файлов результатов инструментов","toolResultCompactRetentionDaysTooltip":"Количество дней хранения сжатых файлов, просроченные файлы удаляются автоматически","toolResultCompactRetentionDaysRequired":"Дни хранения файлов результатов инструментов обязательны","historyRetentionDays":"Дни хранения истории","historyRetentionDaysTooltip":"Количество дней хранения постоянной истории чата. Более старые записи автоматически удаляются при запуске и завершении работы агента.","historyRetentionDaysRequired":"Дни хранения истории обязательны","historyRetentionDaysForeverWarning":"Значение 0 хранит историю вечно — объём хранилища будет расти без ограничений.","historyRetentionDaysLargeWarning":"Большой период хранения может занимать значительный объём хранилища.","exemptFileExtensions":"Исключенные расширения файлов","exemptFileExtensionsTooltip":"Результаты read_file для этих расширений будут использовать порог для новых сообщений","exemptFileExtensionsPlaceholder":".md, .txt, .json","exemptToolNames":"Исключенные инструменты","exemptToolNamesTooltip":"Результаты этих инструментов будут использовать порог для новых сообщений","exemptToolNamesPlaceholder":"chat_with_agent, list_agents","language":"Язык агента","languageTooltip":"Язык файлов персонажа агента (SOUL.md, AGENTS.md и др.). При смене языка MD-файлы будут скопированы на выбранном языке.","languageConfirmTitle":"Смена языка агента","languageConfirmContent":"При смене языка следующие файлы будут перезаписаны версией на новом языке:\\n\\n  SOUL.md, AGENTS.md, PROFILE.md, MEMORY.md, BOOTSTRAP.md, HEARTBEAT.md\\n\\nЕсли вы вносили изменения в эти файлы, сначала сделайте резервную копию. Остальные файлы не будут затронуты.","languageConfirmOk":"Сменить язык","languageSaveSuccess":"Язык успешно обновлён","languageSaveSuccessWithFiles":"Язык обновлён, скопировано файлов: {{count}}","languageSaveFailed":"Не удалось обновить язык","timezone":"Часовой пояс пользователя","timezoneTooltip":"Используется для запланированных задач, отображения времени и контекста агента. По умолчанию — системный часовой пояс.","timezoneRequired":"Пожалуйста, выберите часовой пояс","selectTimezone":"Ð
150’ыберите часовой пояс","timezoneSaveSuccess":"Часовой пояс обновлён","timezoneSaveFailed":"Не удалось обновить часовой пояс","saveSuccess":"Конфигурация успешно сохранена","saveFailed":"Не удалось сохранить конфигурацию","loadFailed":"Не удалось загрузить конфигурацию","historyMaxLength":"Макс. длина истории","historyMaxLengthTooltip":"Максимальная длина вывода команды /history (в символах)","historyMaxLengthRequired":"Требуется указать макс. длину истории","historyMaxLengthMin":"Макс. длина истории должна быть не меньше 1000","historyMaxLengthPlaceholder":"Введите макс. длину","contextCompactTitle":"Настройки сжатия контекста","contextCompactEnabled":"Включить сжатие контекста","contextCompactEnabledTooltip":"Автоматически сжимать контекст для предотвращения переполнения окна контекста","tokenCountModel":"Модель для подсчёта токенов","tokenCountModelTooltip":"Имя модели для точного подсчёта токенов; установите \\"default\\" для использования встроенной оценки","tokenCountModelPlaceholder":"Имя модели или default","tokenCountUseMirror":"Использовать зеркало HuggingFace","tokenCountUseMirrorTooltip":"Использовать зеркальный сайт HuggingFace при загрузке токенизаторов","tokenCountEstimateDivisor":"Делитель оценки byte/Token","tokenCountEstimateDivisorTooltip":"Делитель для оценки токенов на основе байтов (токены ≈ байты / делитель). Рекомендуемое значение: 3.75–4.","tokenCountEstimateDivisorRequired":"Требуется указать делитель оценки","tokenCountEstimateDivisorMin":"Делитель оценки должен быть от 2 до 5","toolResultCompactTitle":"Настройки сжатия результатов инструментов","toolResultCompactEnabled":"Включить сжатие результатов инструментов","toolResultCompactEnabledTooltip":"Сжимать слишком длинные результаты вызовов инструментов для экономии пространства контекста","memorySummaryTitle":"Настройки долгосрочной памяти","memorySummaryEnabled":"Запустить сводку памяти","memorySummaryEnabledTooltip":"Автоматически генерировать и сохранять сводки памяти при сжатии контекста","dreamCronEnabled":"Включить сновидения","dreamCronEnabledTooltip":"Включить плановое задание оптимизации памяти через сновидения","dreamCron":"Расписание сновидений","dreamCronTooltip":"Cron-выражение для периодической оптимизации долгосрочных воспоминаний через состояние сновидения; используйте переключатель выше для включения или отключения","dreamCronPlaceholder":"0 23 * * *","dreamCronRequired":"Введите Cron-выражение, если сновидения включены","dreamCronInvalid":"Введите допустимое Cron-выражение из 5 полей","autoMemorySearch":"Автоматический поиск по памяти (Beta)","autoMemorySearchTooltip":"Автоматически запускать поиск по памяти при каждом диалоге. Каждый запрос будет автоматически вызывать функцию поиска по памяти, помогая QwenPaw лучше понять вас — но это увеличивает расход токенов.","autoMaxResults":"Макс. результатов автоматического поиска","autoMaxResultsTooltip":"Максимальное количество результатов при включённом автоматическом поиске по памяти","autoMaxResultsRequired":"Требуется указать макс. число результатов","autoMaxResultsMin":"Макс. число результатов должно быть не меньше 1","inboxPushEnabled":"Уведомления о результатах памяти","inboxPushEnabledTooltip":"Отправлять результаты автоматической памяти, сновидений и Daily Paper во входящие. Отключение не останавливает задачи памяти.","autoMemoryInterval":"Интервал автоматической памяти","autoMemoryIntervalTooltip":"Запускать автоматическую память каждые N пользовательских запросов. 0 отключает периодическую автоматическую память. 1 означает запуск после каждого запроса. Рекомендуемое значение: 2-5; при значении 1 учитывайте высокий расход токенов.","autoMemoryIntervalPlaceholder":"Введите 0, чтобы отключить периодическую автоматическую память","autoMemoryIntervalRequired":"Требуется указать интервал автоматической памяти","autoMemoryIntervalMin":"Интервал автоматической памяти должен быть не меньше 0","embeddingConfigTitle":"Ð
150Ð°ÑÑ‚ройки модели эмбеддинга","embeddingModelTitle":"Модель эмбеддингов","embeddingBackend":"Тип SDK эмбеддинга","embeddingBackendTooltip":"Тип SDK для вызова модели эмбеддинга","embeddingBackendPlaceholder":"Выберите тип SDK","embeddingApiKey":"API Key","embeddingApiKeyTooltip":"API-ключ провайдера эмбеддинга; оставьте пустым, если аутентификация не требуется","embeddingApiKeyPlaceholder":"Оставьте пустым, если не требуется","embeddingBaseUrl":"Base URL","embeddingBaseUrlTooltip":"Base URL API эмбеддинга. Для OpenAI-совместимых бэкендов этот пользовательский endpoint необязателен; API Key и название модели обязательны.","embeddingBaseUrlPlaceholder":"https://dashscope.aliyuncs.com/compatible-mode/v1","embeddingHost":"Host","embeddingHostTooltip":"Адрес сервиса Ollama. Если оставить пустым, будет использован хост Ollama по умолчанию.","embeddingHostPlaceholder":"http://localhost:11434","embeddingModelName":"Название модели","embeddingModelNameTooltip":"Название модели эмбеддинга. Обязательно для всех бэкендов эмбеддинга.","embeddingModelNamePlaceholder":"text-embedding-v4","embeddingEnableCache":"Включить кэш эмбеддинга","embeddingEnableCacheTooltip":"Кэшировать результаты эмбеддинга для уменьшения повторных вычислений","embeddingMaxCacheSize":"Макс. размер кэша","embeddingMaxCacheSizeTooltip":"Максимальное количество записей в кэше эмбеддинга","embeddingMaxCacheSizeRequired":"Требуется указать макс. размер кэша","embeddingUseDimensions":"Передавать размерность в запросе","embeddingUseDimensionsTooltip":"Передавать параметр dimensions в запросах к OpenAI-совместимому Embedding API; некоторые сервисы не поддерживают этот параметр","embeddingDimensions":"Размерности эмбеддинга","embeddingDimensionsTooltip":"Ожидаемая размерность вектора для проверки ответов, индексов и кэша; если передача в запросе отключена, укажите фактическую размерность вывода модели","embeddingDimensionsRequired":"Требуется указать размерности эмбеддинга","embeddingDimensionsMin":"Размерности должны быть не меньше 1","embeddingMaxInputLength":"Бюджет символов на один вход","embeddingMaxInputLengthTooltip":"Приблизительный бюджет символов для каждого входа Embedding. Перед запросом текст обрезается, а символы CJK и другие полноширинные символы оцениваются консервативнее; это не точный лимит токенов","embeddingMaxInputLengthRequired":"Требуется указать бюджет символов на один вход","embeddingMaxBatchSize":"Макс. размер пакета","embeddingHealthCheckTimeout":"Тайм-аут инициализации","embeddingHealthCheckTimeoutTooltip":"Тайм-аут каждой попытки проверки подключения и проверки embedding при запуске ReMe","embeddingHealthCheckTimeoutRequired":"Укажите тайм-аут инициализации","embeddingMaxBatchSizeTooltip":"Максимальное количество элементов в одном пакетном запросе эмбеддинга","embeddingMaxBatchSizeRequired":"Требуется указать макс. размер пакета","maxContextLength":"Макс. длина контекста","maxContextLengthTooltip":"Максимальное количество токенов в окне контекста модели, определяющее, сколько истории помещается в каждый запрос","maxContextLengthRequired":"Требуется указать макс. длину контекста","maxContextLengthMin":"Макс. длина контекста должна быть не меньше 1000","maxContextLengthPlaceholder":"Введите макс. длину контекста","embeddingActivationNote":"Эмбеддинг активируется, когда заполнены обязательные поля выбранного бэкенда.","embeddingEnableHint":"Эмбеддинг активируется, когда заполнены обязательные поля: название модели и API Key для OpenAI-совместимых или Gemini бэкендов;
150 название модели для Ollama.","rebuildMemoryIndex":"Перестроить индекс памяти","rebuildMemoryIndexWarning":"Эта операция очищает и перестраивает поисковый индекс памяти и может потреблять много ресурсов CPU и оперативной памяти. Используйте её только для восстановления повреждённого индекса или исправления некорректных результатов поиска.","rebuildMemoryIndexConfirmTitle":"Перестроить индекс памяти?","rebuildMemoryIndexConfirm":"Во время перестроения нагрузка на CPU и потребление оперативной памяти могут значительно возрасти. Операция не рекомендуется, если индекс не повреждён и не нуждается в восстановлении.","rebuildMemoryIndexSuccess":"Индекс памяти успешно перестроен","rebuildMemoryIndexFailed":"Не удалось перестроить индекс памяти: {{error}}","rebuildMemoryIndexRequired":"Конфигурация Embedding изменилась. Векторный поиск отключён, и до перестроения индекса Embedding для поиска по памяти будет использоваться BM25.","embeddingIndexReady":"Индекс Embedding соответствует текущей конфигурации.","embeddingIndexStatus":"Индекс Embedding","embeddingIndexAvailable":"Актуален","embeddingSearchModeHybrid":"Текущий поиск: векторы + BM25","embeddingSearchModeBm25":"Текущий поиск: только BM25","embeddingSearchModeBm25Pending":"Текущий поиск: только BM25 · ожидается перестроение","embeddingIndexNeedsRebuild":"Требуется перестроение","embeddingIndexRebuilding":"Перестроение","embeddingIndexRebuildingHint":"Создаются векторы памяти","embeddingIndexSaveFirst":"Сначала сохраните конфигурацию","embeddingIndexUnsavedHint":"Сохраните изменения перед перестроением индекса","embeddingIndexMatchesConfig":"Соответствует текущей конфигурации","embeddingIndexBm25Fallback":"Векторный поиск отключён · используется BM25","rebuildEmbeddingIndex":"Перестроить индекс Embedding","rebuildEmbeddingIndexConfirmTitle":"Перестроить индекс Embedding?","rebuildEmbeddingIndexConfirm":"Для всех фрагментов памяти будут заново созданы эмбеддинги с текущей конфигурацией. Векторный поиск останется отключённым до успешного завершения операции.","rebuildEmbeddingIndexSuccess":"Индекс Embedding перестроен","rebuildEmbeddingIndexFailed":"Не удалось перестроить индекс Embedding: {{error}}","undoEmbeddingChange":"Отменить изменение","undoEmbeddingChangeConfirmTitle":"Восстановить конфигурацию Embedding, использованную для индекса?","undoEmbeddingChangeConfirm":"Будет восстановлена последняя конфигурация, соответствующая существующему векторному индексу.","undoEmbeddingChangeSuccess":"Конфигурация Embedding, использованная для индекса, восстановлена","undoEmbeddingChangeFailed":"Не удалось восстановить конфигурацию Embedding: {{error}}","rebuildBm25Index":"Перестроить индекс BM25","rebuildBm25IndexDescription":"Заново создайте индекс поиска по ключевым словам из текущих фрагментов памяти.","rebuildBm25IndexConfirmTitle":"Перестроить индекс BM25?","rebuildBm25IndexConfirm":"Индекс поиска по ключевым словам будет заново создан из текущих фрагментов памяти.","rebuildBm25IndexSuccess":"Индекс BM25 перестроен","goToLongTermMemory":"Перейти Ð
150º долговременной памяти","toolResultCompactRecentGtOld":"Порог для последних сообщений должен быть больше или равен порогу для старых сообщений","lightContextTitle":"Управление контекстом","visualCompactCollapseLabel":"Визуальное сжатие","visualCompactDescription":"Сжимает старый и длинный контекст в визуальные страницы, сокращая входные токены. Недавний диалог остаётся текстом.","visualCompactEnabled":"Включить Visual Compact","visualCompactEffort":"Интенсивность сжатия","visualCompactLow":"Низкая","visualCompactMedium":"Средняя","visualCompactHigh":"Высокая","visualCompactLowDescription":"Сжимает меньше содержимого и отдаёт приоритет читаемости.","visualCompactMediumDescription":"Балансирует экономию токенов и визуальную читаемость.","visualCompactHighDescription":"Сжимает больше подходящего контекста и отдаёт приоритет экономии токенов.","visualCompactQualityNote":"Более сильное сжатие не обязательно повышает качество ответа.","visualCompactCapabilityNote":"Работает только с моделями, поддерживающими ввод изображений.","remeLightMemoryTitle":"Долгосрочная память","toolExecutionLevelTitle":"Режим одобрения инструментов","toolExecutionLevelTooltip":"Режим одобрения","toolExecutionLevel":{"title":"Режим одобрения инструментов","alertMessage":"Настройте одобрение перед вызовом инструментов. Правила защиты файлов применяются независимо.","strict":"Строгий режим","strictDesc":"Перед каждым вызовом инструмента и доступом к внешним файлам требуется одобрение","smart":"Умный режим","smartDesc":"Вызовы инструментов с низким риском и доступ к внешним файлам выполняются автоматически; операции со средним и высоким риском требуют одобрения","auto":"Автоматический режим","autoDesc":"Одобрение требуется только для операций, соответствующих правилам одобрения инструментов и файлов (по умолчанию)","off":"Выключено","offDesc":"Одобрение инструментов и файлов отключено"},"saveLevelSuccess":"Режим одобрения инструментов сохранён","saveLevelFailed":"Не удалось сохранить режим одобрения инструментов","adbpgMemoryTitle":"ADBPG Long-term Memory","powercontextMemoryTitle":"Память PowerContext","powercontextConfig":{"title":"Конфигурация памяти PowerContext","baseUrl":"URL сервера","token":"Bearer-токен","scopeId":"Область памяти","scopeIdPlaceholder":"Оставьте пустым, чтобы использовать уникальную область агента для этой установки","scopeIdInvalid":"Область памяти не может состоять только из пробелов.","timeout":"Тайм-аут запроса","maxContextBytes":"Максимальный объём внедряемого контекста (байт)","maxContextBytesTooltip":"Ограничивает общий объём результатов поиска PowerContext, добавляемых за один ход модели."},"adbpgConfig":{"title":"ADBPG Memory Configuration","restBaseUrl":"REST Base URL","restApiKey":"REST API Key","memoryIsolation":"Memory Isolation (per-agent)","searchTimeout":"Search Timeout"}}'),Bx={title:"Встроенные инструменты",description:"Управляйте встроенными инструментами и их статусом. Отключённые инструменты не будут доступны агенту.",emptyState:"Нет настроенных инструментов",loadError:"Не удалось загрузить инструменты",enableSuccess:"Инструмент успешно включён",disableSuccess:"Инструмент успешно отключён",toggleError:"Не удалось изменить статус инструмента",enableAll:"Включить все",disableAll:"Отключить все",enableAllSuccess:"Все инструменты включены",disableAllSuccess:"Все инструменты отключены",allEnabled:"Все инструменты уже включены",allDisabled:"Все инструменты уже отключены",asyncExecution:"Асинхронное выполнение",asyncExecutionEnabled:"Асинхронное выполнение включено",asyncExecutionDisabled:"Асинхронное выполнение отключено",browserUnifiedMode:"Унифицированный браузер (бета)",browserLegacyMode:"Режим совместимости с устаревшей версией",browserUnifiedModeButton:"Новый (бета)",browserLegacyModeButton:"Старый (совм.)",browserUnifiedDescription:"Использовать новые возможности унифицированного браузера.",browserLegacyDescription:"Использовать исходную реализацию браузера для прежнего поведения.",browserRestartPending:"После перезапуска служба переключится на: {{mode}}",configure:"Настроить",configured:"Настроено",requiresConfig:"Требуется настройка",configSaved:"Конфигурация сохранена",configSaveError:"Не удалось сохранить конфигурацию",webSearchProviderLabel:"Провайдер",webSearchApiKeyLabel:"API-ключ (необязательно)",webSearchQuotaHintBefore:"Без регистрации: 100 вызовов/день. На ",webSearchQuotaHintAfter:": 1000/день.",active:"активно",available:"Доступно",noEnabled:"Нет включённых инструментов",goEnableBtn:"Включить",configureAction:"Настроить →",enableAction:"Включить →"},Nx={promptTitle:"Требуется LLM-модель — выберите в Chat после настройки",promptMessage:"Для работы чата нужна LLM-модель. Сначала настройте модель, затем выберите её в селекторе моделей вверху страницы Chat.",configureButton:"Настроить модель",skipButton:"Пропустить",chatDisabledTitle:"Чат отключён",chatDisabledMessage:"Функции чата отключены, потому что не настроена модель. Настройте модель, чтобы включить чат.",configureNow:"Настроить модель",modelNotConfigured:"Перед использованием чата настройте модель в разделе «Настройки»"},Hx={changelog:"Список изменений",docs:"Документация",tutorial:"Руководство",featureDemos:"Демонстрация функций",faq:"FAQ",github:"GitHub",resources:"Документация",updateAvailable:"Доступно обновление"}
150,Ux={dark:"Тёмная",light:"Светлая",system:"Как в системе"},qx={newVersion:"Доступна новая версия: v{{version}}, нажмите для обновления",updateModal:{title:"Доступна новая версия: v{{version}}",viewReleases:"Открыть релизы",installDesktopUpdate:"Обновить сейчас",desktopInstallHint:"QwenPaw Desktop {{version}} готов к установке. Приложение перезапустится после обновления.",checking:"Проверка обновлений…",checkingHint:"Проверяем последнюю версию",downloading:"Загрузка обновления",downloadingTo:"Обновление до версии {{version}}",downloadProgress:"{{done}} / {{total}} · {{rate}}",installing:"Установка обновления",willRestart:"Приложение перезапустится автоматически после установки.",stepPrepare:"Подготовка",stepDownloading:"Загрузка",stepInstalling:"Установка",failedTitle:"Обновление не удалось",back:"Назад",retry:"Повторить",errors:{network:"Не удалось подключиться к серверу обновлений. Проверьте интернет и повторите попытку.",signature:"Не удалось проверить подпись файла обновления. Попробуйте загрузить ещё раз.",appLocation:"QwenPaw запущен из macOS-пути только для чтения. Переместите QwenPaw.app в папку Applications, запустите его оттуда и повторите обновление.",other:"Обновление не удалось."},updateLater:"Скачать в фоне",backgroundDownloading:"Загрузка в фоновом режиме…",readyToInstall:"Обновление готово",readyToInstallHint:"Обновление v{{version}} загружено. Перезапустите приложение, чтобы установить и открыть новую версию.",restartNow:"Обновить сейчас",backgroundFailed:"Фоновая загрузка не удалась"},settings:{language:"Язык",theme:"Тема",mode:"Режим",desktopMode:"Режим рабочего стола"},simpleMode:"Простой режим",fullMode:"Полный режим",toggleAgentNavigation:"Развернуть или свернуть навигацию агента"},jx={groups:{cronShort:"Расписание",subagentShort:"Субагент"},fileReference:{codeSnippet:"Фрагмент кода · {{count}} строк"},modelSelectTooltip:"Выбор модели",newChatTooltip:"Новый чат",searchTooltip:"Поиск во всех чатах",chatHistoryTooltip:"История чатов",wideModeTooltip:"Широкий режим",normalModeTooltip:"Обычный режим",messageDisplay:{stepsRunning:"Выполняется… · шагов: {{count}}",stepsCanceled:"Отменено · шагов: {{count}}",stepsFailed:"Ошибка · шагов: {{count}}",stepsCompleted:"Выполнено шагов: {{count}}"},allChats:"Все чаты",createNewChat:"Создать новый чат",pinDrawer:"Закрепить",unpinDrawer:"Открепить",statusIdle:"Ожидание",statusInProgress:"Выполняется",disclaimer:"Работает для вас, растёт вместе с вами",greeting:"Привет, чем я могу помочь вам сегодня?",description:"Я полезный ассистент, который поможет вам с вашими вопросами.",prompt1:"Давайте начнём новое путешествие!",prompt2:"Расскажи мне, какими навыками ты обладаешь?",inputPlaceholder:'"↑↓" для навигации по сообщениям · "/" для быстрых команд',longTextUploadPrompt:"Пожалуйста, прочитайте загруженный файл с промптом и ответьте на его основе.",emptyOutputError:"Ассистент вернул пустой ответ.",commands:{clear:{description:"Очистить контекст диалога"},compact:{description:"Сжать контекст диалога и создать резюме; поддерживается доп. инструкция"},approve:{description:"Подтвердить ожидающее действие инструмента и продолжить выполнение"},deny:{description:"Отклонить ожидающее действие инструмента"},mission:{description:"Режим Mission — разбивает задачи на суб-аÐ
150³ÐµÐ½Ñ‚ов с изолированным контекстом"},skills:{description:"Показать доступные в чате навыки и явные команды их вызова"},agents:{description:"Показать агентов, доступных в текущей среде"},review:{description:"Проверить в Codex незакоммиченные изменения рабочей области"},status:{description:"Показать текущую учётную запись агента, модель и рабочую область"},goal:{description:"Goal-цикл — агент непрерывно преследует цель, автоматически оценивая завершение через Rubric"}},attachments:{tooltip:"Поддерживаются документы, изображения, видео, аудио и другие форматы",tooltipImageOnly:"Текущая модель поддерживает только загрузку изображений",tooltipNoMultimodal:"Мультимодальные возможности текущей модели не обнаружены, изображения или видео могут быть обработаны некорректно",fileSizeLimit:"Максимум {{limit}} МБ на файл",fileSizeExceeded:"Размер файла превышает лимит {{limit}} МБ. Текущий файл: {{size}} МБ",multimodalDisabled:"Текущая модель не поддерживает загрузку файлов",multimodalWarning:"Мультимодальные возможности текущей модели не обнаружены, изображения или видео могут быть обработаны некорректно",imageOnlyAccept:"Текущая модель поддерживает только файлы изображений",imageOnlyWarning:"Текущая модель поддерживает только изображения, видео и другие файлы могут быть обработаны некорректно"},rateLimitHit:"Текущая модель ограничена. Попробуйте переключиться на другую бесплатную модель.",turnUsagePopover:{ariaLabel:"Показать использование токенов и контекста за ход",turn:"Этот ход",turnEstimated:"Этот ход ~",tok:"tok",inOut:"in {{inTok}} · out {{outTok}}",contextLabel:"Окно контекста:",outerRing:"Outer ring",cacheLabel:"Cache hit rate",centerValue:"Center",cacheTokens:"попадание {{readTok}} / ввод {{inputTok}}",manageContext:"Управление контекстом",compact:"Сжать",new:"Новый чат"},rateLimitMessage:"Достигнут лимит запросов. Переключитесь на другую бесплатную модель:",rateLimitSwitched:"Переключено на {{model}}",speech:{startRecording:"Начать запись голоса (Ctrl+Shift+M)",stopRecording:"Остановить запись (Ctrl+Shift+M)",transcribing:"Транскрибация...",transcriptionDisabled:"Транскрибация отключена. Настройте провайдер в Настройки > Голосовая транскрибация.",transcriptionFailed:"Ошибка голосовой транскрибации",microphoneError:"Не удалось получить доступ к микрофону",fileTooLarge:"Файл записи слишком большой ({{size}}МБ). Максимум: {{limit}}МБ",recordingTooLong:"Длительность записи превышает лимит ({{limit}}с)"},search:{title:"Поиск в чате",tooltip:"Поиск в текущем чате",placeholder:"Поиск сообщений...",noResults:"Результаты не найдены",resultsCount:"Найдено {{count}} результат(ов)",searching:"Поиск {{progress}}
150...",loading:"Загрузка...",userMessage:"Пользователь",assistantMessage:"Ассистент",titleMatch:"Название"},contextMenu:{open:"Открыть",rename:"Переименовать",pin:"Закрепить",unpin:"Открепить",delete:"Удалить"},queue:{title:"Очередь сообщений",paused:"Приостановлено",sendFailed:"Ошибка отправки",resume:"Возобновить очередь",pause:"Приостановить очередь",clear:"Очистить очередь",dragSort:"Перетащите для сортировки",edit:"Редактировать",retry:"Повторить",skip:"Пропустить",interruptAndSend:"Прервать и отправить",delete:"Удалить",file:"Файл",noChatWarning:"Сначала отправьте сообщение, чтобы создать диалог, прежде чем использовать очередь",queueFull:"Очередь полна (макс. {{max}} записей). Отправьте или удалите некоторые сообщения",otherTabOwner:"This tab queues only; sending is handled by another tab"},group:{pinned:"Закреплённые",today:"Сегодня",week:"За 7 дней",month:"За 30 дней",older:"Ранее"},sessionPanel:{searchConversations:"Поиск…",noResults:"Результатов нет",noConversations:"Нет диалогов",loadingConversations:"Загрузка…"},conversationHistory:"История диалогов",history:{empty:"Нет истории чатов"},sessionGroup:{today:"Сегодня",recent:"За 7 дней",earlier:"Ранее"}},Gx={parent:"Настройки",security:"Безопасность",title:"Безопасность",description:"Управление функциями безопасности инструментов и навыков.",toolGuardTitle:"Защита инструментов",toolGuardDescription:"Настройте сканирование безопасности для вызовов инструментов. Опасные операции потребуют вашего явного подтверждения перед выполнением.",enabled:"Включить защиту инструментов",enabledTooltip:"При включении вызовы инструментов сканируются на наличие опасных шаблонов перед выполнением",guardedTools:"Защищённые инструменты",guardedToolsTooltip:"Инструменты, требующие подтверждения при обнаружении опасных шаблонов. Оставьте пустым для использования набора по умолчанию.",guardedToolsPlaceholder:"Выберите инструменты или введите пользовательские имена",deniedTools:"Запрещённые инструменты",deniedToolsTooltip:"Инструменты, которые всегда отклоняются без запроса подтверждения",deniedToolsPlaceholder:"Выберите инструменты для запрета",saveSuccess:"Настройки защиты инструментов сохранены",saveFailed:"Не удалось сохранить настройки защиты инструментов",loadFailed:"Не удалось загрузить настройки защиты инструментов",rules:{title:"Правила обнаружения",description:"Правила определяют шаблоны регулярных выражений, которые вызывают оповещения безопасности. Встроенные правила можно отключить; пользовательские правила можно добавлять, редактировать или удалять.",id:"ID правила",severity:"Серьёзность",descriptionCol:"Описание",source:"Источник",actions:"Действия",builtin:"Встроенное",custom:"Пользовательское",enable:"Включить",disable:"Отключить",edit:"Редактировать",delete:"Удалить",add:"Добавить правило",addTitle:"Добавить пользовательское правило",editTitle:"Редактировать пользовательское правило",ruleId:"ID правила",ruleIdRequired:"ID правила обязателен",duplicateId:"Правило с таким ID уже существует",tools:"Целевые инструменты",toolsPlaceholder:"Оставьте пустым для совпадения со всеми инструментами",params:"Целевые параметры",paramsPlaceholder:"Оставьте пустым для совпадения со всеми параметрами",severityLabel:"Серьёзность",categoryLabel:"Категория",patterns:"Шаблоны регулярных выражений",patternsRequired:"Требуется хотя бы один шаблон",patternsTooltip:"По одному регулярному выражению в строке. Сопоставляется со значениями параметров инструмента (без учёта регистра).",excludePatterns:"Шаблоны исключения",excludePatternsTooltip:"По одному регулярному выражению в строке. Если совпадает, правило пропускается.",descriptionLabel:"Описание",de
150scriptionPlaceholder:"Что обнаруживает это правило?",remediationLabel:"Рекомендация",remediationPlaceholder:"Рекомендуемое действие при срабатывании правила",preview:"Просмотр",previewTitle:"Детали правила",actionLabel:"Действие",actionApproval:"Требуется одобрение",autoDeny:"Автоотказ",autoDenyTooltip:"При включении вызовы инструментов, соответствующие этому правилу, будут автоматически отклонены без ручного подтверждения",autoDenyEnable:"Включить автоотказ для этого правила",autoDenyDisable:"Отключить автоотказ для этого правила",allTools:"Все инструменты",allParams:"Все параметры",descriptions:{TOOL_CMD_CONTROL_CHARS:"Обнаруживает непечатаемые управляющие символы, которые могут обойти проверки безопасности",TOOL_CMD_DANGEROUS_MV:"Обнаруживает команду mv, которая может неожиданно переместить или перезаписать файлы",TOOL_CMD_DANGEROUS_RM:"Обнаруживает команду rm, которая может привести к потере данных",TOOL_CMD_DOS_FORK_BOMB:"Обнаруживает классические Bash fork-бомбы и массовое завершение процессов",TOOL_CMD_FIND_DELETE:"Обнаруживает команду 'find -delete', которая может привести к потере данных",TOOL_CMD_FS_DESTRUCTION:"Обнаруживает команды низкоуровневого форматирования или очистки дисков",TOOL_CMD_IFS_INJECTION:"Обнаруживает команды с переменной $IFS, которая может обойти проверку безопасности",TOOL_CMD_JQ_FILE_FLAGS:"Обнаруживает команды jq с флагами для чтения произвольных файлов или выполнения кода",TOOL_CMD_JQ_SYSTEM:"Обнаруживает команды jq с функцией system() для выполнения произвольных команд",TOOL_CMD_OBFUSCATED_EXEC:"Обнаруживает выполнение строк в кодировке base64, передаваемых напрямую в интерпретатор оболочки",TOOL_CMD_PIPE_TO_SHELL:"Обнаруживает паттерны 'curl | bash' для загрузки и немедленного выполнения удалённых скриптов",TOOL_CMD_PRIVILEGE_ESCALATION:"Обнаруживает попытки повышения привилегий с использованием sudo, su, doas, pkexec или runas",TOOL_CMD_PROCESS_KILL:"Обнаруживает команды завершения процессов, которые могут остановить критические процессы",TOOL_CMD_PROC_ENVIRON:"Обнаруживает доступ к /proc/*/environ, который может раскрыть переменные окружения",TOOL_CMD_REVERSE_SHELL:"Обнаруживает попытки создания обратных оболочек или несанкционированных сетевых туннелей",TOOL_CMD_SERVICE_RESTART:"Обнаруживает команды управления службами, которые могут нарушить работу системных служб",TOOL_CMD_SYSTEM_REBOOT:"Обнаруживает команды перезагрузки или выключения системы, которые остановят хост-систему",TOOL_CMD_SYSTEM_TAMPERING:"Обнаруживает доступ к заданиям cron, SSH-ключам или правам sudo (включая чтение и изменение)",TOOL_CMD_UNICODE_WHITESPACE:"Обнаруживает пробельные символы Unicode, вызывающие неоднозначность парсинга",TOOL_CMD_UNSAFE_PERMISSIONS:"Обнаруживает глобаÐ
150»ÑŒÐ½Ð¾Ðµ понижение прав доступа (chmod 777) или установку неизменяемых флагов",TOOL_CMD_ZSH_DANGEROUS:"Обнаруживает Zsh-специфичные встроенные команды, которые могут обойти проверки безопасности"},categories:{command_injection:"Внедрение команд",code_execution:"Выполнение кода",data_exfiltration:"Утечка данных",path_traversal:"Обход пути",sensitive_file_access:"Доступ к конфиденциальным файлам",network_abuse:"Злоупотребление сетью",credential_exposure:"Утечка учётных данных",resource_abuse:"Злоупотребление ресурсами",privilege_escalation:"Повышение привилегий",prompt_injection:"Внедрение промпта",other:"Другое"}},fileGuard:{title:"Защита файлов",description:"Защита конфиденциальных файлов и директорий от доступа инструментов агента. Добавленные пути будут заблокированы для всех вызовов инструментов.",enableLabel:"Включить защиту файлов",path:"Путь",actions:"Действия",add:"Добавить",inputPlaceholder:"Введите путь к файлу или директории (например, ~/.ssh/ или /etc/passwd)",empty:"Пользовательские конфиденциальные пути не настроены",directory:"Директория",removeConfirm:"Удалить этот путь из списка защиты?",duplicate:"Этот путь уже есть в списке",saveSuccess:"Настройки защиты файлов сохранены",saveFailed:"Не удалось сохранить настройки защиты файлов",loadFailed:"Не удалось загрузить настройки защиты файлов",allowPreviewOutsideWorkspace:"Разрешить предпросмотр файлов вне рабочего пространства",allowPreviewOutsideWorkspaceDesc:"Разрешить предпросмотр файлов за пределами рабочей директории в консоли. Защита конфиденциальных файлов остаётся активной."},allowNoAuthHosts:{title:"Хосты без аутентификации",warningTitle:"Предупреждение безопасности",warningDescription:"IP-адреса в этом списке могут обращаться к конечным точкам API без аутентификации. По умолчанию разрешены локальные хосты (127.0.0.1 и ::1) для доступа через CLI. Добавляйте только доверенные IP-адреса. ВНИМАНИЕ: Добавление недоверенных IP представляет серьезную угрозу безопасности.",ipAddress:"IP-адрес",actions:"Действия",add:"Добавить",inputPlaceholder:"Введите IP-адрес (например, 192.168.1.100 или ::1)",empty:"IP-адреса не настроены",default:"По умолчанию",removeConfirm:"Удалить этот IP-адрес из белого списка?",duplicate:"Этот IP-адрес уже есть в списке",invalidIP:"Неверный формат IP-адреса",saveSuccess:"Настройки хостов без аутентификации сохранены",saveFailed:"Не удалось сохранить настройки хостов без аутентификации",loadFailed:"Не удалось загрузить настройки хостов без аутентификации"},skillScanner:{title:"Сканер навыков",description:"Автоматическое сканирование навыков на наличие угроз безопасности перед активацией или установкой.",mode:"Режим сканирования",modeTooltip:"Управление поведением сканера: блокировка, только предупреждение или отключение",modeBlock:"Блокировать",modeWarn:"Только предупреждение",modeOff:"Выключен",timeout:"Таймаут сканирования (секунды)",timeoutTooltip:"Максимальное время ожидания завершения сканирования (5-300 секунд)",saveSuccess:"Настройки сканера навыков сохранены",saveFailed:"Не удалось сохранить настройки сканера навыков",scanAlerts:{title:"Оповещения сканирования",empty:"Нет оповещений безопасности",clearAll:"Очистить все",clearConfirm:"Очистить все оповещения сканирования?",skillName:"Навык",action:"Действие",actionBlocked:"Заблокировано",actionWarned:"Предупреждение",time:"Время",actions:"Действия",allowSkill:"Добавить в белый список",remove:"Удалить",viewFindings:"Подробности"},whitelist:{title:"Белый список",empty:"Белый список пуст",skillName:"Навык",addedAt:"Добавлено",contentHash:"Хеш содержимого",actions:"Действия",remove:"Удалить",removeConfirm:"Удалить этот навык из белого списка?",addSuccess:"Навык добавлен в белый список",removeSuccess:"Навык удалён из белого списка",addFailed:"Не удалось добавить навык в белый список",removeFailed:"Не удалось удалить навык из белого списка",removeWillDisable:"После удаления навык также будет отключён.",removeAndDisabled:"Навык удалён из белого списка и отключён"},scanError:{title:"Обнаружены проблемы безопасности",description:"Обнаружены следующие проблемы безопасности:",warnDescription:"Обнаружены проблемы безопасности, но навык был включён (режим предупреждения):",goToWhitelist:"Перейти Ð
150º белому списку",moreFindings:"Ещё {{count}} записей не показано (полный список: Настройки → Безопасность → Сканер навыков)."}}},Vx=JSON.parse('{"brand":{"title":"Управление Hub","subtitle":"Локальное рабочее пространство","controlPlane":"Панель управления"},"navigation":{"workspace":"Рабочая область","overview":"Операции","runtimes":"Среды выполнения","users":"Пользователи","credentials":"Учетные данные","audit":"Журнал аудита","settings":"Системные настройки"},"actions":{"backToQwenPaw":"Вернуться к QwenPaw","useLightTheme":"Используйте светлую тему","useDarkTheme":"Использовать темную тему","signOut":"Выйти","start":"Запустить","stop":"Остановить","disable":"Отключить","rebuild":"Пересоздать","enableAndStart":"Включить и запустить"},"roles":{"admin":"Администратор","user":"Пользователь"},"userStates":{"active":"Активен","disabled":"Отключен"},"runtimeStates":{"created":"Создана","starting":"Запускается","running":"Работает","stopped":"Остановлена","failed":"Ошибка"},"runtimePolicies":{"owner_allowed":"Владелец может перезапустить","admin_only":"Заблокировано администратором"},"errors":{"actionFailed":"Действие не выполнено","createFailed":"Создать не удалось","updateFailed":"Обновление не выполнено","saveFailed":"Сохранить не удалось","pullTimedOut":"Время ожидания получения изображения истекло."},"messages":{"runtimeCreated":"Среда выполнения создана","accountCreated":"Аккаунт создан","credentialStored":"Учетные данные сохранены","settingsSaved":"Настройки хаба сохранены.","imagePulled":"Получение образа Docker завершено"},"validation":{"required":"Это поле обязательно к заполнению","runtimeIdInvalid":"Используйте от 1 до 64 букв, цифр, точек, подчеркиваний или дефисов, начиная с буквы или цифры.","passwordMin":"Пароль должен содержать не менее восьми символов","credentialNameInvalid":"Используйте имя переменной среды в верхнем регистре, например OPENAI_API_KEY."},"runtimes":{"eyebrow":"Управление Hub","title":"Обзор среды выполнения","description":"У каждого пользователя есть отдельная среда выполнения, в которой файлы и ключи хранятся отдельно.","newRuntime":"Новая среда выполнения","managed":"Управляемая среда выполнения","localBoundaries":"Границы локального процесса","runningNow":"Сейчас работают","needsAttention":"Среда выполнения {{count}} требует внимания","healthy":"Все среды работают нормально","isolationPolicy":"Политика изоляции","available":"Доступный","unavailable":"Недоступно","failClosed":"Блокировка при сбое","noFallback":"Без запуска вне песочницы","executionBlocked":"Запуск среды заблокирован","isolationTitle":"Локальная изоляция с блокировкой при сбое","isolationDescription":"Все дерево процессов среды выполнения находится в изолированной программной среде. Если собственный изоляционный зонд выходит из строя, QwenPaw отказывается его запускать.","unavailableTitle":"Безопасная серверная часть среды выполнения недоступна","unavailableDescription":"{{provisioner}} недоступен: {{reason}} Проверьте установку, состояние и системную конфигурацию серверной части, затем перезапустите QwenPaw Hub.","unavailableUserDescription":"Серверная часть среды выполнения временно недоступна. Обратитесь к администратору.","preflightFailed":"Проверка безопасности не пройдена.","localEndpoint":"Локальная конечная точка · {{endpoint}}","provisioner":"Тип исполнения","localExecution":"Локальная изоляция","dockerExecution":"Контейнер Docker","security":"Безопасность","tenant":"Тенант","removeTitle":"Удалить {{id}}?","removeDescription":"Регистрация удалена; данные времени выполнения сохраняются.","disableTitle":"Отключить {{id}}?","disableDescription":"Процесс остановится, и владелец не сможет перезапустить его, пока администратор не разрешит его.","rebuildTitle":"Пересобрать {{id}} с текущим образом?","rebuildDescription":"Контейнер будет заменен на образ в настройках системы. Постоянное рабочее пространство, секреты и резервные копии сохраняются.","emptyTitle":"Времени выполнения пока нет","emptyDescription":"Создайте первую изолированную локальную среду выполнения QwenPaw."},"users":{"eyebrow":"Идентичность и доступ","title":"Доступ пользователя","de
150scription":"Создавайте локальные учетные записи, назначайте административный доступ и отзывайте сеансы из одного места.","addAccount":"Добавить аккаунт","publicRegistration":"Открытая регистрация","publicRegistrationDescription":"Если этот параметр отключен, только администраторы могут создавать учетные записи.","currentAccountProtected":"Текущая учетная запись защищена","empty":"Ни один пользователь не соответствует этим фильтрам"},"credentials":{"eyebrow":"Хранилище по тенантам","title":"Учетные данные","description":"Храните ключи поставщика внутри явной области клиента или среды выполнения. Секретные значения зашифрованы и никогда не возвращаются API.","storeCredential":"Сохранить учетные данные","updated":"Обновлено {{date}}","deleteTitle":"Удалить {{name}}?","deleteDescription":"Среды выполнения, использующие эти учетные данные, могут перестать работать.","emptyTitle":"Хранилище пусто","emptyDescription":"Сохраните ключ API в области клиента или среды выполнения.","encrypted":"Зашифровано в состоянии покоя; открытый текст не может быть прочитан"},"overview":{"eyebrow":"Панель мониторинга","title":"Обзор Hub","description":"Анализируйте состояние хаба, используя реальное состояние во время выполнения, ресурсы хоста и события аудита.","availability":"Доступность сред","availabilityDetail":"{{running}} из среды выполнения {{total}} в настоящее время доступен онлайн.","totalRuntimes":"Всего сред","failedCount":"Среды выполнения {{count}} требуют внимания","totalUsers":"Пользователи хаба","managedLocally":"Локальное управление идентификацией и доступом","hostResources":"Ресурсы хоста","liveSnapshot":"Текущий снимок в реальном времени","memory":"Память","dataDisk":"Диск с данными","recentActivity":"Недавняя активность","auditBacked":"Поддерживается постоянным журналом аудита","systemHealthy":"Все системы в рабочем состоянии","systemDegraded":"Система деградировала","localIsolation":"Локальное изолированное выполнение"},"table":{"searchRuntimes":"Поиск сред выполнения, владельцев или конечных точек","searchUsers":"Поиск имен пользователей или идентификаторов пользователей","searchCredentials":"Поиск по именам или областям учетных данных","searchAudit":"Поиск актеров или ресурсов","allStates":"Все статусы","allOwners":"Все владельцы","allExecutions":"Все виды исполнения","allRoles":"Все роли","allUserStates":"Все пользовательские состояния","allScopes":"Все области","allActions":"Все действия","runtime":"Среда выполнения","status":"Статус","owner":"Владелец","endpoint":"Адрес","execution":"Тип запуска","updated":"Обновлено","user":"Пользователь","role":"Роль","created":"Создано","credential":"Учетные данные","scope":"Область","event":"Событие","actor":"Оператор","resource":"Ресурс","result":"Результат","time":"Время","total":"{{total}} записей"},"audit":{"eyebrow":"Безопасность и управление","title":"Журнал аудита","description":"Узнайте, кто выполнил каждое действие по управлению Хабом, его цель, результат и время. Чувствительные значения никогда не проверяются.","empty":"Управленческих мероприятий пока нет"},"settings":{"eyebrow":"Конфигурация платформы","title":"Системные настройки","description":"Управляйте полной конфигурацией Hub из одного проверенного источника достоверной информации. Изменения вступают в силу немедленно и сохраняются после перезапуска.","save":"Сохранить настройки","meta":"Версия {{revision}} · Обновлен {{date}}","tabs":{"access":"Безопасность доступа","runtime":"Время выполнения"},"access":{"title":"Доступ и регистрация","description":"Настройте доступный через браузер адрес концентратора и политику общедоступных учетных записей.","publicBaseUrl":"URL общедоступной базы","publicBaseUrlHint":"Используется для обратных вызовов OAuth. Оставьте пустым только для развертываний только с обратной связью.","registration":"Открытая регистрация","registrationHint":"Если этот параметр отключен, только администраторы могут создавать учетные записи.","defaultRole":"Роль регистрации по умолчанию","defaultRoleHint":"Самозарегистрированные учетные записи всегда явл
150яются обычными пользователями в целях безопасности."},"security":{"title":"Защита аутентификации","description":"Ограничьте злоупотребления при входе и регистрации и заблокируйте адреса или сети.","ipBlacklist":"Черный список IP-адресов","ipBlacklistHint":"Поддерживает IPv4, IPv6 и CIDR; нажимайте Enter после каждого значения.","trustedProxyIps":"Доверенные обратные прокси","trustedProxyIpsHint":"X-Forwarded-For заслуживает доверия только при отправке с этих адресов.","loginRateLimit":"Ограничение скорости неудачного входа","loginRateLimitHint":"Временно заблокируйте повторяющиеся неудачные попытки входа с одного адреса.","registrationRateLimit":"Ограничение скорости регистрации","registrationRateLimitHint":"Ограничьте создание новых учетных записей с одного адреса.","maxAttempts":"Максимальное количество попыток","windowSeconds":"Окно (секунды)","blockSeconds":"Длительность блока (секунды)"},"runtime":{"title":"Политика времени выполнения","description":"Выберите серверную часть среды выполнения. Существующие среды выполнения переключаются при следующем перезапуске.","provisioner":"Серверная часть среды выполнения","localBackend":"Локальный процесс","localBackendHint":"Запускает изолированные процессы непосредственно на этом хосте.","dockerBackend":"Контейнер Docker","dockerBackendHint":"Запускает каждую учетную запись в управляемом контейнере.","backendUnavailable":"Недоступно на этом хосте","localIsolationHint":"Локальный режим использует хост-процессы и не использует никаких настроек образа Docker.","dockerIsolationHint":"Режим Docker применяет приведенную ниже политику изображений и ресурсов к каждой учетной записи."},"docker":{"title":"Политика Docker","description":"Централизованно управляйте образом, поведением извлечения и ограничениями ресурсов для каждого контейнера. Пользователи не могут отменить эти настройки.","unavailable":"Двигатель Docker недоступен.","source":"Источник изображения","dockerHub":"Официальный Docker Hub","aliyunAcr":"Официальный реестр Alibaba Cloud","custom":"Пользовательское изображение","customHint":"Введите любую ссылку на изображение, разрешенную политикой.","customRegistry":"Ссылка на собственный реестр или образ","localHost":"Локальное изображение","localHostHint":"Используйте тег изображения, уже присутствующий на этом хосте.","noLocalImages":"Не найдено локальных изображений с тегами","image":"Изображение и тег","selectLocalImage":"Выберите локальный тег изображения","selectedImage":"Эффектный имидж","repository":"Репозиторий","localStatus":"Местный статус","downloaded":"Скачано","notDownloaded":"Не загружено","pullPolicy":"Политика автоматического получения","ifNotPresent":"Тянуть при отсутствии локально","always":"Потяните перед первым созданием","never":"Используйте только локальные изображения","pullImage":"Вытащить изображение сейчас","localImages":"Ссылки на локальные изображения {{count}}","resources":"Ограничения ресурсов контейнера","cpuLimit":"Ядра процессора","memoryLimit":"Память (МБ)","pidsLimit":"Максимум процессов","shmSize":"Общая память (МБ)"}
150,"quotas":{"title":"Глобальная емкость времени выполнения","description":"Каждый арендатор владеет ровно одной средой выполнения; это ограничивает одновременное время выполнения в Hub.","maxRunningRuntimes":"Максимальное время работы","unlimitedHint":"Пустой означает неограниченный."}},"auditActions":{"runtime":{"create":"Созданная среда выполнения","start":"Начало выполнения","stop":"Остановлено время выполнения","disable":"Отключено время выполнения","rebuild":"Восстановленная среда выполнения","delete":"Удалена среда выполнения"},"image":{"pull":"Вытащено изображение Docker."},"user":{"create":"Созданный пользователь","update":"Обновленный пользователь"},"credential":{"store":"Сохраненные учетные данные","delete":"Удаленные учетные данные"},"settings":{"update":"Обновлены настройки Хаба."},"auth":{"register":"Зарегистрированный пользователь Хаба"}},"auditOutcomes":{"success":"Успех","failure":"Отказ"},"runtimeForm":{"title":"Создать среду выполнения","hint":"Среда выполнения запускается внутри собственной локальной песочницы. Его файлы, секреты и дерево процессов остаются отдельно от других пользователей.","runtimeId":"Идентификатор среды выполнения","startImmediately":"Начать немедленно","submit":"Создать среду выполнения"},"userForm":{"title":"Добавить аккаунт","hint":"Используйте временный пароль длиной не менее восьми символов. Пользователь может получить доступ только к средам выполнения, принадлежащим его личному арендатору.","username":"Имя пользователя","temporaryPassword":"Временный пароль","role":"Роль","submit":"Создать учетную запись"},"credentialForm":{"title":"Сохранить учетные данные","hint":"Область действия клиента применяется ко всем средам выполнения. Область выполнения — это частное переопределение для одного выбранного процесса.","scope":"Объем","allRuntimes":"Все мои рантаймы","environmentName":"Имя среды","secretValue":"Секретное значение","submit":"Зашифровать и сохранить"}}'),Wx={title:"Вход в QwenPaw",registerTitle:"Создание аккаунта",firstUserHint:"Создайте учётную запись администратора для начала работы",usernamePlaceholder:"Имя пользователя",passwordPlaceholder:"Пароль",usernameRequired:"Пожалуйста, введите имя пользователя",passwordRequired:"Пожалуйста, введите пароль",submit:"Войти",register:"Зарегистрироваться",failed:"Ошибка входа, проверьте учётные данные",registerSuccess:"Регистрация прошла успешно",registerFailed:"Ошибка регистрации",authNotEnabled:"Аутентификация не включена",logout:"Выйти",logoutSuccess:"Вы успешно вышли",sessionExpired:"Сессия истекла, пожалуйста, войдите снова",unauthorized:"Не авторизован, пожалуйста, войдите"},zx={title:"Управление аккаунтом",currentPassword:"Текущий пароль",currentPasswordRequired:"Пожалуйста, введите текущий пароль",newUsername:"Новое имя пользователя",newUsernamePlaceholder:"Оставьте пустым, чтобы не менять",newPassword:"Новый пароль",newPasswordPlaceholder:"Оставьте пустым, чтобы не менять",confirmPassword:"Подтвердите новый пароль",confirmPasswordPlaceholder:"Введите новый пароль ещё раз",passwordMismatch:"Пароли не совпадают",save:"Сохранить изменения",updateSuccess:"Аккаунт успешно обновлён",updateFailed:"Не удалось обновить аккаунт",wrongPassword:"Текущий пароль неверен",nothingToUpdate:"Пожалуйста, введите новое имя пользователя или пароль",passwordEmpty:"Пароль не может быть пустым",usernameEmpty:"Имя пользователя не может быть пустым",username:"Имя пользователя",passwordRequired:"Введите новый пароль",hubPasswordPlaceholder:"Введите не менее восьми символов",runtimeTitle:"Личная среда выполнения",runtimeDescription:"Перезапустите среду, если рабочее пространство недоступно. Текущие задачи будут прерваны, сохранённые данные останутся.",runtimeRestartConfirmTitle:"Перезапустить среду выполнения?",runtimeRestartConfirmDescription:"Текущие задачи будут прерваны на время перезапуска.",runtimeRestart:"Перезапустить среду",runtimeRestartSuccess:"Среда перезапущена",runtimeRestartFailed:"Не удалось перезапустить среду"}
150,Kx={title:"Транскрипция голоса",description:"Настройте обработку входящих аудио- и голосовых сообщений.",loadFailed:"Не удалось загрузить настройки аудиорежима",saveSuccess:"Аудиорежим сохранён",saveFailed:"Не удалось сохранить аудиорежим",audioModeLabel:"Аудиорежим",audioModeDescription:"Выберите, как голосовые сообщения из каналов (Discord, Telegram и др.) обрабатываются перед отправкой модели.",modeAuto:"Авто (рекомендуется)",modeAutoDesc:"Транскрибировать аудио в текст через выбранный провайдер, затем отправить текст модели. Если транскрипция отключена или недоступна, отображается заглушка «файл загружен». В этом режиме аудио не отправляется модели напрямую. Работает со всеми моделями.",modeNative:"Нативное аудио",modeNativeDesc:"Отправлять аудиофайл модели напрямую без транскрипции. Это единственный режим, передающий аудио модели. Работает только с моделями, поддерживающими аудио (например, gpt-4o-audio). Большинство моделей не поддерживают этот режим.",ffmpegReady:"ffmpeg установлен. Конвертация аудио для нативного режима доступна.",ffmpegMissing:"ffmpeg не установлен.",ffmpegMissingDesc:"Нативный аудиорежим требует ffmpeg для конвертации аудиоформатов (например, .ogg в .wav). Установите ffmpeg как системный пакет для включения этого режима.",providerTypeLabel:"Провайдер транскрипции",providerTypeDescription:"Выберите бэкенд транскрипции. Если голосовая транскрипция не нужна, выберите «Отключено».",providerTypeDisabled:"Отключено",providerTypeDisabledDesc:"Без транскрипции. Голосовые сообщения будут отображаться как заглушка «файл загружен».",providerTypeWhisperApi:"Whisper API",providerTypeWhisperApiDesc:"Использовать OpenAI-совместимый Whisper API от настроенного провайдера (например, OpenAI, Ollama).",providerTypeLocalWhisper:"Локальный Whisper",providerTypeLocalWhisperDesc:"Запускать транскрипцию локально с помощью библиотеки openai-whisper. Требуются ffmpeg и openai-whisper.",localWhisperReady:"Локальный Whisper готов к работе. ffmpeg и openai-whisper установлены.",localWhisperMissing:"Локальный Whisper не готов. Необходимо установить недостающие зависимости.",localWhisperMissingDesc:"ffmpeg: {{ffmpeg}} | openai-whisper: {{whisper}}. Установите недостающие зависимости: ffmpeg (системный пакет) и openai-whisper (uv pip install openai-whisper или установите QwenPaw с опцией [whisper]).",providerLabel:"Провайдер Whisper API",providerDescription:"Выберите провайдера для транскрипции аудио через Whisper API. Отображаются только провайдеры с совместимым эндпоинтом.",providerPlaceholder:"Выберите провайдера...",noProvidersWarning:"Не найдено провайдеров для транскрипции. Настройте провайдер OpenAI для включения голосовой транскрипции.",transcriptionInfoTitle:"Как работает транскрипция",transcriptionInfoDesc:"Whisper API транскрипция использует OpenAI-совместимый эндпоинт /v1/audio/transcriptions. Необходим провайдер с поддержкой Whisper (например, OpenAI). Выберите конкретного провайдера выше для включения транскрипции.",transcriptionInfoDescLocal:"Локальная Whisper транскрипция запускает библиотеку openai-whisper непосредственно на вашем устройстве. Требуются ffmpeg (для декодирования аудио) и пакет openai-whisper. API-ключ и подключение к интернету не нужны. Установка: uv pip install 'qwenpaw[whisper]'."},$x={title:"ACP",loading:"Загрузка конфигурации ACP...",builtin:"Встроенный",custom:"Пользовательский",create:"Добавить пользовательский агент",createTitle:"Создать ACP агент",createSuccess:"ACP агент создан",editTitle:"Редактировать конфигурацию ACP",agentKey:"Ключ агента",agentKeyRequired:"Пожалуйста, введите ключ агента",agentKeyInvalid:"Ключ агента может содержать только буквы, цифры, подчёркивания и дефисы",agentKeyExists:"Этот ключ агента уже существует",enabled:"Включено",command:"Команда",commandRequired:"Пожалуйста, введите команду",args:"Аргументы",argsHelp:"По одному аргументу на строку",env:"Переменные окружения",envHelp:"Используйте формат KEY=VALUE в каждой строке",envInvalidLine:"Неверный формат переменной ок
150ружения: {{line}}",trusted:"Доверенный",toolParseMode:"Режим разбора инструментов",toolParseModeRequired:"Пожалуйста, выберите режим разбора инструментов",stdioBufferLimit:"Лимит буфера stdio",stdioBufferLimitHelp:"Максимальный размер буфера чтения одной строки stdio для ACP-подпроцесса в байтах.",stdioBufferLimitRequired:"Пожалуйста, укажите лимит буфера stdio",stdioBufferLimitMin:"Лимит буфера stdio должен быть не меньше 1 байта",docs:"Документация",docsHelp:'Открыть документацию по ACP и перейти к разделу "How to configure external runners"',notSet:"Не задано",configSaved:"Конфигурация ACP сохранена",configFailed:"Не удалось сохранить конфигурацию ACP",deleteTitle:"Удалить {{name}}",deleteConfirm:"Удалить этот ACP агент? Это действие нельзя отменить.",deleteSuccess:"ACP агент удалён",deleteFailed:"Не удалось удалить ACP агент",nodeSettings:"Настройки Node",nodePath:"Путь к Node",chooseOtherNode:"Выбрать другой Node...",selectNodePath:"Выбрать путь к Node",nodePathPrompt:"Введите путь к исполняемому файлу node",nodeSaved:"Настройки Node сохранены",nodeLoadFailed:"Не удалось загрузить настройки Node",nodeSaveFailed:"Путь к Node недоступен",nodeRuntime:{bundled:"Встроенный Node",system:"Системный Node",custom:"Пользовательский Node"},nodeRuntimeReason:{systemNodeMissing:"Системный Node не обнаружен",nodeMissing:"Путь к Node не существует",npxMissing:"npx не найден",versionCheckFailed:"Проверка версии не удалась",unavailable:"Недоступно"}},Qx={title:"Резервные копии",description:"Резервное копирование и восстановление рабочих пространств агентов и конфигураций.",create:"Создать резервную копию",import:"Импорт",export:"Экспорт",restore:"Восстановить",delete:"Удалить",batchDelete:"Удалить выбранные",batchDeleteConfirm:"Вы уверены, что хотите удалить {{count}} резервную(ых) копию(й)? Это действие нельзя отменить.",deleteConfirm:"Вы уверены, что хотите удалить эту резервную копию? Это действие нельзя отменить.",name:"Название",createdAt:"Создана",scopeSummary:"Область",descriptionLabel:"Описание",noBackups:"Резервных копий пока нет. Создайте одну для сохранения текущей конфигурации.",loadFailed:"Не удалось загрузить список резервных копий",createTitle:"Создать резервную копию",backupMode:"Режим резервного копирования",fullBackup:"Полная резервная копия",fullBackupDesc:"Резервное копирование всего, включая все рабочие пространства агентов, глобальные настройки, пул навыков и секреты",customBackup:"Пользовательская резервная копия",partialBackup:"Частичная резервная копия",partialBackupDesc:"Настроить содержимое резервной копии",nameRequired:"Название резервной копии обязательно",namePlaceholder:"Введите название резервной копии",descriptionPlaceholder:"Необязательное описание...",scopeAgents:"Рабочие пространства агентов",scopeGlobalConfig:"ГлобаÐ
150»ÑŒÐ½Ñ‹Ðµ настройки",scopeSkillPool:"Пул навыков",scopeSecrets:"Секреты",scopeSecretsHint:"Включает секреты провайдеров моделей (API-ключи), переменные окружения и другую конфиденциальную информацию",securityNotice:"Эта резервная копия может содержать конфиденциальные учётные данные. Рабочие пространства агентов включают учётные данные каналов (токены ботов, секреты приложений и т.д.), а секреты провайдеров моделей включают API-ключи. Не передавайте файлы резервных копий другим лицам.",searchPlaceholder:"Поиск по названию или ID...",total:"Всего {{count}}",agentsPlaceholder:"Выберите рабочие пространства агентов (оставьте пустым для всех)",selectAll:"Выбрать все",deselectAll:"Снять выбор",createSuccess:"Резервная копия успешно создана",createFailed:"Не удалось создать резервную копию",restoreTitle:"Восстановить резервную копию",restoreScope:"Область восстановления",restoreFullWarning:"Полное восстановление полностью заменит всё содержимое текущего экземпляра (всех агентов, глобальную конфигурацию, пул навыков и секреты). Это действие нельзя отменить. Во время восстановления связанные функции будут недоступны. После завершения восстановления перезапустите сервис.",agentGroupExisting:"Существующие",agentGroupNew:"Новые",agentExists:"Существует",agentNew:"Новый",agentActionReplace:"Заменить",agentActionAdd:"Добавить",agentColumnName:"Агент",agentColumnWorkspace:"Рабочая область",agentTotal:"Всего {{count}} агентов",noAgentsInBackup:"В резервной копии нет рабочих областей агентов",loadingAgents:"Загрузка списка агентов...",agentSearchPlaceholder:"Поиск по имени или ID...",agentSearchTotal:"{{count}} из {{total}} агентов",restoreCustomSummary:"Выбрано: {{existing}} существующих · {{added}} новых",defaultWorkspaceDirUnused:"Нет новых агентов",otherOptions:"Другие параметры",defaultWorkspaceDirDefault:"<Путь по умолчанию>/{{aid}}",restoreWarningModify:"Восстановление изменит текущие конфигурации. Это действие нельзя отменить.",restoreWarningRestart:"Во время восстановления связанные функции будут недоступны. После завершения восстановления перезапустите сервис.",preRestoreBackupTitle:"Создать резервную копию перед восстановлением",preRestoreBackupContent:"Операция восстановления необратима. Хотите сначала создать резервную копию текущего состояния? Это позволит откатиться, если во время восстановления возникнут проблемы.",preRestoreBackupYes:"Да, сначала создать резервную копию",preRestoreBackupNo:"Нет, восстановить сразу",preRestoreBackupDesc:"Автоматически созданная резервная копия перед восстановлением",preRestoreBackupFailed:"Не удалось создать резервную копию перед восстановлением",preRestoreBackupSuccess:"Резервная копия создана успешно, ID: {{id}}",creatingPreRestoreBackup:"Создание резервной копии перед восстановлением...",skipAndRestore:"Пропустить и продолжить восстановление",restoreConfirm:"Я подтверждаю, что хочу восстановить эту резервную копию",restoreMode:"Режим восстановления",restoreModeFull:"Полное восстановление",restoreModeFullDesc:"Полная замена всего содержимого текущего экземпляра, включая всех агентов, глобаÐ
150»ÑŒÐ½ÑƒÑŽ конфигурацию, пул навыков и секреты",restoreModeCustom:"Выборочное восстановление",restoreModeCustomDesc:"Выберите содержимое для восстановления, например, отдельных агентов, конфигурацию и т.д.; существующие агенты, не включённые в это восстановление, сохранятся",restoreModeFullDisabled:"Только для полной резервной копии",defaultWorkspaceDir:"Каталог рабочей области агента по умолчанию",defaultWorkspaceDirPlaceholder:"Оставьте пустым для использования ~/.qwenpaw/workspaces",defaultWorkspaceDirHint:"Если исходный путь рабочей области агента не существует, агент будет сохранён по пути <путь по умолчанию>/<ID агента>. Если путь существует, используется исходный путь агента.",restoreStrategy:"Стратегия восстановления",restoreStrategyPreserve:"Сохранить локальные настройки безопасности и MCP",restoreStrategyPreserveDesc:"Сохранить защитные настройки безопасности и конфигурацию MCP этого экземпляра.",restoreStrategyRestore:"Восстановить эти настройки из резервной копии",restoreStrategyRestoreDesc:"Использовать настройки безопасности и MCP из резервной копии.",restoreSuccess:"Резервная копия успешно восстановлена. Пожалуйста, перезапустите сервис.",restoreSuccessPreserved:"Резервная копия успешно восстановлена. Сохранены локальные настройки: {{keys}}. Пожалуйста, перезапустите сервис.",restoreSuccessWithBackup:"Резервная копия успешно восстановлена. ID резервной копии до восстановления: {{preRestoreId}}. Пожалуйста, перезапустите сервис.",restoreFailed:"Не удалось восстановить резервную копию",restoreTimedOut:"Восстановление всё ещё выполняется или превысило 5 минут. Проверьте размер резервной копии, свободное место на диске и журналы службы перед повторной попыткой.",restoreTargetBusy:"Не удалось восстановить резервную копию: эти каталоги все еще используются. Закройте браузер или процесс, который их использует, и повторите попытку. Если каталоги остаются заблокированными, перезапустите систему и попробуйте снова.",detailLoadFailed:"Не удалось загрузить детали резервной копии; восстановление недоступно",trustLocalBanner:"Локальная резервная копия — по умолчанию полное восстановление",trustForeignBanner:"Импортированная резервная копия — локальные настройки безопасности и MCP сохраняются по умолчанию",trustLegacyBanner:"Устаревшая резервная копия — перед восстановлением нужно подтвердить доверие",trustForeignTitle:"Доверять этой резервной копии?",trustLegacyTitle:"Доверять устаревшей резервной копии?",unknownBackupName:"Архив резервной копии",trustForeignDesc:"Эта резервная копия не подписана данным экземпляром. Продолжайте только если доверяете источнику; при восстановлении локальные настройки безопасности и MCP будут сохранены по умолчанию.",trustLegacyDesc:"У этой старой резервной копии нет локальной подписи. Продолжайте только если доверяете источнику; этот экземпляр подпишет ее перед восстановлением.",deleteSuccess:"Резервная(ые) копия(и) успешно удалена(ы)",deleteFailed:"Не удалось удалить резервную(ые) копию(и)",exportFailed:"Не удалось экспортировать резервную копию",exportWarningTitle:"Предупреждение о конфиденциальной информации",exportWarningContent:"Эта резервная копия может содержать конфиденциальную информацию учетных данных. Рабочие пространства агентов содержат учетные данные каналов (такие как токены ботов, секреты приложений и т.д.), а секреты поставщиков моделей содержат API-ключи. Не передавайте файл резервной копии другим лицам.",exp
150ortConfirm:"Подтвердить экспорт",importTitle:"Импорт резервной копии",importSuccess:"Резервная копия успешно импортирована",importFailed:"Не удалось импортировать резервную копию",importConflictTitle:"Резервная копия уже существует",importConflictDesc:"Резервная копия с таким же ID уже существует. Хотите заменить её?",importReplace:"Заменить",agents:"{{count}} агент(ов)",allAgents:"Все агенты",globalConfig:"Глобальные настройки",skillPool:"Пул навыков",secrets:"Секреты",selected:"Выбрано {{count}}",fileCount:"{{count}} файлов",totalSize:"{{size}}",progressStarting:"Инициализация резервной копии...",progressAgent:"Резервное копирование агента {{index}} / {{total}}...",progressSaving:"Сохранение файла резервной копии...",progressDone:"Резервная копия создана",localModelsNotice:"Файлы резервной копии не включают локальные файлы моделей. При миграции между устройствами необходимо повторно загрузить нужные локальные модели на целевом устройстве."},Jx={title:"Требуется подтверждение безопасности",tool:"Инструмент",severity:"Уровень угрозы",findings:"Находки",parameters:"Параметры",approve:"Подтвердить",deny:"Отклонить",source:"Источник",subSession:"Подагент",approved:"Вызов инструмента подтвержден",denied:"Вызов инструмента отклонен",approveFailed:"Не удалось подтвердить",denyFailed:"Не удалось отклонить",approvePattern:"Всегда Разрешить",strictModeHint:"Всегда разрешить недоступно в строгом режиме",approveExact:"Только Сейчас",approvalScope:"Область подтверждения",details:"Подробности",timeoutAutoDenied:"Время истекло, автоматически отклонено",acknowledge:"Понятно",builtinSource:"Встроенный",ownerAgent:"Владелец агента",executingAgent:"Исполняющий агент"},Yx={title:"Менеджер плагинов",description:"Установка, управление и удаление плагинов без перезапуска службы.",installed:"Установленные плагины",noPlugins:"Плагины еще не установлены",installBtn:"Установить плагин",installTitle:"Установка плагина",dropPrimary:"Перетащите папку или ZIP-файл сюда",dropSecondary:"или нажмите, чтобы выбрать ZIP-файл",orFromUrl:"или из URL",installFromUrl:"Установить из URL",urlPlaceholder:"https://example.com/plugin.zip",zipOnly:"При перетаскивании файлов поддерживаются только ZIP-файлы — перетащите папку для установки из директории",dropFailed:"Не удалось прочитать перетащенную папку",restartHint:"Некоторые плагины (например, хуки, monkey-patches) могут требовать перезапуска приложения для полного вступления в силу или удаления.",installing:"Установка...",installSuccess:"Плагин успешно установлен",installFailed:"Не удалось установить плагин",uninstall:"Удалить",uninstallConfirm:'Удалить плагин "{{name}}"? Это действие нельзя отменить. Некоторые плагины могут требовать перезапуска приложения для полного удаления.',uninstalling:"Удаление...",uninstallSuccess:"Плагин успешно удалён",uninstallFailed:"Не удалось удалить плагин",statusLoaded:"Работает",statusUnloaded:"Не загружен",type:"Тип",version:"Версия",author:"Автор",unknown:"Неизвестно",noMatchingPlugins:"Нет плагинов, соответствующих текущим фильтрам",loadFailed:"Не удалось загрузить список плагинов",confirmTitle:"Подтвердить удаление",officialTitle:"Официальные плагины",officialDesc:"Установка опубликованных плагинов с CDN загрузок.",catalogRefresh:"Обновить",catalogEmpty:"Нет доступных официальных плагинов (каталог CDN может быть пуст)",catalogLoadFailed:"Не удалось загрузить каталог официальных плагинов",catalogInstall:"Установить",catalogRe
150install:"Переустановить",catalogUpgrade:"Доступно обновление",catalogUpgradeBtn:"Обновить",catalogInstalled:"Установлен",catalogSha256:"SHA256",kindBundle:"Пакет",kindTool:"Инструмент",filterByName:"Фильтр по имени",filterByKind:"Фильтр по типу",marketTitle:"Магазин плагинов",marketEmpty:"No plugins found in market",marketLoadFailed:"Failed to load plugin market",marketUnavailable:"Plugin Market is currently under maintenance, please try again later",marketAll:"All",marketSearch:"Search plugins...",marketCategory:"Filter by category",marketSearchResult:'Found {{count}} plugins matching "{{keyword}}"',marketDetails:"Details",marketDownloads:"Downloads",marketDeveloper:"Developer",marketSortLabel:"Sort plugins",marketSortDownloads:"Most downloaded",marketSortUpdated:"Recently updated",marketSortFavorites:"Most favorited"},Xx={title:"Ежедневный AI-сбор",tabApprovals:"Подтверждения",tabPushMessages:"Push-сообщения",tabHarvests:"AI-сбор",summaryApprovals:"Подтверждения",summaryPushUnread:"Непрочитанные push",summaryHarvests:"Сборы",from:"От:",requestedBy:"Кем:",markRead:"Прочитано",markAllRead:"Прочитать всё",markAllReadNoUnread:"Нет непрочитанных сообщений",markAllReadSuccess:"Отмечено как прочитанное: {{count}} сообщ.",selectAllCurrentPage:"Выбрать текущую страницу",selectedItems:"Выбрано: {{count}}",batchDeleteButton:"Удалить выбранные",batchOperation:"Массовые действия",exitBatch:"Выйти",batchDeleteConfirm:"Удалить {{count}} выбранных push-сообщений?",batchDeleteSuccess:"Удалено push-сообщений: {{count}}",pushCronHeader:"Cron-задача: {{name}}",viewDetails:"Подробнее",deleteMessageConfirm:"Удалить это push-сообщение?",viewAll:"Показать все",read:"Читать",approve:"Подтвердить",reject:"Отклонить",ready:"Готово",harvestNow:"Собрать сейчас",createHarvest:"Создать сбор",createFirstHarvest:"Создайте первый сбор",createSuccess:"Сбор успешно создан",emptyApprovals:"Нет ожидающих подтверждений",emptyPush:"Нет push-сообщений",wobbleEnable:"Включить уведомление о подтверждении",wobbleDisable:"Отключить уведомление о подтверждении",emptyHarvests:"Сборов пока нет",statusReadyToHarvest:"Готово к сбору",statusGrowing:"Растёт",harvestedTimes:"Собрано раз: {{count}}",harvestSuccessRate:"Успешность {{rate}}%",messageDetailComingSoon:"Подробный вид сообщения — скоро!",harvestSettingsComingSoon:"Настройки сбора — скоро!",messageDetailTitle:"Детали выполнения",detailCronTitle:"Cron-задача: {{name}}",detailHeartbeatTitle:"Пульс",messageNotFound:"Сообщение не найдено",detailTaskName:"Имя задачи",detailTaskId:"ID задачи",detailStatus:"Статус",detailSeverity:"Важность",detailAgent:"Агент",detailSource:"Источник",detailSourceCronJob:"Cron-задача",detailSourceHeartbeat:"Пульс",detailTrigger:"Триггер",detailDuration:"Длительность",detailExecutedAt:"Выполнено в",detailReceivedAt:"Получено в",detailRunId:"ID запуска",detailContent:"Вывод",detailPayload:"Данные",detailExecutionTrace:"Трассировка выполнения",detailTraceEmpty:"Трассировка выполнения недоступна",mailDetailSender:"Отправитель",mailDetailSubject:"Тема",mailDetailDate:"Время письма",mailDetailBody:"Предпросмотр текста",mailDetailProcess:"Процесс обработки",filterByAgent:"Фильтр по агенту",filterBySourceType:"Фильтр по источнику",sourceTypeCron:"Cron",sourceTypeHeartbeat:"Heartbeat",sourceTypeMemory:"Memory",sourceTypeMail:"Mail",mailAccessControl:"Контроль доступа к почте",pendingSenders:"Отправители на рассмотрении",senderLists:"Списки отправителей",addSender:"Добавить отправителя",domainWildcardHint:"Поддерживаются шаблоны доменов, например *@example.com",invalidAddress:"Неверный адрес электронной почты. Используйте формат [email protected] или *@domain.com",whitelist:"Белый список",blacklist:"Чёрный список",approveSender:"Одобрить",deny:"Заблокировать",dismiss:"Игнорировать",batchApprove:"Массовое одобрение",batchDeny:"Массовая блокировка",batchDismiss:"Массовое игнорирование",batchRemove:"Массовое удаление",confirmApprove:"Одобрить выбранных отправителей?",confirmDeny:"Отклонить выбранных отправителей?",confirmDismiss:"Игнорировать выбранных отправителей?",confirmRemove:"Подтвердить удаление?",removeSuccess:"Успешно удалено",addedToAllAgents:"Добавлено и синхронизировано со всеми агентами",senderAddress:"Адрес отправителя",displayName:"Имя отправителя",emailSubject:"Тема",bodyPreview:"Предпросмотр текста",selectAgent:"Выбрать агента",allAgents:"Все агенты",time:"Время",remark:"Примечание",actions:"Действия",optional:" (необязательно)",required:" (обязательно)"},Zx={title:"Режим кодирования",experimental:"Экспериментальная функция",experimentalDesc:"Режим кодирования превращает QwenPaw в лёгкую Web IDE с редактором кода, деревом файлов, интеграцией Git и AI-помощником для программирования.",experimentalNote:"Эта функция является экспериментальной и находится в активной разработке. Некоторые возможности могут быть ограничены или изменены в будущих обновлениях.",confirmBtn:"Включить режим кодирования",enterTooltip:"Войти в режим кодирования",exitTooltip:"Выйти из режима кодирования",btnCode:"Код",btnChat:"Чат",selectProject:"Выбрать каталог проекта",selectProjectDesc:"Выберите проект или используйте рабочее пространство по умолчанию",tabWorksp
150ace:"Рабочее пространство по умолчанию",tabClone:"Клонировать репозиторий",tabLocal:"Импортировать локальный проект",tabNew:"Новый проект",workspaceDesc:"Использовать директорию рабочего пространства текущего агента",cloneUrl:"URL Git-репозитория",cloneUrlPlaceholder:"https://github.com/user/repo.git",cloneName:"Название проекта (необязательно)",cloneNamePlaceholder:"Оставьте пустым для определения из URL",cloneBtn:"Начать клонирование",cloning:"Клонирование...",localPath:"Путь к локальной директории",localPathPlaceholder:"/Users/ваше-имя/мой-проект",localPathHint:"Введите абсолютный путь к вашему локальному проекту",openBtn:"Импортировать",newName:"Название проекта",newNamePlaceholder:"мой-проект",createBtn:"Создать проект",switchProject:"Сменить проект",currentProject:"Текущий проект",resetToWorkspace:"Сбросить до рабочего пространства по умолчанию",dropPrimary:"Перетащите папку сюда или нажмите для выбора",dropSecondary:"Перетащите из Finder или вставьте путь ниже",pathHint:"Введите полный абсолютный путь (начинающийся с / или ~)",importing:"Импорт...",dropFailed:"Не удалось прочитать папку",workingDir:"Рабочая директория",importCopyNote:"Папка будет скопирована в управляемую библиотеку проектов QwenPaw. Оригинальные файлы не будут изменены.",importCopyDesc:"Импорт создаст копию папки. Агент работает с копией, оригинальные файлы не изменяются. Чтобы работать с оригиналом напрямую, используйте «Открыть каталог».",tabOpenDir:"Открыть каталог",openDirDesc:"Открыть существующий локальный каталог — файлы не копируются",openDirBtn:"Открыть этот каталог",openDirLoading:"Загрузка...",openDirEmpty:"Нет подкаталогов",openDirHome:"Домой",openDirRefresh:"Обновить",openDirHiddenFolders:"Скрытые папки"},eR={searchPlaceholder:"Поиск навыков по платформам",categoryAll:"Все",categoryPlaceholder:"Поиск категории",searchResult:'Найдено навыков по запросу "{{keyword}}": {{count}}',providerUnavailable:"Источник недоступен",noResults:"Ничего не найдено",startTyping:"Введите запрос выше, чтобы найти навык в маркете",browseHint:"Выберите категорию или введите ключевое слово, чтобы просмотреть навыки в {{providers}}",noDescription:"Описание отсутствует",browseMarket:"Обзор маркета",installQueue:"Очередь установки",clearCompleted:"Очистить",retry:"Повторить",status:{queued:"В очереди",installing:"Установка",completed:"Готово",failed:"Ошибка",cancelled:"Отменено"},loadMore:"Загрузить ещё",noMoreResults:"Больше результатов нет",detail:{title:"Сведения о навыке",version:"Версия",author:"Автор",sourceUrl:"URL установки",slug:"Идентификатор",missing:"—"},stats:{downloads:"Скачивания",stars:"Звёзды",installs:"Установки",likes:"Лайки",views:"Просмотры",category:"Категория",updatedAt:"Обновлено"},queueMsg:{timedOut:"Время установки истекло",failedPrefix:"Ошибка: {{msg}}"}},tR={starting:"Запуск сервера...",checking:"Подключение к серверу...",error:"Не удалось запустить сервер.",errorHint:"Не удалось запустить процесс сервера. Проверьте журналы приложения.",errorDetails:"Показать сведения об ошибке",timeout:"Не удалось запустить сервер за {{seconds}} секунд.",timeoutHint:"Не удалось запустить бэкенд. Повторите попытку или проверьте журналы приложения.",retry:"Повторить"},aR={error:{SENSITIVE_FILE_BLOCKED:"Этот файл заблокирован защитой файлов (защита конфиденциальных файлов).",OUTSIDE_WORKSPACE:"Этот файл находится за пределами рабочего пространства. Включите «Разрешить предпросмотр файлов вне рабочего пространства» в Настройки → Безопасность → Защита файлов.",FORBIDDEN:"Доступ запрещён: недостаточно прав для предпросмотра этого файла.",NOT_FOUND:"Файл не найден. Возможно, он был перемещён или удалён. Если использован относительный путь, попробуйте абсолютный.",LOAD_FAILED:"Не удалось загрузить предпросмотр файла.",LOAD_FAILED_DETAIL:"Не удалось загрузить предпросмотр файла: {{detail}}"}},nR={readFile:"Читать {{file}}",readFileDefault:"Читать файл",writeFile:"Создать {{file}}",writeFileDefault:"Создать файл",editFile:"Редактировать {{file}}",editFileDefault:"Редактировать файл",appendFile:"Добавить в {{file}}",appendFileDefault:"Добавить в файл",grepSearch:"Grep {{pattern}}",grepSearchDefault:"Grep поиск",globSearch:"Glob {{pattern}}",globSearchDefault:"Glob поиск",viewImage:"Просмотр изображения {{file}}",viewImageDefault:"Просмотр изображения",viewVideo:"Просмотр видео {{file}}",viewVideoDefault:"Просмотр видео",desktopScreenshot:"Снимок рабочего стола",sendFile:"Отправить {{file}}",sendFileDefault:"Отправить файл",browserUse:"Просмотр {{detail}}",browserNavigate:"Открыть {{url}}",browserNavigateDefault:"Открыть страницу",browserClick:"Нажать",browserType:"Ввести текст",browserSnapshot:"Снимок страницы",browserScroll:"Прокрутка",getCurrentTime:"Получить текущее время",setTimezone:"Установить {{timezone}}",getTokenUsage:"Запросить использование токенов",memorySearch:"Поиск в памяти {{query}}",memorySearchDefault:"Поиск в памяти",listAgents:"Список агентов",chatWithAgent:"Чат с {{agent}}",chatWithAgentDefault:"Чат с агентом",submitToAgent:"Отправить {{agent}}{{task}}",submitToAgentDefault:"Отправить задачу",checkAgentTask:"Проверить {{agent}} #{{taskId}}",checkAgentTaskAgent:"Проверить {{agent}}",checkAgentTaskDefault:"Проверить задачу",delegateExternalAgent:"Делегировать {{runner}}",delegateExternalAgentDefault:"Делегировать внешнему агенту",shell:"Выполнить {{command}}",shellDefault:"Выполнить команду",formatTable:{file:"Файл",lineNumber:"Строка",score:"Оценка",summary:"Сводка",name:"Имя",id:"ID",description:"Описание",status:"Статус"},loading:"Загрузка...",rawInputPreview:"Необработанный ввод в реальном времени (последние 4 096 символов)",largeOutputOmitted:"Пропущено строк: {{count}} — скопируйте доступный вывод или следуйте инструкциям по восстановлению",largeOutputTruncated:"Вывод усечён для отображения — скопируйте доступный вывод или следуйте инструкциям по восстановлению",browserAction:{startHeaded:"Запустить браузер (с интерфейсом)",start:"Запустить браузер",stop:"Остановить браузер",open:"Открыть {{url}}",openDefault:"Открыть страницу",navigate:"Перейти на {{url}}",navigateDefault:"Навигация",navigateBack:"Назад",click:"Нажать {{selector}}",clickDefault:"Нажать элемент",type:"Ввести {{text}}",typeDefault:"Ввести текст",snapshot:"Получить снимок",screenshot:"Снимок экрана {{path}}",screenshotDefault:"Снимок экрана",eval:"Выполнить {{code}}",evalDefault:"Выполнить код",runCode:"Запустить {{code}}",runCodeDefault:"Запустить код",closePage:"Закрыть страницу",tabs:"Вкладки {{action}}",tabsDefault:"Управление вкладками",fillForm:"Заполнить форму",fileUpload:"Загрузить {{filename}}",fileUploadDefault:"Загрузить файл",fileDownload:"Скачать {{target}}",fileDownloadDefault:"Скачать файл",pressKey:"Нажать {{key}}",pressKeyDefault:"Нажать клавишу",hover:"Навести на {{selector}}",hoverDefault:"Навести на элемент",drag:"Перетащить",
150selectOption:"Выбрать опцию",waitFor:"Ждать {{target}}",waitForDefault:"Ждать элемент",resize:"Изменить размер {{w}}x{{h}}",resizeDefault:"Изменить размер окна",pdf:"Экспорт PDF {{path}}",pdfDefault:"Экспорт PDF",install:"Установить",batch:"Пакет"},lineBadge:{lines:"{{count}} строк",addLines:"+{{count}} строк",delLines:"-{{count}} строк",matches:"{{count}} совпадений",files:"{{count}} файлов"},inlineResult:{taskId:"Задача #{{id}}",submitted:"Отправлено"},execute:"Запустить {{tool}}",executeDefault:"Запустить инструмент"},oR={gotoSettings:"Настройки Loop агента",selectorTitle:"Режим Loop",selectorHint:"Выберите способ продолжения работы агента",selectorAria:"Выбрать режим Loop",builtInModes:"Встроенные",customModes:"Пользовательские и плагины",starting:"Запуск",running:"Выполняется",awaiting_user:"Ожидание вашего ответа",activePersistentDescription:"Режим действует в этом диалоге до завершения задачи или сброса диалога.",activeCustomDescription:"Пользовательский режим действует до команды /mode off, /clear или /new.",loadError:"Не удалось загрузить некоторые режимы Loop.",retry:"Повторить",modes:{default:{name:"По умолчанию",description:"Стандартный управляемый цикл агента."},goal:{name:"Цель",description:"Последовательная работа над конкретной проверяемой целью."},mission:{name:"Миссия",description:"Структурированная длительная многоэтапная задача."}}},iR={common:ux,harnesses:px,desktop:mx,chunkError:hx,appCenter:gx,nav:fx,os:bx,debug:kx,agent:yx,checkpoints:vx,workspace:Tx,skills:Sx,skillPool:Cx,mcp:wx,heartbeat:Px,cronJobs:Ax,channels:Mx,sessions:Dx,environments:xx,tokenUsage:Rx,agentStats:Ix,modelSelector:_x,models:Lx,files:Ex,projectDirectory:Fx,agentConfig:Ox,tools:Bx,modelConfig:Nx,header:Hx,theme:Ux,sidebar:qx,chat:jx,security:Gx,hub:Vx,login:Wx,account:zx,voiceTranscription:Kx,acp:$x,backup:Qx,approval:Jx,pluginManager:Yx,inbox:Xx,codingMode:Zx,market:eR,startup:tR,preview:aR,tool:nR,loop:oR},sR={save:"保存",reset:"重置",cancel:"取消",confirm:"确认",apply:"应用",delete:"删除",edit:"编辑",create:"创建",upload:"上传",download:"下载",refresh:"刷新",retry:"重试",search:"搜索",enable:"启用",disable:"禁用",enabled:"已启用",disabled:"已禁用",preview:"预览",raw:"源码",view:"查看",content:"内容",loading:"加载中...",saving:"保存中...",copy:"复制",copied:"已复制到剪贴板",copyFailed:"复制到剪贴板失败",contentPlaceholder:"输入内容...",help:"帮助",close:"关闭",back:"返回",actions:"操作",total:"共 {{count}} 条",clear:"清除",paste:"粘贴",yes:"是",no:"否"},rR={closeWindow:{title:"关闭窗口",description:"关闭窗口时您希望执行什么操作?退出应用将停止所有正在运行的任务和定时任务。",remember:"记住我的选择",showWindow:"显示窗口",minimizeToTray:"最小化到托盘",quitApp:"退出应用",preference:"关闭窗口",askEveryTime:"每次询问"}},lR={title:"页面加载失败",subTitle:"可能由网络问题或应用更新导致,请稍后重试。",genericTitle:"页面出现异常",genericSubTitle:"渲染此页面时发生了意外错误。",reload:"刷新页面"},dR={backToList:"返回",subtitle:"管理已安装的应用,或从官方与社区渠道扩展工作空间。",myApps:"我的应用",officialApps:"官方应用",appMarket:"应用市场",browseOfficialApps:"浏览官方应用",browseMarket:"浏览应用市场",officialAppsEmpty:"暂无官方应用",searchOfficial:"搜索官方应用...",installedCount:"{{count}} 个应用",clearFilters:"清除筛选",moreActions:"更多操作",openApp:"打开应用",noDescription:"暂无描述",search:"搜索应用...",allCategories:"全部",noApps:"尚未安装任何应用",noResults:"没有匹配的应用",loadFailed:"加载应用失败,请重试。",appNotLoaded:"该应用尚未加载。",appLoadFailed:"应用加载失败。你可以重新加载,当前工作区和其他应用不会受到影响。",uninstall:"卸载",uninstallConfirmTitle:"卸载应用?",uninstallConfirmContent:'这将删除应用 "{{name}}" 的目录,且不可撤销。',uninstallSuccess:"应用已卸载",uninstallFailed:"卸载失败",installing:"正在安装",installSuccess:"已安装",installFailed:"安装失败",installedStatus:"已安装",update:"更新",searchMarket:"搜索应用市场...",marketFilters:"应用市场筛选",filterAll:"全部",trending:"热门",marketEmpty:"未找到应用",loadMore:"加载更多",noMoreApps:"没有更多应用了",install:"安装",details:"详情",featured:"精选",aboutApp:"关于应用",exitApp:"退出应用",moreOptions:"更多选项",backToListHint:"返回应用列表 (ESC)",version:"版本",id:"ID",category:"分类",description:"描述"},cR={connected:"已连接",disconnected:"已断开",notConnected:"未连接",comingSoon:"即将推出",connect:"使用 ChatGPT 连接",disconnect:"断开连接",apiKeyAuthenticated:"已通过 API Key 认证",chatGptAuthenticated:"已连接 ChatGPT",cliAuthenticated:"{{type}} CLI 已认证"},uR={chat:"聊天",files:"文件",control:"控制",channels:"频道",sessions:"会话",inbox:"收件箱",apps:"应用",cronJobs:"定时任务",heartbeat:"心跳",agent:"工作区",workspace:"文件",skills:"技能",skillPool:"技能池",marketplace:"扩展",market:"技能市场",tools:"工具",mcp:"MCP",acp:"ACP",agentConfig:"运行配置",agents:"智能体管理",settings:"设置",models:"模型",environments:"环境变量",offloadPolicy:"工具后台策略",security:"安全",tokenUsage:"Token 消耗",agentStats:"智能体统计",voiceTranscription:"语音转写",debug:"调试",plugins:"插件",backups:"备份",pluginManager:"插件管理"},pR={console:"控制台",appStore:"应用商店",appStoreDesc:"安装或移除桌面应用",arrangeDesktop:"整理桌面",approvalActionFailed:"操作失败,请重试",booting:"正在启动…",changeWallpaper:"更换壁纸",clearAll:"全部清除",closeApp:"关闭",currentSpace:"当前空间",currentSpaceLabel:"当前空间:{{name}}",currentAppLabel:"当前应用:{{name}}",desktopApps:"桌面应用",finder:"桌面",focusApp:"聚焦",install:"安装",installed:"已安装",installedApp:"已安装",installedApps:"已安装应用",launchpad:"启动台",moveDockLeft:"向左移动",moveDockRight:"向右移动",missionControl:"调度中心",noInstalledApps:"暂无已安装应用",noNotifications:"暂无通知",noOpenWindows:"该空间没有打开的窗口",noSettings:"暂无可用设置",notInstalled:"未安装",notifications:"通知",notificationSummary:"审批 {{approvals}} · 收件箱 {{inbox}}",notifyApproval:"审批",notifyInbox:"收件箱",openApp:"打开",keepInDock:"保留在 Dock",removeFromDock:"从 Dock 移除",refreshDesktop:"刷新桌面",appMarket:"应用市场",appMarketRefresh:"刷新",appMarketSearch:"搜索应用...",appMarketEmpty:"暂无应用",appMarketUnavailable:"应用市场暂时不可用,请稍后再试",appMarketInstall:"安装",appMarketDetails:"详情",appMarketDeveloper:"开发者",appMarketDownloads:"下载量",appInstalled:"应用安装成功",a
150ppInstallFailed:"应用安装失败",appCompatibilityWarningTitle:"应用兼容性警告",appCompatibilityWarningContent:"该应用标注适配 QwenPaw {{labels}},而您当前的 QwenPaw 版本为 {{version}}。安装后可能出现错误,是否继续?",appCompatibilityWarningConfirm:"仍然安装",appCompatibilityUnverified:"暂无法确认该应用是否兼容当前 QwenPaw 版本。",restoreAll:"恢复全部",returnToConsole:"返回控制台",desktopMode:"桌面模式",qwenpawMenu:"QwenPaw 菜单",restoredAll:"已恢复全部应用",sortBy:"排列方式",sortFree:"自由排列",sortName:"按名称",sortType:"按类型",systemSettings:"系统设置",uninstall:"卸载",uninstallConfirmTitle:"卸载应用?",uninstallFailed:"卸载失败",uninstalledApp:"已卸载",update:"更新",wallpaper:"壁纸",windows:"个窗口"},mR={newVersion:"发现新版本 v{{version}},点击前往升级",updateModal:{title:"发现新版本 v{{version}}",viewReleases:"查看 Releases",installDesktopUpdate:"现在更新",desktopInstallHint:"QwenPaw 桌面端 {{version}} 已准备好安装,更新后应用将自动重启。",checking:"检查更新中…",checkingHint:"正在确认最新版本",downloading:"正在下载更新",downloadingTo:"正在更新到版本 {{version}}",downloadProgress:"{{done}} / {{total}} · {{rate}}",installing:"正在安装更新",willRestart:"应用将在安装完成后自动重启,请稍候…",stepPrepare:"准备",stepDownloading:"下载",stepInstalling:"安装",failedTitle:"更新失败",back:"返回",retry:"重试",errors:{network:"连接不上更新服务器,请检查网络后重试。",signature:"更新文件签名校验失败,请重新尝试下载。",appLocation:"QwenPaw 正在从 macOS 只读位置运行。请先将 QwenPaw.app 移动到“应用程序”文件夹,从那里启动后再重试更新。",other:"更新失败。"},updateLater:"后台下载",backgroundDownloading:"正在后台下载更新…",readyToInstall:"更新已就绪",readyToInstallHint:"v{{version}} 更新已下载,重启后将安装并启动新版本。",restartNow:"现在更新",backgroundFailed:"后台下载失败"},settings:{language:"语言",theme:"主题",mode:"模式",desktopMode:"桌面模式"},simpleMode:"精简模式",fullMode:"完整模式",toggleAgentNavigation:"展开或收起智能体导航"},hR={title:"调试",desc:"查看后端守护进程日志文件,便于排查问题。在此页面打开时日志会自动刷新。",level:{all:"全部"},backend:{title:"后端日志",autoRefresh:"自动刷新",newestFirst:"最新在前",updatedAt:"更新时间",path:"日志文件",notFound:"暂未找到后端日志文件。",placeholder:"后端日志会显示在这里。",loadFailed:"加载后端日志失败",searchPlaceholder:"搜索后端日志..."},actions:{refreshBackend:"刷新后端日志",refreshSuccess:"日志已刷新",copyBackend:"复制后端日志"}},gR={title:"收件箱",tabApprovals:"审批",tabPushMessages:"推送消息",tabHarvests:"AI 收获",summaryApprovals:"审批数",summaryPushUnread:"未读推送",summaryHarvests:"收获任务",from:"来自:",heartbeatSuccess:"Heartbeat 执行成功",heartbeatTimeout:"Heartbeat 执行超时",heartbeatCancelled:"Heartbeat 已取消",heartbeatFailed:"Heartbeat 执行失败",skillAutoSyncTitle:"技能自动同步",skillBuiltinAutoUpdateTitle:"内置技能自动更新",skillPoolSender:"技能池",skillAutoSynced:"{{skill}}技能发生修改,自动同步至以下智能体:{{agents}}",skillAutoSyncFailed:"{{skill}}技能自动同步失败,目标智能体:{{agents}}",skillBuiltinUpdated:"内置技能“{{skill}}”已在技能池更新:{{from}} → {{to}}",skillBuiltinUpdateFailed:"内置技能“{{skill}}”未能在技能池完成更新",skillBuiltinSynced:"“{{skill}}”已同步至:{{agents}}",skillBuiltinSyncFailed:"“{{skill}}”未能同步至:{{agents}}",requestedBy:"请求方",markRead:"标记已读",markAllRead:"全部标记已读",markAllReadNoUnread:"当前没有未读消息",markAllReadSuccess:"已将 {{count}} 条消息标记为已读",selectAllCurrentPage:"全选当前页",selectedItems:"已选 {{count}} 项",batchDeleteButton:"批量删除",batchOperation:"批量操作",exitBatch:"退出批量",batchDeleteConfirm:"确定删除选中的 {{count}} 条推送消息吗?",batchDeleteSuccess:"已删除 {{count}} 条推送消息",pushCronHeader:"定时任务:{{name}}",viewDetails:"查看详情",deleteMessageConfirm:"确定删除这条推送消息吗?",viewAll:"查看全部",read:"已读",approve:"同意",reject:"拒绝",ready:"已就绪",harvestNow:"立即收获",createHarvest:"创建 Harvest",createFirstHarvest:"创建第一个 Harvest",createSuccess:"Harvest 创建成功",emptyApprovals:"暂无待审批项",emptyPush:"暂无推送消息",wobbleEnable:"开启审批震动提醒",wobbleDisable:"关闭审批震动提醒",emptyHarvests:"暂无 Harvest 任务",statusReadyToHarvest:"可立即收获",statusGrowing:"生成中",harvestedTimes:"已生成 {{count}} 次",harvestSuccessRate:"成功率 {{rate}}%",messageDetailComingSoon:"消息详情功能开发中",harvestSettingsComingSoon:"Harvest 设置功能开发中",messageDetailTitle:"执行详情",detailCronTitle:"定时任务:{{name}}",detailHeartbeatTitle:"心跳",messageNotFound:"未找到该消息",detailTaskName:"任务名称",detailTaskId:"任务 ID",detailStatus:"执行状态",detailSeverity:"严重程度",detailAgent:"所属 Agent",detailSource:"来源",detailSourceCronJob:"定时任务",detailSourceHeartbeat:"心跳任务",detailTrigger:"触发方式",detailDuration:"耗时",detailExecutedAt:"执行时间",detailReceivedAt:"收件时间",detailRunId:"运行 ID",detailContent:"执行输出",detailPayload:"附加信息",detailExecutionTrace:"执行轨迹",detailTraceEmpty:"暂无执行轨迹",mailDetailSender:"发件人",mailDetailSubject:"主题",mailDetailDate:"邮件时间",mailDetailBody:"正文预览",mailDetailProcess:"处理过程",filterByAgent:"按 Agent 筛选",filterBySourceType:"按来源筛选",sourceTypeCron:"定时任务",sourceTypeHeartbeat:"心跳",sourceTypeMemory:"记忆",sourceTypeMail:"邮件",mailAccessControl:"邮件管控",pen
150dingSenders:"待审批发件人",senderLists:"发件人名单",addSender:"添加发件人",domainWildcardHint:"支持域名通配,如 *@example.com",invalidAddress:"邮箱地址格式不正确,请输入如 [email protected] 或 *@domain.com 的地址",whitelist:"白名单",blacklist:"黑名单",approveSender:"通过",deny:"拉黑",dismiss:"忽略",batchApprove:"批量通过",batchDeny:"批量拉黑",batchDismiss:"批量忽略",batchRemove:"批量移除",confirmApprove:"确认批准选中的发件人?",confirmDeny:"确认拒绝选中的发件人?",confirmDismiss:"确认忽略选中的发件人?",confirmRemove:"确认移除?",removeSuccess:"移除成功",addedToAllAgents:"已添加并同步到所有Agent",senderAddress:"发件人地址",displayName:"发件人名称",emailSubject:"邮件主题",bodyPreview:"正文预览",selectAgent:"选择 Agent",allAgents:"全部 Agent",time:"时间",remark:"备注",actions:"操作",optional:"(可选)",required:"(必填)"},fR={nav:"检查点",title:"状态检查点",auto:"自动检查点",autoEnabled:"已开启自动检查点",autoDisabled:"已关闭自动检查点",refresh:"刷新检查点",snapshot:"创建快照",snapshotCreated:"快照已创建",graph:"图谱",checkpoint:"检查点",type:"类型",commit:"提交",createdAt:"创建时间",session:"会话",channel:"频道",parent:"父节点",details:"检查点详情",search:"搜索 Query、名称、会话或 SHA",allTypes:"全部类型",allSessions:"全部会话",showingLatest:"显示最近 {{count}} 条",loadFailed:"无法加载检查点",retry:"重试",more:"更多操作",noMatches:"没有符合筛选条件的检查点。",empty:"暂无状态检查点。创建后,版本历史会显示在这里。",kind:{auto:"自动",snapshot:"快照",safety:"安全快照",commit:"提交"},summary:{total:"个检查点"},snapshotDialog:{title:"创建快照",session:"会话",name:"名称",placeholder:"可选的快照名称"},gc:{settingsAction:"自动清理设置",settingsTitle:"自动清理设置",keepCount:"自动检查点保留数量",keepDays:"自动检查点保留天数",preRestoreDays:"恢复前快照保留天数",settingsSaved:"自动清理设置已保存",thoroughAction:"彻底压缩检查点",thoroughTitle:"彻底压缩检查点?",thoroughDescription:"将忽略自动检查点的保留策略,清理 {{count}} 个检查点,并保留各会话 HEAD。",thoroughConfirm:"彻底压缩",thoroughSuccess:"彻底压缩已删除 {{count}} 个检查点",action:"清理检查点",title:"按保留策略清理检查点?",description:"将按当前保留策略清理 {{count}} 个过期检查点,并保留各会话 HEAD。",confirm:"清理",success:"已清理 {{count}} 个检查点"},reset:{action:"重置检查点数据",title:"重置全部检查点数据?",description:"这会永久删除所有检查点,并关闭自动检查点。",confirm:"重置",success:"检查点数据已重置"},restore:{action:"恢复",title:"恢复检查点",preview:"预览恢复",confirm:"恢复检查点",conversation:"会话内容",memory:"记忆",files:"工作区文件",refreshWarning:"会话内容将发生变化。恢复完成后,请刷新会话以载入最新状态。",selectedCount:"已选择 {{count}} 个文件",selectAll:"选择全部变更文件",delete:"删除",restore:"恢复",noFileChanges:"无需恢复工作区文件。",success:"检查点恢复成功,请刷新会话以载入恢复后的状态。"}},bR={title:"文件",workspacePath:"工作区路径:",noFiles:"没有文件",coreFiles:"核心文件",coreFilesDesc:"引导角色、身份和工具指南。",uploadTooltip:"仅支持 ZIP 文件",uploadTooltipWithLimit:"仅支持 ZIP 文件,最大 {{limit}}MB",selectFile:"选择文件进行编辑",fileContent:"文件内容...",uploadSuccess:"文件上传成功",uploadFailed:"文件上传失败",downloadPreparing:"正在准备工作区下载...",downloadSuccess:"工作区下载成功",downloadFailed:"工作区下载失败",zipOnly:"仅支持上传 .zip 文件",fileSizeExceeded:"文件大小超过 {{limit}}MB 限制。当前文件:{{size}}MB",systemPromptToggleTooltip:"启用/禁用此文件加载到系统提示词",memoryFileWarning:"MEMORY.md 一般是由 agent 主动调用工具按需查询和加载,放到 system prompt 里面可能会导致上下文过长",configUpdated:"系统提示词配置已更新",configUpdateFailed:"更新系统提示词配置失败",attribution:"工作区设计部分灵感源自 OpenClaw 项目,在此表示感谢 🐾",saveSuccess:"保存成功",saveFailed:"保存失败",saving:"保存中...",saved:"已保存",unsaved:"未保存"},kR={parent:"设置",agents:"智能体",management:"智能体管理",pageDescription:"创建、配置和管理多个 AI 智能体,支持自定义工作空间和身份。",name:"名称",id:"ID",description:"描述",workspace:"工作区路径",create:"创建智能体",createTitle:"创建新智能体",createSuccess:"智能体创建成功",createFailed:"智能体创建失败",edit:"编辑",editTitle:"编辑智能体 - {{name}}",updateSuccess:"智能体更新成功",updateFailed:"智能体更新失败",delete:"删除",deleteConfirm:"确认删除智能体",deleteConfirmDesc:"删除后智能体将不可用,但工作区文件会保留",deleteSuccess:"智能体删除成功",deleteFailed:"智能体删除失败",selectAgent:"选择智能体",defaultDisplayName:"默认智能体",currentWorkspace:"当前智能体",switchSuccess:"智能体切换成功",switchFailed:"智能体切换失败",loadFailed:"加载智能体列表失败",loadConfigFailed:"加载智能体配置失败",saveFailed:"保存智能体失败",idRequired:"请输入智能体ID",idLabel:"智能体 ID(可选)",idHelp:"留空则自动生成。仅允许字母、数字、连字符和下划线。",idPattern:"ID只能包含字母、数字、下划线和连字符",idPlaceholder:"ä¾
150‹å¦‚:my-agent",nameRequired:"请输入智能体名称",namePlaceholder:"例如:我的智能体",descriptionPlaceholder:"简要描述这个智能体的用途...",workspaceHelp:"留空将自动生成在 ~/.qwenpaw/workspaces/<id> 目录",dragHandleTooltip:"拖拽调整智能体顺序",reorderSuccess:"智能体顺序已保存",reorderFailed:"保存智能体顺序失败",defaultNotEditable:"默认智能体不允许编辑",defaultNotDeletable:"默认智能体不允许删除",disable:"禁用",enable:"启用",disabled:"已禁用",disableConfirm:"确认禁用智能体",disableConfirmDesc:"禁用后该智能体不会启动运行实例,但仍可在列表中查看",enableConfirm:"确认启用智能体",enableConfirmDesc:"启用后该智能体将可以正常切换使用",disableSuccess:"智能体已禁用",enableSuccess:"智能体已启用",toggleFailed:"切换智能体状态失败",enableAgent:"启用 {{name}}",disableAgent:"禁用 {{name}}",disabledAgents:"已禁用 ({{count}})",pinnedAgents:"已固定",otherAgents:"其他智能体",pinned:"已固定",defaultPinned:"默认智能体始终固定",longPressToPin:"长按固定",longPressToUnpin:"长按取消固定",pinAgent:"固定智能体",unpinAgent:"取消固定智能体",pinSuccess:"智能体已固定",unpinSuccess:"智能体已取消固定",pinFailed:"更新固定状态失败",status:{disabled:"已禁用",pending:"等待启动",starting:"启动中",running:"运行中",failed:"启动失败",waitUntilStarted:"启动完成后可操作"},defaultNotDisablable:"默认智能体不允许禁用",currentAgentDeleted:"当前智能体已被删除,已自动切换到默认智能体",currentAgentDisabled:"当前智能体已被禁用,已自动切换到默认智能体",switchedToDefault:"已自动切换到默认智能体",cannotSwitchToDisabled:"该智能体已被禁用,请先在管理页面启用",initialSkills:"初始技能",initialSkillsHelp:"从技能池选择要添加的技能。之后可以随时添加或移除。",selectAll:"全选",selectBuiltin:"内置",selectNone:"清空",noPoolSkills:"技能池中暂无可用技能",addSkillsToAgent:"添加技能",backend:{column:"后端",eyebrow:"智能体架构",typeTitle:"选择智能体的工作方式",typeDescription:"智能体类型决定它在 Chat、Coding 和所有 Channel 中的运行方式。",nativeTitle:"QwenPaw 原生智能体",nativeBadge:"原生",nativeDescription:"使用已配置的 LLM、Skills、工具、记忆和 QwenPaw Runtime。",thirdPartyTitle:"第三方智能体",thirdPartyBadge:"第三方",thirdPartyDescription:"使用已授权的外部 Agent Runtime,不依赖 QwenPaw 模型。",providerTitle:"选择第三方智能体",providerDescription:"授权在本机共享,项目与会话仍按智能体隔离。",codexHint:"ChatGPT OAuth · 智能体工作区",qoderHint:"Qoder 账户或 PAT · 智能体工作区",account:"Codex 账户",qoderAccount:"Qoder 账户",binary:"Codex 可执行文件",binaryHelp:"留空将优先使用 Python SDK 自带的 Codex CLI,也会自动检测独立安装。手动填写时请输入 macOS/Linux 下的 codex 或 Windows 下的 codex.exe 完整路径。不支持 ChatGPT App 或编辑器扩展内置的二进制。QwenPaw 也会读取 CODEX_BINARY 和后端进程的 PATH。",binaryPlaceholder:"自动检测,或粘贴 codex 可执行文件路径",qoderBinary:"Qoder 可执行文件",qoderBinaryHelp:"留空将优先使用 Python SDK 自带的 qodercli,也会自动检测已有安装。手动填写时请输入可执行文件本身的完整路径:macOS/Linux 下为 qodercli,Windows 下为 qodercli.exe。QwenPaw 也会读取 QODERCLI_PATH 和后端进程的 PATH。",qoderBinaryPlaceholder:"自动检测,或粘贴 qodercli 可执行文件路径",detect:"重新检测",detectedBinary:"已检测到 Codex",qoderDetectedBinary:"已检测到 Qoder",apiKeyLoginHint:"也可以在终端运行 codex login --with-api-key 完成 API Key 认证。",qoderAuthHint:"点击连接会打开 Qoder 浏览器登录;也可以在终端运行 qodercli login,或在启动后端前设置 QODER_PERSONAL_ACCESS_TOKEN。",qoderConnect:"连接 Qoder",model:"智能体模型",modelDefault:"使用智能体默认模型",defaultBadge:"默认",reasoningEffort:"推理强度",reasoningDefault:"使用模型默认强度",codexNotFound:"未检测到 Codex runtime。请安装 qwenpaw[codex],或提供独立 Codex CLI。",qoderNotFound:"未检测到 Qoder runtime。请安装 qwenpaw[qoder],或提供 qodercli。",chatSettingsHint:"模型、推理强度与执行权限统一在 Chat 工具栏中选择。",capabilityTitle:"Qwe
150nPaw 能力",inheritedSkills:"技能",inheritedMcp:"MCP 服务",runtimeInherited:"运行时继承 · 新会话生效",notSupported:"当前服务商不支持",policyCompatibility:"MCP 策略",toolAllowlistSupported:"支持工具白名单",policyLimited:"受服务商能力限制",chatModelHint:"智能体级设置 · 下一轮生效",appliesNextTurn:"下一轮对话生效",approvalMode:"执行权限",approvalPresets:{ask:{name:"变更前询问",description:"允许修改工作区,执行越权操作前需要确认。"},"read-only":{name:"只读",description:"仅检查文件,不允许修改。"},workspace:{name:"工作区访问",description:"允许直接修改工作区,无需逐次确认。"},"accept-edits":{name:"自动接受编辑",description:"允许文件编辑,同时保留其他安全确认。"},plan:{name:"仅规划",description:"只进行分析和规划,不修改文件。"},auto:{name:"自动判断",description:"由 Qoder 判断哪些安全操作可以直接执行。"},"full-access":{name:"完全访问",description:"允许不受限的本地执行,不进行确认。"}}},model:"模型",modelHelp:"为此智能体指定特定的 LLM 模型。留空则使用全局默认模型。",modelPlaceholder:"使用全局默认",noConfiguredModels:"暂无已配置的模型",modelColumn:"模型",copyTooltip:"复制智能体配置",copyDefaultTooltip:"以默认智能体配置为模板进行复制",copyTitle:"复制智能体配置",copyNameLabel:"新智能体名称",copyOptionsLabel:"复制内容",copyOptionAgentJson:"agent.json(必选)",copyOptionAgentJsonHint:"始终复制解析后的源配置,并重置 ID、名称、workspace 与 channels;不是原样复制磁盘上的 agent.json。",copyOptionMdFiles:"AGENTS / SOUL / PROFILE / HEARTBEAT / BOOTSTRAP.md",copyOptionSkills:"skills/ + manifest",copyOptionJobs:"jobs.json",copyOptionJobsHint:"仅复制任务定义,不含历史;新智能体创建后会立即按计划执è
150¡Œã€‚",copySuccess:"智能体配置复制成功",copyFailed:"智能体配置复制失败",mailManagement:"邮箱管理",mailModeNone:"不需要邮箱管理",mailModePersonal:"管理你的个人邮箱",mailModeDedicated:"为智能体配备专属邮箱",mailName:"邮箱名",mailNameOptional:"邮箱命名(可选)",mailNameDedicated:"邮箱名(注册前可选,注册后必填)",mailDomain:"邮箱后缀",mailPassword:"密码",mailPhone:"手机号",mailAuthCode:"16 位授权码",mailAuthCodeOptional:"16 位授权码/应用专用密码(可选)",mailCredentialOptional:"邮箱密码(可选)",mailNameRequired:"请填写邮箱名",mailPasswordRequired:"请填写密码",mailPhoneRequired:"请填写手机号",mailAuthCodeRequired:"请填写授权码",mailAuthCodeLength:"授权码必须为 16 位",mailDomainRequired:"请选择邮箱后缀",mailDomainInvalid:"请输入合法的邮箱域名,如 mycompany.com",mailDomainPlaceholder:"选择或输入邮箱域名",mailProvider:"邮箱服务商",mailProviderRequired:"请选择邮箱服务商",mailProviderPlaceholder:"选择该域名所托管的服务商",mailProviderTencentExmail:"腾讯企业邮",mailProviderAliyunQiye
150:"阿里企业邮",mailProviderNeteaseQiye:"网易企业邮",mailCredentialLabel:"凭据",mailCredentialRequired:"请填写凭据",mailCredentialHintAuthCode:"填写在邮箱设置中生成的 16 位授权码",mailCredentialHintGmail:"填写 Gmail 应用专用密码(需先开启两步验证)",mailCredentialHintAliyun:"填写邮箱登录密码",mailCredentialHintEnterprise:"填写客户端专用密码或邮箱登录密码",mailDedicatedCredentialHint:"{{credentialHint}}。注册前可以留空;注册完成后在此填写并保存,即可完成邮箱绑定。",mailPushTitle:"新邮件自动响应",mailAccessControl:"邮件访问控制",mailAccessControlTip:"开启后,未知发件人的邮件需审批后才会被处理",mailPushModeOff:"关闭",mailPushModeRulesOnly:"仅规则",mailPushModeRulesThenAgent:"规则 + 按需唤醒",mailPushModeAgentAll:"每封唤醒",mailPushModeOffDesc:"不对新邮件做任何自动处理",mailPushModeRulesOnlyDesc:"仅按下方规则自动处理新邮件,不唤醒智能体",mailPushModeRulesThenAgentDesc:"先按规则处理,命中唤醒动作时才唤醒智能体",mailPushModeAgentAllDesc:"每封新邮件都唤醒智能体,由智能体自主决策如何处理",mailPushModeLegacySuffix:"(旧版)",mailPushFieldFrom:"发件人",mailPushFieldSubject:"主题",mailPushFieldContent:"内容",mailPushFieldKeyword:"关键词",mailPushActionMarkRead:"标为已读",mailPushActionMove:"移动到文件夹",mailPushActionNotify:"仅通知",mailPushActionWakeAgent:"唤醒智能体",mailPushContainsPlaceholder:"包含文本",mailPushParamMovePlaceholder:"目标文件夹",mailPushParamWakePlaceholder:"附加指令(可选)",mailPushParamRequired:"请填写目标文件夹",mailPushAddRule:"添加规则",mailPushWakeOptionInvoice:"发票/账单类邮件下载附件并归档",mailPushWakeOptionReply:"询问类邮件礼貌回复",mailPushWakeOptionOtp:"提取验证码并通知我",mailPushWakeOptionSummary:"总结邮件要点存入收件箱"},yR={title:"ACP",loading:"加载 ACP 配置中...",builtin:"内置",custom:"自定义",create:"新增 Custom Agent",createTitle:"新增 ACP Agent",createSuccess:"ACP Agent 已创建",editTitle:"编辑 ACP 配置",agentKey:"Agent Key",agentKeyRequired:"请输入 Agent Key",agentKeyInvalid:"Agent Key 只能包含字母、数字、下划线和连字符",agentKeyExists:"该 Agent Key 已存在",enabled:"启用",command:"命令",commandRequired:"请输入命令",args:"参数",argsHelp:"每行一个参数",env:"环境变量",envHelp:"每行使用 KEY=VALUE 格式",envInvalidLine:"无效环境变量格式:{{line}}",trusted:"可信执行",toolParseMode:"工具解析模式",toolParseModeRequired:"请选择工具解析模式",stdioBufferLimit:"Stdio 缓冲上限",stdioBufferLimitHelp:"ACP 子进程 stdio 单行读取缓冲的最大字节数。",stdioBufferLimitRequired:"请输入 stdio 缓冲上限",stdioBufferLimitMin:"stdio 缓冲上限至少为 1 字节",docs:"配置文档",docsHelp:"打开 ACP 集成文档,并跳转到“如何配置外部 runner”章节",notSet:"未设置",configSaved:"ACP 配置已保存",configFailed:"ACP 配置保存失败",deleteTitle:"删除 {{name}}",deleteConfirm:"确定删除该 ACP Agent 吗?此操作不可撤销。",deleteSuccess:"ACP Agent 已删除",deleteFailed:"ACP Agent 删除失败",nodeSettings:"Node 设置",nodePath:"Node 路径",chooseOtherNode:"选择其他 Node...",selectNodePath:"选择 Node 路径",nodePathPrompt:"请输入 node 可执行文件路径",nodeSaved:"Node 设置已保存",nodeLoadFailed:"Node 设置加载失败",nodeSaveFailed:"Node 路径不可用",nodeRuntime:{bundled:"内置 Node",system:"系统 Node",custom:"自定义 Node"},nodeRuntimeReason:{systemNodeMissing:"未检测到系统 Node",nodeMissing:"Node 路径不存在",npxMissing:"未找到 npx",versionCheckFailed:"版本检查失败",unavailable:"不可用"}},vR={title:"技能",description:"管理智能体技能和能力。",preload:"预加载",preloadHint:"开启后,智能体会预加载该技能,无需在会话中再查找和加载。",qwenpawManaged:"QwenPaw 管理",qwenpawManagedHint:"可编辑,并在运行时投影到支持的第三方智能体。",providerManaged:"第三方智能体技能",providerManagedHint:"从当前第三方智能体发现,仅供只读查看。",providerOnly:"仅当前第三方智能体",readOnly:"只读",noDescription:"暂无描述。",providerSkillDetails:"第三方智能体技能详情",providerManagedDetailHint:"该技能由第三方智能体管理。QwenPaw 可以展示和使用,但不能修改。",provider:"第三方智能体",scope:"作用域",statusLabel:"状态",descriptionLabel:"描述",importHub:"通过URL上传",supportedSources:"支持的来源:",importSkills:"导入技能",enterSkillUrl:"输入技能URL",supportedSkillUrlSources:"支持的技能市场:",urlExamples:"URL 示例:",urlValid:"来自 {{source}}
150 的有效 URL",invalidUrl:"无效的 URL",clickToFill:"点击填入 URL",invalidSkillUrlSource:"请确认技能URL来自受支持的技能市场",type:"类型",installedFrom:"安装来源",source:"来源",path:"路径",tags:"标签",builtin:"内置",custom:"自定义",addSkill:"添加技能",createSkill:"创建技能",viewSkill:"查看技能",editSkill:"编辑技能",skillName:"技能名称",skillContent:"技能内容",pleaseInputName:"请输入技能名称",pleaseInputContent:"请输入技能内容",skillNamePlaceholder:"例如:weather_query",contentPlaceholder:`【格式要求】
151---
152name: 技能名称(必填,英文小写下划线)
153description: 功能描述(必填,简洁清晰)
154---
155
156技能实现内容(Markdown格式)
157
158【示例】
159---
160name: weather_query
161description: 查询指定城市的天气信息
162---
163
164## 功能
165查询实时天气数据。
166
167## 使用
168用户输入城市名,返回天气信息。`,createSuccess:"技能创建成功",createFailed:"技能创建失败",deleteConfirm:"确定要删除此技能吗?",deleteSuccess:"技能删除成功",deleteFailed:"技能删除失败",batchEnable:"启用",batchDisable:"禁用",batchEnableSuccess:"已启用 {{count}} 个技能",batchEnablePartial:"{{enabled}} 个已启用,{{failed}} 个失败",batchEnableFailed:"批量启用失败",batchDisableSuccess:"已禁用 {{count}} 个技能",batchDisablePartial:"{{disabled}} 个已禁用,{{failed}} 个失败",batchDisableFailed:"批量禁用失败",batchDeleteTitle:"删除 {{count}} 个技能?",batchDeleteSuccess:"已删除 {{count}} 个技能",batchDeletePartial:"{{deleted}} 个已删除,{{failed}} 个失败",batchDeleteFailed:"批量删除失败",selectedCount:"已选 {{count}} 个",updateSuccess:"技能更新成功",updateFailed:"技能更新失败",frontmatterRequired:"Skills内容必须以 --- 开头和结尾",frontmatterNameRequired:"Skills 中缺少必填字段:name",frontmatterDescriptionRequired:"Skills 中缺少必填字段:description",editNotSupported:"技能编辑失败",editNote:"提示:这里可以编辑技能内容、频道范围和配置。",create:"创建",optimizeWithAI:"AI优化",stopOptimize:"停止",optimizeSuccess:"技能优化成功",optimizeFailed:"技能优化失败",noContentToOptimize:"没有可优化的内容",cancelImport:"取消导入",importCancelled:"已取消技能导入",importTimeout:"技能导入超时,请重试或检查网络。",uploadSkill:"上传技能",uploadZip:"通过Zip上传",uploadSuccess:"技能上传成功",uploadFailed:"技能上传失败",uploadNoChange:"没有导入新技能,可能已存在相同技能",zipOnly:"仅支持上传 .zip 文件",fileSizeExceeded:"文件大小超过 {{limit}}MB 限制。当前文件:{{size}}MB",channels:"适用频道",allChannels:"所有",lastUpdated:"更新时间",searchPlaceholder:"按名称筛选",listView:"列表视图",gridView:"卡片视图",refreshHint:"从磁盘刷新技能",poolSync:"同步状态",uploadedToPool:"已上传至技能池",downloadedToWorkspace:"已下载至当前工作区",builtinUpgradeTitle:"升级内置技能",builtinUpgradeContent:'技能池中有更新版本的内置技能 "{{name}}",是否覆盖当前版本?',languageSwitchTitle:"切换技能语言",languageSwitchContent:"以下技能在池中有不同的语言版本,确认后将覆盖:",overwriteExistingList:"以下技能已存在,确认后将直接覆盖:",nameConflict:"检测到名称冲突,建议的重命名已填入。",uploadToPoolHint:"将选中的工作区技能上传到共享本地技能池",downloadFromPool:"从技能池载入",uploadToPool:"同步到技能池",selectWorkspaceSkill:"选择工作区技能",selectPoolItem:"选择技能池项目",renameOptional:"重命名(可选)",renamePlaceholder:"冲突时建议的重命名将显示在此",selectAll:"全选",clearSelection:"清除",downloadSkillPool:"下载技能池",uploadSkillPool:"上传技能池",config:"配置",configPlaceholder:'{"KEY": "value"}',configInvalidJson:"JSON 格式无效",configSaved:"配置已保存",emptyStateBadge:"新工作区默认是空的",emptyStateTitle:"这个智能体还没有可用技能",emptyStateText:"这是正常状态。新建的工作区不会自动带上技能。你可以先从技能池下载已有技能,或者直接创建一个新技能,再把这个智能体装备起来。",emptyStateDownload:"从技能池载入",emptyStateCreate:"创建第一个技能",loadFailed:"加载技能失败",refreshFailed:"刷新技能失败",createdSuccessfully:"创建成功",saveFailed:"保存失败",importFailed:"导入失败",disabledSuccessfully:"已禁用",enabledSuccessfully:"已启用",operationFailed:"操作失败",provideUrl:"请提供技能库 URL",validUrl:"请输入以 http:// 或 https:// 开头的有效 URL",importedSkill:"已导入技能:{{name}}",batchOperation:"批量操作",exitBatch:"退出批量",noSearchResults:"未找到匹配的技能",filterByTag:"按标签筛选",noTags:"暂无标签",enabledSkills:"已激活的技能",disabledSkills:"未激活的技能",active:"个激活"},TR={description:"共享本地技能池,包含内置技能和工作区上传。ClawHub 或 LobeHub 等外部导入为ç
168‹¬ç«‹åŠŸèƒ½ã€‚",broadcast:"广播到智能体",broadcastHint:"将技能广播给选定的智能体",refreshHint:"从磁盘刷新技能池",deleteExternalConfirm:"将从磁盘删除外部技能文件:{{path}}。",deleteExternalBatchWarning:"所选的外部技能将从磁盘永久删除。",broadcastTitle:"广播 {{name}}",automation:"自动化",builtinAutoUpdate:"自动更新",builtinAutoUpdateFlow:"内置技能包 → 技能池",autoSyncFlow:"技能池 → 智能体工作区",automationBoth:"自动更新 + 同步",automationMixedHint:"打开详情选择自动更新或自动同步。",automationEnableHint:"开启自动更新和自动同步。",automationDisableHint:"关闭自动更新和自动同步。",automationEnabled:"已为 {{name}} 开启自动更新和自动同步",automationDisabled:"已为 {{name}} 关闭自动更新和自动同步",automationFailed:"更新自动化设置失败",automationNeedsAttention:"已保存,{{count}} 项需处理,请查看收件箱。",autoSync:"自动同步",autoSyncEnableHint:"开启自动同步。",autoSyncDisableHint:"关闭自动同步。",autoSyncEnabled:"已为 {{name}} 开启自动同步",autoSyncDisabled:"已为 {{name}} 关闭自动同步",autoSyncAgentsPlaceholder:"所有已安装该技能的智能体",autoSyncAgentsHint:"留空则同步已有副本,也可指定智能体。",renameAffectsTitle:"同时在智能体中重命名?",renameAffectsContent:"“{{from}}”已安装在 {{count}} 个智能体中。重命名为“{{to}}”",importBuiltin:"更新内置技能",importBuiltinHint:"将内置技能更新到最新版本",importBuiltinAlertHint:"有 {{count}} 项内置技能变更需要查看",importBuiltinSuccess:"已导入内置技能:{{names}}",importBuiltinConflicts:"以下名称冲突,已跳过:{{names}}",importBuiltinNoChanges:"没有可导入的内置变更",importBuiltinFailed:"导入内置技能失败",importBuiltinConflictTitle:"检测到内置技能冲突",importBuiltinConflictContent:"以下内置技能与当前池中副本不同。确认后将使用源码版本覆盖。",sourceVersion:"源码版本",currentVersion:"当前版本",builtinLanguage:"语言",langDefault:"默认",langDefaultTooltip:"保持每个技能原有的语言",langEn:"英文",langZh:"中文",builtinLanguageChangeTitle:"切换内置技能语言?",builtinLanguageChangeContent:"确认用 {{language}} 版本的内置技能覆盖池中的“{{name}}”?",builtinLanguageChangeSuccess:"已将“{{name}}”切换为 {{language}}",builtinLanguageChangeFailed:"切换内置技能语言失败",importStatusMissing:"池中缺失",importStatusCurrent:"已是最新",importStatusOutdated:"版本落后",importStatusLanguageSwitchTo:"将覆盖为{{language}}版本",importStatusConflict:"冲突",builtinNoticeSummary:"检测到 {{count}} 项内置技能变更",builtinNoticeLineAdded:"新增:{{names}}",builtinNoticeLineMissing:"缺失:{{names}}",builtinNoticeLineUpdated:"更新:{{names}}",builtinNoticeLineRemoved:"移除:{{names}}",zipImport:"ZIP 导入",create:"创建",edit:"编辑",delete:"删除",descriptionLabel:"描述",tags:"标签",tagsPlaceholder:"选择或输入标签",tagTooLong:"标签长度不能超过 {{max}} 个字符",filterByTag:"按标签筛选",version:"版本",createTitle:"创建技能池项目",editTitle:"编辑 {{name}}",skillNamePlaceholder:"技能名称",contentPlaceholder:"SKILL.md 内容",nameConflict:"检测到名称冲突,已应用建议的重命名。",deletedFromPool:"已从技能池删除",deleteBuiltinConfirm:"这会将内置技能从技能池中删除。之后仍可从源码重新导入。",deleteConfirm:"此操作将从共享本地技能池中移除该技能。",deleteTitle:"删除 {{name}}?",batchDeleteTitle:"删除 {{count}} 个池技能?",batchDeleteSuccess:"已删除 {{count}} 个池技能",batchDeletePartial:"{{deleted}} 个已删除,{{failed}} 个失败",batchDeleteFailed:"批量删除失败",zipImportFailed:"ZIP 导入失败",externalHubHint:"外部 Hub 导入与本地技能池是独立功能。",imported:"已导入:{{names}}",noNewImports:"无新技能导入",allBuiltin:"全部内置",selectWorkspaces:"广播到工作区",allWorkspaces:"所有工作区",optionalRename:"可选重命名",back:"返回",skillCount:"{{count}} 个技能",skillName:"技能名称",status:"状态",installedFrom:"安装来源",updateBuiltin:"更新",updateConfirmTitle:"更新 {{name}}",updateConfirmContent:"更新到版本 {{version}}?这将用最新内置版本替换当前池中的副本。",updateSuccess:"更新成功",updateFailed:"更新失败",broadcastSuccess:"广播完成",broadcastFailed:"广播失败",overwriteConfirm:"覆盖已存在的技能?",overwriteTargetsContent:"以下目标中已存在该技能,确认后将直接覆盖:",builtinOverwriteTargetsContent:"以下目标中的内置技能版本不同,确认后将直接覆盖:",renameAndRetry:"同名技能已存在,是否使用建议的名称?",multiConflictTitle:"检测到多个冲突",multiConflictDesc:"以下技能已存在,请逐一解决冲突后重试:",singleConflictRename:'"{{name}}" 已存在。重命名为 "{{suggested}}" 以继续?',statusUpToDate:"最新",statusSynced:"已同步",statusOutdated:"已过期",statusNotSynced:"未同步",statusConflict:"冲突",renameEntry:'"{{name}}" 的新名称:',builtin:"内置",custom:"自定义"},SR={title:"MCP 客户端",qwenpawManaged:"QwenPaw 管理",qwenpawManagedHint:"由统一控制面管理,并在运行时注入支持的第三方智能体。",providerManaged:"{{provider}} 本地 MCP",providerManagedHint:"从第三方智能体自身配置中发现;ä
168»…供该智能体使用,并以只读方式展示。",providerOnly:"仅当前第三方智能体",readOnly:"只读",create:"创建客户端",formatSupport:"支持的格式",standardFormat:"标准(mcpServers 包裹)",directFormat:"直连(键 → 配置对象)",singleFormat:"单客户端(平铺字段)",emptyState:"暂无配置的 MCP 客户端",loadError:"加载 MCP 客户端失败",createSuccess:"MCP 客户端创建成功",createError:"MCP 客户端创建失败",updateSuccess:"MCP 客户端更新成功",updateError:"MCP 客户端更新失败",enableSuccess:"MCP 客户端启用成功",disableSuccess:"MCP 客户端禁用成功",toggleError:"切换 MCP 客户端状态失败",deleteConfirm:"确定要删除此 MCP 客户端吗?",deleteSuccess:"MCP 客户端删除成功",deleteError:"MCP 客户端删除失败",maskedFieldHint:"敏感字段已用 *** 遮掩,不支持在遮掩值上直接编辑,如需修改请替换为完整新值。",tools:"工具&权限",noTools:"该 MCP 服务器暂无可用工具",toolsLoadError:"获取 MCP 服务器工具列表失败",toolsConnecting:"MCP 服务器正在连接中,请稍后重试",toolSchema:"描述与参数",access:{title:"访问权限",button:"权限",summary:"MCP 访问策略",clientSection:"整体权限",toolSection:"工具权限",default:"默认策略",sourceType:"调用来源",sourceValue:"来源值",sourceValueAllChannels:"所有频道",subjectType:"对象",subjectValue:"对象值",effectLabel:"策略",source:{channel:"频道"},subjectTypeOption:{all:"全部",user:"用户"},sourceValuePlaceholder:{channel:"控制台 / 钉钉"},subjectValuePlaceholder:"例如 alice",subjectValuePlaceholderSelectedSource:"所选频道内的用户 ID",subjectValuePlaceholderScoped:"{{source}} 内的用户 ID",subjectValueAll:"全部",recentUserPlaceholder:"用户 ID 仅在所选来源内有效;请重新输入或选择",noRecentUsers:"该来源暂无近期用户,可手动输入用户 ID",ambiguousUserSourceWarning:"用户 ID 仅在来源内唯一,请选择具体频道以避免跨频道误匹配。",unknownUserValueWarning:"该用户 ID 未出现在近期活跃用户中,但仍可保存。",validation:{missingUserValue:"请选择具体来源并填写有效的用户 ID。",ambiguousUserSource:"用户规则必须指定具体频道,不能选择所有频道。",unknownUserValue:"该用户 ID 未出现在近期活跃用户中,但仍可保存。"},addRule:"新增规则",deleteRule:"删除规则",noClientRules:"暂无规则",noRules:"暂无规则,使用默认策略",inherit:"继承({{effect}})",stale:"当前不存在",disabledTools:"该 MCP 客户端已禁用,仍可编辑已保存的访问规则。",discardTitle:"放弃未保存的改动?",discardContent:"未保存的访问策略改动将会丢失。",loadError:"加载 MCP 访问策略失败",saveSuccess:"MCP 访问策略已保存",saveError:"保存 MCP 访问策略失败",unmanagedRules:"{{count}} 条高级规则",effect:{allow:"允许",ask:"审批",deny:"拒绝"}},tab:{json:"JSON 导入",form:"表单模式"},form:{key:"客户端标识符",keyPlaceholder:"my-mcp-server",keyRequired:"请填写客户端标识符",name:"显示名称",namePlaceholder:"My MCP Server",nameRequired:"请填写显示名称",transport:"传输方式",url:"服务器 URL",urlRequired:"远程 MCP 服务器需要填写 URL",command:"启动命令",commandRequired:"Stdio 模式需要填写启动命令",args:"命令参数(空格或换行分隔)",description:"描述",descriptionPlaceholder:"可选描述",env:"环境变量",envPlaceholder:"KEY=VALUE(每行一个)"},oauth:{enableOAuth:"使用 OAuth 授权",manage:"OAuth 授权",authorized:"已授权",notAuthorized:"未授权",expired:"授权已过期",failed:"授权失败",waiting:"等待授权中...",authorize:"点击授权",reauthorize:"重新授权",revoke:"撤销授权",startFailed:"启动 OAuth 流程失败",authFailed:"OAuth 授权失败",popupBlocked:"弹窗被浏览器拦截,请允许弹窗后重试",windowClosed:"授权窗口已关闭,请重试",noUrl:"请先填写服务器 URL",noClientKey:"请先创建客户端",showAdvanced:"é«
168˜çº§é€‰é¡¹",hideAdvanced:"收起高级选项",clientId:"Client ID(可选)",clientIdPlaceholder:"留空则使用动态客户端注册",scope:"Scope(可选)",scopePlaceholder:"openid profile email",authEndpoint:"Authorization Endpoint(手动覆盖)",tokenEndpoint:"Token Endpoint(手动覆盖)",endpointHint:"留空将自动从 MCP 服务器发现端点,填写后将跳过自动发现"}},CR={title:"心跳",description:"按固定间隔用 HEARTBEAT.md 内容执行自检。默认静默运行不影响当前对话,也可选择将回复发到上次对话频道。",enabled:"开启心跳",every:"执行间隔",everyRequired:"请填写间隔",everyMin:"间隔至少为 1",timeoutSeconds:"执行超时(秒)",timeoutRequired:"请填写执行超时",timeoutMin:"执行超时至少为 1",timeoutMax:"执行超时最多为 3600",unitMinutes:"分钟",unitHours:"小时",target:"回复目标",targetMain:"静默运行(默认,不发送到频道)",targetLast:"发到上次对话频道",targetInbox:"发送到收件箱",activeHours:"活跃时段(可选)",activeStart:"开始时间",activeEnd:"结束时间",loadFailed:"加载心跳配置失败",saveSuccess:"保存成功,心跳已热重载",saveFailed:"保存心跳配置失败",runNow:"立即执行一次",runNowSuccess:"已触发心跳执行,请稍后查看收件箱或目标渠道",runNowFailed:"触发心跳执行失败"},wR={title:"定时任务",description:"创建和管理在指定时间自动执行的定时任务。",createJob:"创建任务",createFromTemplate:"从模板创建",editJob:"编辑任务",templateModalTitle:"选择定时任务模板",templateModalDescription:"先选内置模板,再在抽屉里微调关键参数后保存。",useTemplate:"使用模板",templateTagPersonal:"个人",templateTagTeam:"团队",templateTagReminder:"提醒",templateTagCalendar:"日历",templateTagCalendarRecommended:"推荐上日历",confirmDelete:"确认删除",deleteConfirm:"确定要删除此定时任务吗?",okText:"确定",cancelText:"取消",deleteText:"删除",id:"任务ID",name:"任务名称",enabled:"启用状态",saveResultToInbox:"运行结果存进收件箱",saveResultToInboxTooltip:"开启后,任务执行成功且投递成功时,会将结果写入收件箱;若投递失败,系统会自动兜底写入收件箱。",scheduleType:"调度类型",scheduleFilterAll:"全部调度类型",scheduleTypeRecurring:"循环任务",scheduleTypeOnce
168:"日程任务",scheduleCron:"执行时间(Cron)",scheduleCronLabel:"执行时间(Cron)",onceRunAt:"执行时间",repeatEnabled:"重复执行",repeatEnabledTooltip:"从该开始时间按固定天数重复执行",repeatFrequency:"重复频率",repeatEveryDays:"重复频率(天)",repeatEveryPrefix:"每",repeatEverySuffix:"天",repeatEndType:"结束重复",repeatEndNever:"无限重复",repeatEndUntil:"终止于某天",repeatEndCount:"限定次数",repeatUntil:"截止时间",repeatCount:"执行次数",scheduleTimezone:"时区",cronType:"频率类型",cronTypeHourly:"每小时",cronTypeDaily:"每天",cronTypeWeekly:"每周",cronTypeCustom:"自定义",cronTime:"执行时间",cronDaysOfWeek:"星期",cronDayMon:"周一",cronDayTue:"周二",cronDayWed:"周三",cronDayThu:"周四",cronDayFri:"周五",cronDaySat:"周六",cronDaySun:"周日",cronCustomExpression:"Cron 表达式",taskText:"消息内容",action:"操作",disable:"禁用",executeNow:"立即执行",edit:"编辑",delete:"删除",totalItems:"共 {{count}} 项",perPage:"/ 页",pleaseInputId:"请输入任务ID",pleaseInputName:"请输入任务名称",pleaseInputCron:"请输入Cron表达式",pleaseSelectScheduleType:"请选择调度类型",pleaseInputRunAt:"请选择执行时间",pleaseInputRepeatEveryDays:"请输入重复频率(天)",pleaseSelectRepeatEndType:"请选择结束方式",pleaseInputRepeatUntil:"请选择截止时间",pleaseInputRepeatCount:"请输入执行次数",validation:{cronRequired:"循环任务必须填写 Cron 表达式。",runAtRequired:"日程任务必须填写执行时间。",repeatUntilRequired:"选择“终止于某天”时,必须填写截止时间。",repeatCountRequired:"选择“限定次数”时,必须填写执行次数。",repeatUntilAfterRunAt:"截止时间必须晚于执行时间,请将截止时间设置为执行时间之后。",textRequired:"任务类型为“消息内容”时,消息内容不能为空。",requestRequired:"任务类型为“Agent”时,请求内容不能为空。",invalidCronExpression:"Cron 表达式无效,请使用 5 段 Cron 格式。"},pleaseSelectTaskType:"请选择任务类型",pleaseInputRequest:"请输入请求内容",pleaseInputMessageContent:"请输入消息内容",pleaseInputChannel:"请输入目标频道",pleaseInputUserId:"请输入目标用户ID",pleaseInputSessionId:"请输入目标会话ID",jobIdPlaceholder:"例如:daily-report-job",jobNamePlaceholder:"例如:每日早报",selectTimezone:"选择时区",taskDescriptionPlaceholder:"简单消息任务时填写实际发送的正文...",invalidJsonFormat:"JSON格式无效",jsonFormatRequired:"需要JSON格式",taskType:"任务类型",text:"消息内容",requestInput:"请求内容",requestSessionId:"请求会话ID",requestUserId:"请求用户ID",dispatchChannel:"目标频道",dispatchTargetUserId:"目标用户ID",dispatchTargetSessionId:"目标会话ID",dispatchMode:"分发模式",silentDelivery:"静默投递",runtimeShareSession:"共用会话",runtimeMaxConcurrency:"最大并发数",runtimeTimeoutSeconds:"超时时间(秒)",runtimeMisfireGraceSeconds:"错过执行宽限期(秒)",runtimeToolSafety:"工具审批检查",idTooltip:"任务的唯一标识符(UUID)由系统在创建时自动分配,不可修改。",nameTooltip:"任务的友好名称,便于识别。",cronTooltip:"定义任务执行时间",cronExample:"常用示例:'0 9 * * *' = 每天9点 | '*/30 * * * *' = 每30分钟 | '0 */2 * * *' = 每2小时 | '0 0 * * 0' = 每周日0点",cronHelper:"不熟悉 Cron 表达式?",cronHelperLink:"使用在线工具生成",timezoneTooltip:"Cron 计划使用的时区。默认:UTC",taskTypeTooltip:"选择 'text' 用于简单消息任务,选择 'agent' 用于复杂的智能体工作流。",textTooltip:"简单消息任务:此处为实际的消息正文,任务类型为'text'时必填。",requestInputTooltip:"JSON 格式的消息内容。这是智能体将接收和处理的内容,任务类型为'agent'时必填。",requestInputExample:'格式:[{"role":"user","content":[{"type":"text","text":"您的消息内容"}]}]',requestSessionIdTooltip:"请求上下文的会话ID。不确定时使用 'default'。",requestUserIdTooltip:"发起请求的用户ID。自动化任务使用 'system'。",dispatchChannelTooltip:"响应将发送到的目标频道(例如:'console'、'discord'、'imessage')。",dispatchTargetUserIdTooltip:"在目标频道中接收响应的用户ID。",dispatchTargetSessionIdTooltip:"在目标频道中传递响应的会话ID。",dispatchModeTooltip:"选择 'stream' 获取实时响应,或选择 'f
168inal' 仅获取完整响应。",silentDeliveryTooltip:"完整执行 Agent 任务并保留会话和追踪记录,但不向渠道发送结果。",shareSessionTooltip:"开启时,与目标用户共用会话。关闭时,每次运行创建独立的会话上下文,互不影响。适用于不需要记忆历史的独立任务。默认:开启",maxConcurrencyTooltip:"此任务可以同时运行的最大数量。默认:1",timeoutSecondsTooltip:"最大执行时间(秒)。超时将终止任务。",misfireGraceSecondsTooltip:"错过执行的宽限期。如果任务错过计划时间超过此时长,将不会执行。",toolSafetyTooltip:"开启时,高风险工具调用需要用户审批(可能阻塞无人值守的定时任务)。关闭时,工具调用不再请求审批;文件防护规则仍然生效。默认:关闭",executeNowTitle:"立即执行任务",executeNowContent:'确定要立即执行任务 "{{name}}" 吗?',executeNowConfirm:"立即执行",listView:"列表视图",calendarView:"日历视图",calendarEmptyHint:"暂无日程任务。创建日程任务后会显示在日历中。",calendarMoreItems:"还有 {{count}} 项",calendarDayListTitle:"{{date}} 的日程任务",executionHistory:"执行记录",historyTitle:"执行记录 - {{name}}",historyEmpty:"暂无执行记录。",historyStatusSuccess:"成功",historyStatusFailed:"失败",historyStatusRunning:"执行中",historyStatusCancelled:"已取消",historyTriggerScheduled:"定时触发",historyTriggerManual:"手动触发",historyExpand:"展开全文",historyCollapse:"收起",templates:{dailyTechNewsBrief:{title:"工作日科技新闻早报",description:"工作日 9:30 自动整理当日热门科技资讯并推送简报。",frequency:"工作日 09:30(30 9 * * 1-5)"},dailyEveningReflection:{title:"每日收尾复盘",description:"工作日 20:00 提醒回顾当日完成事项与待改进点。",frequency:"工作日 20:00(0 20 * * 1-5)"},weekendRelaxationReminder:{title:"周末电影推荐",description:"周末上午推送近期热门电影推荐。",frequency:"周末 10:00(0 10 * * 6,0)"},pomodoroBreakReminder:{title:"休息提醒",description:"工作时段每 25 分钟提醒起身喝水或远眺,减少疲劳。",frequency:"工作日 9:00-17:59 每 25 分钟(*/25 9-17 * * 1-5)"},petCareReminder:{title:"宠物驱虫/疫苗提醒",description:"每月 15 日晚提醒给宠物做体外驱虫。",frequency:"每月 15 日 20:00(0 20 15 * *)"},onceTextBirthdayReminder:{title:"生日提醒",description:"提醒xx于1月1日过生日。",frequency:"执行时间:2026å¹´1月1日 09:00"},onceAgentBusinessTripPrep:{title:"出差前天气与行程准备",description:"查询目的地天气并给出行程准备建议。",frequency:"执行时间:2026å¹´1月1日 20:00"},repeatCountTextMedicineReminder:{title:"吃药提醒(14次)",description:"提醒按时吃药,本疗程共14次。",frequency:"首次执行:2026å¹´1月1日 09:00|每1天一次|限定14次"},repeatCountAgentDietPlan:{title:"14天饮食计划",description:"连续14天生成并发送当日饮食建议。",frequency:"首次执行:2026å¹´1月1日 08:00|每1天一次|限定14次"},repeatUntilTextWeeklyMeeting:{title:"两个月周会提醒",description:"每周提醒参加周会,持续到设定截止时间。",frequency:"首次执行:2026å¹´1月2日 08:45|每7天一次|截止到2026å¹´3月1日"},repeatUntilAgentWeeklySummary:{title:"周会前工作总结",description:"每次周会前基于最近一周 memory 生成工作总结。",frequency:"首次执行:2026å¹´1月2日 08:30|每7天一次|截止到2026å¹´3月1日"}}},PR={title:"频道",description:"管理和配置消息频道",loading:"正在加载频道...",configSaved:"配置保存成功",configFailed:"配置保存失败",botConflictTitle:"机å
168™¨äººå·²è¢«ä½¿ç”¨",botConflictDescription:"该机器人已被 {{agents}} 的同名频道使用,仍然保存可能导致消息冲突。",botConflictConfirm:"仍然保存",channelType:"频道类型",status:"状态",totalItems:"共 {{count}} 项",botPrefix:"机器人前缀",showToolCalls:"显示工具调用信息",showToolCallsTooltip:"向用户显示工具调用信息(关闭则隐藏)",showToolResults:"显示工具结果信息",showToolResultsTooltip:"向用户显示工具结果信息(关闭则隐藏)",toolCallMaxLength:"工具调用最大显示长度",toolResultMaxLength:"工具结果最大显示长度",toolMaxLengthTooltip:"设置为 0 表示不截断",onebotMediaBase64:"使用 Base64 发送本地媒体",onebotMediaBase64Tooltip:"媒体文件发送方式。关闭时发送文件路径,开启时将文件编码为 Base64 发送。远程 URL 保持不变。",onebotMediaBase64MaxMb:"Base64 文件大小上限",onebotMediaBase64MaxMbTooltip:"超过此大小的媒体文件将使用原始文件路径发送。",onebotMediaBase64MaxMbRequired:"请输入 Base64 文件大小上限",onebotMediaBase64MaxMbMin:"Base64 文件大小上限至少为 1 MB",onebotMediaDir:"媒体文件目录",onebotMediaDirTooltip:"下载媒体的保存目录。默认使用 Agent 工作区内的 media 目录。",onebotMediaDownloadMaxMb:"入站媒体大小上限",onebotMediaDownloadMaxMbTooltip:"从 OneBot 下载的单个图片、音频、视频或文件的最大大小。",onebotMediaDownloadMaxMbRequired:"请输入入站媒体大小上限",onebotMediaDownloadMaxMbMin:"入站媒体大小上限至少为 1 MB",onebotWsHostTooltip:"反向 WebSocket 服务的监听地址。保持 127.0.0.1 时仅本机的 OneBot 客户端可连接;填写其他地址会将端口暴露到网络,此时必须设置访问令牌。",onebotAccessTokenTooltip:"OneBot 客户端通过 Authorization 请求头发送的共享令牌。监听地址不是回环地址时必填。",onebotAccessTokenRequired:"监听地址不是回环地址时必须设置访问令牌",showThinking:"显示思考过程",showThinkingTooltip:"向用户显示模型的思考/推理内容(关闭则隐藏)",noTextDebounce:"无文本消息防抖",noTextDebounceTooltip:"开启后,仅含媒体(图片/视频/文件)的消息会暂存,等待后续文本消息合并处理;关闭则所有消息立即处理。语音消息始终立即处理",streamingEnabled:"流式输出",streamingEnabledDingtalkHint:"仅在消息类型为 Card 时生效",streamingEnabledFeishuHint:"需要在飞书开放平台权限管理界面开通 cardkit:card:write 权限",ackMessage:"即时确认消息",ackMessageTooltip:"收到消息后立即发送一条确认回复,在 Agent 处理之前。留空则禁用。",ackMessagePlaceholder:"⏳ 正在处理中...",notSet:"未设置",clickCardToEdit:"点击卡片进行编辑",settings:"设置",channelSettings:"频道设置",channelNames:{console:"控制台",dingtalk:"钉钉",feishu:"飞书",discord:"Discord",telegram:"Telegram",qq:"QQ",imessage:"iMessage",mattermost:"Mattermost",matrix:"Matrix",onebot:"OneBot",mqtt:"MQTT",voice:"语音",sip:"SIP",wecom:"企业微信",wechat:"微信",xiaoyi:"小艺",yuanbao:"元宝",slack:"Slack"},pleaseInputDbPath:"请输入数据库路径",pleaseInputPollInterval:"请输入轮询间隔",discordBotToken:"Discord机器人令牌",acceptBotMessages:"接收机器人消息",acceptBotMessagesTooltip:"开启后,将接收来自其他机器人的消息",httpProxyPlaceholder:"http://127.0.0.1:18118",httpProxyAuthPlaceholder:"用户名:密码",dbPathPlaceholder:"~/Library/Messages/chat.db",botPrefixPlaceholder:"@bot",dmPolicy:"私聊策略",dmPolicyTooltip:"控制谁可以通过私聊与机器人交互。开放:所有人;白名单:仅限授权用户",groupPolicy:"群聊策略",groupPolicyTooltip:"控制谁可以在群聊中与机器人交互。开放:所有人;白名单:仅限授权用户",requireMention:"需要 @提及",requireMentionTooltip:"开启后,群聊中仅在被 @提及 时才会回复",policyOpen:"开放",policyAllowlist:"白名单",allowFrom:"白名单用户",allowFromTooltip:"允许与机器人交互的用户 ID 列表。启用白名单后,用户私聊机器人即可在拒绝消息中看到自己的 ID",allowFromPlaceholder:"输入用户ID后按回车添加",denyMessage:"拒绝访问消息",denyMessageTooltip:"自定义消息,当用户被拒绝访问时显示",twilioAccountSid:"Twilio 
168账户 SID",twilioAuthToken:"Twilio 认证令牌",phoneNumber:"电话号码",phoneNumberSid:"电话号码 SID",phoneNumberSidHelp:"可在 Twilio 控制台的 Phone Numbers → Active Numbers 中找到。",ttsProvider:"TTS 提供商",ttsVoice:"TTS 语音",sttProvider:"STT 提供商",language:"语言",welcomeGreeting:"欢迎语",welcomeText:"欢迎消息",welcomeTextTooltip:"用户当天首次进入机器人单聊会话时机器人自动发送的消息",welcomeTextPlaceholder:"例如:你好!我是 QwenPaw,有什么可以帮你的?",loginWeCom:"获取企业微信二维码",wecomSetupGuide:"使用二维码创建机器人时,授权机器人可使用的能力时请选择「暂不授权」。如果选择了「确认授权」,除了机器人创建者,其他用户可能无法与机器人交互。",wecomScanAuth:"扫码授权",wecomAuthHint:"请使用企业微信扫描上方二维码完成授权,授权成功后 Bot ID 与 Secret 将自动填入。",wecomAuthSuccess:"企业微信机器人授权成功,Bot ID 与 Secret 已自动填入",wecomQrcodeFailed:"获取企业微信二维码失败,请重试",dingtalkSetupGuide:"使用钉钉扫码一键创建机器人。扫码后将自动创建钉钉应用并获取 Client ID 和 Client Secret。",dingtalkScanAuth:"扫码创建机器人",dingtalkGetQrcode:"获取钉钉二维码",dingtalkScanHint:"请使用钉钉扫描上方二维码,完成授权后 Client ID 与 Client Secret 将自动填入。",dingtalkAuthSuccess:"钉钉机器人创建成功,Client ID 与 Client Secret 已自动填入",dingtalkQrcodeFailed:"获取钉钉二维码失败,请稍后重试",dingtalkQrcodeExpired:"二维码已过期,请重新获取",qqSetupGuide:"使用 QQ 扫码授权机器人,扫码后将自动获取 APP ID 和 Client Secret 并填入。",qqScanAuth:"扫码授权机器人",qqGetQrcode:"获取 QQ 二维码",qqScanHint:"请使用 QQ 扫描上方二维码,完成授权后 APP ID 和 Client Secret 将自动填入。",qqAuthSuccess:"QQ 机器人授权成功,APP ID 和 Client Secret 已自动填入",qqQrcodeFailed:"获取 QQ 二维码失败,请稍后重试",qqQrcodeExpired:"二维码已过期,请重新获取",atSenderOnReply:"回复时@发送者",atSenderOnReplyTooltip:"开启后,机器人在群聊中回复时会在第一条消息中@发送者。注意:卡片模式下,@功能仅对企业内部成员生效。",dingtalkEndpoint:"API 地址",dingtalkEndpointTooltip:"用于钉钉私有化部署的自定义 API 地址。留空则使用官方默认地址。",cardAutoLayout:"宽屏卡片(自动布局)",cardAutoLayoutTooltip:"开启后,钉钉将在桌面端以宽屏渲染 AI 卡片。仅消息类型为 card 时生效。卡片模板需已发布。",wecomCancelled:"授权已取消",wecomAuthFailed:"授权失败:{{msg}}",slackBotToken:"Bot Token",slackBotTokenTooltip:"Slack Bot User OAuth Token,以 xoxb- 开头",slackAppToken:"App Token",slackAppTokenTooltip:"Slack App-Level Token(Socket Mode),以 xapp- 开头",slackProxyTooltip:"HTTP 代理地址,用于连接 Slack API",voiceSetupGuide:"请先注册 Twilio 账户并购买电话号码,然后在下方填写凭据。Account SID 和 Auth Token 可在 Twilio 控制台首页找到。Phone Number SID 在 Phone Numbers → Active Numbers 中查看。",voiceSetupLink:"打开 Twilio 控制台",sipSetupGuide:"配置 SIP 注册服务器(如 Asterisk、FreeSWITCH),然后在下方填写 SIP 凭据。Dev 模式使用 pyVoIP 在本地处理 SIP/RTP;Production 模式使用 LiveKit SIP Server。",sipMode:"SIP 模式",sipModeTooltip:"Dev:纯 Python pyVoIP,适合本地开发测试。Production:LiveKit SIP Server,适合高并发生产环境。",sipServer:"SIP 服务器",sipServerPlaceholder:"留空使用内置注册服务器",sipServerPlaceholderLivekit:"LiveKit 模式无需填写",sipUsername:"SIP 用户名",sipPassword:"SIP 密码",sipPort:"SIP 端口",sipTransport:"传输协议",sipDashscopeApiKey:"DashScope API Key",sipDashscopeApiKeyTooltip:"阿里云 DashScope STT/TTS 的 API Key。留空则回退到 DASHSCOPE_API_KEY 环境变量。",livekitUrl:"LiveKit URL",livekitApiKey:"LiveKit API Key",livekitApiSecret:"LiveKit API Secret",livekitSipTrunkId:"LiveKit SIP Trunk ID",livekitRoomName:"LiveKit 房间名称",livekitRoomNameTooltip:"Agent 连入并等待 SIP 来电的 LiveKit 房间名称,需与 S
168IP Dispatch Rule 中配置的房间名一致。",xiaoyiSetupGuide:"请在华为开发者平台创建智能体并获取 AK/SK 和 Agent ID。AK/SK 可在凭证管理页面找到。",filterAll:"全部",builtin:"内置",custom:"自定义",feishuRegion:"地区",feishuRegionTooltip:"国内用户选择飞书,海外用户选择 Lark",feishuChina:"飞书(国内)",feishuInternational:"Lark(海外)",feishuScanGuide:"使用飞书扫码一键创建机器人。扫码后将自动创建飞书应用并获取 App ID 和 App Secret。",feishuScanLogin:"扫码创建机器人",feishuGetQrcode:"获取飞书二维码",feishuScanHint:"请使用飞书扫描上方二维码,完成授权后 App ID 与 App Secret 将自动填入。",feishuAuthSuccess:"飞书机器人创建成功,App ID 与 App Secret 已自动填入",feishuQrcodeExpired:"二维码已过期,请重新获取",feishuQrcodeFailed:"获取飞书二维码失败,请稍后重试",wechatSetupGuide:"微信个人账号 Bot(iLink 协议)。首次启动时若未配置 Bot Token,系统将打印二维码链接,请扫码登录;Token 将自动保存到本地文件供后续使用。",wechatContextTokenLimit:"微信 iLink 平台限制:每条用户消息对应的 context_token 最多只能回复 10 条消息,这是平台侧的硬性限制。建议关闭思考及工具输出,或者使用消息合并功能以避免超出限制导致消息发送失败。",wechatBotToken:"Bot Token",wechatBotTokenTooltip:"扫码登录后获取的 Bearer Token。留空时将在启动时引导扫码登录。",wechatBotTokenPlaceholder:"扫码登录后自动填入,也可手动粘贴",wechatBotTokenFile:"Token 文件路径",wechatBotTokenFileTooltip:"Token 持久化存储路径,默认为 ~/.qwenpaw/wechat_bot_token",wechatMediaDir:"媒体文件目录",wechatMessageMerge:"消息合并",wechatMessageMergeTooltip:"将多条回复消息合并为更少的消息发送,避免触发微信 context_token 10 条消息的限制。开启并设置延时ä¸
168º 0 时,所有文本回复将在请求结束后合并为一条消息发送。设置正数延时(毫秒)则合并该时间窗口内的相邻消息。",wechatMessageMergeDelayMs:"合并延时(毫秒)",wechatMessageMergeDelayMsTooltip:"相邻消息合并的时间窗口。设为 0 表示将所有消息合并为一条最终回复。设为正数(如 1000)则缓冲该时间段内的消息后发送。",wechatMessageMergeDelayMsValidation:"请输入有效的非负整数",wechatScanLogin:"扫码登录",wechatGetQrcode:"获取登录二维码",wechatScanHint:"请用微信扫描二维码,扫码成功后点击保存",wechatQrcodeFailed:"获取二维码失败,请稍后重试",wechatLoginSuccess:"微信扫码登录成功,Token 已填入",wechatQrcodeExpired:"二维码已过期,请重新获取",shareSessionInGroup:"群聊共享上下文",shareSessionInGroupTooltip:"启用时,群内所有成员共享同一会话上下文;禁用时,每位成员维护各自独立的会话。",accessControlEnabled:"访问控制",accessControlEnabledTooltip:"开启后,只有白名单用户可以与机器人互动。未知用户会收到自己的ID提示,并被添加到待审批列表。",accessControlDm:"私聊访问控制",accessControlDmTooltip:"开启后,只有白名单用户可以通过私聊与机器人互动",accessControlGroup:"群聊访问控制",accessControlGroupTooltip:"开启后,只有白名单用户可以在群聊中与机器人互动",dmDisabled:"禁用私聊",dmDisabledTooltip:"开启后,机器人将完全忽略所有私聊消息",groupDisabled:"禁用群聊",groupDisabledTooltip:"开启后,机器人将完全忽略所有群聊消息",manageAccessControl:"访问控制",pen
168dingApprovals:"待审批",whitelist:"白名单",blacklist:"黑名单",addUser:"添加用户",addUserPlaceholder:"输入用户 ID",userId:"用户 ID",channel:"频道",firstMessage:"首条消息",time:"时间",actions:"操作",approve:"加入白名单",deny:"加入黑名单",dismiss:"忽略",noWhitelistUsers:"暂无白名单用户",noBlacklistUsers:"暂无黑名单用户",noPendingApprovals:"暂无待审批",userAdded:"用户添加成功",userRemoved:"用户删除成功",approveSuccess:"已加入白名单",denySuccess:"已加入黑名单",dismissSuccess:"已忽略",operationFailed:"操作失败",remark:"备注",usernamePlaceholder:"输入用户名称(可选)",remarkPlaceholder:"输入备注(可选)",filterByChannel:"按渠道筛选",selectToOperate:"选择项目进行操作",selectedCount:"已选 {{count}} 项",batchApprove:"批量通过",batchDeny:"批量拉黑",batchDismiss:"批量忽略",batchApproveConfirm:"确认通过 {{count}} 位用户?",batchDenyConfirm:"确认将 {{count}} 位用户加入黑名单?",batchDismissConfirm:"确认忽略 {{count}} 位用户?",batchSuccess:"已成功处理 {{count}} 位用户",batchRemove:"删除",batchRemoveConfirm:"确认删除 {{count}} 位用户?",enabledSection:"已激活",enabledCount:"{{count}} 个",availableSection:"未激活",enableAction:"启用",noEnabledChannels:"暂无已激活频道",goEnableChannels:"去启用频道"},AR={title:"会话",description:"查看和管理活动聊天会话",loading:"正在加载会话...",confirmDelete:"确认删除",deleteConfirm:"确定要删除此会话吗?",batchDeleteConfirm:"确定要删除选中的 {{count}} 个会话吗?",deleteSuccess:"会话删除成功",deleteFailed:"会话删除失败",batchDeleteSuccess:"成功删除 {{count}} 个会话",batchDeleteFailed:"批量删除会话失败",saveSuccess:"会话保存成功",saveFailed:"会话保存失败",batchDeleteButton:"批量删除",filterTitle:"按标题筛选",filterUserId:"按用户ID筛选",filterChannel:"按频道筛选",allChannels:"全部频道",totalItems:"共 {{count}} 项",selectedItems:"已选 {{count}} 项",editSession:"编辑会话",pleaseInputName:"请输入会话名称",sessionNamePlaceholder:"会话名称",activeTab:"活跃",archivedTab:"已归档",archivedAtColumn:"归档时间",archive:{action:"归档",unaction:"取消归档",batchAction:"批量归档",success:"会话已归档",successHint:"会话已归档,可在「控制-会话-已归档」查看",failed:"归档失败",unarchiveSuccess:"已取消归档",unarchiveFailed:"取消归档失败",batchSuccess:"已归档 {{count}} 个会话",batchFailed:"批量归档失败",batchUnaction:"批量取消归档",batchUnarchiveSuccess:"已取消归档 {{count}} 个会话",batchUnarchiveFailed:"批量取消归档失败",groupLabel:"已归档 ({{count}})",modalTitle:"已归档的聊天记录",unarchiveAll:"全部取消归档",noArchived:"暂无已归档的会话"}},MR={parent:"设置",environments:"环境变量",title:"环境变量",description:"为智能体和技能配置键值环境变量。",key:"键",value:"值",variableNamePlaceholder:"VARIABLE_NAME",valuePlaceholder:"值",insertRowBelow:"在下方插入行",deleteRow:"删除行",deleteVariable:"删除变量",deleteConfirm:'删除 "{{name}}"?',deleteSelected:"删除选中项",deleteSelectedConfirm:"删除 {{label}}?",keyRequired:"键为必填项",invalidKeyFormat:"键格式无效",duplicateKey:"键重复",saveSuccess:"环境变量已保存",saveFailed:"保存失败",deleteSuccess:'"{{name}}" 已删除',deleteFailed:"删除失败",noVariables:"尚未配置环境变量。",addVariable:"添加变量",loading:"加载中…",retry:"重试",of:"共",selected:"已选",variable:"变量",variables:"变量",showValue:"显示值",hideValue:"隐藏值",searchPlaceholder:"搜索变量",qwenpawSettings:"QwenPaw 已知配置",qwenpawSettingsDescription:"默认展示已知配置,包括默认值和只读启动项。",liveSettings:"实时配置",noLiveVariables:"当前筛选条件下没有可实时修改的配置。",customSettings:"自定义变量",noCustomVariables:"尚未添加自定义子进程变量。",editVariable:"编辑变量",applyNow:"立即应用",applyHint:"当前 QwenPaw 进程立即更新;已经运行的 MCP 需要重新加载。",applied:"环境变量已应用",appliedWithFailures:"变量已保存,但有 {{count}} 个 MCP 未能重新加载",resetVariable:"重置变量",resetSuccess:"已恢复为系统值或代码默认值",startupOnly:"å
168ªè¯»",readonlySettings:"只读配置",noReadonlyVariables:"当前筛选条件下没有只读配置。",impactTitle:"进程影响",explicitConsumers:"{{count}} 个 MCP 明确使用此变量",implicitConsumers:"{{count}} 个 stdio MCP 可能隐式继承此变量",restartMode:"已运行的 MCP",restartAffected:"重新加载受影响的 MCP",restartNone:"不重新加载",restartAllStdio:"重新加载全部 stdio MCP",readonlyReason:{startup:"QwenPaw 启动时确定",agent_owned:"由各 Agent 配置管理",initial_default:"仅作为 Agent 配置的初始化默认值"},mutabilityDescription:{hot_runtime:"每次操作开始时从当前 QwenPaw 进程读取。",hot_process:"可通过 os.getenv() 读取,并由之后启动的子进程继承。",startup_only:"仅供查看,QwenPaw 运行期间不能修改。",internal:"由 QwenPaw 内部管理。"},variableDescriptions:{QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT:"等待首个有效流式内容的最长时间;设为 0 可关闭检测。",QWENPAW_LLM_STREAM_IDLE_TIMEOUT:"两个有效流式内容之间的最长等待时间;设为 0 可关闭检测。"},source:{user:"QwenPaw",system:"系统",default:"默认"}},DR={title:"Token 消耗",totalTokens:"总 Token",totalCalls:"LLM 调用",toolCalls:"工具调用",llmAndToolTrend:"LLM 与工具调用趋势",llmAndToolTrendTooltip:"所有智能体:已记录用量元数据的助手轮次,以及工具调用意图次数(不依赖用量元数据)。不是上方 Total Calls(原始 API 次数);升级前会话的轮次可能为 0。",llmAndToolTrendLoadFailed:"LLM 与工具调用趋势加载失败",recordedTurnsAllAgents:"LLM 调用",byAgent:"按智能体",agent:"智能体",unattributed:"未归属",promptTokens:"输入 Token",completionTokens:"输出 Token",cacheRead:"缓存命中 Token",cacheHitRate:"缓存命中率",byModel:"按模型",byDate:"按日期",model:"模型",date:"日期",loadFailed:"加载 Token 消耗数据失败",noData:"所选时间段内暂无 Token 消耗数据",modelTrend:"模型用量趋势",tokenTypeChart:"Token 类型趋势",selectAll:"全选",allSelected:"全部",itemsSelected:"已选 {{count}} 项",selectModels:"选择模型",selectTokenTypes:"选择 Token 类型"},xR={title:"智能体统计",totalSessions:"总会话数",totalMessages:"总消息数",userMessages:"用户消息",assistantMessages:"智能体消息",promptTokens:"输入 Token",totalInputTokens:"总输入 Token",completionTokens:"输出 Token",toolCalls:"工具调用",newSessions:"新建会话",activeSessions:"活跃会话",messageTrend:"消息趋势",sessionTrend:"会话趋势",tokenTrend:"Token 趋势",llmAndToolTrend:"LLM & 工具调用趋势",sessionsByChannel:"按渠道会话统计",messagesByChannel:"按渠道消息统计",totalSessionsTooltip:"创建的会话总数,每个会话对应一次独立聊天上下文",totalMessagesTooltip:"所有会话中的消息总数,含用户消息和智能体消息",toolCallsTooltip:"智能体决定调用工具的次数,单次 LLM 调用可能产生多个工具意图",messageTrendTooltip:"用户消息与智能体消息的数量对比趋势",sessionTrendTooltip:"新建会话与活跃会话的对比趋势,橙色为当天创建的会话,蓝色为当天产生过消息的会话",llmAndToolTrendTooltip:"当前智能体 LLM 轮次与工具调用次数的对比趋势",sessionsByChannelTooltip:"按消息渠道分布的会话数量占比,未关联渠道的会话默认归为 Console",messagesByChannelTooltip:"按消息渠道分布的消息总数占比",currentAgentLlmCalls:"已记录轮次",currentAgentTokenTrendTooltip:"当前智能体会话中按轮次元数据累计的输入、输出与缓存命中 Token 趋势;缓存命中 Token 是输入 Token 的子集",currentAgentPromptTokensTooltip:"所选时间段内,当前智能体各会话累计的输入 Token(依赖轮次用量元数据,升级前会话可能为 0)",currentAgentCacheHitRateTooltip:"所选时间段内,当前智能体已观测缓存调用的 Token 加权命中率(缓存命中 Token / 可缓存输入 Token;无可观测数据时显示 —)",currentAgentCompletionTokensTooltip:"所选时间段
168内,当前智能体各会话累计的输出 Token(依赖轮次用量元数据,升级前会话可能为 0)",currentAgentLlmCallsTooltip:"所选时间段内,当前智能体已记录用量元数据的助手轮次数(非原始 API 调用次数;升级前会话可能为 0)",loadFailed:"加载统计数据失败",noData:"所选时间段内暂无统计数据",retry:"重试"},RR={selectModel:"选择模型",noConfiguredModels:"暂无已配置模型",noFreeModels:"暂无可用的免费模型",switchFailed:"切换模型失败",searchModels:"搜索模型...",clearSearch:"清除模型搜索",loadingModels:"正在加载模型",partialLoadFailed:"部分模型信息加载失败。",retry:"重试",noModelsFound:"未找到匹配的模型",free:"免费",vision:"视觉",freeBannerText:"免费模型可能存在服务不稳定及用量限制的情况,详情请参考提供商说明。",moreProviders:"更多免费提供商(需配置 API Key)",proBannerText:"仅显示在设置页已配置的模型。",connectToUse:"连接 {{provider}} 以使用免费模型",configureApiKey:"配置 {{provider}} API Key 以使用免费模型",configureApiKeyTitle:"前往配置页",configureApiKeyConfirm:"即将跳转到模型配置页面,配置 {{provider}} 的 API Key。是否继续?",goToConfigure:"前往配置",noModelsDiscovered:"已连接,模型加载中...",oauthTitle:"连接 {{provider}}",oauthDescription:"将打开一个新的浏览器窗口以授权访问 {{provider}},API 密钥将自动保存。",oauthContinue:"继续",oauthWaiting:"等待授权中...",oauthWaitingDescription:"请在浏览器窗口中完成授权。",oauthConnected:"已成功连接 {{provider}}",oauthFailed:"授权失败,请重试",oauthTimeout:"授权超时,请重试",oauthModelUnavailable:"所选模型已不可用,请检查供应商模型后重试。",viewMore:"显示更多 ({{count}})",addAndUse:"添加并使用",availableToAdd:"可添加模型",addFailed:"添加模型失败",hideModel:"隐藏模型",hiddenModels:"已隐藏模型({{count}})",restoreModel:"恢复模型",restore:"恢复",visibilityFailed:"更新模型可见性失败",agentModelSettings:"Agent 模型路由",agentSettingsLoadFailed:"加载 Agent 模型设置失败",loadingAgentSettings:"正在加载 Agent 模型设置",agentSettingsSaveFailed:"保存 Agent 模型设置失败",agentSettingsSaved:"Agent 模型设置已保存",saveAgentSettings:"保存路由设置",thinkingLevel:"思考深度",thinkingUnsupported:"当前模型未声明可配置的思考能力。",thinking:{inherit:"模型默认",off:"关闭",low:"低",medium:"中",high:"高"},subagentModel:"Sub-agent 模型",sameAsPrimary:"与主模型相同",enableFallback:"启用模型降级",fallbackScope:"降级范围",configuredModels:"已配置模型",freeModelsOnly:"仅免费模型",chooseFallback:"选择备用模型",moveFallbackUp:"上移 {{model}}",moveFallbackDown:"下移 {{model}}",removeFallback:"移除 {{model}}",fallbackActive:"实际处理模型:{{provider}} / {{model}}"},IR=JSON.parse('{"discoveryOriginApi":"API 检测","discoveryOriginCatalog":"官方目录","discoveryOriginBoth":"API + 目录","availabilityAvailable":"可用","availabilityPermissionDenied":"无权限","availabilityNotFound":"未找到","availabilityIncompatible":"不兼容对话接口","availabilityRateLimited":"限流中","availabilityTransientError":"暂时不可用","availabilityUnverified":"未验证","modelAlreadyConfigured":"已配置","llmConfiguration":"LLM 配置","providersTitle":"提供商","providersDescription":"为每个提供商配置 API 密钥和端点。","llmTitle":"模型","defaultLlm":"默认LLM","notConfiguredYet":"尚未配置","llmDescription":"在这里设置全局默认的 LLM 模型。你也可以在聊天页面为具体 Agent 单独选择使用的模型。","configureProvider":"配置 {{name}}","baseURL":"基础 URL","apiKey":"API 密钥","advancedConfig":"进阶配置","authMode":"鉴权方式","authModeApiKey":"API Key(x-api-key)","authModeAuthToken":"Auth Token(Authorization: Bearer)","customHeaders":"自定义 Headers","customHeadersHint":"会附加到每次 API 请求中,例如 x-app: cli","customHeaderKey":"Header 名称","customHeaderValue":"Header 值","addHeader":"+ 添加 Header","generateConfig":"生成参数配置","generateConfigHint":"使用 JSON 格式表示的生成参数配置项,会被展开传入到生成请求(`openai.chat.completions` 或 `anthropic.messages`)中。","generateConfigInvalidJson":"请输入有效的 JSON","generateConfigMustBeObject":"生成参数配置必须是 JSON 对象","modelAdvancedConfig":"模型进阶配置","modelGenerateConfig":"模型生成参数","modelGenerateConfigHint":"使用 JSON 格式表示的该模型专属生成参数配置项,会被展开传入到生成请求中。优先级高于提供商级别的进阶配置。","modelConfigSaved":"模型 {{name}} 的配置已保存","modelConfigSaveFailed":"保存模型配置失败","modelConfigLabel":"模型配置","maxTokensLabel":"最大输出 Tokens","maxTokensHint":"每次响应的最大输出 token 数","providerDefault":"服务商默认","resetMaxTokens":"恢复为自动","maxOutputCapabilityLabel":"模型能力上限","unknown":"未知","maxInput
168LengthLabel":"最大上下文长度","maxInputLengthHint":"模型上下文窗口大小,控制上下文压缩阈值(≥1000)","relayReasoningLabel":"转发推理内容","relayReasoningHint":"将推理内容(reasoning contents)回传至后续对话轮次","thinkingModeLabel":"启用思考","thinkingModeHint":"开启以启用模型思考/推理,关闭以禁用思考。","thinkingBudgetLabel":"思考预算","thinkingBudgetHint":"使用模型默认思考预算","switchToManual":"手动设置","switchToAuto":"自动","reasoningEffortLabel":"推理深度","reasoningEffortHint":"控制推理深度(OpenAI 系列)","protocol":"协议","protocolHint":"为当前配置选择提供商 API 协议。","selectProtocol":"请选择协议","protocolOpenAI":"OpenAI 兼容(Chat Completions)","protocolOpenAIResponse":"OpenAI 兼容(Response API)","protocolAnthropic":"Anthropic(Messages API)","currentKey":"当前密钥:{{key}}","startsWith":"以 \\"{{prefix}}\\" 开头","optionalSelfHosted":"自托管服务可选","leaveBlankKeep":"留空以保持当前密钥","enterApiKey":"输入 API 密钥 ({{prefix}}...)","enterApiKeyOptional":"输入 API 密钥(可选)","openAIEndpoint":"OpenAI 端点,例如 https://api.openai.com/v1","openAICompatibleEndpoint":"OpenAI 兼容端点,例如 https://api.example.com(仅在你的服务要求时再追加 /v1)","azureEndpointHint":"Azure OpenAI 端点,例如 https://<resource>.openai.azure.com/openai/v1","anthropicEndpointHint":"Anthropic 端点,例如 https://api.anthropic.com","ollamaEndpointHint":"Ollama 端点,例如 http://localhost:11434","lmstudioEndpointHint":"LM Studio 端点,例如 http://localhost:1234/v1","apiEndpointHint":"API 端点,例如 https://api.example.com","pleaseEnterBaseURL":"请输入 API 基础 URL","selectBaseURL":"请选择基础 URL","selectBaseURLHint":"选择该服务商的区域接入点","pleaseEnterValidURL":"请输入有效的 URL","apiKeyShouldStart":"API 密钥应以 \\"{{prefix}}\\" 开头","configurationSaved":"{{name}} 配置已保存","failedToSaveConfig":"保存配置失败","revokeAuthorization":"撤销授权","revokeConfirmContent":"确定要移除 {{name}} 的 API 密钥吗?当前 LLM 模型配置也将被清除。","revokeConfirmSimple":"确定要移除 {{name}} 的 API 密钥吗?","authorizationRevoked":"{{name}} 授权已撤销,LLM 模型已清除","authorizationRevokedSimple":"{{name}} 授权已撤销","failedToRevoke":"撤销授权失败","active":"活动:{{provider}} / {{model}}","provider":"提供商","model":"模型","selectProvider":"选择提供商(必须已授权)","selectModel":"选择模型","llmModelUpdated":"LLM 模型已更新","failedToSave":"保存失败","freeModelWarningTitle":"免费模型提示","freeModelWarningMessage":"免费模型可能存在服务不稳定的情况,详情请参考提供商服务条款:","freeModelWarningDontShowAgain":"今后不再提示","saved":"已保存","save":"保存","cancel":"取消","loading":"加载中...","retry":"重试","notSet":"未设置","notRequired":"无需配置","available":"可用","unavailable":"不可用","providerAvailable":"可用(有模型)","providerNoModels":"未就绪(无模型)","providerNotConfigured":"未就绪(未配置)","settings":"设置","actions":"操作","search":"搜索","searchPlaceholder":"搜索提供商...","searchModelPlaceholder":"搜索模型...","custom":"自定义","builtin":"内置","freeTierGroup":"免费","paidGroup":"付费","localCustomGroup":"本地 & 自定义","cloudGroup":"云端提供商","configuredGroup":"已配置","configuredOnline":"个提供商在线","noConfigured":"尚未配置任何提供商,请在下方选择一个开始使用","goConfigureBtn":"去配置","availableGroup":"可用提供商","clickToConfigure":"点击配置","configureAction":"配置 →","endpointCount":"{{count}} 个端点","connect":"OAuth 认证","saveApiKey":"保存","addProvider":"添加提供商","addProviderTitle":"添加自定义提供商","providerIdLabel":"提供商 ID","providerIdPlaceholder":"例如 openai, google, anthropic","providerIdHint":"小写字母、数字、连字符、下划线,创建后不可更改。","providerNameLabel":"显示名称","providerNamePlaceholder":"例如 OpenAI, Google Gemini","defaultBaseUrlLabel":"默认 Base URL","defaultBaseUrlPlaceholder":"例如 https://api.example.com","apiKeyPrefixLabel":"API Key 前缀(可选)","apiKeyPrefixPlaceholder":"例如 sk-","providerCreated":"提供商 \\"{{name}}\\" 已创建","providerCreateFailed":"创建提供商失败","deleteProvider":"删除提供商","deleteProviderConfirm":"确定删除自定义提供商 \\"{{name}}\\" 及其所有模型?此操作不可撤销。","providerDeleted":"提供商 \\"{{name}}\\" 已删除","providerDeleteFailed":"删除提供商失败","disableProvider":"停用提供商","disableProviderConfirm":"确定清除 \\"{{name}}\\" 的 API Key?该提供商将变为未配置状态。","disableBtn":"停用","changeApiKey":"修改","selectVariant":"选择 {{name}} 的版本","providerDisabled":"提供商 \\"{{name}}\\" 已停用","manageModels":"模型","models":"模型","manageModelsTitle":"{{provider}} — 模型管理","userAdded":"用户添加","addModel":"添加模型","addModels":"添加模型","autoDiscoverModels":"自动发现模型","addModelTitle":"为 {{provider}} 添加模型","modelIdLabel":"模型 ID","modelIdPlaceholder":"例如 gpt-4o, gemini-2.0-flash","modelDiscoveryUnavailableHint":"未发现可用模型。该供应商可能不支持模型列表查询,请手动输入模型 ID。","modelNameLabel":"模型名称","modelNameRequired":"请输入模型名称","modelNamePlaceholder":"例如 GPT-4o, Gemini 2.0 Flash","modelAdded":"模型 \\"{{name}}\\" 已添加","modelAddFailed":"添加模型失败","modelAlreadyExists":"模型 ID \\"{{id}}\\" 已存在","autoDiscoverModelsSuccess":"模型目录已同步,发现 {{count}} 个新候选模型","autoDiscoverModelsNoNew":"模型目录已同步,没有新的候选模型","autoDiscoverModelsFailed":"自动发现模型失败","modelsLastSynced":"最后同步:{{time}}","modelsNeverSynced":"模型尚未同步","modelsSyncFailed":"上次同步失败","modelsSyncing":"正在发现模型候选项...","discoveredModelsReady":"已发现 {{count}}
168 个模型候选项,添加后即可使用","addAllDiscoveredModels":"添加全部可用模型({{count}} 个)","discoveredModelsAdded":"已添加 {{count}} 个已发现模型","discoveredModelsAddFailed":"{{count}} 个模型添加失败","removeModel":"移除","removeModelConfirm":"确定从 {{provider}} 中移除模型 \\"{{name}}\\"?","modelRemoved":"模型 \\"{{name}}\\" 已移除","modelRemoveFailed":"移除模型失败","loadMore":"加载更多 ({{count}})","modelsCount":"{{count}} 个模型","noModels":"暂无模型","addModelFirst":"请先添加模型","modelList":"模型列表","clearAll":"清除全部","filteredModelsLoaded":"已加载过滤模型:{{count}}","filterFailed":"过滤模型失败","clearAllModels":"清除所有模型","clearAllModelsConfirm":"清除所有 {{count}} 个额外模型?此操作不可撤销。","allModelsCleared":"已清除 {{count}} 个模型","filterModels":"过滤模型","filterByProvider":"供应商:","searchProviderPlaceholder":"搜索供应商名称","selectAllProviders":"全选","clearProviderSelection":"全不选","noMatchingProviders":"没有匹配的供应商","filterByModality":"输入模态:","filterFreeOnly":"仅免费模型:","getModels":"获取模型","discovered":"可用模型:","add":"添加","local":"本地","localType":"类型","localEmbedded":"嵌入式(进程内)","localDownloadFirst":"未启动模型服务","localDownloadModel":"下载模型","localModelsTitle":"{{provider}} — 本地模型","localNoModels":"暂无已下载的模型","localRepoId":"模型仓库 ID","localRepoIdRequired":"请输入模型仓库 ID","localRepoIdPlaceholder":"例如 Qwen/Qwen3-0.6B-GGUF","localFilename":"文件名(可选)","localFilenamePlaceholder":"例如 mistral-7b.Q4_K_M.gguf","localFilenameHint":"留空将自动选择最佳量化版本","localSource":"来源","localDownloadSuccess":"模型下载成功","localDownloadFailed":"模型下载失败","localDeleteModel":"删除模型","localDeleteConfirm":"确定删除本地模型 \\"{{name}}\\"?模型文件将从磁盘中删除。","localModelDeleted":"模型 \\"{{name}}\\" 已删除","localDeleteFailed":"删除模型失败","localDownloadPending":"准备下载...","localDownloading":"正在下载 {{repo}}... 可能需要几分钟。","localDownloadNavigateHint":"您可以离开此页面,下载将在后台继续进行。","localDownloadInProgress":"已有下载任务正在进行","localDownloaded":"已下载","localNotDownloaded":"未下载","localNoRecommendedModels":"当前机器配置较低,不适合运行本地模型","localCancelDownloadTitle":"取消下载","localCancelDownloadAction":"取消下载","localCancelDownloadConfirm":"确定取消下载 \\"{{repo}}\\"?","localDownloadCancelled":"下载已取消","localCancelDownloadFailed":"取消下载失败","localLlamacppName":"推理引擎","localLlamacppInstallHint":"需要先安装本地运行时,才能下载或启动模型。","localInstallLlamacpp":"安装 llama.cpp","localLlamacppInstallStarted":"已开始下载 llama.cpp","localLlamacppInstallSuccess":"llama.cpp 安装成功","localLlamacppInstallFailed":"llama.cpp 安装失败","localRuntimeSectionTitle":"Inference Engine","localRuntimeSectionDescription":"Powered by Llama.cpp","localRuntimeComputeHint":"默认使用 CPU,如需 GPU 加速功能,请使用 Ollama 或 LM Studio","localRuntimeInstalled":"已安装","localRuntimeUpdateAvailable":"可更新","localRuntimeUpdateAction":"点击下载最新版本","localRuntimeUpdateConfirmTitle":"确认更新 llama.cpp","localRuntimeUpdateConfirmContent":"更新会覆盖当前已安装的 llama.cpp 版本。确认后将开始下载并安装最新版本。","localRuntimeUpdateConfirmContentWithServer":"更新会覆盖当前已安装的 llama.cpp 版本,并关闭当前正在运行的模型服务({{model}})。确认后将开始下载并安装最新版本。","localRuntimeUnsupported":"当前环境不支持","localRuntimeMissing":"未安装","localServerRunningTitle":"当前本地服务","localServerOnline":"运行中","localServerIdle":"不可用","localServerUnavailable":"异常","localNoActiveModel":"暂无运行中的模型","localNoD
168ownloadedModelsHint":"请先下载合适的模型,再启动本地推理服务。","localDownloadModelFirst":"请先下载模型","localEngineInstallStateLabel":"安装","localEngineRunStateLabel":"状态","localEngineCurrentModelLabel":"当前服务模型","localEngineNextStepLabel":"下一步","localEngineHealthLabel":"引擎状态","localEngineStatusHint":"请在下方列表中下载并启动合适的模型","localStartServer":"启动","localStopServer":"停止","localServerStartFailed":"启动本地服务失败","localServerStopFailed":"停止本地服务失败","localServerSwitchTitle":"切换运行中的模型","localServerSwitchConfirm":"当前服务正在运行 {{current}}。确认切换到 {{next}}?","localSwitchModel":"切换","localModelPathMissing":"该已下载模型缺少本地路径信息。","localModelsSectionTitle":"本地模型","localModelsSectionDescription":"下载后即可启动;当前只允许一个模型下载任务和一个本地服务实例。","localModelsLockedHint":"请先安装 llama.cpp","localAlternativeRuntimeHint":"请尝试使用 Ollama 或 LM Studio","localModelsCount":"已下载 {{downloaded}} / {{total}}","localCurrentDownloadTitle":"当前下载","localAdvancedConfigTitle":"本地模型进阶配置","localAdvancedConfigDescription":"这些设置会应用到内置本地推理运行时。其中最大上下文长度会在下一次启动本地服务时生效","localAdvancedConfigSaved":"本地模型进阶配置已保存","localAdvancedConfigSaveFailed":"保存本地模型进阶配置失败","localMaxContextLengthLabel":"最大上下文长度","localMaxContextLengthHint":"模型上下文窗口的最大 token 数,决定每次请求可携带的历史长度,在下一次启动本地服务时生效","localMaxContextLengthRequired":"请输入最大上下文长度","localMaxContextLengthMin":"最大上下文长度必须大于等于 {{min}}","localMaxContextLengthPlaceholder":"请输入最大上下文长度","localServerPortLabel":"服务端口","localServerPortHint":"留空时,llama.cpp 会在启动时自动选择一个可用端口;填写端口号则会在后续启动时复用该固定端口,配置会在下一次启动本地服务时生效","localServerPortRange":"服务端口必须在 {{min}} 到 {{max}} 之间","localServerPortPlaceholder":"留空则自动选择端口","localGenerateConfigHint":"使用 JSON 格式表示的生成参数配置项,会被展开传入到生成请求中","localCustomModelTitle":"自定义模型下载","localCustomModelHint":"输入模型仓库 ID,仅支持 GGUF 格式。","localSourceHuggingFace":"Hugging Face","localSourceModelScope":"ModelScope","ollamaModelNamePlaceholder":"例如 mistral:7b, qwen3:8b","testConnection":"测试连接","testConnectionSuccess":"连接测试成功","testConnectionFailed":"连接测试失败","testConnectionFailedWithMessage":"连接测试失败:{{message}}","testConnectionError":"测试连接时发生错误","modelTestFailed":"模型验证失败,请检查模型ID是否正确","modelTestFailedConfirm":"模型连接测试失败:{{message}}。是否仍要添加此模型?","tagVideo":"视频","tagMultimodal":"多模态","tagVision":"视觉","tagText":"文本","free":"免费","probeMultimodal":"测试多模态","probeImage":"图片","probeVideo":"视频","probeSupported":"支持: {{types}}","probeNotSupported":"该模型不支持多模态输入","probeFailed":"探测失败","tagNotProbed":"未检测","modalityVision":"图片","modalityAudio":"音频","modalityVideo":"视频","modalityFile":"文件","perMillionIn":"/1M 输入","perMillionOut":"/1M 输出"}'),_R={title:"文件",navigator:"文件导航器",source:"来源",workspace:"工作区",agentWorkspace:"Agent 工作区",profile:"档案",memory:"长期记忆",daily:"日记",digest:"知识库",memoryGraph:"记忆图谱",memoryGraphShort:"Graph",memoryGraphLoading:"正在加载记忆图谱…",memoryGraphLoadFailed:"记忆图谱加载失败。",memoryGraphCounts:"{{nodes}} 个节点 · {{edges}} 条链接",memoryGraphEmpty:"还没有已索引的记忆链接。",memoryGraphZoomOut:"缩小",memoryGraphZoomIn:"放大",memoryGraphFit:"适应画布",memoryGraphAutoRotate:"自动旋转",memoryGraphMotionReduced:"系统已启用减少动态效果",memoryGraphRendering:"正在构建 3D 场景…",memoryGraphRenderFailed:"3D 图谱渲染失败。",memoryGraphCanvasLabel:"交互式 3D 记忆图谱。可拖动旋转视角、滚动缩放,并选择节点查看详情。",memoryGraphCloseDetails:"关闭节点详情",memoryGraphRoot:"根节点",memoryGraphRootDirect:"直连文件",memoryGraphOtherFile:"其他文件",memoryGraphIndexed:"已索引文件",memoryGraphUnresolved:"未解析链接",memoryGraphDirection:"Wiki Link 方向",memoryGraphOpenFile:"打开 Markdown",memoryGraphOutbound:"出链 · {{count}}
168",memoryGraphInbound:"入链 · {{count}}",projectDirectory:"项目目录",workspaceDirectory:"配置目录",switchRoot:"切换目录",manageDirs:"管理目录…",primaryRoot:"主工作目录",rootMissing:"缺失",rootsPending:"另有 {{count}} 个目录将在发送第一条消息后可用",changeDirectoryTitle:"更换项目目录?",changeDirectoryWarning:"当前项目仍有未保存的编辑或待处理差异。更换目录将丢弃这些内容。",sourceEmpty:"此来源暂无可用文件。",loadMore:"继续加载 200 项",upload:"上传文件",conflictPolicy:"上传冲突策略",conflictRename:"保留两份",conflictRenameDescription:"自动为新文件添加序号,原文件保持不变。",conflictSkip:"保留原文件",conflictSkipDescription:"跳过同名的新文件,继续上传其他文件。",conflictOverwrite:"使用新文件",conflictOverwriteDescription:"用新文件替换已有的同名文件。",uploadConflictTitle:"发现同名文件",uploadConflictDescription:"以下文件已存在:{{files}}。请选择处理方式。",promptToggle:"切换 {{name}} 是否加入系统 Prompt",addSystemPrompt:"从工作区添加",addSystemPromptTitle:"添加 System Prompt 文件",addSystemPromptDescription:"选择一个工作区 Markdown 文件,将其加入 System Prompt。",searchSystemPromptFiles:"搜索工作区 Markdown 文件",noSystemPromptCandidates:"没有匹配的可选文件。",sourceControl:"源码管理",preview:"预览",htmlPreview:"HTML 预览",openHtmlInBrowser:"在浏览器中打开",edit:"编辑",selectFile:"选择文件以打开",closeTab:"关闭标签页",closeOtherTabs:"关闭其他标签页",closeAllTabs:"关闭全部标签页",openFiles:"已打开文件,{{count}} 个",openFilesLabel:"已打开文件",openFileCount:"已打开 {{count}} 个",searchOpenFiles:"搜索文件名或路径",noOpenFilesFound:"没有匹配的已打开文件",scrollTabsLeft:"向左滚动标签页",scrollTabsRight:"向右滚动标签页",agentChangedFile:"智能体修改了此文件",keep:"应用",keepAll:"全部应用",undo:"回退",undoAll:"全部回退",copySelectionToChat:"复制选区到聊天",copyFileToChat:"复制文件到聊天",previewSize:"预览 · {{size}} 字节",backToPreview:"返回预览",download:"下载",downloadFailed:"文件下载失败",resize:"调整文件抽屉宽度",loadFailed:"文件加载失败。请确认文件仍在当前智能体工作区的主工作目录中。",previewUnavailable:"暂不支持预览,仍可查看元数据并下载。",mentionInChat:"在聊天中引用",expandWorkspace:"展开工作区",openWorkspace:"打开工作区",closeWorkspace:"关闭工作区",artifactCreated:"已新增",artifactModified:"已修改",artifactsExpand:"展开其余 {{count}} 个文件",artifactsCollapse:"收起文件"},LR={agentTitle:"Agent 项目目录",agentDescription:"Agent 文件工作区默认使用此目录。",sessionTitle:"当前会话项目目录",pathPlaceholder:"输入绝对目录路径",recentProjects:"最近项目",browseDirectory:"浏览目录",noRecentProjects:"暂无最近项目",clearSelection:"清除所选项目",homeDirectory:"主工作目录",parentDirectory:"上一级目录",refreshDirectory:"刷新目录",restoreDefault:"恢复默认",createDirectory:"新建文件夹",directoryNamePlaceholder:"输入文件夹名称",createDirectoryFailed:"新建文件夹失败",useWorkspace:"使用配置目录",createSessionHint:"发送第一条消息后可设置会话专属目录。",sessionSource:"会话",agentSource:"Agent 默认",makePrimary:"设为主要",remove:"删除",add:"添加",boundDirs:"智能体工作区",primaryHint:"工具调用与命令默认在主工作目录中执行。",primaryTag:"主工作目录",unbound:"未绑定目录",unavailable:"不存在",alreadyBound:"已绑定",tooMany:"最多可绑定 {{max}} 个目录。",countTitle:"已绑定的目录数量"},ER=JSON.parse('{"title":"运行配置","projectDirectoryTitle":"默认项目目录","projectDirectoryDescription":"文件和命令默认使用的目录。","projectDirectoryDefault":"Agent 默认目录","changeProjectDirectory":"更换目录","projectDirectoryWorkspaceFallback":"当前使用智能体工作区","enhancedCodeCapability":"增强代码能力","enhancedCodeCapabilityTooltip":"增加代码工具,但不会改变项目目录。","enhancedCodeCapabilityDescription":"启用 AST、LSP、代码提示词、Git 上下文和源码管理。","description":"配置智能体运行参数","reactAgentTitle":"ReAct 智能体","llmRetryTitle":"LLM 自动重试","llmRetryEnabled":"启用自动重试","llmRetryEnabledTooltip":"对限流、超时、连接中断等瞬时 LLM API 错误自动重试。保存后对新的请求生效。","llmMaxRetries":"最大重试次数","llmMaxRetriesTooltip":"单次 LLM 请求在遇到可重试错误时,最多额外重试多少次。","llmMaxRetriesPlaceholder":"请输入最大重试次数","llmMaxRetriesRequired":"最大重试次数为必填项","llmMaxRetriesMin":"最大重试次数必须大于等于 1","llmBackoffBase":"退避基础延迟(秒)","llmBackoffBaseTooltip":"第一次重试前的基础等待时间,后续会按指数退避增长。","llmBackoffBasePlaceholder":"请输入基础延迟","llmBackoffBaseRequired":"退避基础延迟为必填项","llmBackoffBaseMin":"退避基础延迟必须大于等于 0.1 秒","llmBackoffCap":"退避最大延迟(秒)","llmBackoffCapTooltip":"指数退避的最大等待上限,避免重试间隔无限增大。","llmBackoffCapPlaceholder":"请输入最大延迟","llmBackoffCapRequired":"退避最大延迟为必填项","llmBackoffCapMin":"退避最大延迟必须大于等于 0.5 秒","llmBackoffCapGteBase":"退避最大延迟必须大于等于基础延迟","llmRateLimiterTitle":"LLM 并发限流","llmMaxConcurrent":"最大并发请求数","llmMaxConcurrentTooltip":"允许同时发出的 LLM 请求上限,所有 Agent 共享。ä»
168…首次初始化时生效,修改后需重启服务。","llmMaxConcurrentPlaceholder":"请输入最大并发数","llmMaxConcurrentRequired":"最大并发请求数为必填项","llmMaxConcurrentRange":"最大并发请求数必须大于等于 1","llmMaxQpm":"每分钟最大请求数(QPM)","llmMaxQpmTooltip":"60 秒滑动窗口内允许的最大请求数。超出上限的请求在发送前会等待,从源头预防 429 限流。0 表示不限制。","llmMaxQpmPlaceholder":"请输入每分钟最大请求数(0 = 不限制)","llmMaxQpmRequired":"每分钟最大请求数为必填项","llmMaxQpmRange":"每分钟最大请求数必须大于等于 0","llmRateLimitPause":"限流暂停时长(秒)","llmRateLimitPauseTooltip":"收到 429 限流响应时全局暂停的默认时长(秒)。若 API 返回 Retry-After 头,则以其为准。","llmRateLimitPausePlaceholder":"请输入暂停时长","llmRateLimitPauseRequired":"限流暂停时长为必填项","llmRateLimitPauseMin":"限流暂停时长必须大于等于 1 秒","llmRateLimitJitter":"抖动范围(秒)","llmRateLimitJitterTooltip":"在暂停时长基础上叠加的随机抖动范围(秒),使并发等待者错开唤醒时间,避免新的请求突刺。","llmRateLimitJitterPlaceholder":"请输入抖动范围","llmRateLimitJitterRequired":"抖动范围为必填项","llmRateLimitJitterMin":"抖动范围必须大于等于 0 秒","llmAcquireTimeout":"槽位获取超时(秒)","llmAcquireTimeoutTooltip":"等待获取限流槽位的最长时间(秒),超时后将抛出错误而非无限等待。","llmAcquireTimeoutPlaceholder":"请输入超时时间","llmAcquireTimeoutRequired":"槽位获取超时为必填项","llmAcquireTimeoutMin":"槽位获取超时必须大于等于 10 秒","llmAcquireTimeoutGtPauseJitter":"槽位获取超时必须大于限流暂停时长与抖动范围之和","contextManagementTitle":"上下文管理","memoryManagerBackend":"长期记忆管理后端","memoryManagerBackendTooltip":"记忆管理器的后端类型,可选 remelight(本地文件)、adbpg(云端数据库)、PowerContext(远程记忆服务)或 none(关闭记忆)","memoryManagerBackendRestartWarning":"切换长期记忆管理后端不支持热更新,保存后需要重启 QwenPaw 才能生效","maxIters":"最大迭代次数","maxItersTooltip":"ReAct 智能体的最大推理-行动迭代次数","maxItersPlaceholder":"请输入最大迭代次数","maxItersRequired":"最大迭代次数为必填项","maxItersMin":"最大迭代次数必须大于等于 1","agentLoopTitle":"智能体 Loop 设置","loopMode":{"builtIn":"内置","builtInNote":"流程已锁定 · 参数可编辑","templateSectionTitle":"Loop 模板","templateSectionDescription":"选择内置模板,或添加自己的模板。","defaultTab":"默认","goalTab":"目标","missionTab":"任务","defaultDescription":"未启用显式模式时使用的标准受控 ReAct Loop。","goalDescription":"面向具体、可验证目标的有界持续 Loop。","missionDescription":"面向长时、多步骤任务的持续执行流程。","gatePipeline":"Gate 流程","repetitionTitle":"重复行为保护","repetitionDescription":"检测重复工具调用并进行干预。","iterationTitle":"迭代次数限制","iterationDescription":"限制 ReAct 的最大迭代次数。","retryTitle":"定性完成度检查","retryDescription":"仅在 Agent 给出不包含工具调用的文本答复时触发。","goalTurnTitle":"目标轮次限制","goalTurnDescription":"限制单个活动目标内的执行轮次。","maxGoalTurns":"最大目标轮次","goalBudgetTitle":"目标 Token 预算","goalBudgetDescription":"完整目标达到预算时停止。","maxGoalTokens":"最大目标 Token 数","goalCompletionTitle":"目标完成检查","goalCompletionDescription":"停止前读取明确的目标状态。","goalCompletionReadOnly":"完成状态由内置目标状态协议控制。","missionProgressTitle":"任务进度检查","missionProgressDescription":"持续执行,直到任务故事全部通过或达到上限。","missionProgressReadOnly":"完成状态由内置 Mission Story 状态控制。","missionIterationTitle":"任务轮次限制","missionIterationDescription":"设置新 Mission 默认允许的最大执行轮次。","workerAttemptsTitle":"Worker 尝试次数","workerAttemptsDescription":"限制 Story 验证未通过后 Worker 的重试次数。","missionVerificationTitle":"任务验证策略","missionVerificationDescription":"设置默认验证指导和测试命令。","defaultMaxMissionIterations":"默认最大执行轮次","defaultMaxMissionIterationsTooltip":"当 /mission 未指定 --max-iterations 时使用。","maxRetriesPerStory":"每个 Story 最大重试次数","maxRetriesPerStoryTooltip":"Verifier 返回失败或部分完成后,Worker 可重试的次数。","defaultVerificationInstructions":"验证指导(可选)","defaultVerificationInstructionsHelp":"应用于每个 Mission Verifier 的自然语言验证要求。","defaultVerificationInstructionsPlaceholder":"例如:检查 Windows 路径兼容性,并检查实际渲染界面。","defaultVerifyCommand":"默认测试命令(可选)","defaultVerifyCommandHelp":"Verifier 会通过正常工具和权限尝试执行;/mission --verify 可临时覆盖。","defaultVerifyCommandPlaceholder":"例如:pytest -q","enableRepetitionProtection":"启用重复行为保护","removeRule":"删除规则","custom"
168:"自定义","customDescription":"使用 QwenPaw 内置 Gate 构建并保存执行流程。","duplicate":"复制","delete":"删除","displayName":"显示名称","duplicateModeName":"已存在同名的 Loop 模式。","slashCommand":"斜杠命令","description":"描述","availableToAgent":"允许当前智能体使用","runsTopToBottom":"按从上到下的顺序执行","addGate":"添加 Gate","emptyPipeline":"至少添加一个 Gate 后,此模式即可使用。","iterationGateTitle":"迭代次数限制","iterationGateDescription":"达到固定 Loop 迭代次数后停止。","doomGateTitle":"重复行为保护","doomGateDescription":"检测重复工具调用并调整策略。","tokenGateTitle":"Token 预算","tokenGateDescription":"限制提示和生成内容的 Token 用量。","timeoutGateTitle":"Loop 时间限制","timeoutGateDescription":"达到时间上限后在下一个 Loop 边界停止,不会中断正在执行的内容。","toolBudgetGateTitle":"工具调用预算","toolBudgetGateDescription":"限制全部调用及指定工具的调用次数。","retryGateTitle":"提前停止重试","retryGateDescription":"结束前提示智能体再次验证。","rubricGateTitle":"完成度量表","rubricGateDescription":"评估明确的完成标准,并在需要时修订。","qualitativeRubricTitle":"定性完成度检查","qualitativeRubricDescription":"仅在 Agent 给出不包含工具调用的文本答复时,按自然语言标准检查完成度。","qualitativeRubric":"自然语言完成标准","qualitativeRubricHelp":"仅在不包含工具调用的文本答复时触发;仍有工作时要求 Agent 继续。","completionRubricTitle":"完成信号检查","completionRubricDescription":"仅在 Agent 给出不包含工具调用的文本答复时检查完成信号。","completionRubricHelp":"在不包含工具调用的文本答复后触发。完成时 Agent 输出完成信号;未完成时继续工作,直到达到最多判断轮数。","completionPrompt":"完成判断 Prompt","completionPromptHelp":"描述结果何时算完成,QwenPaw 会自动注入完成信号的输出要求。","completionSignal":"完成信号","completionSignalHelp":"QwenPaw 会将此信号及“只能输出该信号”的要求自动注入完成判断 Prompt。清理首尾空白并忽略大小写后,只有完整匹配才会结束 Loop。","removeCriterion":"删除标准 {{number}}","totalTokensHelp":"本轮输入和输出 Token 的合计上限。","promptTokensHelp":"包含系统指令、对话上下文、工具定义和工具结果。","completionTokensHelp":"本轮模型生成内容的 Token 上限。","maxIterations":"最大迭代次数","historyWindow":"历史窗口","similarityThreshold":"相似度阈值","totalTokens":"最大总 Token","promptTokens":"最大输入 Token","completionTokens":"最大输出 Token","maxSeconds":"最长秒数","maxSecondsHelp":"当前模型响应或工具调用完成后才检查耗时,不会强行中断正在执行的内容。","allToolCalls":"全部工具调用","perToolLimits":"单个工具限制","toolName":"工具名称","callLimitAria":"{{name}} 调用上限","removeToolLimitAria":"删除 {{name}} 的限制","addToolLimit":"添加单个工具限制","maxRetries":"最大重试次数","retryInstruction":"重试指令","passThreshold":"通过阈值","maxEvaluations":"最多判断轮数","graderError":"评分器错误","stopSafely":"安全停止","verifyOnceMore":"再验证一次","completionCriteria":"完成标准","criterionPlaceholder":"描述可观察的完成结果","required":"必需","weight":"权重","addCriterion":"添加标准","moveGateAria":"移动 {{title}}","removeGate":"删除 Gate","newModeName":"新 Loop 模式","defaultCustomDescription":"自定义 Gate 流程。","copyName":"{{name}} 副本","createModeAria":"创建自定义 Loop 模式","createModeTitle":"创建自定义 Loop 模式","startingTemplate":"初始模板","startingPipeline":"初始 Gate 流程","blankPipelineHint":"从空流程开始,稍后添加 Gate","safeTemplate":"安全运行","researchTemplate":"预算研究","qualityTemplate":"质量优先","blankTemplate":"空白流程"},"doomLoopEnabled":"重复行为保护","doomLoopEnabledTooltip":"当 Agent 陷入重复相同操作时自动介入","doomLoopAfter":"连续重复","doomLoopRepetitions":"次相同操作后","doomLoopStopAction":"暂停并等待确认","doomLoopWarnAction":"发送提醒","doomLoopSimpleMode":"简单","doomLoopAdvancedMode":"高级","doomLoopWindowSize":"检测范围","doomLoopWindowSizeTooltip":"检查最近多少次操作是否重复","doomLoopSimilarity":"匹配灵敏度","doomLoopSimilarityTooltip":"操作相似度超过此值视为重复(越低越严格)","doomLoopStages":"干预规则","doomLoopAction":"动作","doomLoopPrompt":"提示语","doomLoopPromptPlaceholder":"提醒内容或暂停原因...","doomLoopAddStage":"添加规则","iterationTitle":"迭代限制","iterationEnabled":"启用迭代限制","iterationEnabledTooltip":"在固定轮次后停止 Agent 循环","iterationMaxIterations":"最大迭代次数","iterationMaxIterationsTooltip":"循环执行的最大轮次","rubricTitle":"定性完成度检查","rubricEnabled":"启用定性完成度检查","rubricEnabledTooltip":"仅在 Agent 给出不包含工具调用的文本答复时触发。","rubricPrompt":"自然语言完成标准","rubricPromptTooltip":"注入的提示语,要求 Agent 评估任务完成情况","rubricDesc":"当 Agent 给出不包含工具调用的文本答复时,按自然语言完成标准检查,并在仍有工作时要求 Agent 继续。","rubricPromptPlaceholder":"你上一轮没有调用任何工具。如果任务已完成请确认,否则请继续使用工具完成。","rubricMaxInterventions":"最多判断轮数","rubricMaxInterventionsTooltip":"单个 Turn 内,对不包含工具调用的文本答复最多进行多少轮完成度检查。","inLoopModes":"在 /goal、/mission 模式中启用","inLoopModesTooltip":"当 /goal 或 /mission 循环模式激活时也启用此功能","comingSoonEditable":"自定义配置将在未来版本中开放。","simpleMode":"简单","advancedMode":"高级","comingSoon":"即将推出","reactModeTab":"Loop模板 - 默认","goalModeTab":"Loop模板 - Goal模式","missionModeTab":"Loop模板 - Mission模式","goalModeInfoTitle":"Goal模式 vs 默认模式","goalModeInfo":"默认模式在产生回复后即停止。Goal模式让 Agent 围绕目标持续循环执行,通过 Rubric 评估自动判断是否完成,未完成则继续推进。所有操作在当前 Agent 上下文中进行。","missionModeInfoTitle":"Mission模式 vs Goal模式","missionModeInfo":"Mission模式将复杂任务自动分解为
168子任务,由 Worker 子Agent独立执行,Verifier 子Agent验证结果。每个子任务有独立上下文,不会污染主会话历史。适合需要长时间、多步骤协作的复杂工程任务。","goalIterationGate":"目标迭代 Gate","goalIterationGateDesc":"限制目标会话中的 Agent 执行轮次,跟踪迭代次数和 Token 使用量。","goalBudgetGate":"Token 预算 Gate","goalBudgetGateDesc":"为目标会话设置 Token 消耗上限,超出预算时停止 Agent。","goalRubricGate":"目标完成度评估","goalRubricGateDesc":"通过检查会话状态评估目标是否已完成。","goalDoomGate":"重复行为保护","goalDoomGateDesc":"在目标执行过程中检测重复模式并触发干预。","missionProgressGate":"任务进度 Gate","missionProgressGateDesc":"跟踪 PRD 用户故事的完成情况,直到所有故事通过或达到最大迭代次数。","missionIterBypass":"迭代绕行","missionIterBypassDesc":"在任务执行期间临时取消 ReAct 迭代限制,允许长时间运行的阶段。","customLoopTitle":"自定义循环模式","customLoopDesc":"使用自定义 Gate 组合创建您自己的循环模式,
168即将推出。","autoGenerateSessionTitle":"自动生成会话标题","autoGenerateSessionTitleTooltip":"新会话首条用户消息发送后,后台触发一次轻量 LLM 调用,把截断的占位标题替换为更贴切的短标题。每个新会话会多一次 LLM 调用;关闭后保留占位标题、不产生该开销。","shellCommandTimeout":"Shell 命令超时(秒)","shellCommandTimeoutTooltip":"execute_shell_command 工具的默认超时时间(秒)。LLM 在单次调用时仍可通过 timeout 参数覆盖此值。适用于编译、数据处理等耗时任务。","shellCommandTimeoutPlaceholder":"请输入超时时间","shellCommandTimeoutRequired":"Shell 命令超时为必填项","shellCommandTimeoutMin":"Shell 命令超时至少为 1 秒","shellCommandExecutable":"Shell 可执行程序","shellCommandExecutableTooltip":"execute_shell_command 使用的 shell 路径。Linux/macOS:如 /bin/bash、/bin/zsh。Windows:支持 powershell.exe、pwsh.exe 或类 POSIX shell(如 Git Bash)。留空时依次回退到 $SHELL 环境变量,再回退到平台默认值(Unix 为 /bin/sh,Windows 为 cmd.exe)。","shellCommandExecutablePlaceholder":"例如 /bin/bash 或 powershell.exe(留空 = 自动检测)","maxInputLength":"最大输入长度","maxInputLengthTooltip":"模型上下文窗口的最大输入长度(token 数)","maxInputLengthPlaceholder":"请输入最大输入长度","maxInputLengthRequired":"最大输入长度为必填项","maxInputLengthMin":"最大输入长度必须大于等于 1000","contextCompactRatio":"上下文压缩阈值比例","contextCompactRatioTooltip":"当上下文长度达到最大上下文长度的该比例时,触发自动压缩","contextCompactRatioRequired":"上下文压缩比例为必填项","contextCompactThreshold":"压缩触发阈值(tokens)","contextCompactThresholdTooltip":"根据最大上下文长度与压缩阈值比例自动计算,上下文超过此 token 数时触发压缩","contextCompactThresholdPlaceholder":"自动计算","contextCompactReserveRatio":"上下文保留阈值比例","contextCompactReserveRatioTooltip":"用于计算 recent tail 的目标预算;Scroll 模式会再应用最小 recent 预算和 40K 上限,并始终完整保留 active turn","contextCompactReserveRatioRequired":"上下文保留比例为必填项","contextCompactReserveThreshold":"保留阈值(tokens)","contextCompactReserveThresholdTooltip":"实际用于切分 recent tail 的目标 token 数;这是软目标,边界消息和完整 active turn 可能使实际保留量更大","contextCompactReserveThresholdPlaceholder":"自动计算","toolResultCompactRecentN":"最新工具结果范围","toolResultCompactRecentNTooltip":"Native 上下文模式下,最近 N 条包含工具结果的消息使用较大的最近预览字节上限","toolResultCompactRecentNRequired":"最新工具结果范围为必填项","toolResultCompactOldThreshold":"旧工具结果预览字节数","toolResultCompactOldThresholdTooltip":"Native 上下文模式下,旧工具结果使用的最大预览字节数","toolResultCompactOldThresholdPlaceholder":"请输入预览字节上限","toolResultCompactOldThresholdRequired":"旧工具结果预览字节数为必填项","toolResultCompactRecentThreshold":"最近工具结果预览字节数","toolResultCompactRecentThresholdTooltip":"工具结果进入 agent context 前使用的最大预览字节数;Scroll 模式下也作为 recall_history 单页和 read_file 单次读取的字节上限","toolResultCompactRecentThresholdPlaceholder":"请输入预览字节上限","toolResultCompactRecentThresholdRequired":"最近工具结果预览字节数为必填项","toolResultCompactRetentionDays":"完整工具结果文件保留天数","toolResultCompactRetentionDaysTooltip":"完整工具结果 artifact 的独立保留天数;到期后自动清理,history.db 中仍可能保留有限预览","toolResultCompactRetentionDaysRequired":"完整工具结果文件保留天数为必填项","historyRetentionDays":"历史记录保留天数","historyRetentionDaysTooltip":"持久化聊天历史的保留天数。超期记录会在启动和 Agent 关闭时自动清理。","historyRetentionDaysRequired":"历史记录保留天数为必填项","historyRetentionDaysForeverWarning":"设为 0 将永久保留历史,存储会无限增长。","historyRetentionDaysLargeWarning":"保留天数过大可能占用较多存储空间。","exemptFileExtensions":"豁免文件后缀","exemptFileExtensionsTooltip":"Native 上下文模式下,这些文件后缀的 read_file 结果始终使用较大的最近预览字节上限","exemptFileExtensionsPlaceholder":".md, .txt, .json","exemptToolNames":"豁免工具名称","exemptToolNamesTooltip":"Native 上下文模式下,这些工具的调用结果始终使用较大的最近预览字节上限","exemptToolNamesPlaceholder":"chat_with_agent, list_agents","language":"智能体语言","languageTooltip":"智能体人设文件(SOUL.md、AGENTS.md 等)使用的语言。切换语言后将自动重新复制对应语言的 MD 文件。","languageConfirmTitle":"切换智能体语言","languageConfirmContent":"切换语言将会覆盖以下文件为新语言的默认版本:\\n\\n  SOUL.md、AGENTS.md、PROFILE.md、MEMORY.md、BOOTSTRAP.md、HEARTBEAT.md\\n\\n如果您已对这些文件进行过自定义修改,请提前备份。您自行添加的其他文件不受影响。","languageConfirmOk":"切换语言","languageSaveSuccess":"语言更新成功","languageSaveSuccessWithFiles":"语言已更新,已复制 {{count}} 个 MD 文件","languageSaveFailed":"语言更新失败","timezone":"用户时区","timezoneTooltip":"用于定时任务、时间显示和 Agent 上下文,默认使用系统时区。","timezoneRequired":"请选择时区","selectTimezone":"选择时区","timezoneSaveSuccess":"时区更新成功","timezoneSaveFailed":"时区更新失败","saveSuccess":"配置保存成功","saveFailed":"配置保存失败","loadFailed":"配置加载失败","historyMaxLength":"历史记录最大长度","historyMaxLengthTooltip":"/history 命令输出的最大长度(字符数)","historyMaxLengthRequired":"历史记录最大长度为必填项","historyMaxLengthMin":"历史记录最大长度必须大于等于 1000","historyMaxLengthPlaceholder":"请输入最大长度","contextCompactTitle":"上下文压缩配置","contextCompactEnabled":"启用上下文压缩","contextCompactEnabledTooltip":"自动压缩上下文,防止上下文窗口溢出","tokenCountModel":"Token 计数模型","tokenCountModelTooltip":"用于精确计算 token 数量的模型名称,填 default 使用内置估算","tokenCountModelPlaceholder":"填写模型名称或 default","tokenCountUseMirror":"使用 HuggingFace 镜像","tokenCountUseMirrorTooltip":"下载 tokenizer 时是å
168¦ä½¿ç”¨ HuggingFace 国内镜像","tokenCountEstimateDivisor":"byte/Token 估算除数","tokenCountEstimateDivisorTooltip":"基于字节数估算 token 数的除数(token 数 ≈ 字节数 / 除数)。推荐值:3.75 ~ 4。","tokenCountEstimateDivisorRequired":"估算除数为必填项","tokenCountEstimateDivisorMin":"估算除数范围为 2 ~ 5","toolResultCompactTitle":"工具结果压缩配置","toolResultCompactEnabled":"启用工具结果压缩","toolResultCompactEnabledTooltip":"对过长的工具调用结果进行压缩,节省上下文空间","memorySummaryTitle":"长期记忆配置","memorySummaryEnabled":"启动记忆总结","memorySummaryEnabledTooltip":"在上下文压缩时自动生成并保存记忆总结","dreamCronEnabled":"启用梦境任务","dreamCronEnabledTooltip":"启用按 Cron 定时执行的梦境记忆优化任务","dreamCron":"梦境定时","dreamCronTooltip":"设置梦境任务自动整理和优化长期记忆。定时触发后会随机延迟 0–60 秒再启动,以避免集中调用;是否执行由上方开关控制","dreamCronPlaceholder":"0 23 * * *","dreamCronRequired":"启用梦境任务时请输入 Cron 表达式","dreamCronInvalid":"请输入有效的 5 段 Cron 表达式","memoryDailyPaperTitle":"每日论文","memoryDailyPaperDescription":"按计划生成论文精读和简明的每日论文简报,论文信息来自 Hugging Face。","dailyPaperCron":"每日论文定时","dailyPaperCronTooltip":"设置每日论文生成任务的 Cron 表达式;默认关闭,启用上方开关后才会执行。","dailyPaperTopics":"关注主题","dailyPaperTopicsTooltip":"填写希望每日论文优先关注的主题,可留空。","dailyPaperTopicsPlaceholder":"例如:智能体记忆、强化学习","dailyPaperUseHfMirror":"使用 Hugging Face 镜像站","dailyPaperUseHfMirrorDescription":"从 Hugging Face 镜像站获取论文信息","dailyPaperCronPlaceholder":"0 9 * * *","dailyPaperCronRequired":"启用每日论文时请输入 Cron 表达式","dailyPaperCronInvalid":"请输入有效的 5 段 Cron 表达式","memoryAutoFinTitle":"财经研究","memoryAutoFinDescription":"研究近期与关注主题相关的财联社电报,并结合历史记忆形成报告。","autoFinDocumentation":"查看使用指南","autoFinCron":"定时","autoFinCronTooltip":"设置 Auto Fin 财经研究任务的 Cron 表达式;启用上方开关后才会执行。","autoFinCronPlaceholder":"0 18 * * *","autoFinCronRequired":"启用 Auto Fin 时请输入 Cron 表达式","autoFinCronInvalid":"请输入有效的 5 段 Cron 表达式","autoFinTopics":"关注主题","autoFinTopicsTooltip":"用于筛选近期财联社新闻的主题,多个主题请用逗号分隔。","autoFinTopicsPlaceholder":"例如:黄金、AI、存储芯片","autoFinWindowHours":"新闻时间窗口(小时)","autoFinWindowHoursTooltip":"每次运行时向前分析多少小时内的财联社电报。","autoFinWindowHoursPlaceholder":"24","autoFinWindowHoursRequired":"请输入新闻时间窗口","autoFinWindowHoursMin":"新闻时间窗口不能少于 1 小时","autoFinWindowHoursMax":"新闻时间窗口不能超过 {{max}} 小时","autoFinNotifyDescription":"Auto Fin 完成后发送结果到收件箱","autoFinDisclaimer":"Auto Fin 不提供行情、收益、目标价、买卖点或投资建议。","autoMemorySearch":"自动记忆搜索(Beta)","autoMemorySearchTooltip":"每轮对话都自动触发记忆搜索。每次 query 进来都会自动调用记忆搜索能力,让 QwenPaw 更懂你,但会增加 token 消耗。","autoMaxResults":"自动记忆搜索最大结果数","autoMaxResultsTooltip":"自动记忆搜索时返回的最大结果数","autoMaxResultsRequired":"最大结果数为必填项","autoMaxResultsMin":"最大结果数必须大于等于 1","embeddingConfigTitle":"向量模型配置","embeddingModelTitle":"Embedding 模型","embeddingBackend":"向量模型 SDK 类型","embeddingBackendTooltip":"选择用于调用向量模型的 SDK 类型","embeddingBackendPlaceholder":"请选择 SDK 类型","embeddingApiKey":"API Key","embeddingApiKeyTooltip":"向量模型提供方的 API Key,无需认证时留空","embeddingApiKeyPlaceholder":"无需认证时留空","embeddingBaseUrl":"Base URL","embeddingBaseUrlTooltip":"向量模型 API 的 Base URL。OpenAI 兼容后端中该自定义地址为可选项,API Key 和模型名称为必填项","embeddingBaseUrlPlaceholder":"https://dashscope.aliyuncs.com/compatible-mode/v1","embeddingHost":"Host","embeddingHostTooltip":"Ollama 服务地址。留空时使用 Ollama 默认地址","embeddingHostPlaceholder":"http://localhost:11434","embeddingModelName":"模型名称","embeddingModelNameTooltip":"向量模型名称,所有向量后端都需
168要填写","embeddingModelNamePlaceholder":"text-embedding-v4","embeddingEnableCache":"启用 Embedding 缓存","embeddingEnableCacheTooltip":"缓存向量结果,减少重复计算","embeddingMaxCacheSize":"最大缓存条目数","embeddingMaxCacheSizeTooltip":"向量缓存的最大条目数","embeddingMaxCacheSizeRequired":"最大缓存条目数为必填项","embeddingUseDimensions":"请求时传递维度","embeddingUseDimensionsTooltip":"开启后,在 OpenAI 兼容的 Embedding API 请求中传递 dimensions 参数;部分服务不支持该参数","embeddingDimensions":"向量维度","embeddingDimensionsTooltip":"预期的向量维度,用于返回值校验、索引和缓存;关闭“请求时传递维度”时,仍需填写模型实际输出的维度","embeddingDimensionsRequired":"向量维度为必填项","embeddingDimensionsMin":"向量维度必须大于等于 1","embeddingMaxInputLength":"单条输入字符预算","embeddingMaxInputLengthTooltip":"单条 Embedding 输入的近似字符预算。请求前会据此截断文本,并对中文等全角字符采用更保守的估算;该值不是精确的 Token 上限","embeddingMaxInputLengthRequired":"单条输入字符预算为必填项","embeddingMaxBatchSize":"最大批处理大小","embeddingMaxBatchSizeTooltip":"单次批量向量化请求的最大条目数","embeddingMaxBatchSizeRequired":"最大批处理大小为必填项","embeddingHealthCheckTimeout":"初始化超时时间","embeddingHealthCheckTimeoutTooltip":"真实连接测试和 ReMe 启动时 Embedding 健康检查的单次超时时间","embeddingHealthCheckTimeoutRequired":"初始化超时时间为必填项","embeddingTestConnection":"测试 Embedding 服务","embeddingTestSuccess":"Embedding 服务测试成功","embeddingTestSuccessDetail":"实际维度:{{dimensions}},请求耗时:{{latency}} ms。保存后将应用该模型。","embeddingTestFailed":"Embedding 服务测试失败","embeddingTestIncomplete":"请先填写完整的模型名称、凭证和有效的向量维度","embeddingStatusDescription":"查看当前模型配置,并验证服务连接与向量输出","embeddingOverviewTitle":"Embedding 模型中心","embeddingConfigStatus":"配置状态","embeddingCurrentModel":"当前模型","embeddingConfiguredDimensions":"设置维度","embeddingDimensionsUnit":"维向量","embeddingVerificationStatus":"服务验证","embeddingVerified":"验证通过","embeddingNotVerified":"尚未验证","embeddingVerificationHint":"点击验证服务,查看返回维度与耗时","embeddingVerificationMetrics":"返回 {{dimensions}} 维 · {{latency}} ms","embeddingServiceTitle":"Embedding 服务","embeddingServiceDescription":"连接模型服务并定义向量输出","embeddingCapabilityEnabled":"已开启","embeddingCapabilityDisabled":"未开启","embeddingIndexTitle":"索引与缓存","embeddingIndexDescription":"控制 ReMe 的向量存储和批处理行为","memoryPageDescription":"让智能体从历史对话中提取、整理并召回有用信息。日常设置会立即生效,语义搜索配置为可选项。","memoryPoweredBy":"Powered by","memoryDocumentation":"使用文档","memoryOverviewTitle":"长期记忆中心","memoryRuntimeStatus":"服务状态","memoryStatusUnknown":"未检查","memoryStatusChecking":"正在检查","memoryStatusRunning":"运行正常","memoryStatusCheckFailed":"状态检查失败","remeStatusLoading":"正在读取 ReMe 运行状态…","remeStatusFailed":"无法读取 ReMe 运行状态","remeStatusComponentsTotal":"ReMe 组件估算占用","remeStatusEstimated":"各状态组件的对象大小合计","remeStatusProcessRss":"进程内存 RSS","remeStatusProcessRssHint":"QwenPaw 当前进程的物理内存占用","remeStatusComponents":"组件明细","remeStatusEstimateNote":"组件占用为独立估算,共享对象可能被重复计算,因此组件合计不等同于进程 RSS。","memoryStatusNeedsAttention":"需要关注","memoryStatusBusy":"后台处理中","memoryStatusStopping":"正在停止","memoryBackgroundTasks":"后台任务","memoryWorker":"记忆工作器","memoryWorkerStatus":{"idle":"空闲","busy":"处理中","stopping":"正在停止","error":"异常停止"},"memoryQueueSummary":"{{running}} 项处理中 · {{pending}} 项等待","memoryQueueIdleSummary":"空闲 · 无等待任务","memoryAutoRecordDisabledHint":"自动对话记忆已关闭","memoryAutoMemoryEnabledSummary":"自动记忆已开启 · 每 {{interval}} 轮对话触发","memoryRuntimeActivityDescription":"自动和手动触发的自动记忆任务会在后台依次处理,不会阻塞当前对话","memoryLastError":"最近一次错误","memoryNeverRun":"暂无记录","autoMemoryRecentTasks":"最近的自动记忆任务","autoMemoryRecentTasksEmpty":"最近还没有自动记忆任务","autoMemoryTrigger":{"periodic":"周期触发","manual":"手动触发","compact":"上下文压缩","new":"新会话"},"memoryTaskMessages":"处理 {{count}} 条消息","memoryTaskNoResult":"任务尚未返回内容","memoryTaskStatus":{"pen
168ding":"等待中","running":"处理中","completed":"已完成","failed":"失败","cancelled":"已取消"},"memoryResourceUsageDescription":"当前 ReMe 组件估算与 QwenPaw 进程内存","memoryDiagnostics":"资源与诊断","memoryComponentsMetric":"组件","memoryProcessMetric":"进程","memoryDiagnosticsHint":"查看组件占用与运行明细","remeStatusComponent":{"embedding_store":"向量存储","file_graph":"文件关系图","file_store":"文件存储","keyword_index":"关键词索引"},"memoryStatusDisabled":"已关闭","memoryJournalTitle":"自动记忆","memoryJournalDescription":"从对话和外部知识源中持续提取并沉淀可检索的记忆","memoryConversationJournalTitle":"对话记忆","memoryExternalSourcesDevelopingLabel":"持续开发中","memoryExternalSourcesTitle":"外部知识日记","dailyPaperDocumentation":"查看使用指南","memoryAutoRecordTitle":"启用对话记忆","memoryAutoRecordDescription":"按设定轮次持续提取新的长期记忆","memoryAutoRecordFrequency":"记录频率(对话轮数)","memoryNotifyTitle":"收件箱通知","memoryNotifyDescription":"仅在对话日记有变化或任务失败时发送到收件箱","dailyPaperNotifyDescription":"每日论文生成后发送到收件箱","autoDreamNotifyDescription":"仅在记忆整理有变化或任务失败时发送到收件箱","memoryOrganizeSectionTitle":"记忆整理","memoryOrganizeSectionDescription":"定期归纳、合并并优化已有长期记忆","memoryOrganizeTitle":"梦境整理","memoryScheduledOrganizeTitle":"启用梦境整理","memoryScheduledOrganizeDescription":"通过梦境任务在后台维护记忆质量","memoryRecallTitle":"记忆搜索工具","memorySearchSectionTitle":"记忆搜索","memorySearchSectionDescription":"控制智能体主动搜索和回复前自动召回记忆的方式","memorySearchToolTitle":"向智能体提供记忆搜索工具","memorySearchToolDescription":"允许智能体按需主动调用 memory_search","memoryAutoRecallTitle":"启用自动记忆搜索(Beta)","memoryAutoRecallDescription":"每轮对话自动搜索,无需智能体主动调用工具","memoryMaintenanceEyebrow":"维护与修复","memoryMaintenanceTitle":"重建记忆索引","memoryMaintenanceDescription":"清除并重新生成搜索索引。仅建议在索引损坏或搜索结果异常时使用。","toolExecutionLevelTitle":"工具审批模式","toolExecutionLevelTooltip":"审批模式","toolExecutionLevel":{"title":"工具审批模式","alertMessage":"配置工具调用前的审批策略;文件防护规则独立生效","strict":"严格模式","strictDesc":"每次工具调用和外部文件访问前均需审批","smart":"智能模式","smartDesc":"低风险工具调用和外部文件访问操作自动执行,中高风险需审批","auto":"自动模式","autoDesc":"仅命中工具和文件审批规则的操作需审批(默认)","off":"关闭模式","offDesc":"关闭工具和文件审批"},"saveLevelSuccess":"工具审批模式已保存","saveLevelFailed":"保存工具审批模式失败","offloadPolicy":{"title":"工具后台执行策略","alertMessage":"这是全局设置(sett
168ings.json),不是按 Agent 独立配置。用于控制工具到达转入后台时限后的默认行为;用户仍可在工具运行时通过控制面板临时覆盖。","keepForeground":"保持前台执行","keepForegroundDesc":"倒计时结束后工具继续在前台运行,不自动转入后台。适合需要实时查看输出的场景。","offload":"自动转入后台","offloadDesc":"倒计时结束后工具自动转入后台执行,Agent 可继续处理其他任务。适合长时间运行的工具。","saveFailed":"保存策略失败"},"maxContextLength":"最大上下文长度","maxContextLengthTooltip":"模型上下文窗口的最大 token 数,决定每次请求能携带的最大历史长度","maxContextLengthRequired":"最大上下文长度为必填项","maxContextLengthMin":"最大上下文长度必须大于等于 1000","maxContextLengthPlaceholder":"请输入最大上下文长度","embeddingActivationNote":"所选后端的必要字段填写完整后才会开启向量模型功能","embeddingEnableHint":"所选后端的必要字段填写完整后启用向量模型功能:OpenAI 兼容或 Gemini 后端需要模型名称和 API Key;Ollama 需要模型名称。","rebuildMemoryIndex":"重建记忆索引","rebuildMemoryIndexWarning":"此操作会清空并重建记忆搜索索引,期间会消耗较多 CPU 和内存。仅建议在索引损坏或搜索结果异常时用于修复。","rebuildMemoryIndexConfirmTitle":"确认重建记忆索引?","rebuildMemoryIndexConfirm":"重建期间 CPU 和内存占用可能明显升高。除非索引损坏或需要修复,否则不建议执行。","rebuildMemoryIndexSuccess":"记忆索引重建完成","rebuildMemoryIndexFailed":"记忆索引重建失败:{{error}}","rebuildMemoryIndexRequired":"Embedding 配置已变化,向量搜索当前不可用;重建 Embedding 索引成功前,记忆搜索将自动降级为 BM25。","embeddingIndexReady":"Embedding 索引与当前配置一致。","embeddingIndexStatus":"Embedding 索引","embeddingIndexAvailable":"无需重建","embeddingIndexDisabled":"未开启","embeddingIndexEnableFirst":"请先开启 Embedding,再重建索引","embeddingSearchModeHybrid":"当前搜索:向量 + BM25","embeddingSearchModeBm25":"当前搜索:仅 BM25","embeddingSearchModeBm25Pending":"当前搜索:仅 BM25 · 等待重建","embeddingIndexNeedsRebuild":"需要重建","embeddingIndexRebuilding":"正在重建","embeddingIndexRebuildingHint":"正在生成记忆向量,请稍候","embeddingIndexSaveFirst":"请先保存配置","embeddingIndexUnsavedHint":"当前修改尚未保存,保存后才能重建索引","embeddingIndexMatchesConfig":"与当前配置一致","embeddingIndexBm25Fallback":"向量搜索停用 · 当前使用 BM25","rebuildEmbeddingIndex":"重建 Embedding 索引","rebuildEmbeddingIndexConfirmTitle":"确认重建 Embedding 索引?","rebuildEmbeddingIndexConfirm":"将使用当前配置重新生成全部记忆向量。成功完成前,向量搜索会保持禁用。","rebuildEmbeddingIndexSuccess":"Embedding 索引重建完成","rebuildEmbeddingIndexFailed":"Embedding 索引重建失败:{{error}}","undoEmbeddingChange":"撤销修改","undoEmbeddingChangeConfirmTitle":"恢复已索引的 Embedding 配置?","undoEmbeddingChangeConfirm":"将恢复与现有向量索引匹配的上一次 Embedding 配置。","undoEmbeddingChangeSuccess":"已恢复原 Embedding 配置","undoEmbeddingChangeFailed":"恢复 Embedding 配置失败:{{error}}","rebuildBm25Index":"重建 BM25 索引","rebuildBm25IndexDescription":"根据当前记忆分块重新生成关键词索引。","rebuildBm25IndexConfirmTitle":"确认重建 BM25 索引?","rebuildBm25IndexConfirm":"将根据当前记忆分块重新生成关键词搜索索引。","rebuildBm25IndexSuccess":"BM25 索引重建完成","goToLongTermMemory":"前往长期记忆","toolResultCompactRecentGtOld":"最近工具结果预览字节数必须大于或等于 compact 预览字节数","lightContextTitle":"上下文管理","remeLightMemoryTitle":"长期记忆","dialogPath":"对话存储路径","dialogPathTooltip":"对话记录持久化存储的相对路径(相对于 working_dir)","dialogPathPlaceholder":"dialog","contextCompactCollapseLabel":"上下文压缩","toolResultPruningCollapseLabel":"工具结果压缩","visualCompactCollapseLabel":"视觉压缩","visualCompactDescription":"将较早、较长的上下文压缩为视觉页面,以减少输入 Token;最近对话仍保留为文本。","visualCompactEnabled":"启用 Visual Compact","visualCompactEffort":"压缩强度","visualCompactLow":"低","visualCompactMedium":"中","visualCompactHigh":"高","visualCompactLowDescription":"压缩较少内容,优先保证可读性。","visualCompactMediumDescription":"平衡 Token 节省与视觉可读性。","visualCompactHighDescription":"压缩更多符合条件的上下文,优先节省 Token。","visualCompactQualityNote":"更高压缩强度不一定带来更高回答质量。","visualCompactCapabilityNote":"仅对支持图片输入的模型生效。","autoMemorySearchCollapseLabel":"自动记忆搜索","embeddingConfigCollapseLabel":"向量模型配置","summarizeWhenCompact":"压缩时记忆","summarizeWhenCompactTooltip":"在上下文压缩时自动生成并保存记忆","inboxPushEnabled":"记忆结果收件箱通知","inboxPushEnabledTooltip":"将自动记忆、自动梦境和每日论文任务结果推送到收件箱。关闭后仅停止通知,不影响记忆任务运行ã€
168‚","autoMemoryInterval":"自动记忆间隔","autoMemoryIntervalTooltip":"每隔 N 次用户查询触发一次自动记忆。0 表示禁用定期自动记忆,1 表示每次查询后自动记忆,推荐设置 2-5;设置 1 需要注意高 token 消耗。","autoMemoryIntervalPlaceholder":"输入 0 禁用定期自动记忆","autoMemoryIntervalRequired":"请输入自动记忆间隔","autoMemoryIntervalMin":"自动记忆间隔必须大于等于 0","contextManagerBackend":"上下文管理后端","contextManagerBackendTooltip":"上下文管理器的后端类型,目前仅支持 Light","contextStrategy":"上下文策略","contextStrategyTooltip":"智能体如何管理长上下文。Scroll(推荐)将驱逐的对话轮次持久化到历史库并按需召回;Native 使用就地压缩。更改后需重启 QwenPaw 生效。","contextStrategyScroll":"Scroll","contextStrategyNative":"Native","backendRestartWarning":"切换后端不支持热更新,保存后需要重启 QwenPaw 才能生效","adbpgMemoryTitle":"ADBPG 长期记忆","powercontextMemoryTitle":"PowerContext 记忆","powercontextConfig":{"title":"PowerContext 记忆配置","baseUrl":"服务地址","token":"Bearer Token","scopeId":"记忆作用域","scopeIdPlaceholder":"留空以使用当前安装中唯一的 Agent 作用域","scopeIdInvalid":"记忆作用域不能只包含空白字符。","timeout":"请求超时","maxContextBytes":"最大注入上下文(字节)","maxContextBytesTooltip":"限制单轮模型调用中注入的 PowerContext 检索结果总量。"},"adbpgConfig":{"title":"ADBPG 记忆配置","restBaseUrl":"REST Base URL","restApiKey":"REST API Key","memoryIsolation":"记忆隔离(按 Agent)","searchTimeout":"搜索超时"}}'),FR={title:"内置工具",description:"管理内置工具及其启用状态。禁用的工具将不会提供给智能体使用。",emptyState:"暂无工具配置",loadError:"加载工具失败",enableSuccess:"工具启用成功",disableSuccess:"工具禁用成功",toggleError:"切换工具状态失败",enableAll:"全部启用",disableAll:"全部禁用",enableAllSuccess:"全部工具已启用",disableAllSuccess:"全部工具已禁用",allEnabled:"所有工具已处于启用状态",allDisabled:"所有工具已处于禁用状态",asyncExecution:"异步执行",asyncExecutionEnabled:"异步执行已启用",asyncExecutionDisabled:"异步执行已禁用",browserUnifiedMode:"统一浏览器(Beta)",browserLegacyMode:"旧版兼容模式",browserUnifiedModeButton:"新版(Beta)",browserLegacyModeButton:"旧版(兼容)",browserUnifiedDescription:"使用新版统一浏览器能力。",browserLegacyDescription:"使用原有浏览器实现,适用于需要旧行为的场景。",browserRestartPending:"重启服务后将切换为:{{mode}}",configure:"配置",configured:"已配置",requiresConfig:"需要配置",configSaved:"配置已保存",configSaveError:"配置保存失败",webSearchProviderLabel:"搜索服务商",webSearchApiKeyLabel:"API 密钥(可选)",webSearchQuotaHintBefore:"未注册每日限 100 次,前往 ",webSearchQuotaHintAfter:" 注册可享每日 1000 次免费额度。",active:"个已激活",available:"可用",noEnabled:"暂无已启用的工具",goEnableBtn:"去启用",configureAction:"配置 →",enableAction:"启用 →"},OR={promptTitle:"需要配置 LLM 模型,配置模型后在 Chat 页面选择",promptMessage:"聊天功能需要 LLM 模型才能运行。请先配置模型,配置完成后在 Chat 页面顶部的模型选择器中选择即可使用。",configureButton:"配置模型",skipButton:"跳过",chatDisabledTitle:"聊天已禁用",chatDisabledMessage:"聊天功能已禁用,因为未配置模型。请配置模型以启用聊天功能。",configureNow:"配置模型",modelNotConfigured:"请先在设置中配置模型后再使用聊天功能"},BR={changelog:"更新日志",docs:"文档",tutorial:"教程",featureDemos:"功能演示",faq:"常见问题",github:"GitHub",resources:"文档资料",updateAvailable:"有可用更新"},NR={dark:"深色",light:"浅色",system:"跟随系统"},HR={fileReference:{codeSnippet:"代码片段 · {{count}} 行"},modelSelectTooltip:"模型选择",newChatTooltip:"新建聊天",searchTooltip:"搜索所有聊天",chatHistoryTooltip:"聊天åŽ
168†å²",wideModeTooltip:"宽屏模式",normalModeTooltip:"正常模式",messageDisplay:{stepsRunning:"正在执行中… · {{count}} 个步骤",stepsCanceled:"已取消 · {{count}} 个步骤",stepsFailed:"执行失败 · {{count}} 个步骤",stepsCompleted:"已完成 {{count}} 个步骤"},allChats:"全部聊天",createNewChat:"创建新聊天",pinDrawer:"固定",unpinDrawer:"取消固定",statusIdle:"空闲",statusInProgress:"进行中",statusUnseenResult:"有新结果",disclaimer:"懂你所需,伴你左右",greeting:"你好,我今天能帮你做什么?",description:"我是一个智能助手,可以帮助你解答问题。",prompt1:"让我们开启一段新的旅程吧!",prompt2:"能告诉我你有哪些技能吗?",inputPlaceholder:'"↑↓" 浏览消息 · "/" 快捷指令',longTextUploadPrompt:"请读取已上传的提示词文件,并根据文件内容回答。",emptyOutputError:"助手返回了空响应。",commands:{clear:{description:"清空对话上下文"},compact:{description:"压缩对话上下文并生成摘要,支持附带说明"},approve:{description:"批准待执行的工具操作并继续执行"},deny:{description:"拒绝待执行的工具操作"},mission:{description:"Mission模式 — 分解任务委派子Agent,独立上下文不污染主会话"},skills:{description:"列出当前对话可用的技能,并显示可显式调用的技能命令"},agents:{description:"列出当前运行时可用的智能体"},review:{description:"使用 Codex 审查工作区中尚未提交的变更"},status:{description:"查看当前智能体账户、模型和工作区"},plan:{description:"创建结构化计划,将任务分解为多个子任务"},goal:{description:"Goal循环 — Agent围绕目标持续执行,通过Rubric评估自动判断完成"}},attachments:{tooltip:"支持文档、图片、视频、音频等多种格式",tooltipImageOnly:"当前模型仅支持图片上传",tooltipNoMultimodal:"当前模型未检测到多模态能力,图片或视频可能无法被正确处理",fileSizeLimit:"单文件不超过 {{limit}}MB",fileSizeExceeded:"文件大小超过 {{limit}}MB 限制。当前文件:{{size}}MB",multimodalDisabled:"当前模型不支持文件上传",multimodalWarning:"当前模型未检测到多模态能力,图片或视频可能无法被正确处理",imageOnlyAccept:"当前模型仅支持图片文件",imageOnlyWarning:"当前模型仅检测到图片支持,视频等非图片文件可能无法被正确处理"},rateLimitHit:"当前模型已触发限流,请尝试切换其他免费模型。",modelFallbackNotice:"模型已从 {{from}} 切换到 {{to}}({{reason}})。",turnUsagePopover:{ariaLabel:"上下文占用 {{contextRate}},缓存命中 {{cacheRate}},查看用量详情",turn:"本轮",turnEstimated:"本轮约",tok:"tok",inOut:"in {{inTok}} · out {{outTok}}",contextLabel:"上下文窗口",outerRing:"外圈",cacheLabel:"缓存命中率",centerValue:"中心",cacheTokens:"命中 {{readTok}} / 输入 {{inputTok}}",manageContext:"上下文管理",compact:"压缩",new:"新对话"},rateLimitMessage:"已触发限流,切换其他免费模型:",rateLimitSwitched:"已切换至 {{model}}",speech:{startRecording:"开始语音录制 (Ctrl+Shift+M)",stopRecording:"停止录制 (Ctrl+Shift+M)",transcribing:"正在转录...",transcriptionDisabled:"语音转录已禁用。请在设置 > 语音转写中配置转录服务。",transcriptionFailed:"语音转录失败",microphoneError:"无法访问麦克风",fileTooLarge:"录音文件过大({{size}}MB),最大支持 {{limit}}MB",recordingTooLong:"录音时长超过限制({{limit}}秒)"},search:{title:"搜索聊天",tooltip:"搜索当前聊天",placeholder:"搜索消息...",noResults:"未找到结果",resultsCount:"找到 {{count}} 个结果",searching:"正在搜索 {{progress}}...",loading:"加载中...",userMessage:"用户",assistantMessage:"助手",titleMatch:"标题"},contextMenu:{open:"打开",rename:"重命名",pin:"置顶",unpin:"取消置顶",pinFailed:"更新会话置顶状态失败",moveToGroup:"移动到分组",delete:"删除"},queue:{title:"消息队列",paused:"已暂停",sendFailed:"发送失败",resume:"继续发送队列",pause:"暂停发送队列",clear:"清空队列",dragSort:"拖动排序",edit:"编辑",retry:"重试",skip:"跳过",interruptAndSend:"打断并发送",delete:"删除",file:"文件",noChatWarning:"请先发送一条消息创建对话,再使用队列功能",queueFull:"队列已满(最多 {{max}} 条),请先发送或删除部分消息",otherTabOwner:"当前标签页仅入队,发送由其他标签页完成"},group:{pinned:"置顶",today:"今天",week:"7天内",month:"30天内",older:"更早"},groups:{create:"新建分组",namePlaceholder:"分组名称",uncategorized:"未分组",cron:"定时任务对话",cronShort:"定时任务",cronHint:"由定时任务运行时创建的独立对话,默认收起并固定在列表底部",subagents:"与子智能体的对话",subagentShort:"子智能体",subagentsHint:"由子智能体执行任务时创建的独立对话,默认收起并固定在列表底部",pin:"置顶分组",unpin:"取消置顶分组",pinned:"已置顶分组",fixedLast:"系统分组,固定在列表底部",dragSessionHint:"长按会话并拖到目标分组",moveSuccess:"已移动到“{{name}}”",moveFailed:"移动会话失败,请重试",rename:"重命名",moveUp:"上移",moveDown:"下移",delete:"删除分组",manage:"管理分组",deleteTitle:"删除这个分组?",deleteHint:"组内会话将返回各自的系统分组。"},sessionPanel:{searchConversations:"搜索对话…",noResults:"无匹配结果",noConversations:"暂无对话",loadingConversations:"加载中…"},conversationHistory:"历史对话",history:{empty:"暂无聊天记录"},sessionGroup:{today:"今天",recent:"近 7 天",earlier:"更早"}},UR={parent:"设置",security:"安全",title:"安全",description:"管理工具和技能的安全功能。",toolGuardTitle:"工具防护",toolGuardDescription:"配置工具调用的安全扫描。危险操作将在执行前需要你的明确批准。",enabled:"启用工具防护",enabledTooltip:"启用后,工具调用在执行前会被扫描是否包含危险模式",sandboxEnabled:"启用沙箱执行",sandboxEnabledTooltip:"启用后,无匹配规则的 shell 命令会在沙箱内静默执行;关闭后,此类命令将不经沙箱直接执行(无需审批)。无论开关如何,密钥文件读取与危险命令(如 rm -rf /、sudo)等仍会被拦截或要求审批。",sandboxDegradedWarning:"沙箱已配置为开启,但当前未以管理员身份运行,沙箱本次会话不会生效。如需使用沙箱,请以管理员身份重新启动 QwenPaw。",sandboxElevatedWarning:"沙箱正在以管理员模式运行",sandboxElevatedDescription:"管理员模式的沙箱可能会触发杀毒软件拦截或导致兼容性问题。如果遇到意外阻止或崩溃,请尝试关闭沙箱或以非管理员身份运行 QwenPaw。",sandboxUnelevatedWarning:"沙箱正在以非管理员模式运行",sandboxUnelevatedDescription:"管理员模式会提供更加激进和完整的沙箱隔离功能,但可能会触发杀毒软件拦截或导致兼容性问题,仅建议高级用户使用。启用方法:右键点击 QwenPaw 快捷方式 → 以管理员身份运行;或打开管理员权限的终端,运行 `qwenpaw app`。",denyPathsProtection:"敏感路径访问保护",denyPathsSandboxEnhancement:"这是沙箱的增强功能。在非管理员模式下运行时,沙箱无法完全隔离文件系统访问ã€
168‚此功能通过 Windows ACL 拒绝对敏感路径的访问,提供额外的保护层。",denyPathsProtectionTooltip:"启用后,将在系统级别为当前用户设置拒绝 ACL,阻止对敏感路径(如 ~/.ssh、~/.aws)的访问。警告:启用期间,当前用户的所有程序都无法访问这些路径,而非仅限于 QwenPaw。QwenPaw 退出或关闭此开关后会自动恢复访问权限。",denyPathsActiveMessage:"敏感路径保护已启用",denyPathsActiveDescription:"以下路径当前已对当前用户的所有进程禁止访问。关闭此开关或退出 QwenPaw 即可恢复访问。",guardedTools:"受保护的工具",guardedToolsTooltip:"检测到危险模式时需要审批的工具。留空则使用内置默认集合。",guardedToolsPlaceholder:"选择工具或输入自定义工具名",deniedTools:"禁止的工具",deniedToolsTooltip:"始终被拒绝的工具,无需审批直接拦截",deniedToolsPlaceholder:"选择要始终禁止的工具",saveSuccess:"工具防护设置已保存",saveFailed:"保存工具防护设置失败",loadFailed:"加载工具防护设置失败",rules:{title:"检测规则",description:"规则定义了触发安全警告的正则表达式模式。内置规则可以禁用;自定义规则可以添加、编辑或删除。",id:"规则 ID",severity:"严重程度",descriptionCol:"描述",source:"来源",actions:"操作",builtin:"内置",custom:"自定义",enable:"启用",disable:"禁用",edit:"编辑",delete:"删除",add:"添加规则",addTitle:"添加自定义规则",editTitle:"编辑自定义规则",ruleId:"规则 ID",ruleIdRequired:"规则 ID 不能为空",duplicateId:"已存在相同 ID 的规则",tools:"目标工具",toolsPlaceholder:"留空匹配所有工具",params:"目标参数",paramsPlaceholder:"留空匹配所有参数",severityLabel:"严重程度",categoryLabel:"分类",patterns:"正则模式",patternsRequired:"至少需要一个正则模式",patternsTooltip:"每行一个正则表达式,匹配工具参数值(不区分大小写)。",excludePatterns:"排除模式",excludePatternsTooltip:"每行一个正则表达式。如果匹配,则跳过该规则。",descriptionLabel:"描述",descriptionPlaceholder:"该规则检测什么?",remediationLabel:"修复建议",remediationPlaceholder:"触发规则时建议的操作",preview:"预览",previewTitle:"规则详情",actionLabel:"触发行为",actionApproval:"等待审批",autoDeny:"自动拒绝",autoDenyTooltip:"启用后,匹配此规则的工具调用将被自动拒绝,无需人工审批",autoDenyEnable:"启用此规则的自动拒绝",autoDenyDisable:"关闭此规则的自动拒绝",allTools:"所有工具",allParams:"所有参数",descriptions:{TOOL_CMD_CONTROL_CHARS:"检测包含不可打印控制字符的命令,可能绕过安全检查",TOOL_CMD_DANGEROUS_MV:"检测可能意外移动或覆盖文件的 mv 命令",TOOL_CMD_DANGEROUS_RM:"检测可能导致数据丢失的 rm 命令",TOOL_CMD_DOS_FORK_BOMB:"检测经典 Bash Fork 炸弹和批量进程终止",TOOL_CMD_FIND_DELETE:"检测可能导致数据丢失的 find -delete 命令",TOOL_CMD_FS_DESTRUCTION:"检测低级别磁盘格式化或擦除命令",TOOL_CMD_IFS_INJECTION:"检测使用 $IFS 变量绕过安全验证的命令",TOOL_CMD_JQ_FILE_FLAGS:"检测使用标志位读取任意文件或执行外部代码的 jq 命令",TOOL_CMD_JQ_SYSTEM:"检测包含 system() 函数可执行任意 Shell 命令的 jq 命令",TOOL_CMD_OBFUSCATED_EXEC:"检测将 base64 编码字符串直接传递给 Shell 解释器执行的行为",TOOL_CMD_PIPE_TO_SHELL:"检测通过 'curl | bash' 模式下载并立即执行远程载荷的行为",TOOL_CMD_PRIVILEGE_ESCALATION:"检测使用 sudo、su、doas、pkexec 或 runas 的权限提升尝试",TOOL_CMD_PROCESS_KILL:"检测可能终止关键进程的进程终止命令",TOOL_CMD_PROC_ENVIRON:"检测访问 /proc/*/environ 可能泄露敏感环境变量的命令",TOOL_CMD_REVERSE_SHELL:"检测建立反向 Shell 或未授权网络隧道的行为",TOOL_CMD_SERVICE_RESTART:"检测可能中断系统服务的服务管理命令",TOOL_CMD_SYSTEM_REBOOT:"检测将终止主机系统的系统重启或关机命令",TOOL_CMD_SYSTEM_TAMPERING:"检测对定时任务、SSH 密钥或 sudo 权限的访问(包括读取和修改)",TOOL_CMD_UNICODE_WHITESPACE:"检测包含可能导致解析不一致的 Unicode 空白字符的å‘
168½ä»¤",TOOL_CMD_UNSAFE_PERMISSIONS:"检测全局权限降级(chmod 777)或设置不可变标志的操作",TOOL_CMD_ZSH_DANGEROUS:"检测使用 Zsh 特有内置命令可能绕过安全检查的命令"},categories:{command_injection:"命令注入",code_execution:"代码执行",data_exfiltration:"数据外泄",path_traversal:"路径穿越",sensitive_file_access:"敏感文件访问",network_abuse:"网络滥用",credential_exposure:"凭证泄露",resource_abuse:"资源滥用",privilege_escalation:"权限提升",prompt_injection:"提示注入",other:"其他"}},shellEvasion:{title:"Shell 逃逸检测",description:"配置启用哪些 Shell 逃逸和混淆检测。这些检测能够发现试图绕过简单正则检测来隐藏恶意意图的技术手段。",checks:{command_substitution:{name:"命令替换",description:"检测 $()、反引号、进程替换等命令替换模式"},obfuscated_flags:{name:"混淆标志",description:"检测 ANSI-C 引号、本地化引号和空引号标志混淆"},backslash_escaped_whitespace:{name:"反斜杠转义空白",description:"检测可能改变命令解析的反斜杠转义空格/制表符"},backslash_escaped_operators:{name:"反斜杠转义操作符",description:"检测 Shell 操作符 (;|&<>) 前的反斜杠,可隐藏命令结构"},newlines:{name:"隐藏换行符",description:"检测可能分隔隐藏命令的换行符和回车符"},comment_quote_desync:{name:"注释引号失同步",description:"检测 # 注释中的引号字符,可导致引号追踪失同步"},quoted_newline:{name:"引号内换行",description:"检测引号字符串中的换行符后跟 # 行,可隐藏参数"}}},fileGuard:{title:"文件防护",description:"保护敏感文件和目录,防止被 Agent 工具访问。添加的路径将在所有工具调用中被拦截。",enableLabel:"启用文件防护",path:"路径",actions:"操作",add:"添加",inputPlaceholder:"输入文件或目录路径(如 ~/.ssh/ 或 /etc/passwd)",empty:"未配置自定义敏感路径",directory:"目录",removeConfirm:"从保护列表中移除该路径?",duplicate:"该路径已存在",saveSuccess:"文件防护设置已保存",saveFailed:"保存文件防护设置失败",loadFailed:"加载文件防护设置失败",allowPreviewOutsideWorkspace:"允许控制台预览工作区外文件",allowPreviewOutsideWorkspaceDesc:"允许在控制台中预览工作区目录之外的文件,敏感文件防护仍然生效。"},allowNoAuthHosts:{title:"免认证主机白名单",warningTitle:"安全警告",warningDescription:"此列表中的 IP 地址可以无需认证访问 API 端点。默认情况下,本地主机(127.0.0.1 和 ::1)允许 CLI 访问。仅添加可信任的 IP 地址。警告:添加不受信任的 IP 会带来严重的安全风险。",ipAddress:"IP 地址",actions:"操作",add:"添加",inputPlaceholder:"输入 IP 地址(例如:192.168.1.100 或 ::1)",empty:"未配置 IP 地址",default:"默认",removeConfirm:"从白名单中移除该 IP 地址?",duplicate:"该 IP 地址已存在",invalidIP:"无效的 IP 地址格式",saveSuccess:"免认证主机白名单设置已保存",saveFailed:"保存免认证主机白名单设置失败",loadFailed:"加载免认证主机白名单设置失败"},skillScanner:{title:"技能扫描器",description:"在启用或安装技能前,自动扫描安全威胁。不安全的技能可以被拦截或加入白名单。",mode:"扫描模式",modeTooltip:"控制扫描器如何处理不安全的技能:拦截、仅提醒或关闭",modeBlock:"拦截",modeWarn:"仅提醒",modeOff:"关闭",timeout:"扫描超时(秒)",timeoutTooltip:"等待扫描完成的最长时间(5-300秒)",saveSuccess:"技能扫描器设置已保存",saveFailed:"保存技能扫描器设置失败",scanAlerts:{title:"扫描告警",empty:"暂无安全告警",clearAll:"清除全部",clearConfirm:"确定清除所有扫描告警吗?",skillName:"技能",action:"动作",actionBlocked:"已拦截",actionWarned:"已提醒",time:"时间",actions:"操作",allowSkill:"加入白名单",remove:"删除",viewFindings:"查看详情"},whitelist:{title:"白名单",empty:"暂无白名单技能",skillName:"技能",addedAt:"添加时间",contentHash:"内容哈希",actions:"操作",remove:"移除",removeConfirm:"确定将此技能从白名单中移除?",addSuccess:"技能已加入白名单",removeSuccess:"技能已从白名单移除",addFailed:"加入白名单失败",removeFailed:"从白名单移除失败",removeWillDisable:"移除后该技能将同时被禁用。",removeAndDisabled:"技能已从白名单移除并已禁用"},scanError:{title:"检测到安全问题",description:"发现以下安全问题:",warnDescription:"发现安全问题,但技能仍已启用(仅提醒模式):",goToWhitelist:"前往白名单",moreFindings:"另有 {{count}} 条未列出(完整列表见 设置 → 安全 → 技能扫描)。"}}},qR={brand:{title:"Hub 管理中心",subtitle:"本地工作空间",controlPlane:"控制中心"},navigation:{workspace:"工作空间",overview:"运营总览",runtimes:"运行环境",users:"用户",credentials:"凭据",audit:"审计日志",settings:"系统设置"},actions:{backToQwenPaw:"返回 QwenPaw",useLightTheme:"使用浅色主题",useDar
168kTheme:"使用深色主题",signOut:"退出登录",start:"启动",stop:"停止",disable:"禁用",rebuild:"重建",enableAndStart:"启用并启动"},roles:{admin:"管理员",user:"普通用户"},userStates:{active:"已启用",disabled:"已禁用"},runtimeStates:{created:"已创建",starting:"启动中",running:"运行中",stopped:"已停止",failed:"失败"},runtimePolicies:{owner_allowed:"用户可重启",admin_only:"管理员锁定"},errors:{actionFailed:"操作失败",createFailed:"创建失败",updateFailed:"更新失败",saveFailed:"保存失败",pullTimedOut:"镜像拉取等待超时"},messages:{runtimeCreated:"运行环境已创建",accountCreated:"账号已创建",credentialStored:"凭据已保存",settingsSaved:"Hub 设置已保存",imagePulled:"Docker 镜像拉取完成"},validation:{required:"此项为必填项",runtimeIdInvalid:"请输入 1–64 位字母、数字、点、下划线或连字符,并以字母或数字开头",passwordMin:"密码至少需要八个字符",credentialNameInvalid:"请输入大写环境变量名称,例如 OPENAI_API_KEY"},runtimes:{eyebrow:"Hub 管理中心",title:"运行环境概览",description:"每位用户拥有独立的运行环境,文件和密钥彼此分开。",newRuntime:"新建运行环境",managed:"托管运行环境",localBoundaries:"本地进程边界",runningNow:"当前运行",needsAttention:"{{count}} 个运行环境需要处理",healthy:"当前所有状态均正常",isolationPolicy:"隔离策略",available:"可用",unavailable:"不可用",failClosed:"失败即关闭",noFallback:"不回退到非沙箱模式",executionBlocked:"运行环境执行已被阻止",isolationTitle:"失败即关闭的本地隔离",isolationDescription:"整个运行环境进程树均在沙箱中执行。如果原生隔离探测失败,QwenPaw 将拒绝启动。",unavailableTitle:"安全运行后端不可用",unavailableDescription:"{{provisioner}} 不可用:{{reason}}。请检查该后端的安装、运行状态和系统配置,然后重启 QwenPaw Hub。",unavailableUserDescription:"运行后端暂不可用,请联系管理员。",preflightFailed:"安全预检失败",localEndpoint:"本地端点 · {{endpoint}}",provisioner:"运行方式",localExecution:"本机隔离",dockerExecution:"Docker 容器",security:"安全级别",tenant:"租户",removeTitle:"移除 {{id}}?",removeDescription:"仅移除注册记录,运行环境数据将保留。",disableTitle:"禁用 {{id}}?",disableDescription:"进程将被停止;在管理员重新启用之前,用户无法自行启动或重启。",rebuildTitle:"使用当前镜像重建 {{id}}?",rebuildDescription:"容器将被替换并使用系统设置中的当前镜像;持久化工作目录、密钥和备份会保留。",emptyTitle:"尚无运行环境",emptyDescription:"创建第一个隔离的本地 QwenPaw 运行环境。"},users:{eyebrow:"身份与访问控制",title:"用户访问",description:"集中创建本地账号、分配管理员权限并撤销会话。",addAccount:"添加账号",publicRegistration:"开放注册",publicRegistrationDescription:"关闭后,仅管理员可以创建账号。",currentAccountProtected:"当前账户已保护",empty:"没有符合条件的用户"},credentials:{eyebrow:"租户级保管箱",title:"凭据",description:"将 Provider 密钥保存到明确的租户或运行环境作用域。密钥值会加密保存,API 永不返回明文。",storeCredential:"保存凭据",updated:"更新于 {{date}}",deleteTitle:"删除 {{name}}?",deleteDescription:"使用此凭据的运行环境可能会停止工作。",emptyTitle:"保管箱为空",emptyDescription:"保存租户级或运行环境级 API Key。",encrypted:"已加密保存,不可读取明文"},overview:{eyebrow:"运营控制台",title:"Hub 运行概览",description:"基于真实运行状态、主机资源和审计事件掌握 Hub 当前情况。",availability:"实例在线率",availabilityDetail:"{{running}} / {{total}} 个运行实例当前在线",totalRuntimes:"全部运行实例",failedCount:"{{count}} 个实例需要关注",totalUsers:"Hub 用户",managedLocally:"本地身份与权限管理",hostResources:"主机资源",liveSnapshot:"当前实时快照",memory:"内存",dataDisk:"数据盘",recentActivity:"最近活动",auditBacked:"来自持久化审计日志",systemHealthy:"系统运行正常",systemDegraded:"系统状态异常",localIsolation:"本机隔离运行方式"},table:{searchRuntimes:"搜索实例、用户或端点",searchUsers:"搜索用户名或用户 ID",searchCredentials:"搜索凭据名称或作用域",searchAudit:"搜索操作人或资源",allStates:"全部状态",allOwners:"全部所有者",allExecutions:"全部运行方式",allRoles:"全部角色",allUserStates:"全部用户状态",allScopes:"全部作用域",allActions:"全部操作",runtime:"运行实例",status:"状态",owner:"所有者",endpoint:"端点",execution:"运行方式",updated:"最近更新",user:"用户",role:"角色",created:"创建时间",credential:"凭据",scope:"作用域",event:"事件",actor:"操作人",resource:"目标资源",result:"结果",time:"时间",total:"共 {{total}} 条"},audit:{eyebrow:"安全与治理",title:"审计日志",description:"查看 Hub 管理操作的主体、目标、结果和发生时间。敏感值不会进入审计数据。",empty:"尚无管理操作记录"},settings:{eyebrow:"平台配置",title:"系统设置",description:"在一个带审计的权威入口中管理完整 Hub 配置。修改会立即生效,并在服务重启后保留。",save:"保存设置",meta:"配置版本 {{revision}} · 更新于 {{date}}",tabs:{access:"访问安全",runtime:"运行环境"},access:{title:"访问与注册",description:"配置浏览器可访问的 Hub 地址和公开账号策略。",publicBaseUrl:"公开访问地址",publicBaseUrlHint:"用于 OAuth 回调。只有纯本机部署才建议留空。",registration:"开放注册",registrationHint:"关闭后,仅管理员可以创建账号。",defaultRole:"默认注册角色",defaultRoleHint:"出于安全考虑,自助注册账号固定为普通用户。"},security:{title:"登录防护",description:"限制登录和注册滥用,并按 IP 地址æ
168ˆ–网段阻止访问。",ipBlacklist:"IP 黑名单",ipBlacklistHint:"支持 IPv4、IPv6 和 CIDR;输入后按回车确认。",trustedProxyIps:"可信反向代理",trustedProxyIpsHint:"只有来自这些地址的 X-Forwarded-For 才会被信任。",loginRateLimit:"登录失败速率限制",loginRateLimitHint:"同一地址连续登录失败时,临时阻止其继续尝试。",registrationRateLimit:"注册速率限制",registrationRateLimitHint:"限制同一地址短时间内批量创建账号。",maxAttempts:"最大尝试次数",windowSeconds:"统计窗口(秒)",blockSeconds:"封禁时长(秒)"},runtime:{title:"运行环境策略",description:"管理员统一选择运行环境后端;现有环境将在下次重启时切换。",provisioner:"运行环境后端",localBackend:"本机进程",localBackendHint:"直接在当前宿主机上运行隔离进程。",dockerBackend:"Docker 容器",dockerBackendHint:"为每个账户运行独立的托管容器。",backendUnavailable:"当前宿主机不可用",localIsolationHint:"本机模式使用宿主机进程,不会读取或应用任何 Docker 镜像设置。",dockerIsolationHint:"Docker 模式会把下方镜像与资源策略统一应用到所有账户。"},docker:{title:"Docker 策略",description:"统一管理镜像、拉取规则和每个容器的资源上限。普通用户无法覆盖这些设置。",unavailable:"Docker 引擎不可用",source:"镜像源",dockerHub:"Docker Hub 官方源",aliyunAcr:"阿里云官方源",custom:"自定义镜像",customHint:"填写策略允许范围内的任意镜像引用。",customRegistry:"自定义仓库或镜像引用",localHost:"本机镜像",localHostHint:"使用宿主机已经下载并带有 Tag 的镜像。",noLocalImages:"宿主机暂无带 Tag 的本地镜像",image:"镜像与 Tag",selectLocalImage:"选择本机镜像 Tag",selectedImage:"实际使用镜像",repository:"镜像仓库",localStatus:"本机状态",downloaded:"已下载",notDownloaded:"未下载",pullPolicy:"自动拉取策略",ifNotPresent:"本地不存在时拉取",always:"每次首次创建前拉取",never:"仅使用本地镜像",pullImage:"立即拉取镜像",localImages:"本机已有 {{count}} 个镜像引用",resources:"容器资源上限",cpuLimit:"CPU 核数",memoryLimit:"内存(MB)",pidsLimit:"最大进程数",shmSize:"共享内存(MB)"},quotas:{title:"全局运行容量",description:"每个租户固定拥有一个运行环境;这里只限制整个 Hub 同时运行的数量。",maxRunningRuntimes:"最多同时运行数",unlimitedHint:"留空表示不限制。"}},auditActions:{runtime:{create:"创建运行实例",start:"启动运行实例",stop:"停止运行实例",disable:"禁用运行实例",rebuild:"重建运行实例",delete:"删除运行实例"},image:{pull:"拉取 Docker 镜像"},user:{create:"创建用户",update:"更新用户"},credential:{store:"保存凭据",delete:"删除凭据"},settings:{update:"更新 Hub 设置"},auth:{register:"注册 Hub 用户"}},auditOutcomes:{success:"成功",failure:"失败"},runtimeForm:{title:"创建运行环境",hint:"运行环境将在本机原生沙箱中启动,其文件、密钥和进程树与其他用户保持隔离。",runtimeId:"运行环境 ID",startImmediately:"立即启动",submit:"创建运行环境"},userForm:{title:"添加账号",hint:"请设置至少八位的临时密码。该用户只能访问其个人租户拥有的运行环境。",username:"用户名",temporaryPassword:"临时密码",role:"角色",submit:"创建账号"},credentialForm:{title:"保存凭据",hint:"租户作用域适用于你的全部运行环境;运行环境作用域可为单个进程提供私有覆盖。",scope:"作用域",allRuntimes:"我的全部运行环境",environmentName:"环境变量名称",secretValue:"密钥值",submit:"加密并保存"}},jR={title:"登录 QwenPaw",registerTitle:"创建账户",firstUserHint:"创建管理员账户以开始使用",usernamePlaceholder:"用户名",passwordPlaceholder:"密码",usernameRequired:"请输入用户名",passwordRequired:"请输入密码",submit:"登录",register:"注册",returnToSignIn:"返回登录",createAccount:"创建账号",failed:"登录失败,请检查您的凭据",registerSuccess:"注册成功",registerFailed:"注册失败",authNotEnabled:"认证未启用",logout:"退出登录",logoutSuccess:"已成功退出",sessionExpired:"会话已过期,请重新登录",unauthorized:"未授权,请登录",switchLanguage:"切换语言",hubDisclaimerTitle:"自托管 Hub 安全提示",hubDisclaimerPoint1:"仅登录由你本人或可信组织运营的 Hub",hubDisclaimerPoint2:"管理员可能接触此实例存储或处理的数据",hubDisclaimerPoint3:"沙箱环境可能限制部分 QwenPaw 能力",hubDisclaimerAccept:"我已阅读并同意用户条款",hubDisclaimerAcceptPrefix:"我已阅读并同意",hubTerms:"《用户条款》",hubLinks:"QwenPaw 相关链接",officialWebsite:"官方网站",hubTermsTitle:"Qwe
168nPaw Hub 用户条款",hubTermsLead:"使用此独立部署的 QwenPaw Hub 实例前,请完整阅读以下条款。",hubTermsSection1Title:"一、可信部署",hubTermsSection1Body:"请仅使用由你本人或可信组织部署的 Hub。第三方 Hub 由其运营者独立管理,QwenPaw 项目无法验证该实例的身份、配置或安全性。",hubTermsSection2Title:"二、数据与管理员权限",hubTermsSection2Body:"实例运营者控制服务器、数据库、备份、日志和运行进程。管理员在技术上可能接触此实例存储或处理的对话、上传文件、凭据、配置及运行数据。",hubTermsSection3Title:"三、凭据与敏感信息",hubTermsSection3Body:"请仅提供完成工作所必需的凭据和数据,不要向不可信实例提交秘密信息。数据的存储、保留、备份、删除和安全事件处理策略由实例运营者决定。",hubTermsSection4Title:"四、沙箱与能力限制",hubTermsSection4Body:"QwenPaw 在 Hub 的隔离运行环境中工作。宿主机权限、设备、本地应用、网络和其他集成可能受限,因此 Hub 无法保证具备可信本地 QwenPaw 安装的全部能力。",hubTermsSection5Title:"五、合法与授权使用",hubTermsSection5Body:"你只能将本服务用于合法且已获授权的用途,并对自己的指令、上传内容、生成结果、外部服务使用,以及遵守实例运营规则和相关服务规则承担责任。",hubTermsSection6Title:"六、可用性与风险",hubTermsSection6Body:"服务可用性、数据保护、支持和恢复由实例运营者负责。请自行备份重要数据,并在依赖生成结果前进行核验。QwenPaw 项目贡献者不是第三方部署的运营者。",hubTermsEnd:"点击“同意并继续”,即表示你确认信任当前 Hub 的运营者,并理解上述数据、能力和使用边界。",hubTermsScrollHint:"请滚动至底部后继续",hubTermsAgree:"同意并继续"},GR={title:"账户管理",currentPassword:"当前密码",currentPasswordRequired:"请输入当前密码",newUsername:"新用户名",newUsernamePlaceholder:"留空则保持不变",newPassword:"新密码",newPasswordPlaceholder:"留空则保持不变",confirmPassword:"确认新密码",confirmPasswordPlaceholder:"再次输入新密码",passwordMismatch:"两次输入的密码不一致",save:"保存更改",updateSuccess:"账户更新成功",updateFailed:"账户更新失败",wrongPassword:"当前密码不正确",nothingToUpdate:"请输入新用户名或新密码",passwordEmpty:"密码不能为空白",usernameEmpty:"用户名不能为空白",username:"用户名",passwordRequired:"请输入新密码",hubPasswordPlaceholder:"请输入至少八个字符",runtimeTitle:"个人运行环境",runtimeDescription:"工作空间不可用时可在此重启。正在运行的任务会被中断,已保存的数据不会删除。",runtimeRestartConfirmTitle:"确认重启运行环境?",runtimeRestartConfirmDescription:"正在运行的任务会被中断,运行环境就绪后页面将自动刷新。",runtimeRestart:"重启运行环境",runtimeRestarting:"正在重启运行环境…",runtimeRestartSuccess:"运行环境已重启",runtimeRestartFailed:"运行环境重启失败",runtimeStoppedTitle:"运行环境已停止",runtimeStoppedDescription:"管理员已停止进程。需要继续使用时,你可以手动重新启动。",runtimeDisabledTitle:"运行环境已被禁用",runtimeDisabledDescription:"管理员已禁止该运行环境启动,请联系管理员恢复使用。"},VR={title:"语音转写",description:"配置如何处理收到的音频和语音消息。",loadFailed:"加载音频模式设置失败",saveSuccess:"音频模式已保存",saveFailed:"保存音频模式失败",audioModeLabel:"音频模式",audioModeDescription:"选择来自频道(Discord、Telegram 等)的语音消息在发送给模型之前如何处理。",modeAuto:"自动(推荐)",modeAutoDesc:"使用所选转写提供商将音频转写为文字后发送给模型。如果转写未启用或不可用,则显示文件上传占位消息。此模式下音频不会直接发送给模型。适用于所有模型。",modeNative:"原生音频",modeNativeDesc:"直接将音频文件发送给模型,不进行转写。这是唯一会将音频发送给模型的模式。仅适用于特定的音频模型(如 gpt-4o-audio),大多数模型不支持此模式。",ffmpegReady:"ffmpeg 已安装。原生模式音频格式转换可用。",ffmpegMissing:"ffmpeg 未安装。",ffmpegMissingDesc:"原生音频模式需要 ffmpeg 来转换音频格式(如 .ogg 转 .wav)。请安装 ffmpeg 系统包以启用此模式。",providerTypeLabel:"转写提供商",providerTypeDescription:"选择转写后端。如果不需要语音转写,请选择「已禁用」。",providerTypeDisabled:"已禁用",providerTypeDisabledDesc:"不进行转写。语音消息将显示为文件上传占位消息。",providerTypeWhisperApi:"Whisper API",providerTypeWhisperApiDesc:"使用已配置提供商(如 OpenAI、Ollama)的 OpenAI 兼容 Whisper API 端点。",providerTypeLocalWhisper:"本地 Whisper",providerTypeLocalWhisperDesc:"使用本地安装的 openai-whisper Python 库进行转写。需要同时安装 ffmpeg 和 openai-whisper。",localWhisperReady:"本地 Whisper 已就绪。ffmpeg 和 openai-whisper 均已安装。",localWhisperMissing:"本地 Whisper 未就绪,缺少必要依赖。",localWhisperMissingDesc:"ffmpeg: {{ffmpeg}} | openai-whisper: {{whisper}}。请安装缺少的依赖:ffmpeg(系统包)和 openai-whisper(uv pip install openai-whisper,或使用 [whisper] 额外依赖安装 QwenPaw)。",providerLabel:"Whisper API 提供商",providerDescription:"选择用于 Whisper API 音频转写的提供商。仅显示支持 Whisper 端点的提供商。",providerPlaceholder:"选择提供商...",noProvidersWarning:"未找到支持转写的提供商。请配置一个 OpenAI 提供商以启用语音转写。",transcriptionInfoTitle:"转写工作原理",transcriptionInfoDesc:"Whisper API 转写使用 OpenAI 兼容的 /v1/audio/transcriptions 端点。需要配置一个支持 Whisper 端点的提供商(如 OpenAI)。请在上方选择具体的提供商以启用转写。",transcriptionInfoDescLocal:"本地 Whisper 转写直接在您的设备上运行 openai-whisper 库。需要同时安装 ffmpeg(用于音频解码)和 openai-whisper Python 包。无需 API Key 或网络连接。安装命令:uv pip install 'qwenpaw[whisper]'。"},WR={title:"备份",description:"备份和恢复智能体工作区及配置。",create:"创建备份",import:"导入",export:"导出",restore:"恢复",delete:"删除",batchDelete:"批量删除",batchDeleteConfirm:"确定要删除 {{count}} 个备份吗?此操作不可恢复。",deleteConfirm:"确定要删除此备份吗?此操作不可恢复。",name:"名称",createdAt:"创建时间",scopeSummary:"备份范围",descriptionLabel:"描述",noBackups:"暂无备份。创建一个备份来保存当前配置。",loadFailed:"加载备份列表失败",createTitle:"创建备份",backupMode:"备份模式",fullBackup:"完整备份",fullBackupDesc:"备份所有内容,包括所有智能体工作区、全局设置、技能池和密钥信息",customBackup:"自定义备份",partialBackup:"部分备份",partialBackupDesc:"自定义选择要备份的内容",nameRequired:"备份名称不能为空",namePlaceholder:"输入备份名称",descriptionPlaceholder:"可选的描述信息...",scopeAgents:"智能体工作区",scopeGlobalConfig:"全局设置",scopeSkillPool:"技能池",scopeSecrets:"密钥信息",scopeSecretsHint:"包含模型供应商密钥(API Key)和环境变量等敏感信息",securityNotice:"此备份可能包含敏感凭证信息。智能体工作区包含渠道凭证(如 bot token、app secret 等),模型供应商密钥包含 API Key。请勿将备份文件分享给他人。",searchPlaceholder:"按名称或 ID 搜索备份...",total:"共 {{count}} 条",agentsPlaceholder:"请选择智能体工作区(留空表示全部)",selectAll:"全选",deselectAll:"取消å
168…¨é€‰",createSuccess:"备份创建成功",createFailed:"备份创建失败",restoreTitle:"恢复备份",restoreScope:"恢复范围",restoreFullWarning:"整体恢复将完全替换当前实例的所有内容(包括所有智能体、全局配置、技能池和密钥),操作不可撤销。恢复期间相关功能不可用,恢复完成后请重启服务。",agentGroupExisting:"已存在",agentGroupNew:"新增",agentExists:"已存在",agentNew:"新增",agentActionReplace:"替换已有",agentActionAdd:"新增",agentColumnName:"智能体",agentColumnWorkspace:"工作目录",agentTotal:"共 {{count}} 个智能体",noAgentsInBackup:"备份中没有智能体工作区",loadingAgents:"正在加载智能体列表...",agentSearchPlaceholder:"按名称或 ID 搜索智能体...",agentSearchTotal:"搜索到 {{count}} 个,共 {{total}} 个",restoreCustomSummary:"已选 {{existing}} 个已存在 · {{added}} 个新增",defaultWorkspaceDirUnused:"无新增智能体,不生效",otherOptions:"其他选项",defaultWorkspaceDirDefault:"<默认路径>/{{aid}}",restoreWarningModify:"恢复操作会修改当前配置,此操作不可撤销。",restoreWarningRestart:"恢复期间相关功能不可用,恢复完成后请重启服务。",preRestoreBackupTitle:"创建恢复前备份",preRestoreBackupContent:"恢复操作不可逆。是否先创建当前状态的备份?这样如果恢复出现问题,您可以回退到当前状态。",preRestoreBackupYes:"是,先创建备份",preRestoreBackupNo:"否,直接恢复",preRestoreBackupDesc:"恢复前自动创建的备份",preRestoreBackupFailed:"创建恢复前备份失败",preRestoreBackupSuccess:"恢复前备份创建成功,ID:{{id}}",creatingPreRestoreBackup:"正在创建恢复前备份...",skipAndRestore:"跳过并继续恢复",restoreConfirm:"我确认要恢复此备份",restoreMode:"恢复模式",restoreModeFull:"整体恢复",restoreModeFullDesc:"完全替换当前实例的所有内容,包括所有智能体、全局配置、技能池和密钥",restoreModeCustom:"自定义恢复",restoreModeCustomDesc:"选择要恢复的内容,如部分智能体、配置等;当前已有但不在本次恢复范围内的其他智能体不会被移除",restoreModeFullDisabled:"仅完整备份可用",defaultWorkspaceDir:"智能体默认工作目录",defaultWorkspaceDirPlaceholder:"留空时将使用 ~/.qwenpaw/workspaces",defaultWorkspaceDirHint:"待恢复的智能体的工作路径不存在时,智能体将保存在 <默认路径>/<智能体ID> 下,存在时则使用智能体的原始工作路径。",restoreStrategy:"恢复策略",restoreStrategyPreserve:"保留本地安全和 MCP 配置",restoreStrategyPreserveDesc:"保留当前实例的安全防护和 MCP 配置。",restoreStrategyRestore:"从备份恢复这些设置",restoreStrategyRestoreDesc:"使用备份中的安全和 MCP 配置。",restoreSuccess:"备份恢复成功,请您重启服务。",restoreSuccessPreserved:"备份恢复成功。已保留本地设置:{{keys}}。请重启服务。",restoreSuccessWithBackup:"备份恢复成功,恢复前备份 ID:{{preRestoreId}},请您重启服务。",restoreFailed:"备份恢复失败",restoreTimedOut:"恢复仍在进行或已超过 5 分钟。请检查备份大小、磁盘空间和服务日志后再试。",restoreTargetBusy:"备份恢复失败:以下目录仍被占用。请关闭正在使用这些目录的浏览器或进程后重试;如果仍然被锁定,请重启系统后再试。",detailLoa
168dFailed:"备份详情加载失败,无法进行恢复操作",trustLocalBanner:"本地备份 - 默认完整恢复",trustForeignBanner:"导入的备份 - 默认保留本地安全和 MCP 配置",trustLegacyBanner:"历史备份 - 恢复前需要确认信任",trustForeignTitle:"信任此备份?",trustLegacyTitle:"信任历史备份?",unknownBackupName:"备份归档",trustForeignDesc:"此备份不是由当前实例签名。仅在信任来源时继续;恢复时默认保留本地安全和 MCP 配置。",trustLegacyDesc:"此旧版备份没有本地签名。仅在信任来源时继续;确认后会使用当前实例签名再恢复。",deleteSuccess:"备份删除成功",deleteFailed:"备份删除失败",exportFailed:"导出备份失败",exportWarningTitle:"敏感信息警告",exportWarningContent:"此备份可能包含敏感凭证信息。智能体工作区包含渠道凭证(如 bot token、app secret 等),模型供应商密钥包含 API Key。请勿将备份文件分享给他人。",exportConfirm:"确认导出",importTitle:"导入备份",importSuccess:"备份导入成功",importFailed:"备份导入失败",importConflictTitle:"备份已存在",importConflictDesc:"导入的备份与系统中已有的备份 ID 相同,是否覆盖已有备份?",importReplace:"覆盖",agents:"{{count}} 个 Agent",allAgents:"全部 Agent",globalConfig:"全局设置",skillPool:"技能池",secrets:"密钥",selected:"已选择 {{count}} 个",fileCount:"{{count}} 个文件",totalSize:"{{size}}",progressStarting:"正在初始化备份...",progressAgent:"正在备份第 {{index}} / {{total}} 个 Agent...",progressSaving:"正在写入备份文件...",progressDone:"备份完成",localModelsNotice:"备份文件不包含本地模型文件。如需跨设备迁移,请在目标设备上重新下载所需的本地模型。"},zR={title:"安全审批",agent:"Agent",ownerAgent:"归属Agent",executingAgent:"执行Agent",tool:"工具",severity:"严重性",findings:"发现",reason:"调用理由",parameters:"参数",approve:"批准",deny:"拒绝",source:"来源",builtinSource:"内置",subSession:"子Agent",approved:"已批准工具调用",denied:"已拒绝工具调用",approveFailed:"批准失败",denyFailed:"拒绝失败",timeoutAutoDenied:"已超时,自动拒绝",acknowledge:"我知道了",approvePattern:"总是允许",strictModeHint:"严格模式下无法总是允许",approveExact:"仅本次",approvalScope:"批准范围",details:"详细信息"},KR={title:"插件管理",description:"安装、管理和卸载插件,无需重启服务。",installed:"已安装插件",noPlugins:"暂无已安装插件",installBtn:"安装插件",publishBtn:"发布插件",installTitle:"安装插件",dropPrimary:"拖入文件夹或 ZIP 文件",dropSecondary:"或点击选择 ZIP 文件",orFromUrl:"或通过 URL 安装",installFromUrl:"从 URL 安装",urlPlaceholder:"https://example.com/plugin.zip",zipOnly:"直接拖入文件时仅支持 ZIP,如需安装文件夹请直接拖入文件夹",dropFailed:"读取拖入的文件夹失败",restartHint:"部分插件(如 hook、monkey-patch 类型)安装或卸载后可能需要重启应用才能完全生效。",installing:"安装中...",installSuccess:"插件安装成功",installFailed:"插件安装失败",uninstall:"卸载",uninstallConfirm:'确定要卸载插件 "{{name}}"?操作无法撤销。部分插件可能需要重启应用才能完全移除。',uninstalling:"卸载中...",uninstallSuccess:"插件卸载成功",uninstallFailed:"插件卸载失败",statusLoaded:"运行中",statusUnloaded:"未加载",type:"类型",version:"版本",author:"作者",unknown:"未知",noMatchingPlugins:"没有符合当前筛选条件的插件",loadFailed:"加载插件列表失败",confirmTitle:"确认卸载",officialTitle:"官方插件",officialDesc:"从下载站获取已发布的插件,一键安装到本机。",catalogRefresh:"刷新",catalogEmpty:"暂无官方插件(请确认已发布到下载 CDN)",catalogLoadFailed:"加载官方插件列表失败",catalogInstall:"安装",catalogReinstall:"重新安装",catalogUpgrade:"可升级",catalogUpgradeBtn:"升级",catalogInstalled:"已安装",catalogSha256:"SHA256",kindBundle:"插件包",kindTool:"工具",filterByName:"按名称筛选",filterByKind:"按标签筛选",marketTitle:"插件市场",marketEmpty:"暂无市场插件",marketLoadFailed:"加载插件市场失败",marketUnavailable:"插件市场正在维护中,请稍后再试",marketSearch:"搜索插件...",marketAll:"全部",marketFeatured:"精选",marketTrending:"热门",marketCategory:"按类别筛选",marketSearchResult:'"{{keyword}}" 相关插件共搜索到 {{count}} 个结果',marketDetails:"详情",marketDownloads:"下载量",marketDeveloper:"开发者",marketSortLabel:"插件排序",marketSortDownloads:"下载量最多",marketSortUpdated:"最近更新",marketSortFavorites:"收藏量最多",compatWarningTitle:"兼容性警告",compatWarningContent:"该插件标注适配 QwenPaw {{labels}},而您当前的 QwenPaw 版本为 {{version}}
168。安装后可能出现错误,是否确认继续?",compatWarningConfirm:"仍然安装"},$R={title:"编程模式",experimental:"实验性功能",experimentalDesc:"编程模式将 QwenPaw 转变为一个轻量级 Web IDE,提供代码编辑器、文件树、Git 集成和 AI 辅助编程能力。",experimentalNote:"该功能目前为实验性阶段,仍在持续开发中,部分功能可能受限或在后续版本中有所变动。",confirmBtn:"确认",enterTooltip:"进入编程模式",exitTooltip:"退出编程模式",btnCode:"代码",btnChat:"聊天",selectProject:"选择项目目录",selectProjectDesc:"选择一个项目开始工作,或使用默认工作区",tabWorkspace:"默认工作区",tabClone:"克隆仓库",tabLocal:"导入本地项目",tabNew:"新建项目",workspaceDesc:"使用当前 Agent 的工作区目录",cloneUrl:"Git 仓库地址",cloneUrlPlaceholder:"https://github.com/user/repo.git",cloneName:"项目名称(可选)",cloneNamePlaceholder:"留空则自动从 URL 获取",cloneBtn:"开始克隆",cloning:"克隆中...",localPath:"本地目录路径",localPathPlaceholder:"/Users/yourname/my-project",localPathHint:"输入本地项目的绝对路径",openBtn:"导入",newName:"项目名称",newNamePlaceholder:"my-project",createBtn:"创建项目",switchProject:"切换项目",currentProject:"当前项目",resetToWorkspace:"重置为默认工作区",dropPrimary:"拖入文件夹,或点击浏览",dropSecondary:"支持从 Finder 直接拖入",pathHint:"请输入完整的绝对路径(以 / 或 ~ 开头)",importing:"导入中...",dropFailed:"读取文件夹失败",workingDir:"工作区目录",importCopyNote:"文件夹将被复制到 QwenPaw 托管的项目库中(不会修改原始文件)",importCopyDesc:"导入会将文件夹复制为副本,Agent 在副本上工作,不会修改原始文件。如需直接操作原目录,请使用「打开目录」",tabOpenDir:"打开目录",openDirDesc:"直接打开本机上已有的目录,不会复制任何文件",openDirBtn:"打开此目录",openDirLoading:"加载中...",openDirEmpty:"此目录下没有子目录",openDirHome:"主目录",openDirRefresh:"刷新",openDirHiddenFolders:"隐藏文件夹"},QR={searchPlaceholder:"在多平台中搜索技能",categoryAll:"全部",categoryPlaceholder:"搜索分类",searchResult:'"{{keyword}}" 相关技能共搜索到 {{count}} 个结果',providerUnavailable:"数据源不可用",noResults:"没有找到结果",startTyping:"在上方输入关键字以搜索技能市场",browseHint:"选择分类或输入关键词以浏览 {{providers}} 中的技能",noDescription:"暂无描述",browseMarket:"浏览市场",installQueue:"安装队列",clearCompleted:"清空",retry:"重试",status:{queued:"排队中",installing:"安装中",completed:"已完成",failed:"失败",cancelled:"已取消"},loadMore:"加载更多",noMoreResults:"没有更多了",detail:{title:"技能详情",version:"版本",author:"作者",sourceUrl:"安装地址",slug:"标识",missing:"—"},stats:{downloads:"下载量",stars:"星标",installs:"安装量",likes:"点赞",views:"浏览量",category:"分类",updatedAt:"更新时间"},queueMsg:{timedOut:"安装超时",failedPrefix:"失败:{{msg}}"}},JR={starting:"正在启动后端服务...",checking:"正在连接后端...",error:"后端服务启动失败。",errorHint:"无法启动后端进程,请检查应用日志了解详情。",errorDetails:"显示错误详情",timeout:"后端服务在 {{seconds}} 秒内未能启动。",timeoutHint:"后端启动失败,请重试,或检查应用日志了解详情。",retry:"重试"},YR={readFile:"阅读 {{file}}",readFileDefault:"阅读 文件",writeFile:"创建 {{file}}",writeFileDefault:"创建 文件",editFile:"编辑 {{file}}",editFileDefault:"编辑 文件",appendFile:"追加 {{file}}",appendFileDefault:"追加 文件",grepSearch:"文本匹配 {{pattern}}",grepSearchDefault:"文本匹配",globSearch:"文件匹配 {{pattern}}",globSearchDefault:"文件匹配",viewImage:"查看图片 {{file}}",viewImageDefault:"查看图片",viewVideo:"查看视频 {{file}}
168",viewVideoDefault:"查看视频",desktopScreenshot:"截图 桌面",sendFile:"发送 {{file}}",sendFileDefault:"发送 文件",browserUse:"浏览 {{detail}}",browserNavigate:"浏览 打开 {{url}}",browserNavigateDefault:"浏览 打开页面",browserClick:"浏览 点击",browserType:"浏览 输入",browserSnapshot:"浏览 快照",browserScroll:"浏览 滚动",getCurrentTime:"获取 当前时间",setTimezone:"设置 {{timezone}}",getTokenUsage:"查询 Token 用量",memorySearch:"搜索记忆 {{query}}",memorySearchDefault:"搜索 记忆",listAgents:"列出 代理",chatWithAgent:"对话 {{agent}}",chatWithAgentDefault:"对话 代理",submitToAgent:"提交 {{agent}}{{task}}",submitToAgentDefault:"提交 任务",checkAgentTask:"检查 {{agent}} #{{taskId}}",checkAgentTaskAgent:"检查 {{agent}}",checkAgentTaskDefault:"检查 任务",delegateExternalAgent:"委派 {{runner}}",delegateExternalAgentDefault:"委派 外部代理",shell:"执行 {{command}}",shellDefault:"执行 命令",runToolBatch:"运行工作流 {{workflow}}",runToolBatchRunning:"正在运行预存工作流",runToolBatchProgress:"共 {{count}} æ­¥",runToolBatchStepCount:"总步骤数:{{count}}",formatTable:{file:"文件",lineNumber:"行号",score:"分数",summary:"摘要",name:"名称",id:"ID",description:"描述",status:"状态"},loading:"处理中...",rawInputPreview:"实时原始参数(最后 4096 个字符)",largeOutputOmitted:"已省略 {{count}} 行 — 可复制当前输出,或按其中的恢复提示获取完整结果",largeOutputTruncated:"输出过长已截断显示 — 可复制当前输出,或按其中的恢复提示获取完整结果",browserAction:{startHeaded:"启动浏览器(有界面)",start:"启动浏览器",stop:"关闭浏览器",open:"打开 {{url}}",openDefault:"打开页面",navigate:"导航 {{url}}",navigateDefault:"导航页面",navigateBack:"返回上一页",click:"点击 {{selector}}",clickDefault:"点击元素",type:"输入 {{text}}",typeDefault:"输入文本",snapshot:"获取快照",screenshot:"æˆ
168ªå›¾ {{path}}",screenshotDefault:"截图",eval:"执行 {{code}}",evalDefault:"执行代码",runCode:"运行 {{code}}",runCodeDefault:"运行代码",closePage:"关闭页面",tabs:"标签页 {{action}}",tabsDefault:"管理标签页",fillForm:"填写表单",fileUpload:"上传 {{filename}}",fileUploadDefault:"上传文件",fileDownload:"下载 {{target}}",fileDownloadDefault:"下载文件",pressKey:"按键 {{key}}",pressKeyDefault:"按键",hover:"悬停 {{selector}}",hoverDefault:"悬停元素",drag:"拖拽",selectOption:"选择选项",waitFor:"等待 {{target}}",waitForDefault:"等待元素",resize:"调整大小 {{w}}x{{h}}",resizeDefault:"调整窗口大小",pdf:"导出PDF {{path}}",pdfDefault:"导出PDF",install:"安装",batch:"批量操作"},lineBadge:{lines:"{{count}}行",addLines:"+{{count}}行",delLines:"-{{count}}行",matches:"{{count}}匹配",files:"{{count}}文件"},inlineResult:{taskId:"任务 #{{id}}",submitted:"已提交"},execute:"执行 {{tool}}",executeDefault:"执行 工具",control:{title:"工具执行中 · 是否转后台?",offload:"转入后台",keep:"保持前台",extendOffload:"推迟转后台",extendKill:"延长执行超时",cancel:"取消执行",autoAction:"{{seconds}}秒后自动执行默认操作:",noCountdown:"无倒计时 · 默认操作:",policyOffload:"转入后台",policyKeep:"不转后台",manage:"后台管理",offloadMode:{title:"工具执行较久 · 即将转入后台",offloadNow:"立即转入后台",preventOffload:"禁止转入后台",delayOffload:"延迟转入后台",countdownCaption:"后自动转入后台",footerNoCountdown:"无倒计时 · 默认将转入后台",ringAria:"距自动转入后台还剩 {{seconds}} 秒",toastAuto:"已自动转入后台",preventedTitle:"已禁止自动转入后台",preventedFooter:"不会自动转入后台;可手动转入后台或取消执行"},keepMode:{title:"工具仍在前台执行",offload:"转入后台",countdownCaption:"后收起本面板",footerNoCountdown:"默认保持前台;可随时手动转入后台",ringAria:"面板将在 {{seconds}} 秒后收起",toastDismiss:"已收起提醒,工具继续前台执行"},toast:{offloaded:"工具已转入后台",keepWaiting:"继续前台等待…",extended:"已延迟转入后台,+30 秒后再次提示",killExtended:"执行超时已延长 30 秒",cancelled:"工具调用已取消",cancelFailed:"取消工具失败",actionFailed:"操作失败。工具可能已结束,或请求被拒绝。",notFound:"找不到该工具调用(可能已结束)。",conflict:"操作被拒绝(工具状态已变化或已达上限)。",networkError:"网络错误,请检查连接后重试。",bgComplete:"后台工具已完成:{{tool}}",bgCancelled:"后台工具已取消:{{tool}}"},hint:{completed:"工具 {{tool}} 已在后台完成",cancelled:"工具 {{tool}} 已取消"},bgQueue:{title:"后台任务",running:"运行中",done:"已完成",doneLabel:"任务已完成",cancelled:"已取消",totalDuration:"总耗时",cancel:"取消",remove:"移除",cancelAll:"全部取消",clearAll:"清除已完成",cancelAllDone:"已取消全部运行中任务",clearAllDone:"已清除已完成任务",showFinished:"显示已完成",emptyRunning:"暂无运行中任务",emptyHiddenFinished:"{{count}} 个已完成(已隐藏)",scrollMore:"可滑动查看",noOutput:"暂无输出"}}},XR={error:{SENSITIVE_FILE_BLOCKED:"该文件被文件防护拦截(敏感文件保护)。",OUTSIDE_WORKSPACE:"该文件位于工作区范围之外。请在 设置 → 安全 → 文件防护 中启用「允许控制台预览工作区外文件」。",FORBIDDEN:"访问被拒绝:没有预览此文件的权限。",NOT_FOUND:"文件未找到,可能已被移动或删除。如果使用了相对路径,请尝试使用绝对路径。",LOAD_FAILED:"加载文件预览失败。",LOAD_FAILED_DETAIL:"加载文件预览失败:{{detail}}"}},ZR={budget:{low:"低",medium:"中",high:"高"},status:{pause:"暂停",resume:"ç»§ç»­",stop:"停止"},gotoSettings:"智能体 Loop 设置",selectorTitle:"Loop 模式",selectorHint:"选择智能体接下来的工作方式",selectorAria:"选择 Loop 模式",builtInModes:"内置",customModes:"自定义与插件",starting:"正在启动",running:"运行中",awaiting_user:"等待你的回复",activePersistentDescription:"该模式会在当前会话中持续生效,直到任务结束或重新开始会话。",activeCustomDescription:"该自定义模式会持续生效,直到使用 /mode off、/clear 或 /new。",loadError:"部分 Loop 模式加载失败。",retry:"重试",modes:{default:{name:"默认",description:"标准的受控智能体 Loop。"},goal:{name:"目标",description:"持续推进一个具体且可验证的目标。"},mission:{name:"任务",description:"运行结构化、可持续的多步骤任务。"}}},eI={common:sR,desktop:rR,chunkError:lR,appCenter:dR,harnesses:cR,nav:uR,os:pR,sidebar:mR,debug:hR,inbox:gR,checkpoints:fR,workspace:bR,agent:kR,acp:yR,skills:vR,skillPool:TR,mcp:SR,heartbeat:CR,cronJobs:wR,channels:PR,sessions:AR,environments:MR,tokenUsage:DR,agentStats:xR,modelSelector:RR,models:IR,files:_R,projectDirectory:LR,agentConfig:ER,tools:FR,modelConfig:OR,header:BR,theme:NR,chat:HR,security:UR,hub:qR,login:jR,account:GR,voiceTranscription:VR,backup:WR,approval:zR,pluginManager:KR,codingMode:$R,market:QR,startup:JR,tool:YR,preview:XR,loop:ZR},tI={save:"保存",reset:"リセット",cancel:"キャンセル",confirm:"確認",apply:"適用",delete:"削除",edit:"編集",create:"作成",upload:"アップロード",download:"ダウンロード",refresh:"更新",retry:"再試
168行",search:"検索",enable:"有効化",disable:"無効化",enabled:"有効",disabled:"無効",preview:"プレビュー",raw:"ソース",view:"閲覧",content:"内容",loading:"読み込み中...",saving:"保存中...",copy:"コピー",copied:"クリップボードにコピーしました",copyFailed:"クリップボードへのコピーに失敗しました",contentPlaceholder:"内容を入力してください...",help:"ヘルプ",close:"閉じる",actions:"操作",total:"合計 {{count}} 件",clear:"クリア",paste:"貼り付け"},aI={connected:"接続済み",disconnected:"切断済み",notConnected:"未接続",comingSoon:"近日公開",connect:"ChatGPTで接続",disconnect:"切断",apiKeyAuthenticated:"API キーで認証済み",chatGptAuthenticated:"ChatGPT に接続済み",cliAuthenticated:"{{type}} CLI 認証済み"},nI={closeWindow:{title:"ウィンドウを閉じる",description:"ウィンドウを閉じるときに実行する操作を選択してください。アプリを終了すると、実行中のすべてのタスクとスケジュール済みタスクが停止します。",remember:"選択を記憶する",showWindow:"ウィンドウを表示",minimizeToTray:"トレイに最小化",quitApp:"アプリを終了",preference:"ウィンドウを閉じる",askEveryTime:"毎回確認する"}},oI={title:"ページの読み込みに失敗しました",subTitle:"ネットワークの問題またはアプリの更新が原因の可能性があります。",genericTitle:"問題が発生しました",genericSubTitle:"このページのレンダリング中に予期しないエラーが発生しました。",reload:"再読み込み"},iI={backToList:"戻る",subtitle:"インストール済みのアプリを管理したり、アプリマーケットからワークスペースを拡張したりできます。",myApps:"マイアプリ",officialApps:"公式アプリ",appMarket:"アプリマーケット",browseOfficialApps:"公式アプリを見る",browseMarket:"アプリマーケットを見る",officialAppsEmpty:"公式アプリはまだありません",searchOfficial:"公式アプリを検索...",installedCount:"{{count}} 個のアプリ",clearFilters:"フィルターをクリア",moreActions:"その他の操作",openApp:"アプリを開く",noDescription:"説明はありません",search:"アプリを検索...",allCategories:"すべて",noApps:"インストール済みのアプリはありません",noResults:"検索条件に一致するアプリはありません",loadFailed:"アプリの読み込みに失敗しました。再試行してください。",appNotLoaded:"このアプリはまだ読み込まれていません。サイドバーから一度開いてから再試行してください。",uninstall:"アンインストール",uninstallConfirmTitle:"アプリをアンインストールしますか?",uninstallConfirmContent:"アプリ「{{name}}」のディレクトリが削除されます。この操作は元に戻せません。",uninstallSuccess:"アプリをアンインストールしました",uninstallFailed:"アンインストールに失敗しました",installing:"インストール中",installSuccess:"インストールしました",installFailed:"インストールに失敗しました",installedStatus:"インストール済み",update:"アップデート",searchMarket:"アプリマーケットを検索...",marketFilters:"アプリマーケットのフィルター",filterAll:"すべて",trending:"人気",marketEmpty:"アプリが見つかりません",loadMore:"さらに読み込む",noMoreApps:"これ以上アプリはありません",install:"インストール",details:"詳細",featured:"おすすめ",refreshApp:"アプリを更新",appRefreshed:"アプリを更新しました",aboutApp:"アプリについて",exitApp:"アプリを終了",moreOptions:"その他のオプション",backToListHint:"アプリ一覧に戻る (ESC)",version:"バージョン",id:"ID",category:"カテゴリ",description:"説明"},sI={chat:"チャット",files:"ファイル",control:"コントロール",channels:"チャンネル",sessions:"セッション",cronJobs:"定期実行",heartbeat:"ハートビート",agent:"ワークスペース",workspace:"ファイル",skills:"スキル",skillPool:"スキルプール",marketplace:"拡張機能",mcp:"MCP",agentConfig:"設定",settings:"設定",models:"モデル",environments:"環境変数",security:"セキュリティ",tokenUsage:"トークン使用量",agentStats:"エージェント統計",tools:"ツール",voiceTranscription:"音声文字起こし",agents:"エージェント管理",debug:"デバッグ",plugins:"プラグイン",acp:"ACP",backups:"バックアップ",pluginManager:"プラグインマネージャー"},rI={console:"コンソール",appStore:"App Store",appStoreDesc:"デスクトップアプリのインストールと削除",arrangeDesktop:"デスクトップを整理",approvalActionFailed:"操作に失敗しました。再試行してください",booting:"起動中…",changeWallpaper:"壁紙を変更",clearAll:"すべてクリア",closeApp:"閉じる",currentSpace:"現在のスペース",currentSpaceLabel:"現在のスペース:{{name}}",currentAppLabel:"現在のアプリ:{{name}}",desktopApps:"デスクトップアプリ",finder:"デスクトップ",focu
168sApp:"フォーカス",install:"インストール",installed:"インストール済み",installedApp:"インストールしました",installedApps:"インストール済みアプリ",launchpad:"Launchpad",moveDockLeft:"左へ移動",moveDockRight:"右へ移動",missionControl:"Mission Control",noInstalledApps:"インストール済みのアプリはありません",noNotifications:"通知はありません",noOpenWindows:"このスペースに開いているウィンドウはありません",noSettings:"利用可能な設定はありません",notInstalled:"未インストール",notifications:"通知",notificationSummary:"承認 {{approvals}} · 受信トレイ {{inbox}}",notifyApproval:"承認",notifyInbox:"受信トレイ",openApp:"開く",keepInDock:"Dock に追加",removeFromDock:"Dock から削除",refreshDesktop:"デスクトップを更新",appMarket:"アプリマーケット",appMarketRefresh:"更新",appMarketSearch:"アプリを検索...",appMarketEmpty:"アプリが見つかりません",appMarketUnavailable:"アプリマーケットは現在利用できません。後でもう一度お試しください。",appMarketInstall:"インストール",appMarketDetails:"詳細",appMarketDeveloper:"開発者",appMarketDownloads:"ダウンロード数",appInstalled:"アプリをインストールしました",appInstallFailed:"アプリのインストールに失敗しました",appCompatibilityWarningTitle:"アプリの互換性に関する警告",appCompatibilityWarningContent:"このアプリは QwenPaw {{labels}} 向けです。現在の QwenPaw バージョンは {{version}} です。インストールするとエラーが発生する可能性があります。続行しますか?",appCompatibilityWarningConfirm:"それでもインストール",appCompatibilityUnverified:"現在の QwenPaw バージョンとの互換性を確認できません。",restoreAll:"すべて復元",returnToConsole:"コンソールに戻る",desktopMode:"デスクトップモード",qwenpawMenu:"QwenPaw メニュー",restoredAll:"すべてのアプリを復元しました",sortBy:"並べ替え",sortFree:"自由配置",sortName:"名前",sortType:"種類",systemSettings:"システム設定",uninstall:"アンインストール",uninstallConfirmTitle:"アプリをアンインストールしますか?",uninstallFailed:"アンインストールに失敗しました",uninstalledApp:"アンインストールしました",update:"アップデート",wallpaper:"壁紙",windows:"個のウィンドウ"},lI={title:"デバッグ",desc:"バックエンドのデーモンログを表示し、問題の調査に役立てます。このページを開いている間は自動で更新されます。",level:{all:"すべて"},backend:{title:"バックエンドログ",autoRefresh:"自動更新",newestFirst:"新しい順",updatedAt:"更新時刻",path:"ログファイル",notFound:"バックエンドログファイルはまだ見つかっていません。",placeholder:"バックエンドログがここに表示されます。",loadFailed:"バックエンドログの読み込みに失敗しました",searchPlaceholder:"バックエンドログを検索..."},actions:{refreshBackend:"バックエンドログを更新",refreshSuccess:"ログを更新しました",copyBackend:"バックエンドログをコピー"}},dI={parent:"設定",agents:"エージェント",management:"エージェント管理",pageDescription:"カスタムワークスペースとアイデンティティを持つ複数の AI エージェントを作成、設定、管理します。",name:"名前",id:"ID",description:"説明",workspace:"ワークスペースパス",backend:{column:"バックエンド",eyebrow:"エージェントアーキテクチャ",typeTitle:"このエージェントの動作方式を選択",typeDescription:"エージェントの種類は、Chat、Coding、Channel のすべての会話に適用されます。",nativeTitle:"QwenPaw ネイティブエージェント",nativeBadge:"ネイティブ",nativeDescription:"設定済みの LLM、Skills、ツール、メモリ、QwenPaw ランタイムを使用します。",thirdPartyTitle:"サードパーティエージェント",thirdPartyBadge:"サードパーティ",thirdPartyDescription:"QwenPaw モデルの代わりに、認証済みの外部エージェントランタイムを使用します。",providerTitle:"サードパーティエージェントを選択",providerDescription:"認証情報はこのデバイスで共有されますが、プロジェクトと会話はエージェントごとに分離されます。",codexHint:"ChatGPT OAuth · エージェントワークスペース",qoderHint:"Qoder アカウントまたは PAT · エージェントワークスペース",account:"Codex アカウント",qoderAccount:"Qoder アカウント",binary:"Codex 実行ファイル",binaryHelp:"空欄の場合は Python SDK 付属の Codex CLI を優先し、単独インストールも自動検出します。手動で指定する場合は、macOS/Linux の codex または Windows の codex.exe のフルパスを入力してください。ChatGPT App やエディター拡張機能に内蔵されたバイナリはサポートされません。QwenPaw は CODEX_BINARY とバックエンドの PATH も参照します。",binaryPlaceholder:"自動検出、または Codex 実行ファイルのパスを貼り付け",qoderBinary:"Qoder 実行ファイル",qoderBinaryHelp:"空欄の場合は Python SDK 同梱の qodercli を優先し、既存のインストールも自動検出します。手動指定では macOS/Linux の qodercli または Windows の qodercli.exe へのフルパスを入力してください。QODERCLI_PATH とバックエンドの PATH も参照します。",qoderBinaryPlaceholder:"自動検出、または qodercli のパスを貼り付け",detect:"再検出",detectedBinary:"Codex を検出しました",qoderDetectedBinary:"Qoder を検出しました",apiKeyLoginHint:"ターミナルで codex login --with-api-key を実行して認証することもできます。",qoderAuthHint:"接続すると Qoder のブラウザログインが開きます。qodercli login の
168実行、またはバックエンド起動前の QODER_PERSONAL_ACCESS_TOKEN 設定も利用できます。",qoderConnect:"Qoder に接続",model:"エージェントモデル",modelDefault:"エージェントのデフォルトを使用",defaultBadge:"デフォルト",reasoningEffort:"推論レベル",reasoningDefault:"モデルのデフォルトを使用",codexNotFound:"Codex runtime が見つかりません。qwenpaw[codex] をインストールするか、単独の Codex CLI を指定してください。",qoderNotFound:"Qoder runtime が見つかりません。qwenpaw[qoder] をインストールするか、qodercli を指定してください。",chatSettingsHint:"Chat ツールバーでモデル、推論レベル、実行権限を選択します。",capabilityTitle:"QwenPaw の機能",inheritedSkills:"スキル",inheritedMcp:"MCP サーバー",runtimeInherited:"実行時に継承 · 新規セッション",notSupported:"このプロバイダーでは未対応",policyCompatibility:"MCP ポリシー",toolAllowlistSupported:"ツール許可リスト対応",policyLimited:"プロバイダーの制限あり",chatModelHint:"エージェント単位の設定 · 次のターンから適用",appliesNextTurn:"次のターンから適用",approvalMode:"実行権限",approvalPresets:{ask:{name:"変更前に確認",description:"ワークスペースの変更を許可し、昇格操作の前に確認します。"},"read-only":{name:"読み取り専用",description:"ファイルを変更せずに確認します。"},workspace:{name:"ワークスペースアクセス",description:"確認なしでワークスペースの変更を許可します。"},"accept-edits":{name:"編集を許可",description:"ファイル編集を許可し、その他の安全確認は維持します。"},plan:{name:"計画のみ",description:"ファイルを変更せずに分析と計画を行います。"},auto:{name:"自動",description:"安全な操作を Qoder が判断して実行します。"},"full-access":{name:"フルアクセス",description:"確認なしで無制限のローカル実行を許可します。"}}},create:"エージェントを作成",createTitle:"新しいエージェントを作成",createSuccess:"エージェントが正常に作成されました",createFailed:"エージェントの作成に失敗しました",edit:"編集",editTitle:"エージェントを編集 - {{name}}",updateSuccess:"エージェントが正常に更新されました",updateFailed:"エージェントの更新に失敗しました",delete:"削除",deleteConfirm:"エージェントの削除を確認",deleteConfirmDesc:"削除後、エージェントは利用できなくなりますが、ワークスペースファイルは保持されます",deleteSuccess:"エージェントが正常に削除されました",deleteFailed:"エージェントの削除に失敗しました",selectAgent:"エージェントを選択",defaultDisplayName:"デフォルトエージェント",currentWorkspace:"現在のエージェント",switchSuccess:"エージェントが正常に切り替えられました",switchFailed:"エージェントの切り替えに失敗しました",loadFailed:"エージェントリストの読み込みに失敗しました",loadConfigFailed:"エージェント設定の読み込みに失敗しました",saveFailed:"エージェントの保存に失敗しました",idRequired:"エージェント ID を入力してください",idLabel:"エージェント ID(任意)",idHelp:"空欄のままにすると自動生成されます。英数字、ハイフン、アンダースコアのみ使用可能。",idPattern:"ID は英数字、アンダースコア、ハイフンのみ使用できます",idPlaceholder:"例:my-agent",nameRequired:"エージェント名を入力してください",namePlaceholder:"例:マイエージェント",descriptionPlaceholder:"このエージェントの目的を簡単に説明してください...",workspaceHelp:"空欄のままにすると、~/.qwenpaw/workspaces/<id> に自動生成されます",dragHandleTooltip:"ドラッグしてエージェントの順序を変更",reorderSuccess:"エージェントの順序を保存しました",reorderFailed:"エージェントの順序を保存できませんでした",defaultNotEditable:"デフォルトのエージェントは編集できません",defaultNotDeletable:"デフォルトのエージェントは削除できません",disable:"無効化",enable:"有効化",disabled:"無効",disableConfirm:"エージェントの無効化を確認",disableConfirmDesc:"無効化後、エージェントインスタンスは起動しませんが、リストには表示されます",enableConfirm:"エージェントの有効化を確認",enableConfirmDesc:"有効化後、エージェントは切り替えて使用できるようになります",disableSuccess:"エージェントが無効化されました",enableSuccess:"エージェントが有効化されました",toggleFailed:"エージェント状態の切り替えに失敗しました",enableAgent:"{{name}} を有効化",disableAgent:"{{name}}
168 を無効化",disabledAgents:"無効 ({{count}})",pinnedAgents:"固定済み",otherAgents:"その他のエージェント",pinned:"固定済み",defaultPinned:"デフォルトエージェントは常に固定されます",longPressToPin:"長押しで固定",longPressToUnpin:"長押しで固定解除",pinAgent:"エージェントを固定",unpinAgent:"エージェントの固定を解除",pinSuccess:"エージェントを固定しました",unpinSuccess:"エージェントの固定を解除しました",pinFailed:"固定状態を更新できませんでした",status:{disabled:"無効",pending:"起動待ち",starting:"起動中",running:"実行中",failed:"起動失敗",waitUntilStarted:"起動完了後に操作できます"},defaultNotDisablable:"デフォルトのエージェントは無効化できません",currentAgentDeleted:"現在のエージェントが削除されました。デフォルトエージェントに自動切り替えしました",currentAgentDisabled:"現在のエージェントが無効化されました。デフォルトエージェントに自動切り替えしました",switchedToDefault:"デフォルトエージェントに自動切り替えしました",cannotSwitchToDisabled:"このエージェントは無効化されています。管理ページで有効化してください",model:"モデル",modelHelp:"このエージェントに特定の LLM モデルを割り当てます。空欄の場合はグローバルデフォルトが使用されます。",modelPlaceholder:"グローバルデフォルト",noConfiguredModels:"設定済みのモデルがありません",modelColumn:"モデル",initialSkills:"初期スキル",initialSkillsHelp:"プールからスキルを追加選択します。後でいつでも追加・削除できます。",selectAll:"すべて",selectBuiltin:"組み込み",selectNone:"クリア",noPoolSkills:"プールに利用可能なスキルがありません",addSkillsToAgent:"スキルを追加",copyTooltip:"エージェント設定をコピー",copyDefaultTooltip:"デフォルトエージェントをテンプレートとしてコピー",copyTitle:"エージェント設定をコピー",copyNameLabel:"新しいエージェント名",copyOptionsLabel:"コピー内容",copyOptionAgentJson:"agent.json(必須)",copyOptionAgentJsonHint:"解析済みのソース設定を常にコピーし、ID・名前・workspace・channels のみリセットします。ディスク上の agent.json をそのまま複製するわけではありません。",copyOptionMdFiles:"AGENTS / SOUL / PROFILE / HEARTBEAT / BOOTSTRAP.md",copyOptionSkills:"skills/ + manifest",copyOptionJobs:"jobs.json",copyOptionJobsHint:"ジョブ定義のみをコピーし、実行履歴は含みません。作成後、新しいエージェントはスケジュールに従ってすぐに実行を開始します。",copySuccess:"エージェント設定のコピーに成功しました",copyFailed:"エージェント設定のコピーに失敗しました",mailManagement:"メール管理",mailModeNone:"メール管理は不要",mailModePersonal:"個人のメールボックスを管理",mailModeDedicated:"エージェント専用のメールボックスを用意",mailName:"メールボックス名",mailNameOptional:"メールボックス名(任意)",mailDomain:"メールドメイン",mailPassword:"パスワード",mailPhone:"電話番号",mailAuthCode:"16桁の認証コード",mailNameRequired:"メールボックス名を入力してください",mailPasswordRequired:"パスワードを入力してください",mailPhoneRequired:"電話番号を入力してください",mailAuthCodeRequired:"認証コードを入力してください",mailAuthCodeLength:"認証コードは16桁である必要があります",mailDomainRequired:"メールドメインを選択してください",mailDomainInvalid:"有効なメールドメインを入力してください(例:mycompany.com)",mailDomainPlaceholder:"メールドメインを選択または入力",mailProvider:"メールプロバイダー",mailProviderRequired:"メールプロバイダーを選択してください",mailProviderPlaceholder:"このドメインをホストするプロバイダーを選択",mailProviderTencentExmail:"Tencent Exmail(騰訊企業メール)",mailProviderAliyunQiye
168:"Alibaba Enterprise Mail(阿里企業メール)",mailProviderNeteaseQiye:"Netease Enterprise Mail(網易企業メール)",mailCredentialLabel:"認証情報",mailCredentialRequired:"認証情報を入力してください",mailCredentialHintAuthCode:"メールボックス設定で生成した16桁の認証コードを入力してください",mailCredentialHintGmail:"Gmailのアプリパスワードを入力してください(2段階認証の有効化が必要)",mailCredentialHintAliyun:"メールボックスのログインパスワードを入力してください",mailCredentialHintEnterprise:"クライアント専用パスワードまたはメールボックスのログインパスワードを入力してください",mailPushTitle:"新着メールの自動応答",mailAccessControl:"メールアクセス制御",mailAccessControlTip:"有効にすると、不明な差出人からのメールは承認されるまで処理されません",mailPushModeOff:"オフ",mailPushModeRulesOnly:"ルールのみ",mailPushModeRulesThenAgent:"ルール + 必要時に起動",mailPushModeAgentAll:"毎回起動",mailPushModeOffDesc:"新着メールを自動処理しません",mailPushModeRulesOnlyDesc:"以下のルールのみで新着メールを処理し、エージェントは起動しません",mailPushModeRulesThenAgentDesc:"まずルールで処理し、起動アクションに一致した場合のみエージェントを起動します",mailPushModeAgentAllDesc:"新着メールごとにエージェントを起動し、処理方法をエージェントが自律的に判断します",mailPushModeLegacySuffix:"(旧版)",mailPushFieldFrom:"差出人",mailPushFieldSubject:"件名",mailPushFieldContent:"内容",mailPushFieldKeyword:"キーワード",mailPushActionMarkRead:"既読にする",mailPushActionMove:"フォルダへ移動",mailPushActionNotify:"通知のみ",mailPushActionWakeAgent:"エージェントを起動",mailPushContainsPlaceholder:"含まれるテキスト",mailPushParamMovePlaceholder:"移動先フォルダ",mailPushParamWakePlaceholder:"追加指示(任意)",mailPushParamRequired:"移動先フォルダを入力してください",mailPushAddRule:"ルールを追加",mailPushWakeOptionInvoice:"請求書・領収書メールの添付を保存してアーカイブ",mailPushWakeOptionReply:"問い合わせメールに丁寧に返信",mailPushWakeOptionOtp:"認証コードを抽出して通知",mailPushWakeOptionSummary:"メールの要点をまとめて受信箱に保存"},cI={nav:"チェックポイント",title:"状態チェックポイント",auto:"自動",autoEnabled:"自動チェックポイントを有効にしました",autoDisabled:"自動チェックポイントを無効にしました",refresh:"更新",snapshot:"スナップショット",snapshotCreated:"スナップショットを作成しました",graph:"グラフ",checkpoint:"チェックポイント",type:"種類",commit:"コミット",createdAt:"作成日時",session:"セッション",channel:"チャンネル",parent:"親",details:"チェックポイントの詳細",search:"クエリ、名前、セッション、SHAを検索",allTypes:"すべての種類",allSessions:"すべてのセッション",showingLatest:"最新{{count}}件を表示",loadFailed:"チェックポイントを読み込めません",retry:"再試行",more:"その他の操作",noMatches:"条件に一致するチェックポイントはありません。",empty:"状態チェックポイントはまだありません。作成後、履歴がここに表示されます。",kind:{auto:"自動",snapshot:"スナップショット",safety:"安全",commit:"コミット"},summary:{total:"件"},snapshotDialog:{title:"スナップショットを作成",session:"セッション",name:"名前",placeholder:"任意の名前"},gc:{settingsAction:"自動整理設定",settingsTitle:"自動整理設定",keepCount:"保持する自動チェックポイント数",keepDays:"自動チェックポイントの保持日数",preRestoreDays:"復元前スナップショットの保持日数",settingsSaved:"自動整理設定を保存しました",thoroughAction:"Thoroughly compact checkpoints",thoroughTitle:"Thoroughly compact checkpoints?",thoroughDescription:"自動チェックポイントの保持ポリシーを無視して {{count}} 件を削除します。各セッションの HEAD は保持されます。",thoroughConfirm:"Thoroughly compact",thoroughSuccess:"Removed {{count}} checkpoint(s) during thorough compaction",action:"チェックポイントを整理",title:"保持ポリシーに従ってチェックポイントを整理しますか?",description:"現在の保持ポリシーに従い、期限切れのチェックポイント {{count}} 件を削除します。各セッションの HEAD は保持されます。",confirm:"整理",success:"{{count}}件を削除しました"},reset:{action:"チェックポイントをリセット",title:"すべてリセットしますか?",description:"すべてのチェックポイントを完全に削除し、自動作成を無効にします。",confirm:"リセット",success:"リセットしました"},restore:{action:"復元",title:"チェックポイントを復元",preview:"復元をプレビュー",confirm:"復元",conversation:"会話",memory:"メモリ",files:"ワークスペースファイル",refreshWarning:"会話が変更されます。復元後に会話を更新してください。",selectedCount:"{{count}}ファイルを選択",selectAll:"変更ファイルをすべて選択",delete:"削除",restore:"復元",noFileChanges:"復元が必要なファイルはありません。",success:"復元しました。会話を更新して状態を読み込んでください。"}},uI={title:"ファイル",workspacePath:"ワークスペース:",noFiles:"ファイルなし",coreFiles:"コアファイル",coreFilesDesc:"ペルソナ・アイデンティティ・ツールガイダンスを設定します。",uploadTooltip:"ZIPファイルのみ",uploadTooltipWithLimit:"ZIPファイルのみ、最大{{limit}}MB",selectFile:"編集するファイルを選択",fileContent:"ファイルの内容...",uploadSuccess:"ファイルのアップロードに成功しました",uploadFailed:"ファイルのアップロードに失敗しました",downloadPreparing:"ワークスペースのダウンロードを準備中...",downloadSuccess:"ワークスペースのダウンロードに成功しました",downloadFailed:"ワークスペースのダウンロードに失敗しました",zipOnly:"アップロードできるのは .zip ファイルのみです",fileSizeExceeded:"ファイルサイズが{{limit}}MBの制限を超えています。現在のファイル: {{size}}MB",systemPromptToggleTooltip:"システムプロンプトへのファイル読み込みを有効/無効にする",memoryFileWarning:"MEMORY.md は通常、エージェントがツールを使用してオンデマンドで照会および読み込みます。システムプロンプトに読み込むと、コンテキストが長くなりすぎる可能性があります。",configUpdated:"システムプロンプト設定が更新されました",configUpdateFailed:"システムプロンプト設定の更新に失敗しました",attribution:"ワークスペースの設計はOpenClawプロジェクトの一部を参考にしています — ありがとう!🐾",saveSuccess:"保存しました",saveFailed:"保存に失敗しました"},pI={title:"スキル",description:"エージェントのスキルと機能を管理します。",preload:"プリロード",preloadHint:"有効にすると、エージェントがこのスキルをプリロードし、会話中に探して読み込む必要がなくなります。",qwenpawManaged:"QwenPaw 管理",qwenpawManagedHint:"編集可能で、実行時に対応する外部エージェントへ反映されます。",providerManaged:"サードパーティエージェントのスキル",providerManagedHint:"現在のサードパーティエージェントから検出され、読み取り専用で表示されます。",providerOnly:"現在のサードパーティエージェントのみ",readOnly:"読み取り専用",noDescription:"説明はありません。",providerSkillDetails:"サードパーティエージェント Skill の詳細",providerManagedDetailHint:"この Skill はサードパーティエージェントによって管理されています。QwenPaw では表示および使用できますが、変更はできません。",provider:"サードパーティエージェント",scope:"スコープ",statusLabel:"ステータス",descriptionLabel:"説明",importHub:"URL からアップロード",supportedSources:"対応ソース:",importSkills:"スキルをインポート",enterSkillUrl:"スキルのURLを入力",supportedSkillUrlSources:"サポートされているスキルマーケットプレイス:",urlExamples:"URLの例:",urlValid:"{{source}}
168 からの有効な URL",invalidUrl:"無効な URL",clickToFill:"クリックして URL を入力",invalidSkillUrlSource:"サポートされているマーケットプレイスのスキルURLであることを確認してください",type:"タイプ",installedFrom:"インストール元",source:"ソース",path:"パス",tags:"タグ",builtin:"組み込み",custom:"カスタム",addSkill:"スキルを追加",createSkill:"スキルを作成",viewSkill:"スキルを表示",editSkill:"スキルを編集",skillName:"スキル名",skillContent:"スキルの内容",pleaseInputName:"スキル名を入力してください",pleaseInputContent:"スキルの内容を入力してください",skillNamePlaceholder:"例: weather_query",contentPlaceholder:`---
169name: <スキル名> (必須)
170description: <スキルの説明> (必須)
171metadata: { "qwenpaw": { "emoji": "🔧" } }
172---
173
174スキルの実装内容...
175
176# 例:
177# ---
178# name: cron
179# description: qwenpawコマンド経由でcronジョブを管理 - タスクの作成・照会・一時停止・再開・削除
180# metadata: { "qwenpaw": { "emoji": "⏰" } }
181# ---`,createSuccess:"スキルを作成しました",createFailed:"スキルの作成に失敗しました",deleteConfirm:"このスキルを削除してもよろしいですか?",deleteSuccess:"スキルを削除しました",deleteFailed:"スキルの削除に失敗しました",batchEnable:"有効化",batchDisable:"無効化",batchEnableSuccess:"{{count}}個のスキルを有効にしました",batchEnablePartial:"{{enabled}}個有効化、{{failed}}個失敗",batchEnableFailed:"一括有効化に失敗しました",batchDisableSuccess:"{{count}}個のスキルを無効にしました",batchDisablePartial:"{{disabled}}個無効化、{{failed}}個失敗",batchDisableFailed:"一括無効化に失敗しました",batchDeleteTitle:"{{count}}個のスキルを削除しますか?",batchDeleteSuccess:"{{count}}個のスキルを削除しました",batchDeletePartial:"{{deleted}}個削除、{{failed}}個失敗",batchDeleteFailed:"一括削除に失敗しました",selectedCount:"{{count}}個選択中",selectAll:"すべて選択",clearSelection:"クリア",updateSuccess:"スキルを更新しました",updateFailed:" スキルの更新に失敗しました",frontmatterRequired:"スキルは --- で始まり --- で終わる必要があります",frontmatterNameRequired:"スキルに必須フィールド「name」がありません",frontmatterDescriptionRequired:"スキルに必須フィールド「description」がありません",editNotSupported:"スキルの編集に失敗しました",editNote:"ヒント: ここでスキルの内容、チャンネル範囲、設定を編集できます。",create:"作成",optimizeWithAI:"AI最適化",stopOptimize:"停止",optimizeSuccess:"スキルを最適化しました",optimizeFailed:"スキルの最適化に失敗しました",noContentToOptimize:"最適化するコンテンツがありません",cancelImport:"インポートを中止",importCancelled:"スキルのインポートを中止しました",importTimeout:"スキルのインポートがタイムアウトしました。再試行するかネットワークを確認してください。",uploadSkill:"スキルをアップロード",uploadZip:"Zip をアップロード",uploadSuccess:"スキルのアップロードに成功しました",uploadFailed:"スキルのアップロードに失敗しました",uploadNoChange:"新しいスキルはインポートされませんでした。既に存在する可能性があります",zipOnly:"アップロードは .zip ファイルのみ対応しています",fileSizeExceeded:"ファイルサイズが{{limit}}MBの制限を超えています。現在のファイル: {{size}}MB",channels:"適用チャンネル",allChannels:"すべて",lastUpdated:"更新日時",searchPlaceholder:"名前で絞り込み",listView:"リスト表示",gridView:"カード表示",refreshHint:"ディスクからスキルを更新",poolSync:"同期状態",uploadedToPool:"スキルプールにアップロードしました",downloadedToWorkspace:"現在のワークスペースにダウンロードしました",builtinUpgradeTitle:"ビルトインスキルのアップグレード",builtinUpgradeContent:"スキルプールにビルトインスキル「{{name}}」の新しいバージョンがあります。現在のバージョンを上書きしますか?",languageSwitchTitle:"スキル言語の切り替え",languageSwitchContent:"次のスキルはプール内に異なる言語バージョンがあり、上書きされます:",overwriteExistingList:"次のスキルは既に存在しており、上書きされます:",nameConflict:"名前の競合が検出されました。推奨される名前変更が入力されました。",uploadToPoolHint:"選択したワークスペーススキルを共有ローカルスキルプールにアップロードします",downloadFromPool:"スキルプールから読み込む",uploadToPool:"スキルプールに同期",emptyStateBadge:"新しいワークスペースは空で始まります",emptyStateTitle:"このエージェントにはまだスキルがありません",emptyStateText:"これは正常な状態です。新しいワークスペースにはスキルが自動的に含まれていません。スキルプールからスキルをダウンロードするか、ここで新しいスキルを作成して、このエージェントを装備してください。",emptyStateDownload:"スキルプールから読み込む",emptyStateCreate:"最初のスキルを作成",selectWorkspaceSkill:"ワークスペーススキルを選択",selectPoolItem:"スキルプール項目を選択",renameOptional:"名前変更(任意)",renamePlaceholder:"競合時に推奨される名前変更がここに表示されます",renameSingleOnly:"名前変更はスキルを1つだけ選択した場合にのみ利用できます。",downloadSkillPool:"スキルプールをダウンロード",uploadSkillPool:"スキルプールにアップロード",config:"設定",configPlaceholder:'{"KEY": "value"}',configInvalidJson:"無効な JSON 形式",configSaved:"設定を保存しました",loadFailed:"スキルの読み込みに失敗しました",refreshFailed:"スキルの更新に失敗しました",createdSuccessfully:"作成しました",saveFailed:"保存に失敗しました",importFailed:"インポートに失敗しました",disabledSuccessfully:"無
181効化しました",enabledSuccessfully:"有効化しました",operationFailed:"操作に失敗しました",provideUrl:"ハブスキルのURLを入力してください",validUrl:"http:// または https:// で始まる有効なURLを入力してください",importedSkill:"スキルをインポートしました: {{name}}",batchOperation:"一括操作",exitBatch:"一括操作を終了",noSearchResults:"検索に一致するスキルが見つかりません",filterByTag:"タグで絞り込み",noTags:"利用可能なタグがありません",enabledSkills:"有効なスキル",disabledSkills:"無効なスキル",active:"個有効"},mI={description:"ビルトインスキルとワークスペースアップロード用の共有ローカルスキルプール。ClawHub や LobeHub などの外部インポートは別機能です。",broadcast:"ブロードキャスト",broadcastHint:"スキルプールのスキルを全てまたは選択したワークスペースにブロードキャスト",refreshHint:"ディスクからスキルプールを更新",deleteExternalConfirm:"外部スキルのファイル {{path}} をディスクから削除します。",deleteExternalBatchWarning:"選択した外部スキルはディスクから完全に削除されます。",broadcastTitle:"{{name}} をブロードキャスト",automation:"自動化",builtinAutoUpdate:"自動更新",builtinAutoUpdateFlow:"ビルトインパッケージ → スキルプール",autoSyncFlow:"スキルプール → エージェントのワークスペース",automationBoth:"自動更新 + 自動同期",automationMixedHint:"詳細を開いて自動更新または自動同期を設定します。",automationEnableHint:"自動更新と自動同期を有効にします。",automationDisableHint:"自動更新と自動同期を無効にします。",automationEnabled:"{{name}} の自動更新と自動同期を有効にしました",automationDisabled:"{{name}} の自動更新と自動同期を無効にしました",automationFailed:"自動化設定を更新できませんでした",automationNeedsAttention:"保存しました。{{count}} 件は受信トレイで確認してください。",autoSync:"自動同期",autoSyncEnableHint:"自動同期を有効にします。",autoSyncDisableHint:"自動同期を無効にします。",autoSyncEnabled:"{{name}} の自動同期を有効にしました",autoSyncDisabled:"{{name}} の自動同期を無効にしました",autoSyncAgentsPlaceholder:"このスキルがあるすべてのエージェント",autoSyncAgentsHint:"空欄なら既存のコピーを同期します。特定のエージェントも選択できます。",importBuiltin:"ビルトインを取り込む",importBuiltinHint:"ソースからビルトインスキルをプールに取り込みます",importBuiltinAlertHint:"{{count}} 件のビルトイン変更を確認してください",importBuiltinSuccess:"ビルトインを取り込みました: {{names}}",importBuiltinConflicts:"名前の競合でスキップしました: {{names}}",importBuiltinNoChanges:"取り込むビルトイン変更はありません",importBuiltinFailed:"ビルトインã
181®å–り込みに失敗しました",importBuiltinConflictTitle:"ビルトインの競合が見つかりました",importBuiltinConflictContent:"以下のビルトインは現在のプール内コピーと異なります。確認するとソース版で上書きします。",sourceVersion:"ソース版",currentVersion:"現在の版",builtinLanguage:"言語",langDefault:"デフォルト",langDefaultTooltip:"各スキルの元の言語設定を保持",langEn:"英語",langZh:"中国語",builtinLanguageChangeTitle:"ビルトイン言語を切り替えますか?",builtinLanguageChangeContent:"プール内の「{{name}}」を {{language}} 版のビルトインで上書きしますか?",builtinLanguageChangeSuccess:"「{{name}}」を {{language}} に切り替えました",builtinLanguageChangeFailed:"ビルトイン言語の切り替えに失敗しました",importStatusMissing:"プールにありません",importStatusCurrent:"最新です",importStatusOutdated:"バージョンが古いです",importStatusLanguageSwitchTo:"{{language}}版で上書きします",importStatusConflict:"競合",builtinNoticeSummary:"{{count}} 件のビルトイン変更が見つかりました",builtinNoticeLineAdded:"追加: {{names}}",builtinNoticeLineMissing:"不足: {{names}}",builtinNoticeLineUpdated:"更新: {{names}}",builtinNoticeLineRemoved:"削除: {{names}}",zipImport:"ZIPインポート",create:"作成",edit:"編集",delete:"削除",descriptionLabel:"説明",tags:"タグ",tagsPlaceholder:"タグを選択または入力",filterByTag:"タグで絞り込む",version:"バージョン",createTitle:"スキルプール項目を作成",editTitle:"{{name}} を編集",skillNamePlaceholder:"スキル名",contentPlaceholder:"SKILL.md の内容",nameConflict:"名前の競合が検出されました。推奨される名前変更が適用されました。",deletedFromPool:"スキルプールから削除しました",deleteBuiltinConfirm:"このビルトインスキルをプールから削除します。後でソースから再度取り込めます。",deleteConfirm:"共有ローカルスキルプールからこのスキルを削除します。",deleteTitle:"{{name}} を削除しますか?",batchDeleteTitle:"{{count}}個のプールスキルを削除しますか?",batchDeleteSuccess:"{{count}}個のプールスキルを削除しました",batchDeletePartial:"{{deleted}}個削除、{{failed}}個失敗",batchDeleteFailed:"一括削除に失敗しました",imported:"インポート済み:{{names}}",noNewImports:"新しいスキルはインポートされませんでした",allBuiltin:"すべての組み込み",selectWorkspaces:"ワークスペースにブロードキャスト",allWorkspaces:"すべてのワークスペース",optionalRename:"任意の名前変更",back:"戻る",skillCount:"{{count}} スキル",skillName:"スキル名",status:"状態",installedFrom:"インストール元",updateBuiltin:"更新",updateConfirmTitle:"{{name}} を更新",updateConfirmContent:"バージョン {{version}} に更新しますか?現在のプールコピーが最新の組み込みバージョンに置き換えられます。",updateSuccess:"更新しました",updateFailed:"更新に失敗しました",broadcastSuccess:"ブロードキャストが完了しました",broadcastFailed:"ブロードキャストに失敗しました",overwriteConfirm:"既存のスキルを上書きしますか?",overwriteTargetsContent:"次の既存ターゲットは上書きされます:",builtinOverwriteTargetsContent:"次のビルトインターゲットはバージョンが異なるため、上書きされます:",renameAndRetry:"同名のスキルが存在します。推奨名を使用しますか?",multiConflictTitle:"複数の競合が検出されました",multiConflictDesc:"以下のスキルは既に存在します。競合を個別に解決してから再試行してください:",singleConflictRename:'"{{name}}" は既に存在します。"{{suggested}}" にリネームして続行しますか?',statusUpToDate:"最新",statusSynced:"同期済み",statusOutdated:"古いです",statusNotSynced:"未同期",statusConflict:"競合",renameEntry:'"{{name}}" の新しい名前:',builtin:"組み込み",custom:"カスタム"},hI={title:"MCPクライアント",qwenpawManaged:"QwenPaw 管理",qwenpawManagedHint:"統合コントロールプレーンで管理し、対応ã
181™ã‚‹ã‚µãƒ¼ãƒ‰ãƒ‘ーティエージェントへ実行時に注入します。",providerManaged:"{{provider}} ローカル MCP",providerManagedHint:"サードパーティエージェント固有の設定から検出されます。読み取り専用で、そのエージェントだけで使用できます。",providerOnly:"サードパーティエージェント限定",readOnly:"読み取り専用",create:"クライアントを作成",formatSupport:"サポートされているフォーマット",standardFormat:"標準(mcpServers でラップ)",directFormat:"直接(キー → 設定オブジェクト)",singleFormat:"単一クライアント(フラットなフィールド)",emptyState:"MCPクライアントがまだ設定されていません",loadError:"MCPクライアントの読み込みに失敗しました",createSuccess:"MCPクライアントを作成しました",createError:"MCPクライアントの作成に失敗しました",updateSuccess:"MCPクライアントを更新しました",updateError:"MCPクライアントの更新に失敗しました",enableSuccess:"MCPクライアントを有効化しました",disableSuccess:"MCPクライアントを無効化しました",toggleError:"MCPクライアントのステータス変更に失敗しました",deleteConfirm:"このMCPクライアントを削除してもよろしいですか?",deleteSuccess:"MCPクライアントを削除しました",deleteError:"MCPクライアントの削除に失敗しました",maskedFieldHint:"機密フィールドは *** でマスクされています。マスク値の直接編集はできません。変更するには完全な新しい値に置き換えてください。",tools:"ツール&権限",noTools:"このMCPサーバーには利用可能なツールがありません",toolsLoadError:"MCPサーバーからツール一覧の取得に失敗しました",toolsConnecting:"MCPサーバーに接続中です。しばらくしてから再度お試しください",toolSchema:"入力スキーマ",access:{title:"アクセス",button:"アクセス",summary:"MCPアクセスポリシー",clientSection:"全体アクセス",toolSection:"ツールアクセス",default:"デフォルト",sourceType:"ソース",sourceValue:"ソース値",sourceValueAllChannels:"すべてのチャンネル",subjectType:"対象",subjectValue:"対象値",effectLabel:"ポリシー",source:{channel:"チャンネル"},subjectTypeOption:{all:"すべて",user:"ユーザー"},sourceValuePlaceholder:{channel:"console / dingtalk"},subjectValuePlaceholder:"例: alice",subjectValuePlaceholderSelectedSource:"選択したソース内のユーザーID",subjectValuePlaceholderScoped:"{{source}} のユーザーID",subjectValueAll:"すべて",recentUserPlaceholder:"ユーザーIDは選択したソース内で有効です。再入力または選択してください",noRecentUsers:"このソースに最近のユーザーはいません。ユーザーIDを手入力できます",ambiguousUserSourceWarning:"ユーザーIDはソース内でのみ一意です。チャンネルを指定して、別チャンネルのユーザーと誤って一致しないようにしてください。",unknownUserValueWarning:"このユーザーIDは最近のアクティブユーザーにありません。保存は可能です。",validation:{missingUserValue:"具体的なソースを選択し、有効なユーザーIDを入力してください。",ambiguousUserSource:"ユーザールールは、すべてのチャンネルではなく特定のチャンネルを対象にしてください。",unknownUserValue:"このユーザーIDは最近のアクティブユーザーにありません。保存は可能です。"},addRule:"ルールを追加",deleteRule:"ルールを削除",noClientRules:"ルールなし",noRules:"ルールなし。デフォルトポリシーを使用します",inherit:"継承({{effect}})",stale:"見つかりません",disabledTools:"このMCPクライアントは無効です。保存済みのアクセスルールは引き続き編集できます。",discardTitle:"未保存の変更を破棄しますか?",discardContent:"未保存のアクセスポリシー変更は失われます。",loadError:"MCPアクセスポリシーの読み込みに失敗しました",saveSuccess:"MCPアクセスポリシーを保存しました",saveError:"MCPアクセスポリシーの保存に失敗しました",unmanagedRules:"{{count}} 件の詳細ルール",effect:{allow:"許可",ask:"確認",deny:"拒否"}},tab:{json:"JSONインポート",form:"フォームモード"},form:{key:"クライアントキー",keyPlaceholder:"my-mcp-server",keyRequired:"クライアントキーは必須です",name:"表示名",namePlaceholder:"My MCP Server",n
181ameRequired:"表示名は必須です",transport:"トランスポート",url:"サーバーURL",urlRequired:"リモートMCPサーバーにはURLが必要です",command:"コマンド",commandRequired:"stdioトランスポートにはコマンドが必要です",args:"引数(スペースまたは改行区切り)",description:"説明",descriptionPlaceholder:"任意の説明",env:"環境変数",envPlaceholder:"KEY=VALUE(1行に1つ)"},oauth:{enableOAuth:"OAuth 認証を使用する",manage:"OAuth",authorized:"認証済み",notAuthorized:"未認証",expired:"トークン期限切れ",failed:"認証失敗",waiting:"認証待ち...",authorize:"認証する",reauthorize:"再認証する",revoke:"取り消す",startFailed:"OAuthフローの開始に失敗しました",authFailed:"OAuth認証に失敗しました",popupBlocked:"ポップアップがブラウザにブロックされました。許可してから再試行してください。",windowClosed:"認証ウィンドウが閉じられました。再試行してください。",noUrl:"先にサーバーURLを入力してください",noClientKey:"先にクライアントを作成してください",showAdvanced:"詳細オプション",hideAdvanced:"詳細オプションを隠す",clientId:"Client ID(任意)",clientIdPlaceholder:"空白のままで動的クライアント登録を使用",scope:"Scope(任意)",scopePlaceholder:"openid profile email",authEndpoint:"Authorization Endpoint(上書き)",tokenEndpoint:"Token Endpoint(上書き)",endpointHint:"空白のままにするとMCPサーバーから自動検出されます。"}},gI={title:"ハートビート",description:"一定間隔でHEARTBEAT.mdを実行してセルフチェックを行います。デフォルトでは現在の会話に影響を与えずサイレントに動作しますが、オプションで最後のチャットチャンネルに返信を送ることもできます。",enabled:"ハートビートを有効化",every:"間隔",everyRequired:"必須",everyMin:"1以上の値が必要です",timeoutSeconds:"実行タイムアウト(秒)",timeoutRequired:"必須",timeoutMin:"1以上の値が必要です",timeoutMax:"3600以下の値が必要です",unitMinutes:"分",unitHours:"時間",target:"返信先",targetMain:"サイレントモード(デフォルト、チャンネル出力なし)",targetLast:"最後のチャットチャンネルに送信",activeHours:"稼働時間(任意)",activeStart:"開始時刻",activeEnd:"終了時刻",loadFailed:"ハートビート設定の読み込みに失敗しました",saveSuccess:"保存しました。ハートビートをホットリロードしました",saveFailed:"ハートビート設定の保存に失敗しました",targetInbox:"受信トレイに送信",runNow:"今すぐ実行",runNowSuccess:"ハートビートを実行しました。受信トレイまたは送信先チャンネルを確認してください。",runNowFailed:"ハートビートの実行に失敗しました"},fI={title:"定期実行",description:"指定した時刻に自動実行されるスケジュールタスクを作成・管理します。",createJob:"ジョブを作成",editJob:"ジョブを編集",confirmDelete:"削除の確認",deleteConfirm:"この定期実行ジョブを削除してもよろしいですか?",okText:"OK",cancelText:"キャンセル",deleteText:"削除",id:"ジョブID",name:"ジョブ名",enabled:"ステータス",scheduleType:"スケジュールタイプ",scheduleCron:"スケジュール(Cron)",scheduleCronLabel:"スケジュール(Cron)",scheduleTimezone:"タイムゾーン",cronType:"頻度",cronTypeHourly:"毎時",cronTypeDaily:"毎日",cronTypeWeekly:"毎週",cronTypeCustom:"カスタム",cronTime:"時刻",cronDaysOfWeek:"曜日",cronDayMon:"月曜日",cronDayTue:"火曜日",cronDayWed:"水曜日",cronDayThu:"木曜日",cronDayFri:"金曜日",cronDaySat:"土曜日",cronDaySun:"日曜日",cronCustomExpression:"Cron式",taskText:"メッセージ内容",action:"操作",disable:"無効化",executeNow:"今すぐ実行",edit:"編集",delete:"削除",totalItems:"合計 {{count}} ä»¶",perPage:"ä»¶/ページ",pleaseInputId:"ジョブIDを入力してください",pleaseInputName:"ジョブ名を入力してください",pleaseInputCron:"Cron式を入力してください",pleaseSelectTaskType:"タスクタイプを選択してください",pleaseInputRequest:"リクエスト内容を入力してください",pleaseInputMessageContent:"メッセージ内容を入力してください",pleaseInputChannel:"対象チャンネルを入力してください",pleaseInputUserId:"対象ユーザーIDを入力してください",pleaseInputSessionId:"対象セッションIDを入力してください",jobIdPlaceholder:"ä¾
181‹: daily-report-job",jobNamePlaceholder:"例: 毎朝の日報",selectTimezone:"タイムゾーンを選択",taskDescriptionPlaceholder:"テキストタスクの場合は送信する本文を入力...",invalidJsonFormat:"JSONフォーマットが不正です",jsonFormatRequired:"JSONフォーマットが必要です",taskType:"タスクタイプ",text:"メッセージ内容",requestInput:"リクエスト内容",requestSessionId:"リクエストセッションID",requestUserId:"リクエストユーザーID",dispatchChannel:"対象チャンネル",dispatchTargetUserId:"対象ユーザーID",dispatchTargetSessionId:"対象セッションID",dispatchMode:"配信モード",silentDelivery:"サイレント配信",runtimeShareSession:"セッション共有",runtimeMaxConcurrency:"最大同時実行数",runtimeTimeoutSeconds:"タイムアウト(秒)",runtimeMisfireGraceSeconds:"遅延許容時間(秒)",runtimeToolSafety:"ツール承認チェック",idTooltip:"タスクの作成時にシステムによって生成され、編集不可の一意のUUID。",nameTooltip:"このジョブを識別するためのわかりやすい名前。",cronTooltip:"タスクの実行タイミングを定義します",cronExample:"よく使う例: '0 9 * * *' = 毎日9時 | '*/30 * * * *' = 30分ごと | '0 */2 * * *' = 2時間ごと | '0 0 * * 0' = 日曜0時",cronHelper:"Cron式に慣れていませんか?",cronHelperLink:"オンラインジェネレーターを使う",timezoneTooltip:"Cronスケジュールのタイムゾーン。デフォルト: UTC",taskTypeTooltip:"シンプルなメッセージタスクには「テキスト」を、複雑なエージェントワークフローには「エージェント」を選択してください。",textTooltip:"シンプルなメッセージタスク:実際に送る本文です。タスクタイプが「text」のとき必須です。",requestInputTooltip:"JSON形式のメッセージ内容。エージェントが受け取って処理する内容です。タスクタイプが「agent」のとき必須です。",requestInputExample:'フォーマット: [{"role":"user","content":[{"type":"text","text":"ここにメッセージを入力"}]}]',requestSessionIdTooltip:"リクエストコンテキストのセッションID。不明な場合は「default」を使用してください。",requestUserIdTooltip:"リクエストを開始するユーザーID。自動タスクには「system」を使用してください。",dispatchChannelTooltip:"レスポンスを送信する対象チャンネル(例: 'console', 'discord', 'imessage')。",dispatchTargetUserIdTooltip:"対象チャンネルでレスポンスを受け取るユーザーID。",dispatchTargetSessionIdTooltip:"対象チャンネルでレスポンスを届けるセッションID。",dispatchModeTooltip:"リアルタイム応答には「ストリーム」を、完了後の応答には「ファイナル」を選択してください。",silentDeliveryTooltip:"エージェントタスクを実行してセッションとトレースを保持しますが、結果はチャンネルに送信しません。",shareSessionTooltip:"有効にすると、対象ユーザーとセッションを共有します。無効にすると、実行ごとに一意のIDで独立したコンテキストを作成します。履歴を必要としない独立したタスクに適しています。デフォルト: 有効",maxConcurrencyTooltip:"このジョブの最大同時実行数。デフォルト: 1",timeoutSecondsTooltip:"最大実行時間(秒)。超過するとジョブが終了します。",misfireGraceSecondsTooltip:"実行漏れの許容時間。スケジュール時刻をこの時間以上過ぎた場合は実行されません。",toolSafetyTooltip:"有効にすると、リスクの高いツール呼び出しにユーザー承認が必要です(無人のcronジョブをブロックする可能性があります)。無効にすると、ツール呼び出しでは承認を求めませんが、ファイル保護ルールは引き続き適用されます。デフォルト:無効",executeNowTitle:"タスクを今すぐ実行",executeNowContent:'"{{name}}" を今すぐ実行してもよろしいですか?',executeNowConfirm:"今すぐ実行",createFromTemplate:"テンプレートから作成",templateModalTitle:"タスクテンプレートを選択",templateModalDescription:"内蔵テンプレートを選び、保存前に主要パラメータを調整します。",useTemplate:"このテンプレートを使用",templateTagPersonal:"個人",templateTagTeam:"チーム",templateTagReminder:"リマインダー",templateTagCalendar:"カレンダー",templateTagCalendarRecommended:"カレンダー推奨",saveResultToInbox:"実行結果を受信トレイに保存",saveResultToInboxTooltip:"有効時、実行と配信が成功した結果を受信トレイに保存します。配信失敗時はフォールバックとして必ず受信トレイに記録されます。",scheduleFilterAll:"すべてのスケジュール種別",scheduleTypeRecurring:"繰り返し",scheduleTypeOnce
181:"日程",onceRunAt:"実行日時",repeatEnabled:"繰り返し実行",repeatEnabledTooltip:"この開始時刻から定期実行を有効化します",repeatFrequency:"繰り返し頻度",repeatEveryDays:"繰り返し間隔(日)",repeatEveryPrefix:"毎",repeatEverySuffix:"日",repeatEndType:"終了条件",repeatEndNever:"終了しない",repeatEndUntil:"日時で終了",repeatEndCount:"回数で終了",repeatUntil:"終了日時",repeatCount:"実行回数",pleaseSelectScheduleType:"スケジュール種別を選択してください",pleaseInputRunAt:"実行日時を選択してください",pleaseInputRepeatEveryDays:"繰り返し間隔(日)を入力してください",pleaseSelectRepeatEndType:"終了条件を選択してください",pleaseInputRepeatUntil:"終了日時を選択してください",pleaseInputRepeatCount:"実行回数を入力してください",validation:{cronRequired:"繰り返しスケジュールには Cron 式が必要です。",runAtRequired:"単発スケジュールには実行日時が必要です。",repeatUntilRequired:"「日時で終了」を選択した場合は終了日時が必要です。",repeatCountRequired:"「回数で終了」を選択した場合は実行回数が必要です。",repeatUntilAfterRunAt:"終了日時は実行日時より後である必要があります。実行日時より後の日時を指定してください。",textRequired:"タスクタイプが text の場合、メッセージ内容は必須です。",requestRequired:"タスクタイプが agent の場合、リクエスト内容は必須です。",invalidCronExpression:"Cron 式が不正です。5 フィールド形式を使用してください。"},listView:"リスト表示",calendarView:"カレンダー表示",calendarEmptyHint:"Scheduled タスクはまだありません。作成するとカレンダーに表示されます。",calendarMoreItems:"他 {{count}} ä»¶",calendarDayListTitle:"{{date}} の Scheduled タスク",executionHistory:"実行履歴",historyTitle:"実行履歴 - {{name}}",historyEmpty:"実行履歴はまだありません。",historyStatusSuccess:"成功",historyStatusFailed:"失敗",historyStatusRunning:"実行中",historyStatusCancelled:"キャンセル",historyTriggerScheduled:"スケジュール実行",historyTriggerManual:"手動実行",historyExpand:"展開",historyCollapse:"折りたたむ",templates:{dailyTechNewsBrief:{title:"平日テックニュース要約",description:"平日 09:30 に注目の技術ニュースを短く要約して配信します。",frequency:"平日 09:30 (30 9 * * 1-5)"},dailyEveningReflection:{title:"毎日夜の振り返り",description:"平日 20:00 に当日の振り返りを促します。",frequency:"平日 20:00 (0 20 * * 1-5)"},weekendRelaxationReminder:{title:"週末リラックス通知",description:"週末朝におすすめ映画を配信します。",frequency:"週末 10:00 (0 10 * * 6,0)"},pomodoroBreakReminder:{title:"ポモドーロ休憩リマインダー",description:"業務時間中に 25 分ごとに休憩と水分補給を促します。",frequency:"平日 09:00-17:59、25 分ごと (*/25 9-17 * * 1-5)"},petCareReminder:{title:"ペットケアリマインダー",description:"毎月15日夜に駆虫・ワクチン確認を通知します。",frequency:"毎月15日 20:00 (0 20 15 * *)"},onceTextBirthdayReminder:{title:"誕生日リマインダー",description:"xx が 1月1日に誕生日であることを通知します。",frequency:"実行時刻:2026-01-01 09:00"},onceAgentBusinessTripPrep:{title:"出張前の準備",description:"目的地の天気を確認し、出張準備の提案を行います。",frequency:"実行時刻:2026-01-01 20:00"},repeatCountTextMedicineReminder:{title:"服薬リマインダー(14回)",description:"14回の療程で、時間どおりの服薬を通知します。",frequency:"初回:2026-01-01 09:00|1日ごと|14回"},repeatCountAgentDietPlan:{title:"14日間の食事プラン",description:"14日間、毎日の食事提案を生成して送信します。",frequency:"初回:2026-01-01 08:00|1日ごと|14回"},repeatUntilTextWeeklyMeeting:{title:"2か月間の週次会議リマインダー",description:"設定した締切まで毎週、会議参加を通知します。",frequency:"初回:2026-01-02 08:45|7日ごと|2026-03-01まで"},repeatUntilAgentWeeklySummary:{title:"会議前の週次サマリー",description:"毎週会議前に、直近1週間の memory ã
181‚’もとに業務サマリーを生成します。",frequency:"初回:2026-01-02 08:30|7日ごと|2026-03-01まで"}}},bI=JSON.parse('{"title":"チャンネル","description":"メッセージチャンネルの管理と設定","loading":"チャンネルを読み込み中...","configSaved":"設定を保存しました","configFailed":"設定の保存に失敗しました","botConflictTitle":"Bot はすでに使用されています","botConflictDescription":"この Bot は同じチャンネルで {{agents}} によって使用されています。このまま保存するとメッセージが競合する可能性があります。","botConflictConfirm":"このまま保存","channelType":"チャンネルタイプ","status":"ステータス","totalItems":"合計 {{count}} ä»¶","botPrefix":"Botプレフィックス","showToolCalls":"ツール呼び出し情報を表示","showToolCallsTooltip":"ツール呼び出し情報をユーザーに表示します(オフにすると非表示)","showToolResults":"ツール結果情報を表示","showToolResultsTooltip":"ツール結果情報をユーザーに表示します(オフにすると非表示)","toolCallMaxLength":"ツール呼び出しの最大表示長","toolResultMaxLength":"ツール結果の最大表示長","toolMaxLengthTooltip":"0 に設定すると省略しません","onebotMediaBase64":"ローカルメディアを Base64 で送信","onebotMediaBase64Tooltip":"メディアファイルの送信方式を選択します。無効の場合はファイルパスを送信し、有効の場合はファイルを Base64 にエンコードして送信します。リモート URL は変更されません。","onebotMediaBase64MaxMb":"Base64 ファイルサイズ上限","onebotMediaBase64MaxMbTooltip":"この上限を超えるメディアファイルは、元のファイルパスを使用して送信されます。","onebotMediaBase64MaxMbRequired":"Base64 ファイルサイズ上限を入力してください","onebotMediaBase64MaxMbMin":"Base64 ファイルサイズ上限は 1 MB 以上にしてください","onebotMediaDir":"メディアディレクトリ","onebotMediaDirTooltip":"ダウンロードしたメディアの保存先です。デフォルトではエージェントワークスペースの media ディレクトリを使用します。","onebotMediaDownloadMaxMb":"受信メディアサイズ上限","onebotMediaDownloadMaxMbTooltip":"OneBot からダウンロードする画像、音声、動画、ファイルごとの最大サイズです。","onebotMediaDownloadMaxMbRequired":"受信メディアサイズ上限を入力してください","onebotMediaDownloadMaxMbMin":"受信メディアサイズ上限は 1 MB 以上にしてください","onebotWsHostTooltip":"リバース WebSocket サーバーの待ち受けアドレス。127.0.0.1 のままにすると、このマシン上の OneBot クライアントのみ接続できます。他のアドレスを指定するとポートがネットワークに公開されるため、アクセストークンが必須になります。","onebotAccessTokenTooltip":"OneBot クライアントが Authorization ヘッダーで送信する共有トークン。待ち受けアドレスがループバック以外の場合は必須です。","onebotAccessTokenRequired":"待ち受けアドレスがループバックでない場合はアクセストークンが必須です","showThinking":"思考過程を表示","showThinkingTooltip":"モデルの思考・推論内容をユーザーに表示します(オフにすると非表示)","noTextDebounce":"テキストなしデバウンス","noTextDebounceTooltip":"有効にすると、メディアのみのメッセージ(画像/動画/ファイル)は一時保存され、後続のテキストメッセージ到着時に結合されます。無効にするとすべてのメッセージが即時処理されます。音声メッセージは常に即時処理されます。","streamingEnabled":"ストリーミング出力","streamingEnabledDingtalkHint":"メッセージタイプがCardの場合のã
181¿æœ‰åй","streamingEnabledFeishuHint":"Feishuオープンプラットフォームの権限管理ページでcardkit:card:write権限を有効にする必要があります","ackMessage":"即時確認メッセージ","ackMessageTooltip":"メッセージ受信時にエージェント処理の前に即時返信を送信します。空欄で無効化。","ackMessagePlaceholder":"⏳ 処理中...","notSet":"未設定","clickCardToEdit":"カードをクリックして編集","settings":"設定","channelSettings":"チャンネル設定","pleaseInputDbPath":"DBパスを入力してください","pleaseInputPollInterval":"ポーリング間隔を入力してください","discordBotToken":"Discord Botトークン","acceptBotMessages":"Botメッセージを受信","acceptBotMessagesTooltip":"有効にすると、他のBotからのメッセージを受信します","httpProxyPlaceholder":"http://127.0.0.1:18118","httpProxyAuthPlaceholder":"ユーザー:パスワード","dbPathPlaceholder":"~/Library/Messages/chat.db","botPrefixPlaceholder":"@bot","dmPolicy":"DMポリシー","dmPolicyTooltip":"ダイレクトメッセージでBotと対話できるユーザーを制御します。オープン: 全員、許可リスト: 認証済みユーザーのみ","groupPolicy":"グループポリシー","groupPolicyTooltip":"グループチャットでBotと対話できるユーザーを制御します。オープン: 全員、許可リスト: 認証済みユーザーのみ","requireMention":"@メンション必須","requireMentionTooltip":"有効にすると、グループチャットでは明示的に@メンションされた場合のみ応答します","policyOpen":"オープン","policyAllowlist":"許可リスト","allowFrom":"許可ユーザー","allowFromTooltip":"Botと対話できるユーザーIDのリスト(フォーマット: ニックネーム#末尾4桁、例: John#1234)","allowFromPlaceholder":"ユーザーIDを入力してEnterで追加","denyMessage":"アクセス拒否メッセージ","denyMessageTooltip":"アクセスが拒否されたユーザーに表示されるカスタムメッセージ","twilioAccountSid":"Twilio アカウント SID","twilioAuthToken":"Twilio 
181認証トークン","phoneNumber":"電話番号","phoneNumberSid":"電話番号 SID","phoneNumberSidHelp":"TwilioコンソールのPhone Numbers → Active Numbersで確認できます。","ttsProvider":"TTSプロバイダー","ttsVoice":"TTSボイス","sttProvider":"STTプロバイダー","language":"言語","welcomeGreeting":"ウェルカムメッセージ","voiceSetupGuide":"Twilioアカウントを作成して電話番号を取得し、以下に認証情報を入力してください。アカウント SIDと認証トークンはTwilioコンソールのダッシュボードで確認できます。電話番号 SIDはPhone Numbers → Active Numbersに記載されています。","voiceSetupLink":"Twilioコンソールを開く","sipSetupGuide":"SIPレジストラ(Asterisk、FreeSWITCHなど)を設定し、以下にSIP認証情報を入力してください。DevモードではpyVoIPがローカルでSIP/RTPを処理します。ProductionモードではLiveKit SIP Serverを使用します。","sipMode":"SIPモード","sipModeTooltip":"Dev:ローカルテスト用のPython pyVoIP。Production:高並行性のLiveKit SIP Server。","sipServer":"SIPサーバー","sipServerPlaceholder":"空欄で内蔵レジストラを使用","sipServerPlaceholderLivekit":"LiveKitモードでは不要","sipUsername":"SIPユーザー名","sipPassword":"SIPパスワード","sipPort":"SIPポート","sipTransport":"トランスポート","sipDashscopeApiKey":"DashScope API Key","sipDashscopeApiKeyTooltip":"Aliyun DashScope STT/TTS用のAPIキー。空の場合、DASHSCOPE_API_KEY環境変数にフォールバックします。","livekitUrl":"LiveKit URL","livekitApiKey":"LiveKit APIキー","livekitApiSecret":"LiveKit APIシークレット","livekitSipTrunkId":"LiveKit SIPトランクID","livekitRoomName":"LiveKit ルーム名","livekitRoomNameTooltip":"SIP着信を待機するLiveKitルーム名。SIP Dispatch Ruleのルーム名と一致させてください。","loginWeCom":"WeCom QRコードを取得","wecomSetupGuide":"QRコードでボットを作成する際、ボットの権限を承認する画面では「承認をスキップ」を選択してください。「承認を確認」を選択すると、ボット作成者以外のユーザーがボットと対話できなくなる場合があります。","wecomScanAuth":"QRコードで認証","wecomAuthHint":"上のQRコードをWeComでスキャンして認証してください。認証後、Bot IDとSecretが自動入力されます。","wecomAuthSuccess":"WeComボットの認証に成功しました。Bot IDとSecretが自動入力されました。","wecomQrcodeFailed":"WeCom QRコードの取得に失敗しました。もう一度お試しください。","slackBotToken":"Bot Token","slackBotTokenTooltip":"Slack Bot User OAuth Token(xoxb- で始まる)","slackAppToken":"App Token","slackAppTokenTooltip":"Slack App-Level Token(Socket Mode用、xapp- で始まる)","slackProxyTooltip":"Slack API接続用HTTPプロキシURL","dingtalkSetupGuide":"DingTalkでQRコードをスキャンしてボットを作成します。スキャン後、DingTalkアプリが自動作成され、Client IDとClient Secretが自動入力されます。","dingtalkScanAuth":"スキャンしてボットを作成","dingtalkGetQrcode":"DingTalk QRコードを取得","dingtalkScanHint":"上のQRコードをDingTalkでスキャンしてください。認証後、Client IDとClient Secretが自動入力されます。","dingtalkAuthSuccess":"DingTalkボットが作成されました。Client IDとClient Secretが自動入力されました。","dingtalkQrcodeFailed":"DingTalk QRコードの取得に失敗しました。もう一度お試しください。","dingtalkQrcodeExpired":"QRコードの有効期限が切れました。再取得してください。","qqSetupGuide":"QQを使用してQRコードをスキャンし、ボットの認証を行ってください。スキャン後、APP IDとClient Secretが自動的に取得され、入力欄に反映されます。","qqScanAuth":"QRコードをスキャンしてボットを認証する","qqGetQrcode":"QQのQRコードを取得する","qqScanHint":"上部のQRコードをQQでスキャンし、認証を完了してください。認証完了後、APP IDとClient Secretが自動的に入力されます。","qqAuthSuccess":"QQボットの認証が完了しました。APP IDとClient Secretが自動的に入力されました。","qqQrcodeFailed":"QQのQRコードの取得に失敗しました。しばらくしてからもう一度お試しください。","qqQrcodeExpired":"QRコードの有効期限が切れています。再度取得してください。","atSenderOnReply":"返信時に送信者を@メンション","atSenderOnReplyTooltip":"有効にすると、ボットはグループチャットでの返信の最初のメッセージで送信者を@メンションします。注意:カードモードでは、@メンションは企業内部メンバーのみ有効です。","dingtalkEndpoint":"APIエンドポイント","dingtalkEndpointTooltip":"DingTalkプライベートデプロイ用のカスタムAPIエンドポイント。空欄の場合は公式デフォルトを使用します。","cardAutoLayout":"ワイドスクリーンカード(自動レイアウト)","cardAutoLayoutTooltip":"有効にすると、DingTalk がデスクトップで AI カードをワイドスクリーンでレンダリングします。メッセージタイプが card の場合のã
181¿æœ‰åŠ¹ã§ã™ã€‚ã‚«ãƒ¼ãƒ‰ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã¯å…¬é–‹æ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚","wecomCancelled":"認証がキャンセルされました","wecomAuthFailed":"認証に失敗しました: {{msg}}","filterAll":"すべて","builtin":"組み込み","custom":"カスタム","feishuRegion":"地域","feishuRegionTooltip":"中国国内はFeishu、海外はLarkを選択","feishuChina":"Feishu(中国)","feishuInternational":"Lark(海外)","feishuScanGuide":"FeishuでQRコードをスキャンしてボットを作成します。スキャン後、Feishuアプリが自動作成され、App IDとApp Secretが自動入力されます。","feishuScanLogin":"スキャンしてボットを作成","feishuGetQrcode":"Feishu QRコードを取得","feishuScanHint":"上のQRコードをFeishuでスキャンしてください。認証後、App IDとApp Secretが自動入力されます。","feishuAuthSuccess":"Feishuボットが作成されました。App IDとApp Secretが自動入力されました。","feishuQrcodeExpired":"QRコードの有効期限が切れました。再取得してください。","feishuQrcodeFailed":"Feishu QRコードの取得に失敗しました。もう一度お試しください。","wechatSetupGuide":"WeChat個人アカウントBot(iLinkプロトコル)。Bot Tokenが未設定の場合、起動時にQRコードURLを表示します。スキャンして認証してください。Tokenはローカルに保存されます。","wechatContextTokenLimit":"WeChat iLinkプラットフォームの制限:各ユーザーメッセージのcontext_tokenで返信できるメッセージは最大10件です。これはプラットフォーム側のハード制限です。制限超過による送信失敗を避けるため、思考およびツール出力を無効にするか、メッセージ統合機能を有効にすることをお勧めします。","wechatBotToken":"Bot Token","wechatBotTokenTooltip":"QRコードログイン後に取得したBearerトークン。空の場合は起動時にQRコードログインが案内されます。","wechatBotTokenPlaceholder":"QRログイン後に自動入力、または手動で貼り付け","wechatBotTokenFile":"Tokenファイルパス","wechatBotTokenFileTooltip":"Botトークンの保存パス。デフォルトは ~/.qwenpaw/wechat_bot_token","wechatMediaDir":"メディアディレクトリ","wechatMessageMerge":"メッセージ統合","wechatMessageMergeTooltip":"複数の返信メッセージを統合して送信し、WeChat の context_token あたり10件のメッセージ制限を回避します。遅延を0に設定すると、すべてのテキスト返信がリクエスト終了時に1つのメッセージに統合されます。正の遅延値(ミリ秒)は、その時間内の隣接メッセージを統合します。","wechatMessageMergeDelayMs":"統合遅延(ミリ秒)","wechatMessageMergeDelayMsTooltip":"隣接メッセージ統合の時間ウィンドウ。0に設定すると、すべてのメッセージを1つの最終返信に統合します。正の値(例: 1000)は、その期間中のメッセージをバッファリングしてから送信します。","wechatMessageMergeDelayMsValidation":"有効な非負整数を入力してください","wechatScanLogin":"QRコードでログイン","wechatGetQrcode":"ログインQRコードを取得","wechatScanHint":"WeChatでQRコードをスキャンして、完了後に保存してください","wechatQrcodeFailed":"QRコードの取得に失敗しました。再試行してください","wechatLoginSuccess":"WeChat ログイン成功、トークンが入力されました","wechatQrcodeExpired":"QRコードが期限切れです。再取得してください","shareSessionInGroup":"グループでコンテキスト共有","shareSessionInGroupTooltip":"有効にすると、グループの全メンバーが同じ会話コンテキストを共有します。無効にすると、各メンバーが独立したコンテキストを持ちます。","accessControlEnabled":"アクセス制御","accessControlEnabledTooltip":"有効にすると、ホワイトリストのユーザーのみBotと対話できます。未知のユーザーにはIDが通知され、承認待ちリストに追加されます。","accessControlDm":"DM アクセス制御","accessControlDmTooltip":"有効にすると、ホワイトリストのユーザーのみDMã
181§Botと対話できます","accessControlGroup":"グループ アクセス制御","accessControlGroupTooltip":"有効にすると、ホワイトリストのユーザーのみグループチャットでBotと対話できます","dmDisabled":"DMを無効化","dmDisabledTooltip":"有効にすると、Botはすべてのダイレクトメッセージを完全に無視します","groupDisabled":"グループを無効化","groupDisabledTooltip":"有効にすると、Botはすべてのグループメッセージを完全に無視します","manageAccessControl":"アクセス制御","pendingApprovals":"承認待ち","whitelist":"ホワイトリスト","blacklist":"ブラックリスト","addUser":"ユーザーを追加","addUserPlaceholder":"ユーザーIDを入力","userId":"ユーザーID","username":"ユーザー名","channel":"チャンネル","firstMessage":"最初のメッセージ","time":"時間","actions":"操作","approve":"ホワイトリスト","deny":"ブラックリスト","dismiss":"無視","noWhitelistUsers":"ホワイトリストユーザーなし","noBlacklistUsers":"ブラックリストユーザーなし","noPendingApprovals":"承認待ちなし","userAdded":"ユーザーを追加しました","userRemoved":"ユーザーを削除しました","approveSuccess":"ホワイトリストに追加しました","denySuccess":"ブラックリストに追加しました","dismissSuccess":"無視しました","operationFailed":"操作に失敗しました","remark":"備考","usernamePlaceholder":"ユーザー名を入力(任意)","remarkPlaceholder":"備考を入力(任意)","filterByChannel":"チャンネルで絞り込み","selectToOperate":"項目を選択して操作","selectedCount":"{{count}}件選択中","batchApprove":"承認","batchDeny":"ブラックリスト","batchDismiss":"削除","batchApproveConfirm":"{{count}}件のユーザーを承認しますか?","batchDenyConfirm":"{{count}}件のユーザーをブラックリストに追加しますか?","batchDismissConfirm":"{{count}}件のユーザーを削除しますか?","batchSuccess":"{{count}}件のユーザーを処理しました","batchRemove":"削除","batchRemoveConfirm":"{{count}}件のユーザーを削除しますか?","enabledSection":"有効","enabledCount":"{{count}}ä»¶","availableSection":"未有効","enableAction":"有効にする","noEnabledChannels":"有効なチャンネルはありません","goEnableChannels":"チャンネルを有効にする"}'),kI={title:"セッション",description:"アクティブなチャットセッションの表示と管理",loading:"セッションを読み込み中...",confirmDelete:"削除の確認",deleteConfirm:"このセッションを削除してもよろしいですか?",batchDeleteConfirm:"選択した {{count}} 件のセッションを削除してもよろしいですか?",deleteSuccess:"セッションを削除しました",deleteFailed:"セッションの削除に失敗しました",batchDeleteSuccess:"{{count}} 件のセッションを削除しました",batchDeleteFailed:"セッションの一括削除に失敗しました",saveSuccess:"セッションを保存しました",saveFailed:"セッションの保存に失敗しました",batchDeleteButton:"一括削除",filterTitle:"タイトルで絞り込み",filterUserId:"ユーザーIDで絞り込み",filterChannel:"チャンネルで絞り込み",allChannels:"すべてのチャンネル",totalItems:"合計 {{count}} ä»¶",selectedItems:"{{count}} 件選択中",editSession:"セッションを編集",pleaseInputName:"セッション名を入力してください",sessionNamePlaceholder:"セッション名",activeTab:"アクティブ",archivedTab:"アーカイブ済み",archivedAtColumn:"アーカイブ日時",archive:{action:"アーカイブ",unaction:"アーカイブ解除",batchAction:"一括アーカイブ",batchUnaction:"一括アーカイブ解除",success:"チャットをアーカイブしました",successHint:"アーカイブしました。「コントロール>セッション管理>アーカイブ済み」で確認できます。",failed:"アーカイブに失敗しました",unarchiveSuccess:"アーカイブを解除しました",unarchiveFailed:"アーカイブ解除に失敗しました",batchSuccess:"{{count}} 件のチャットをアーカイブしました",batchFailed:"一括アーカイブに失敗しました",batchUnarchiveSuccess:"{{count}} 件のアーカイブを解除しました",batchUnarchiveFailed:"一括アーカイブ解除に失敗しました",groupLabel:"アーカイブ済み ({{count}})",modalTitle:"アーカイブ済みのチャット",unarchiveAll:"すべてアーカイブ解除",noArchived:"アーカイブ済みのチャットはありません"}},yI={parent:"設定",environments:"環境変数",title:"環境変数",description:"エージェントとスキルのキー・バリュー形式の環境変数を設定します。",key:"キー",value:"値",variableNamePlaceholder:"VARIABLE_NAME",valuePlaceholder:"値",insertRowBelow:"下に行を挿入",deleteRow:"行を削除",deleteVariable:"変数を削除",deleteConfirm:'"{{name}}" を削除しますか?',deleteSelected:"選択を削除",deleteSelectedConfirm:"{{label}} を削除しますか?",keyRequired:"キーは必須です",invali
181dKeyFormat:"キーのフォーマットが不正です",duplicateKey:"キーが重複しています",saveSuccess:"環境変数を保存しました",saveFailed:"保存に失敗しました",deleteSuccess:'"{{name}}" を削除しました',deleteFailed:"削除に失敗しました",noVariables:"環境変数がまだ設定されていません。",addVariable:"変数を追加",loading:"読み込み中...",retry:"再試行",of:"/",selected:"選択中",variable:"変数",variables:"変数",showValue:"値を表示",hideValue:"値を非表示",searchPlaceholder:"変数を検索",liveSettings:"リアルタイム設定",noLiveVariables:"現在の条件に一致するリアルタイム設定はありません。",customSettings:"カスタム変数",noCustomVariables:"カスタム変数はまだありません。",editVariable:"変数を編集",applyNow:"今すぐ適用",applyHint:"現在の QwenPaw プロセスは即時更新されます。実行中の MCP には再読み込みが必要です。",applied:"環境変数を適用しました",appliedWithFailures:"保存しましたが、{{count}} 件の MCP を再読み込みできませんでした",resetVariable:"変数をリセット",resetSuccess:"システム値または既定値に戻しました",readonlySettings:"読み取り専用設定",noReadonlyVariables:"現在の条件に一致する読み取り専用設定はありません。",impactTitle:"プロセスへの影響",explicitConsumers:"{{count}} 件の MCP がこの変数を明示的に使用しています",implicitConsumers:"{{count}} 件の stdio MCP が暗黙的に継承する可能性があります",restartMode:"実行中の MCP",restartAffected:"影響を受ける MCP を再読み込み",restartNone:"再読み込みしない",restartAllStdio:"すべての stdio MCP を再読み込み",readonlyReason:{startup:"QwenPaw 起動時に確定",agent_owned:"各エージェント設定で管理",initial_default:"Agent 設定の初期値としてのみ使用"},mutabilityDescription:{hot_runtime:"各操作の開始時に現在の QwenPaw プロセスから読み取ります。",hot_process:"os.getenv() で利用でき、今後の子プロセスに継承されます。",startup_only:"参照専用で、QwenPaw の実行中は変更できません。",internal:"QwenPaw が内部で管理します。"},variableDescriptions:{QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT:"最初の有効なストリーム内容を待つ最大時間です。0 で監視を無効化します。",QWENPAW_LLM_STREAM_IDLE_TIMEOUT:"有効なストリームチャンク間の最大待機時間です。0 で監視を無効化します。"},source:{user:"QwenPaw",system:"システム",default:"既定値"}},vI={title:"Token 使用量",totalTokens:"合計 Token",totalCalls:"LLM呼び出し",toolCalls:"ツール呼び出し",llmAndToolTrend:"LLM とツール呼び出しの推移",llmAndToolTrendTooltip:"全エージェントの、用量メタデータ付きアシスタント・ターンとツール呼び出し意図の合計です。Total Calls(生の API 回数)ではありません。アップグレード前のターンは 0 になる場合があります。",llmAndToolTrendLoadFailed:"LLM とツール呼び出し推移の読み込みに失敗しました",recordedTurnsAllAgents:"LLM呼び出し",byAgent:"エージェント別",agent:"エージェント",unattributed:"未帰属",promptTokens:"入力 Token",completionTokens:"出力 Token",cacheRead:"キャッシュヒット Token",cacheHitRate:"キャッシュヒット率",byModel:"モデル別",byDate:"日付別",model:"モデル",date:"日付",loadFailed:"Token 使用量の読み込みに失敗しました",noData:"選択期間に Token 使用データがありません",modelTrend:"モデル使用量トレンド",tokenTypeChart:"トークンタイプのトレンド",selectAll:"すべて選択",allSelected:"すべて",itemsSelected:"{{count}} 件選択済み",selectModels:"モデルを選択",selectTokenTypes:"トークンタイプを選択"},TI={title:"エージェント統計",totalSessions:"総セッション数",totalMessages:"総メッセージ数",userMe
181ssages:"ユーザーメッセージ",assistantMessages:"アシスタントメッセージ",promptTokens:"入力 Token",totalInputTokens:"総入力 Token",completionTokens:"出力 Token",toolCalls:"ツール呼び出し",newSessions:"新規セッション",activeSessions:"アクティブセッション",messageTrend:"メッセージ推移",sessionTrend:"セッション推移",tokenTrend:"Token 推移",llmAndToolTrend:"LLM & ツール呼び出し推移",sessionsByChannel:"チャンネル別セッション統計",messagesByChannel:"チャンネル別メッセージ統計",totalSessionsTooltip:"作成されたチャットセッションの総数。各セッションは独立した会話コンテキストです",totalMessagesTooltip:"全セッションのメッセージ総数。ユーザーメッセージとアシスタントメッセージを含みます",toolCallsTooltip:"エージェントがツールを呼び出すことを決めた回数。1回のLLM呼び出しで複数のツール意図が発生する場合があります",messageTrendTooltip:"ユーザーメッセージとアシスタントメッセージの比較推移",sessionTrendTooltip:"新規セッションとアクティブセッションの比較推移。オレンジ色のバーはその日に作成されたセッション、青色のバーはその日にメッセージがあったセッションです",llmAndToolTrendTooltip:"現在のエージェントの LLM ターンとツール呼び出しの比較推移",sessionsByChannelTooltip:"メッセージチャンネル別のセッション分布。チャンネルに属さないセッションはデフォルトで Console にグループ化されます",messagesByChannelTooltip:"メッセージチャンネル別のメッセージ総数分布",currentAgentLlmCalls:"記録済みターン",currentAgentTokenTrendTooltip:"現在のエージェントのターン単位メタデータに基づく入力、出力、キャッシュヒット Token の推移。キャッシュヒット Token は入力 Token の一部です",currentAgentPromptTokensTooltip:"選択期間における現在のエージェントの各セッション合計プロンプト Token(ターン用量メタデータが必要。アップグレード前のセッションは 0 になる場合があります)",currentAgentCacheHitRateTooltip:"選択期間に現在のエージェントで観測されたキャッシュ呼び出しの Token 加重ヒット率(キャッシュヒット Token / キャッシュ対象入力 Token。データがない場合は —)",currentAgentCompletionTokensTooltip:"選択期間における現在のエージェントの各セッション合計完了 Token(ターン用量メタデータが必要。アップグレード前のセッションは 0 になる場合があります)",currentAgentLlmCallsTooltip:"選択期間における現在のエージェントの用量メタデータ付きアシスタント・ターン数(生の API 呼び出し回数ではありません。アップグレード前のセッションは 0 になる場合があります)",loadFailed:"統計データの読み込みに失敗しました",noData:"選択期間に統計データがありません",retry:"再試行"},SI={selectModel:"モデルを選択",noConfiguredModels:"設定済みモデルがありません",noFreeModels:"利用可能な無料モデルがありません",switchFailed:"モデルの切り替えに失敗しました",searchModels:"モデルを検索...",noModelsFound:"一致するモデルが見つかりません",free:"無料",vision:"視覚",freeBannerText:"無料モデルには利用制限やサービス不安定の可能性があります。詳細はプロバイダーをご確認ください。",moreProviders:"その他の無料プロバイダー(API Key が必要)",proBannerText:"設定ページで構成済みのモデルのみ表示。",connectToUse:"{{provider}} に接続して無料モデルを利用",configureApiKey:"{{provider}} の API Key を設定して無料モデルを利用",configureApiKeyTitle:"設定ページへ移動",configureApiKeyConfirm:"モデル設定ページに移動して {{provider}} の API Key を設定します。続行しますか?",goToConfigure:"設定へ",noModelsDiscovered:"接続済みã€
181‚モデル読み込み中...",oauthTitle:"{{provider}} に接続",oauthDescription:"{{provider}} への認証用に新しいブラウザウィンドウが開きます。APIキーは自動的に保存されます。",oauthContinue:"続行",oauthWaiting:"認証を待機中...",oauthWaitingDescription:"ブラウザウィンドウで認証を完了してください。",oauthConnected:"{{provider}} に正常に接続しました",oauthFailed:"認証に失敗しました。もう一度お試しください",oauthTimeout:"認証がタイムアウトしました。もう一度お試しください",viewMore:"もっと見る ({{count}})"},CI=JSON.parse('{"discoveryOriginApi":"API 検出","discoveryOriginCatalog":"公式カタログ","discoveryOriginBoth":"API + カタログ","availabilityAvailable":"利用可能","availabilityPermissionDenied":"権限なし","availabilityNotFound":"見つかりません","availabilityIncompatible":"チャット非対応","availabilityRateLimited":"レート制限中","availabilityTransientError":"一時的に利用不可","availabilityUnverified":"未検証","modelAlreadyConfigured":"設定済み","llmConfiguration":"LLM設定","providersTitle":"プロバイダー","providersDescription":"各プロバイダーのAPIキーとエンドポイントを設定します。","llmTitle":"モデル","defaultLlm":"デフォルト LLM","llmDescription":"ここではグローバル既定の LLM モデルを設定します。Chat ページでは各 Agent ごとに使用するモデルを個別に選択できます。","configureProvider":"{{name}} を設定","baseURL":"ベースURL","apiKey":"APIキー","advancedConfig":"詳細設定","authMode":"認証モード","authModeApiKey":"API Key (x-api-key)","authModeAuthToken":"Auth Token (Authorization: Bearer)","customHeaders":"カスタムヘッダー","customHeadersHint":"すべての API リクエストに追加されます(例: x-app: cli)","customHeaderKey":"ヘッダー名","customHeaderValue":"ヘッダー値","addHeader":"+ ヘッダーを追加","generateConfig":"生成パラメータ設定","generateConfigHint":"JSON 形式で指定した生成パラメータ設定です。展開されたうえで生成リクエスト(`openai.chat.completions` または `anthropic.messages`)に渡されます。","generateConfigInvalidJson":"有効な JSON を入力してください","generateConfigMustBeObject":"生成パラメータ設定は JSON オブジェクトである必要があります","modelAdvancedConfig":"モデル詳細設定","modelGenerateConfig":"モデル生成パラメータ","modelGenerateConfigHint":"JSON 形式で指定したこのモデル専用の生成パラメータ設定です。展開されたうえで生成リクエストに渡されます。プロバイダーレベルの詳細設定より優先されます。","modelConfigSaved":"モデル {{name}} の設定が保存されました","modelConfigSaveFailed":"モデル設定の保存に失敗しました","modelConfigLabel":"モデル設定","maxTokensLabel":"最大出力トークン数","maxTokensHint":"1回のレスポンスあたりの最大出力トークン数","maxInputLengthLabel":"最大コンテキスト長","maxInputLengthHint":"モデルのコンテキストウィンドウサイズ、コンテキスト圧縮のしきい値を制御します(≥1000)","relayReasoningLabel":"思考内容を転送","relayReasoningHint":"推論内容(reasoning contents)を後続の会話ターンに転送します","thinkingModeLabel":"思考を有効化","thinkingModeHint":"オンにすると思考/推論を有効化、オフにすると思考を無効化します。","thinkingBudgetLabel":"思考バジェット","thinkingBudgetHint":"モデルのデフォルト思考バジェットを使用","switchToManual":"手動設定","switchToAuto":"自動","reasoningEffortLabel":"推論深度","reasoningEffortHint":"推論の深さを制御(OpenAI系)","protocol":"プロトコル","protocolHint":"この設定のプロバイダーAPIプロトコルを選択してください。","selectProtocol":"プロトコルを選択してください","protocolOpenAI":"OpenAI互換(Chat Completions)","protocolOpenAIResponse":"OpenAI互換(Response API)","protocolAnthropic":"Anthropic(Messages API)","currentKey":"現在: {{key}}","startsWith":"\\"{{prefix}}\\" で始まる","optionalSelfHosted":"セルフホストサービスの場合は任意","leaveBlankKeep":"空欄のままにすると現在のキーを維持します","enterApiKey":"APIキーを入力({{prefix}}...)","enterApiKeyOptional":"APIキーを入力(任意)","openAIEndpoint":"OpenAIエンドポイント、例: https://api.openai.com/v1","openAICompatibleEndpoint":"OpenAI互換エンドポイント、例: https://api.example.com(プロバイダーが必要とする場合のã
181¿ /v1 を追加)","azureEndpointHint":"Azure OpenAIエンドポイント、例: https://<resource>.openai.azure.com/openai/v1","anthropicEndpointHint":"Anthropicエンドポイント、例: https://api.anthropic.com","ollamaEndpointHint":"Ollamaエンドポイント、例: http://localhost:11434","lmstudioEndpointHint":"LM Studioエンドポイント、例: http://localhost:1234/v1","apiEndpointHint":"APIエンドポイント、例: https://api.example.com","pleaseEnterBaseURL":"APIベースURLを入力してください","selectBaseURL":"ベースURLを選択してください","selectBaseURLHint":"このプロバイダーのリージョンエンドポイントを選択","pleaseEnterValidURL":"有効なURLを入力してください","apiKeyShouldStart":"APIキーは \\"{{prefix}}\\" で始まる必要があります","configurationSaved":"{{name}} の設定を保存しました","failedToSaveConfig":"設定の保存に失敗しました","revokeAuthorization":"認証を取り消す","revokeConfirmContent":"{{name}} のAPIキーを削除してもよろしいですか?現在のLLMモデル設定もクリアされます。","revokeConfirmSimple":"{{name}} のAPIキーを削除してもよろしいですか?","authorizationRevoked":"{{name}} の認証を取り消し、LLMモデルをクリアしました","authorizationRevokedSimple":"{{name}} の認証を取り消しました","failedToRevoke":"認証の取り消しに失敗しました","active":"アクティブ: {{provider}} / {{model}}","provider":"プロバイダー","model":"モデル","selectProvider":"プロバイダーを選択(認証済みである必要があります)","selectModel":"モデルを選択","llmModelUpdated":"LLMモデルを更新しました","failedToSave":"保存に失敗しました","freeModelWarningTitle":"無料モデルのご案内","freeModelWarningMessage":"無料モデルはサービスが不安定になる場合があります。詳細はプロバイダーの利用規約をご確認ください:","freeModelWarningDontShowAgain":"今後は表示しない","saved":"保存しました","save":"保存","cancel":"キャンセル","loading":"読み込み中...","retry":"再試行","notSet":"未設定","notRequired":"不要","available":"利用可能","unavailable":"利用不可","providerAvailable":"準備完了(モデルあり)","providerNoModels":"未準備(モデルなし)","search":"検索","searchPlaceholder":"プロバイダーを検索...","searchModelPlaceholder":"モデルを検索...","providerNotConfigured":"未準備(未設定)","settings":"設定","actions":"操作","custom":"カスタム","builtin":"組み込み","freeTierGroup":"無料枠","paidGroup":"有料","localCustomGroup":"ローカル & カスタム","endpointCount":"{{count}} エンドポイント","connect":"OAuth","saveApiKey":"保存","addProvider":"プロバイダーを追加","addProviderTitle":"カスタムプロバイダーを追加","providerIdLabel":"プロバイダーID","providerIdPlaceholder":"例: openai, google, anthropic","providerIdHint":"小文字・数字・ハイフン・アンダースコアが使用できます。後から変更できません。","providerNameLabel":"表示名","providerNamePlaceholder":"例: OpenAI, Google Gemini","defaultBaseUrlLabel":"デフォルトベースURL","defaultBaseUrlPlaceholder":"例: https://api.example.com","apiKeyPrefixLabel":"APIキープレフィックス(任意)","apiKeyPrefixPlaceholder":"例: sk-","providerCreated":"プロバイダー \\"{{name}}\\" を作成しました","providerCreateFailed":"プロバイダーの作成に失敗しました","deleteProvider":"プロバイダーを削除","deleteProviderConfirm":"カスタムプロバイダー \\"{{name}}\\" とすべてのモデルを削除しますか?この操作は取り消せません。","providerDeleted":"プロバイダー \\"{{name}}\\" を削除しました","providerDeleteFailed":"プロバイダーの削除に失敗しました","manageModels":"モデル","models":"モデル","manageModelsTitle":"{{provider}} — モデル管理","userAdded":"ユーザー追加","addModel":"モデルを追加","addModels":"モデルを追加","autoDiscoverModels":"モデルを自動検出","addModelTitle":"{{provider}} にモデルを追加","modelIdLabel":"モデルID","modelIdPlaceholder":"例: gpt-4o, gemini-2.0-flash","modelDiscoveryUnavailableHint":"利用可能なモデルが見つかりませんでした。このプロバイダーはモデル一覧の取得に対å¿
181œã—ていない可能性があるため、モデルIDを手動で入力してください。","modelNameLabel":"モデル名","modelNameRequired":"モデル名を入力してください","modelNamePlaceholder":"例: GPT-4o, Gemini 2.0 Flash","modelAdded":"モデル \\"{{name}}\\" を追加しました","modelAddFailed":"モデルの追加に失敗しました","modelAlreadyExists":"モデル ID \\"{{id}}\\" は既に存在します","autoDiscoverModelsSuccess":"自動検出が完了しました。{{count}} 件のモデルを追加しました","autoDiscoverModelsNoNew":"自動検出が完了しました。新しいモデルは追加されませんでした","autoDiscoverModelsFailed":"モデルの自動検出に失敗しました","removeModel":"削除","removeModelConfirm":"{{provider}} からモデル \\"{{name}}\\" を削除しますか?","modelRemoved":"モデル \\"{{name}}\\" を削除しました","modelRemoveFailed":"モデルの削除に失敗しました","loadMore":"もっと読み込む ({{count}})","modelsCount":"{{count}} モデル","noModels":"モデルなし","addModelFirst":"先にモデルを追加してください","local":"ローカル","localType":"タイプ","localEmbedded":"組み込み(インプロセス)","localDownloadFirst":"モデルサービスは未起動です","localDownloadModel":"モデルをダウンロード","localModelsTitle":"{{provider}} — ローカルモデル","localNoModels":"まだダウンロード済みモデルがありません","localRepoId":"モデルリポジトリID","localRepoIdRequired":"モデルリポジトリIDを入力してください","localRepoIdPlaceholder":"例: Qwen/Qwen3-0.6B-GGUF","localFilename":"ファイル名(任意)","localFilenamePlaceholder":"例: mistral-7b.Q4_K_M.gguf","localFilenameHint":"空欄にすると最適な量
181子化が自動選択されます","localSource":"ソース","localDownloadSuccess":"モデルのダウンロードに成功しました","localDownloadFailed":"モデルのダウンロードに失敗しました","localDeleteModel":"モデルを削除","localDeleteConfirm":"ローカルモデル \\"{{name}}\\" を削除しますか?モデルファイルはディスクから削除されます。","localModelDeleted":"モデル \\"{{name}}\\" を削除しました","localDeleteFailed":"モデルの削除に失敗しました","localDownloadPending":"ダウンロードの準備中...","localDownloading":"{{repo}} をダウンロード中... 数分かかる場合があります。","localDownloadNavigateHint":"他のページに移動しても構いません。ダウンロードはバックグラウンドで継続されます。","localDownloadInProgress":"すでにダウンロードが進行中です","localDownloaded":"ダウンロード済み","localNotDownloaded":"未ダウンロード","localNoRecommendedModels":"現在のマシン性能ではローカルモデルの実行に向いていません","localCancelDownloadTitle":"ダウンロードをキャンセル","localCancelDownloadAction":"ダウンロードをキャンセル","localCancelDownloadConfirm":"\\"{{repo}}\\" のダウンロードをキャンセルしますか?","localDownloadCancelled":"ダウンロードをキャンセルしました","localCancelDownloadFailed":"ダウンロードのキャンセルに失敗しました","localLlamacppName":"推論エンジン","localLlamacppInstallHint":"モデルのダウンロードや起動の前にローカルランタイムをインストールしてください。","localInstallLlamacpp":"llama.cpp をインストール","localLlamacppInstallStarted":"llama.cpp のダウンロードを開始しました","localLlamacppInstallSuccess":"llama.cpp のインストールが完了しました","localLlamacppInstallFailed":"llama.cpp のインストールに失敗しました","localRuntimeSectionTitle":"Inference Engine","localRuntimeSectionDescription":"Powered by Llama.cpp","localRuntimeComputeHint":"デフォルトでは CPU を使用します。GPU アクセラレーションが必要な場合は、Ollama または LM Studio を使用してください。","localRuntimeInstalled":"インストール済み","localRuntimeUpdateAvailable":"更新可能","localRuntimeUpdateAction":"クリックして最新バージョンをダウンロード","localRuntimeUpdateConfirmTitle":"llama.cpp の更新を確認","localRuntimeUpdateConfirmContent":"更新すると、現在インストールされている llama.cpp が上書きされます。確認すると最新バージョンのダウンロードとインストールを開始します。","localRuntimeUpdateConfirmContentWithServer":"更新すると、現在インストールされている llama.cpp が上書きされ、現在実行中のモデルサービス({{model}})が停止します。確認すると最新バージョンのダウンロードとインストールを開始します。","localRuntimeUnsupported":"未対応","localRuntimeMissing":"未導入","localServerRunningTitle":"現在のローカルサーバー","localServerOnline":"稼働中","localServerIdle":"停止","localServerUnavailable":"異常","localNoActiveModel":"実行中のモデルはありません","localNoDownloadedModelsHint":"ローカル推論サービスを起動する前に、適切なモデルをダウンロードしてください。","localDownloadModelFirst":"先にモデルをダウンロードしてください","localEngineInstallStateLabel":"導入","localEngineRunStateLabel":"状態","localEngineCurrentModelLabel":"現在提供中のモデル","localEngineNextStepLabel":"次のステップ","localEngineHealthLabel":"エンジン状態","localEngineStatusHint":"下の一覧から適切なモデルをダウンロードして起動してください","localStartServer":"起動","localStopServer":"停止","localServerStartFailed":"ローカルサーバーの起動に失敗しました","localServerStopFailed":"ローカルサーバーの停止に失敗しました","localServerSwitchTitle":"実行中モデルを切り替え","localServerSwitchConfirm":"現在 {{current}} が実行中です。{{next}} に切り替えますか?","localSwitchModel":"切り替え","localModelPathMissing":"このダウンロード済みモデルにはローカルパス情報がありません。","localModelsSectionTitle":"ローカルモデル","localModelsSectionDescription":"ダウンロード済みモデルはすぐに起動できます。同時に実行できるのは 1 つのモデルダウンロードと 1 つのローカルサーバーだけです。","localModelsLockedHint":"先に llama.cpp をインストールしてください","localAlternativeRuntimeHint":"Ollama または LM Studio をお試しください","localModelsCount":"ダウンロード済み {{downloaded}} / {{total}}","localCurrentDownloadTitle":"現在のダウンロード","localAdvancedConfigTitle":"ローカルモデル詳細設定","localAdvancedConfigDescription":"これらの設定は組み込みのローカル推論ランタイムに適用されます。最大コンテキスト長の変更は、次回ローカルサーバー起動時に反映されます。","localAdvancedConfigSaved":"ローカルモデル詳細設定を保存しました","localAdvancedConfigSaveFailed":"ローカルモデル詳細設定の保存に失敗しました","localMaxContextLengthLabel":"最大コンテキスト長","localMaxContextLengthHint":"モデルのコンテキストウィンドウで扱える最大トークン数です。各リクエストに含められる履歴長を決定します。変更は次回ローカルサーバー起動時に反映されます。","localMaxContextLengthRequired":"最大コンテキスト長を入力してください","localMaxContextLengthMin":"最大コンテキスト長は {{min}} 以上である必要があります","localMaxContextLengthPlaceholder":"最大コンテキスト長を入力","localServerPortLabel":"サーバーポート","localServerPortHint":"空欄の場合、llama.cpp は起動時に利用可能なポートを自動選択します。ポート番号を入力すると、以後の起動でその固定ポートを再利用します。変更は次回ローカルサーバー起動時に反映されます。","localServerPortRange":"サーバーポートは {{min}} から {{max}} の範囲で指定してください","localServerPortPlaceholder":"空欄で自動ポート選択","localGenerateConfigHint":"ローカルモデルの生成パラメータを JSON オブジェクトで設定します。後続の生成リクエストに展開して渡されます。","localCustomModelTitle":"カスタムモデルのダウンロード","localCustomModelHint":"モデルリポジトリIDを入力します。GGUF形式のみ対応。","localSourceHuggingFace":"Hugging Face","localSourceModelScope":"ModelScope","ollamaModelNamePlaceholder":"例: mistral:7b, qwen3:8b","testConnection":"接続テスト","testConnectionSuccess":"接続テストに成功しました","testConnectionFailed":"接続テストに失敗しました","testConnectionFailedWithMessage":"接続テストに失敗しました: {{message}}","testConnectionError":"接続テスト中にエラーが発生しました","discoverModels":"モデルを検出","discoverModelsFailed":"モデルの検出に失敗しました","ollamaFetchModelsFailed":"Ollamaモデルの取得に失敗しました。エラーの詳細を確認してください。","modelTestFailed":"モデルの検証に失敗しました。モデルIDが正しいか確認してください","modelTestFailedConfirm":"モデルの接続テストに失敗しました: {{message}}。このモデルを追加しますか?","autoDiscoveredAndAdded":"{{count}} 件のモデルを自動検出し、{{added}}
181 件の新規モデルを追加しました","autoDiscoveredNoNew":"{{count}} 件のモデルを自動検出しました。モデルリストはすでに最新です","autoDiscoverFailed":"モデルの自動検出に失敗しました。手動でモデルを追加できます","tagImage":"画像","tagVideo":"動画","tagTextOnly":"テキストのみ","tagMultimodal":"マルチモーダル","tagVision":"ビジョン","tagText":"テキスト","free":"無料","tagNotProbed":"未検出","probeMultimodal":"マルチモーダルテスト","probeImage":"画像","probeVideo":"動画","probeSupported":"対応: {{types}}","probeNotSupported":"このモデルはマルチモーダル入力に対応していません","probeFailed":"検出に失敗しました","modalityVision":"画像","modalityAudio":"音声","modalityVideo":"動画","modalityFile":"ファイル","modalityText":"テキストのみ","searchProviderPlaceholder":"プロバイダー名を検索","selectAllProviders":"すべて選択","clearProviderSelection":"すべて解除","noMatchingProviders":"一致するプロバイダーがありません","filterFreeOnly":"無料モデルのみ"}'),wI={title:"ファイル",navigator:"ファイルナビゲーター",source:"ソース",workspace:"ワークスペース",profile:"プロフィール",memory:"長期記憶",daily:"日記",digest:"ナレッジベース",memoryGraph:"メモリグラフ",memoryGraphShort:"グラフ",memoryGraphLoading:"メモリグラフを読み込み中…",memoryGraphLoadFailed:"メモリグラフを読み込めませんでした。",memoryGraphCounts:"{{nodes}} ノード · {{edges}} リンク",memoryGraphEmpty:"インデックス済みのメモリリンクはありません。",memoryGraphZoomOut:"縮小",memoryGraphZoomIn:"拡大",memoryGraphFit:"全体を表示",memoryGraphRoot:"ルート",memoryGraphRootDirect:"直結ファイル",memoryGraphOtherFile:"その他のファイル",memoryGraphIndexed:"インデックス済みファイル",memoryGraphUnresolved:"未解決リンク",memoryGraphDirection:"Wiki リンクの方向",memoryGraphOpenFile:"Markdownを開く",memoryGraphOutbound:"発リンク · {{count}}",memoryGraphInbound:"被リンク · {{count}}",projectDirectory:"プロジェクトディレクトリ",workspaceDirectory:"設定ディレクトリ",switchRoot:"ディレクトリを切り替え",manageDirs:"ディレクトリを管理…",primaryRoot:"メイン",rootMissing:"見つかりません",rootsPending:"他 {{count}} 件は最初のメッセージ送信後に利用できます",sourceEmpty:"このソースにはまだファイルがありません。",loadMore:"次の200件を読み込む",upload:"ファイルをアップロード",conflictPolicy:"アップロード競合ポリシー",conflictRename:"両方を保持",conflictRenameDescription:"新しいファイル名に番号を付け、既存ファイルを保持します。",conflictSkip:"既存を保持",conflictSkipDescription:"同名の新規ファイルをスキップし、残りをアップロードします。",conflictOverwrite:"新しいファイルを使用",conflictOverwriteDescription:"既存ファイルを新しいファイルで置き換えます。",uploadConflictTitle:"同名ファイルがあります",uploadConflictDescription:"次のファイルは既に存在します:{{files}}。処理方法を選択してください。",promptToggle:"{{name}} をシステムプロンプトに含めるか切り替えます",addSystemPrompt:"ワークスペースから追加",addSystemPromptTitle:"システムプロンプトファイルを追加",addSystemPromptDescription:"システムプロンプトに含めるワークスペースの Markdown ファイルを選択します。",searchSystemPromptFiles:"ワークスペースの Markdown ファイルを検索",noSystemPromptCandidates:"一致するファイルはありません。",sourceControl:"ソース管理",preview:"プレビュー",edit:"編集",selectFile:"開くファイルを選択",closeTab:"タブを閉じる",closeOtherTabs:"他のタブを閉じる",closeAllTabs:"すべてのタブを閉じる",openFiles:"開いているファイル、{{count}}ä»¶",openFilesLabel:"開いているファイル",openFileCount:"{{count}}件を開いています",searchOpenFiles:"ファイル名またはパスを検索",noOpenFilesFound:"一致するファイルはありません",scrollTabsLeft:"タブを左へスクロール",scrollTabsRight:"タブを右へスクロール",agentChangedFile:"エージェントがこのファイルを変更しました",keep:"保持",keepAll:"すべて保持",undo:"元に戻す",undoAll:"すべて元に戻す",copySelectionToChat:"選択範囲をチャットにã
181‚³ãƒ”ー",copyFileToChat:"ファイルをチャットにコピー",previewSize:"プレビュー · {{size}} バイト",backToPreview:"プレビューに戻る",download:"ダウンロード",downloadFailed:"ファイルをダウンロードできませんでした",resize:"ファイルドロワーの幅を変更",loadFailed:"ファイルを読み込めませんでした。現在のエージェントワークスペースのメイン作業ディレクトリにファイルがあることを確認してください。",previewUnavailable:"プレビューできません。メタデータの表示とダウンロードは利用できます。",mentionInChat:"チャットで参照",expandWorkspace:"ワークスペースを展開",openWorkspace:"ワークスペースを開く",closeWorkspace:"ワークスペースを閉じる"},PI={agentTitle:"エージェントのプロジェクトディレクトリ",sessionTitle:"セッションのプロジェクトディレクトリ",pathPlaceholder:"絶対ディレクトリパスを入力",recentProjects:"最近のプロジェクト",browseDirectory:"ディレクトリを参照",noRecentProjects:"最近のプロジェクトはありません",clearSelection:"選択したプロジェクトを解除",homeDirectory:"ホームディレクトリ",parentDirectory:"親ディレクトリ",refreshDirectory:"ディレクトリを更新",restoreDefault:"既定に戻す",createDirectory:"新しいフォルダーを作成",directoryNamePlaceholder:"フォルダー名を入力",createDirectoryFailed:"フォルダーを作成できませんでした",useWorkspace:"設定ディレクトリを使用",createSessionHint:"最初のメッセージ送信後にセッション専用ディレクトリを設定できます。",sessionSource:"セッション",agentSource:"エージェント既定",makePrimary:"主にする",remove:"削除",add:"追加",boundDirs:"追加したプロジェクトディレクトリ",primaryHint:"ツール呼び出しとコマンドは既定でメインディレクトリで実行されます。",primaryTag:"メイン",unbound:"バインドされたディレクトリなし",unavailable:"見つかりません",alreadyBound:"既にバインド済み",tooMany:"バインドできるディレクトリは最大 {{max}} 件です。",countTitle:"設定済みディレクトリ数"},AI=JSON.parse('{"title":"設定","projectDirectoryTitle":"既定のプロジェクトディレクトリ","projectDirectoryDescription":"ファイルとコマンドで使用する既定ディレクトリです。","projectDirectoryDefault":"エージェントの既定値","changeProjectDirectory":"ディレクトリを変更","projectDirectoryWorkspaceFallback":"エージェントワークスペースを使用中","enhancedCodeCapability":"コード能力を強化","enhancedCodeCapabilityTooltip":"プロジェクトディレクトリを変更せずにコードツールを追加します。","enhancedCodeCapabilityDescription":"AST、LSP、コードプロンプト、Gitコンテキスト、ソース管理を有効にします。","description":"エージェントのランタイムパラメーターを設定します","reactAgentTitle":"ReActエージェント","llmRetryTitle":"LLM自動再試行","llmRetryEnabled":"自動再試行を有効化","llmRetryEnabledTooltip":"レート制限、タイムアウト、接続エラーなどの一時的なLLM API失敗を自動で再試行します。保存後、新しいリクエストに適用されます。","llmMaxRetries":"最大再試行回数","llmMaxRetriesTooltip":"再試行可能なLLMエラーが発生した場合の追加再試行回数の上限です。","llmMaxRetriesPlaceholder":"最大再試行回数を入力","llmMaxRetriesRequired":"最大再試行回数は必須です","llmMaxRetriesMin":"最大再試行回数は1以上である必要があります","llmBackoffBase":"バックオフ初期待機時間(秒)","llmBackoffBaseTooltip":"最初の再試行までの基本待機時間です。以降は指数バックオフで増加します。","llmBackoffBasePlaceholder":"初期待機時間を入力","llmBackoffBaseRequired":"バックオフ初期待機時間は必須です","llmBackoffBaseMin":"バックオフ初期待機時間は0.1秒以上である必要があります","llmBackoffCap":"バックオフ最大待機時間(秒)","llmBackoffCapTooltip":"指数バックオフの待機時間の上限です。","llmBackoffCapPlaceholder":"最大待機時間を入力","llmBackoffCapRequired":"バックオフ最大待機時間は必須です","llmBackoffCapMin":"バックオフ最大待機時間は0.5秒以上である必要があります","llmBackoffCapGteBase":"バックオフ最大待機時間は初期待機時間以上である必要があります","llmRateLimiterTitle":"LLMレートリミッター","llmMaxConcurrent":"最大同時リクエスト数","llmMaxConcurrentTooltip":"同時に実行できるLLMリクエストの上限です。すべてのAgentで共有されます。変更は再起動後に反映されます。","llmMaxConcurrentPlaceholder":"最大同時リクエスト数を入力","llmMaxConcurrentRequired":"最大同時リクエスト数は必須です","llmMaxConcurrentRange":"最大同時リクエスト数は1以上である必要があります","llmMaxQpm":"最大クエリ数/分(QPM)","llmMaxQpmTooltip":"60秒スライディングウィンドウ内で許可される最大リクエスト数です。上限を超えるリクエストはディスパッチ前に待機し、429レート制限エラーを未然に防ぎます。0 = 無制限。","llmMaxQpmPlaceholder":"最大QPMを入力(0 = 無制限)","llmMaxQpmRequired":"最大QPMは必須です","llmMaxQpmRange":"最大QPMは0以上である必要があります","llmRateLimitPause":"レート制限一時停止(秒)","llmRateLimitPauseTooltip":"429レート制限レスポンスを受信した際に適用されるデフォルトの一時停止時間(秒)です。APIのRetry-Afterヘッダーが存在する場合はそちらが優先されます。","llmRateLimitPausePlaceholder":"一時停止時間を入力","llmRateLimitPauseRequired":"レート制限一時停止時間は必須です","llmRateLimitPauseMin":"レート制限一時停止時間は1秒以上である必要があります","llmRateLimitJitter":"ジッター範囲(秒)","llmRateLimitJitterTooltip":"一時停止時間に追加されるランダムなジッター範囲(秒)です。同時待機者の起床をずらすことで新たなバーストを防ぎます。","llmRateLimitJitterPlaceholder":"ジッター範囲を入力","llmRateLimitJitterRequired":"ジッター範囲は必須です","llmRateLimitJitterMin":"ジッター範囲は0秒以上である必要があります","llmAcquireTimeout":"スロット取得タイムアウト(秒)","llmAcquireTimeoutTooltip":"レートリミタースロットの取得を待機する最大時間(秒)です。タイムアウト後ã
181¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ます。","llmAcquireTimeoutPlaceholder":"タイムアウト時間を入力","llmAcquireTimeoutRequired":"スロット取得タイムアウトは必須です","llmAcquireTimeoutMin":"スロット取得タイムアウトは10秒以上である必要があります","llmAcquireTimeoutGtPauseJitter":"スロット取得タイムアウトはレート制限一時停止とジッターの合計より大きい必要があります","contextManagementTitle":"コンテキスト管理","memoryManagerBackend":"長期記憶管理バックエンド","memoryManagerBackendTooltip":"メモリマネージャーのバックエンドタイプ。remelight(ローカルファイル)、adbpg(クラウドデータベース)、PowerContext(リモートメモリサービス)、または none(メモリを無効化)から選択できます。","memoryManagerBackendRestartWarning":"長期記憶管理バックエンドの切り替えはホットリロードに対応していません。変更を反映するには保存後に QwenPaw を再起動してください。","maxIters":"最大反復回数","maxItersTooltip":"ReActエージェントの推論・行動サイクルの最大反復回数","maxItersPlaceholder":"最大反復回数を入力","maxItersRequired":"最大反復回数は必須です","maxItersMin":"最大反復回数は1以上である必要があります","agentLoopTitle":"エージェント Loop 設定","loopMode":{"builtIn":"組み込み","builtInNote":"パイプライン固定 · 値は編集可能","templateSectionTitle":"Loop テンプレート","templateSectionDescription":"組み込みテンプレートを選択するか、独自に追加します。","defaultTab":"デフォルト","goalTab":"ゴール","missionTab":"ミッション","defaultDescription":"明示的なモード以外で使用する標準の保護付き ReAct Loop。","goalDescription":"具体的で検証可能なゴール向けの持続 Loop。","missionDescription":"長時間の複数ステップミッション向けパイプライン。","gatePipeline":"Gate パイプライン","repetitionTitle":"反復保護","repetitionDescription":"繰り返されるツール呼び出しを検出して介入します。","iterationTitle":"反復回数制限","iterationDescription":"ReAct の反復回数を制限します。","retryTitle":"定性的完了チェック","retryDescription":"ツール呼び出しを含まないテキスト応答のときだけ実行します。","goalTurnTitle":"ゴールのターン制限","goalTurnDescription":"アクティブなゴール内のターン数を制限します。","maxGoalTurns":"ゴールの最大ターン数","goalBudgetTitle":"ゴールのトークン予算","goalBudgetDescription":"ゴール全体が予算に達したら停止します。","maxGoalTokens":"ゴールの最大トークン数","goalCompletionTitle":"ゴール完了チェック","goalCompletionDescription":"停止前に明示的なゴール状態を確認します。","goalCompletionReadOnly":"完了は組み込みのゴール状態プロトコルで制御されます。","missionProgressTitle":"ミッション進捗チェック","missionProgressDescription":"全ストーリーが通過するか上限まで継続します。","missionProgressReadOnly":"完了は組み込みの Mission Story 状態で制御されます。","missionIterationTitle":"Mission の反復上限","missionIterationDescription":"新しい Mission の既定の実行上限を設定します。","workerAttemptsTitle":"Worker の試行回数","workerAttemptsDescription":"Story の検証失敗後の Worker 再試行回数を制限します。","missionVerificationTitle":"Mission の検証ポリシー","missionVerificationDescription":"既定の検証ガイダンスとテストコマンドを設定します。","defaultMaxMissionIterations":"既定の最大実行ラウンド数","defaultMaxMissionIterationsTooltip":"/mission で --max-iterations が未指定の場合に使用します。","maxRetriesPerStory":"Story ごとの最大再試行回数","maxRetriesPerStoryTooltip":"Verifier が失敗または部分完了を返した後の Worker 再試行回数です。","defaultVerificationInstructions":"検証ガイダンス(任意)","defaultVerificationInstructionsHelp":"すべての Mission Verifier に適用する自然言語の指示です。","defaultVerificationInstructionsPlaceholder":"例:Windows のパス処理と実際の UI 表示を確認してください。","defaultVerifyCommand":"既定のテストコマンド(任意)","defaultVerifyCommandHelp":"Verifier は通常のツールと権限で実行を試みます。/mission --verify ã
181§ä¸Šæ›¸ãã§ãã¾ã™ã€‚","defaultVerifyCommandPlaceholder":"例:pytest -q","enableRepetitionProtection":"反復保護を有効化","removeRule":"ルールを削除","custom":"カスタム","customDescription":"QwenPaw 組み込み Gate で保存可能なパイプラインを構築します。","duplicate":"複製","delete":"削除","displayName":"表示名","duplicateModeName":"同じ名前の Loop モードが既に存在します。","slashCommand":"スラッシュコマンド","description":"説明","availableToAgent":"このエージェントで使用可能","runsTopToBottom":"上から下へ実行","addGate":"Gate を追加","emptyPipeline":"Gate を1つ以上追加すると、このモードを使用できます。","iterationGateTitle":"反復回数制限","iterationGateDescription":"指定回数の Loop 後に停止します。","doomGateTitle":"反復保護","doomGateDescription":"繰り返しを検出して戦略を変更します。","tokenGateTitle":"トークン予算","tokenGateDescription":"入力と出力のトークン使用量を制限します。","timeoutGateTitle":"Loop 時間制限","timeoutGateDescription":"時間超過後、実行中の処理を中断せず次の Loop 境界で停止します。","toolBudgetGateTitle":"ツール呼び出し予算","toolBudgetGateDescription":"全体および指定ツールの呼び出しを制限します。","retryGateTitle":"早期終了の再試行","retryGateDescription":"終了前に再確認を促します。","rubricGateTitle":"完了ルーブリック","rubricGateDescription":"明示的な基準を評価し、必要なら修正します。","qualitativeRubricTitle":"定性的完了チェック","qualitativeRubricDescription":"ツール呼び出しのないテキスト応答を自然言語の基準で確認します。","qualitativeRubric":"自然言語の完了基準","qualitativeRubricHelp":"ツール呼び出しのないテキスト応答でのみ実行し、作業が残る場合は続行させます。","completionRubricTitle":"完了信号チェック","completionRubricDescription":"ツール呼び出しのないテキスト応答で完了信号を確認します。","completionRubricHelp":"ツール呼び出しのないテキスト応答後に実行します。完了時は完了信号を出力し、未完了時は最大判定回数に達するまで作業を続行します。","completionPrompt":"完了判定プロンプト","completionPromptHelp":"完了と見なす条件を記述します。完了信号の出力指示は QwenPaw が自動的に挿入します。","completionSignal":"完了信号","completionSignalHelp":"QwenPaw はこの信号と、この信号だけを出力する指示を判定プロンプトに挿入します。前後の空白と大文字小文字を無視した完全一致のみが Loop を終了します。","removeCriterion":"基準 {{number}} を削除","totalTokensHelp":"このターンで使用する入力・出力トークンの合計上限です。","promptTokensHelp":"システム指示、会話履歴、ツール定義、ツール結果を含みます。","completionTokensHelp":"このターンでモデルが生成するトークンの上限です。","maxIterations":"最大反復回数","historyWindow":"履歴ウィンドウ","similarityThreshold":"類似度しきい値","totalTokens":"最大総トークン","promptTokens":"最大入力トークン","completionTokens":"最大出力トークン","maxSeconds":"最大秒数","maxSecondsHelp":"現在のモデル応答またはツール呼び出しの完了後に時間を確認し、実行中の処理は中断しません。","allToolCalls":"全ツール呼び出し","perToolLimits":"ツール別制限","toolName":"ツール名","callLimitAria":"{{name}} の呼び出し上限","removeToolLimitAria":"{{name}} の制限を削除","addToolLimit":"ツール別制限を追加","maxRetries":"最大再試行回数","retryInstruction":"再試行の指示","passThreshold":"合格しきい値","maxEvaluations":"最大判定回数","graderError":"評価エラー","stopSafely":"安全に停止","verifyOnceMore":"もう一度検証","completionCriteria":"完了基準","criterionPlaceholder":"観測可能な完了条件を記述","required":"必須","weight":"重み","addCriterion":"基準を追加","moveGateAria":"{{title}} を移動","removeGate":"Gate を削除","newModeName":"新しい Loop モード","defaultCustomDescription":"カスタム Gate パイプライン。","copyName":"{{name}} のコピー","createModeAria":"カスタム Loop モードを作成","createModeTitle":"カスタム Loop モードを作成","startingTemplate":"開始テンプレート","startingPipeline":"開始パイプライン","blankPipelineHint":"空の状態から始め、後でゲートを追加","safeTemplate":"安全な実行","researchTemplate":"予算付き調査","qualityTemplate":"品質優先","blankTemplate":"空のパイプライン"},"doomLoopEnabled":"繰り返し行動保護","doomLoopEnabledTooltip":"エージェントが同じ操作を繰り返している場合に自動的に介入します","doomLoopAfter":"連続","doomLoopRepetitions":"回の同一操作後","doomLoopStopAction":"一時停止して確認を待つ","doomLoopWarnAction":"リマインダーを送信","doomLoopSimpleMode":"シンプル","doomLoopAdvancedMode":"詳細","doomLoopWindowSize":"検出範囲","doomLoopWindowSizeTooltip":"繰り返し検出のために最近何回の操作をチェックするか","doomLoopSimilarity":"マッチ感度","doomLoopSimilarityTooltip":"操作がどの程度類似していれば繰り返しとみなã
181™ã‹ï¼ˆä½Žã„ほど厳格)","doomLoopStages":"介入ルール","doomLoopAction":"アクション","doomLoopPrompt":"メッセージ","doomLoopPromptPlaceholder":"リマインダーメッセージまたは一時停止の理由...","doomLoopAddStage":"ルールを追加","iterationTitle":"イテレーション制限","iterationEnabled":"イテレーション制限を有効化","iterationEnabledTooltip":"固定回数のループ後にエージェントを停止","iterationMaxIterations":"最大イテレーション数","iterationMaxIterationsTooltip":"停止するまでの最大ループ回数","rubricTitle":"定性的完了チェック","rubricEnabled":"定性的完了チェックを有効化","rubricEnabledTooltip":"ツール呼び出しを含まないテキスト応答のときだけ実行します。","rubricPrompt":"自然言語の完了基準","rubricPromptTooltip":"タスク完了評価を求めるために注入されるプロンプト","rubricDesc":"ツール呼び出しのないテキスト応答に自然言語の完了基準を適用し、作業が残る場合は続行させます。","rubricPromptPlaceholder":"前のターンでツールを呼び出しませんでした。タスクが完了している場合は確認してください。そうでなければツールを使って続行してください。","rubricMaxInterventions":"最大判定回数","rubricMaxInterventionsTooltip":"1ターン内で、ツール呼び出しのないテキスト応答に対して行う完了チェックの最大回数です。","inLoopModes":"/goal・/mission モードでも有効化","inLoopModesTooltip":"/goal または /mission ループモードがアクティブな時もこのゲートを適用","comingSoonEditable":"カスタム設定は将来のリリースで利用可能になります。","simpleMode":"シンプル","advancedMode":"詳細","comingSoon":"近日公開","reactModeTab":"Loopテンプレート - デフォルト","goalModeTab":"Loopテンプレート - Goal","missionModeTab":"Loopテンプレート - Mission","goalModeInfoTitle":"Goalモード vs デフォルト","goalModeInfo":"デフォルトモードは応答後に停止します。Goalモードはエージェントを目標に向かってループさせ、Rubric評価で完了を判断します。すべての操作は現在のエージェントコンテキスト内で実行されます。","missionModeInfoTitle":"Missionモード vs Goalモード","missionModeInfo":"Missionモードは複雑なタスクを自動分解し、独立したWorkerサブエージェントが実行、Verifierサブエージェントが検証します。各サブタスクは独自のコンテキストで実行され、メインセッションのコンテキスト汚染を防ぎます。","goalIterationGate":"目標イテレーションゲート","goalIterationGateDesc":"目標セッション内のエージェントターン数を制限し、イテレーション数とトークン使用量を追跡します。","goalBudgetGate":"トークン予算ゲート","goalBudgetGateDesc":"目標セッションのトークン消費上限を設定し、予算超過時にエージェントを停止します。","goalRubricGate":"目標完了ルーブリック","goalRubricGateDesc":"セッション状態をチェックして目標が達成されたかを評価します。","goalDoomGate":"繰り返し保護","goalDoomGateDesc":"目標実行中の繰り返しパターンを検出し、介入をトリガーします。","missionProgressGate":"ミッション進捗ゲート","missionProgressGateDesc":"PRDユーザーストーリーの完了状況を追跡します。すべて合格または最大イテレーションに達するまで続行します。","missionIterBypass":"イテレーションバイパス","missionIterBypassDesc":"ミッション実行中にReActイテレーション制限を一時的に解除し、長時間のフェーズを許可します。","customLoopTitle":"カスタムループモード","customLoopDesc":"カスタムゲート組み合わせで独自のループモードを作成。近日公開予定。","autoContinueOnTextOnly":"テキストのみのステップで自動継続","autoContinueOnTextOnlyTooltip":"推論ステップがツール呼び出しなしのテキストのみで終わった場合、ヒントを挿入し同じツール方針でもう1回推論します。多段階タスクの途中停止を減らします。オフにすると従来どおりです。有効時はトークン消費が増える場合があります。","autoGenerateSessionTitle":"セッションタイトルを自動生成","autoGenerateSessionTitleTooltip":"新しいチャットの最初のユーザーメッセージ後、バックグラウンドで短いLLM呼び出しを実行し、切り詰められたプレースホルダを簡潔なタイトルに置き換えます。新しいチャットごとに短いLLM呼び出しが1回追加されます。オフにするとプレースホルダのままで、その追加コストは発生しません。","shellCommandTimeout":"Shellコマンドタイムアウト(秒)","shell
181CommandTimeoutTooltip":"execute_shell_commandツールのデフォルトタイムアウト(秒)。LLMはtimeoutパラメータで呼び出しごとにこの値を上書きできます。コンパイルやデータ処理などの長時間タスクに便利です。","shellCommandTimeoutPlaceholder":"タイムアウトを入力","shellCommandTimeoutRequired":"Shellコマンドタイムアウトは必須です","shellCommandTimeoutMin":"Shellコマンドタイムアウトは1秒以上である必要があります","shellCommandExecutable":"Shell実行ファイル","shellCommandExecutableTooltip":"execute_shell_commandが使用するシェルのパス。Linux/macOS: /bin/bash、/bin/zshなど。Windows: powershell.exe、pwsh.exe、またはGit Bashなどの POSIX互換シェルに対応。空の場合は $SHELL 環境変数、次にプラットフォームデフォルト(Unixは /bin/sh、Windowsは cmd.exe)にフォールバックします。","shellCommandExecutablePlaceholder":"例: /bin/bash または powershell.exe(空 = 自動検出)","maxInputLength":"最大入力長","maxInputLengthTooltip":"モデルのコンテキストウィンドウの最大入力長(トークン数)","maxInputLengthPlaceholder":"最大入力長を入力","maxInputLengthRequired":"最大入力長は必須です","maxInputLengthMin":"最大入力長は1000以上である必要があります","contextCompactRatio":"コンテキスト圧縮比率","contextCompactRatioTooltip":"コンテキストがいっぱいの時に圧縮するコンテキストの比率","contextCompactRatioRequired":"コンテキスト圧縮比率は必須です","contextCompactThreshold":"コンテキスト圧縮閾値","contextCompactThresholdTooltip":"コンテキスト圧縮閾値(トークン数)、最大入力長と圧縮比率から自動計算","contextCompactThresholdPlaceholder":"自動計算","contextCompactReserveRatio":"コンテキスト予約比率","contextCompactReserveRatioTooltip":"コンテキスト圧縮時に予約する比率","contextCompactReserveRatioRequired":"コンテキスト予約比率は必須です","contextCompactReserveThreshold":"コンテキスト予約閾値","contextCompactReserveThresholdTooltip":"コンテキスト予約閾値(トークン数)、最大入力長と予約比率から自動計算","contextCompactReserveThresholdPlaceholder":"自動計算","toolResultCompactRecentN":"ツール呼び出し結果のrecent_n","toolResultCompactRecentNTooltip":"最近のしきい値を使用するツール呼び出し結果の数","toolResultCompactRecentNRequired":"ツール呼び出し結果のrecent_nは必須です","toolResultCompactOldThreshold":"recent_nを超えるツール呼び出し結果の最大文字数","toolResultCompactOldThresholdTooltip":"recent_n範囲外のツール呼び出し結果で、この文字数を超えると圧縮されます","toolResultCompactOldThresholdPlaceholder":"文字数しきい値を入力","toolResultCompactOldThresholdRequired":"recent_nを超えるツール呼び出し結果の最大文字数は必須です","toolResultCompactRecentThreshold":"recent_n内のツール呼び出し結果の最大文字数","toolResultCompactRecentThresholdTooltip":"recent_n範囲内のツール呼び出し結果で、このバイト数を超えると圧縮されます。また、read_fileツールの1回の読み取りで返される最大バイト数にもなります。古いメッセージのしきい値以上である必要があります","toolResultCompactRecentThresholdPlaceholder":"文字数しきい値を入力","toolResultCompactRecentThresholdRequired":"recent_n内のツール呼び出し結果の最大文字数は必須です","toolResultCompactRetentionDays":"ツール呼び出しファイルの保持日数","toolResultCompactRetentionDaysTooltip":"圧縮されたツール結果ファイルの保持日数、期限切れは自動削除されます","toolResultCompactRetentionDaysRequired":"ツール呼び出しファイルの保持日数は必須です","historyRetentionDays":"履歴の保持日数","historyRetentionDaysTooltip":"永続的なチャット履歴を保持する日数。古い行は起動時とエージェント終了時に自動的に削除されます。","historyRetentionDaysRequired":"履歴の保持日数は必須です","historyRetentionDaysForeverWarning":"0 に設定すると履歴を永久に保持し、ストレージが無制限に増加します。","historyRetentionDaysLargeWarning":"保持日数が大きいと、ストレージを大量に消費する可能性があります。","exemptFileExtensions":"除外ファイル拡張子","exemptFileExtensionsTooltip":"read_fileツールの結果で、これらのファイル拡張子には最新メッセージの圧縮しきい値が使用されます","exemptFileExtensionsPlaceholder":".md, .txt, .json","exemptToolNames":"除外ツール名","exemptToolNamesTooltip":"これらのツールの結果には最新メッセージの圧縮しきい値が使用されます","exemptToolNamesPlaceholder":"chat_with_agent, list_agents","language":"エージェント言語","languageTooltip":"エージェントのペルソナファイルï¼
181ˆSOUL.md、AGENTS.md など)の言語。変更すると選択した言語のMDファイルが再コピーされます。","languageConfirmTitle":"エージェント言語の変更","languageConfirmContent":"言語を変更すると、以下のファイルが新しい言語のデフォルト版で上書きされます:\\n\\n  SOUL.md、AGENTS.md、PROFILE.md、MEMORY.md、BOOTSTRAP.md、HEARTBEAT.md\\n\\nカスタマイズ済みのファイルがある場合は、事前にバックアップしてください。その他のファイルは影響を受けません。","languageConfirmOk":"言語を変更","languageSaveSuccess":"言語を更新しました","languageSaveSuccessWithFiles":"言語を更新し、{{count}} 個のMDファイルをコピーしました","languageSaveFailed":"言語の更新に失敗しました","timezone":"ユーザータイムゾーン","timezoneTooltip":"スケジュールタスク、時刻表示、エージェントコンテキストに使用されます。デフォルトはシステムのタイムゾーンです。","timezoneRequired":"タイムゾーンを選択してください","selectTimezone":"タイムゾーンを選択","timezoneSaveSuccess":"タイムゾーンを更新しました","timezoneSaveFailed":"タイムゾーンの更新に失敗しました","saveSuccess":"設定を保存しました","saveFailed":"設定の保存に失敗しました","loadFailed":"設定の読み込みに失敗しました","historyMaxLength":"履歴の最大長","historyMaxLengthTooltip":"/history コマンドの最大出力長(文字数)","historyMaxLengthRequired":"履歴の最大長は必須です","historyMaxLengthMin":"履歴の最大長は1000以上である必要があります","historyMaxLengthPlaceholder":"最大長を入力","contextCompactTitle":"コンテキスト圧縮設定","contextCompactEnabled":"コンテキスト圧縮を有効化","contextCompactEnabledTooltip":"コンテキストウィンドウのオーバーフローを防ぐために自動的にコンテキストを圧縮します","tokenCountModel":"トークンカウントモデル","tokenCountModelTooltip":"精確なトークン数計算に使用するモデル名。「default」を設定すると組み込みの推定値を使用します","tokenCountModelPlaceholder":"モデル名または default","tokenCountUseMirror":"HuggingFaceミラーを使用","tokenCountUseMirrorTooltip":"トークナイザーのダウンロード時にHuggingFaceミラーサイトを使用します","tokenCountEstimateDivisor":"byte/Token 推定除数","tokenCountEstimateDivisorTooltip":"バイト数に基づくトークン数推定の除数(トークン数 ≈ バイト数 / 除数)。推奨値:3.75~4","tokenCountEstimateDivisorRequired":"推定除数は必須です","tokenCountEstimateDivisorMin":"推定除数は2から5の範囲である必要があります","toolResultCompactTitle":"ツール結果圧縮設定","toolResultCompactEnabled":"ツール結果圧縮を有効化","toolResultCompactEnabledTooltip":"過大なツール呼び出し結果を圧縮してコンテキストスペースを節約します","memorySummaryTitle":"長期記憶設定","memorySummaryEnabled":"記憶まとめを起動","memorySummaryEnabledTooltip":"コンテキスト圧縮時に自動的に記憶サマリーを生成・保存します","dreamCronEnabled":"ドリームを有効化","dreamCronEnabledTooltip":"Cron によるドリームベースの記憶最適化タスクを有効にします","dreamCron":"ドリームスケジュール","dreamCronTooltip":"ドリーム状態を通じて定期的に長期記憶を最適化するCron式です。実行は上のスイッチで切り替えます","dreamCronPlaceholder":"0 23 * * *","dreamCronRequired":"ドリームを有効にする場合は Cron 式を入力してください","dreamCronInvalid":"有効な5フィールドの Cron 式を入力してください","autoMemorySearch":"自動記憶検索(Beta)","autoMemorySearchTooltip":"毎回の会話で記憶検索を自動実行します。各クエリで自動的に記憶検索機能を呼び出し、QwenPawがあなたをより理解できますが、トークン消費が増加します。","autoMaxResults":"自動検索の最大結果数","autoMaxResultsTooltip":"自動記憶検索が有効な
181場合に返される最大結果数","autoMaxResultsRequired":"最大結果数は必須です","autoMaxResultsMin":"最大結果数は1以上である必要があります","inboxPushEnabled":"記憶結果の受信トレイ通知","inboxPushEnabledTooltip":"自動記憶、自動夢想、Daily Paper の結果を受信トレイに送信します。無効にしても記憶ジョブは停止しません。","autoMemoryInterval":"自動記憶の間隔","autoMemoryIntervalTooltip":"ユーザークエリ N 回ごとに自動記憶を実行します。0 は定期的な自動記憶を無効にします。1 は各クエリ後に自動記憶を実行します。推奨設定は 2-5 です。1 に設定する場合は高いトークン消費に注意してください。","autoMemoryIntervalPlaceholder":"0 を入力すると定期的な自動記憶を無効化","autoMemoryIntervalRequired":"自動記憶の間隔を入力してください","autoMemoryIntervalMin":"自動記憶の間隔は 0 以上である必要があります","embeddingConfigTitle":"埋め込みモデル設定","embeddingModelTitle":"埋め込みモデル","embeddingBackend":"埋め込みSDKタイプ","embeddingBackendTooltip":"埋め込みモデルの呼び出しに使用するSDKタイプ","embeddingBackendPlaceholder":"SDKタイプを選択","embeddingApiKey":"API Key","embeddingApiKeyTooltip":"埋め込みプロバイダーのAPIキー。認証が不要な場合は空欄にしてください","embeddingApiKeyPlaceholder":"不要な場合は空欄","embeddingBaseUrl":"Base URL","embeddingBaseUrlTooltip":"埋め込みAPIのBase URL。OpenAI互換バックエンドでは、このカスタムエンドポイントは任意で、API Keyとモデル名が必須です","embeddingBaseUrlPlaceholder":"https://dashscope.aliyuncs.com/compatible-mode/v1","embeddingHost":"Host","embeddingHostTooltip":"OllamaサービスのURL。空欄の場合はOllamaのデフォルトホストを使用します","embeddingHostPlaceholder":"http://localhost:11434","embeddingModelName":"モデル名","embeddingModelNameTooltip":"埋め込みモデル名。すべての埋め込みバックエンドで必須です","embeddingModelNamePlaceholder":"text-embedding-v4","embeddingEnableCache":"埋め込みキャッシュを有効化","embeddingEnableCacheTooltip":"埋め込み結果をキャッシュして重複計算を削減します","embeddingMaxCacheSize":"最大キャッシュサイズ","embeddingMaxCacheSizeTooltip":"埋め込みキャッシュの最大エントリ数","embeddingMaxCacheSizeRequired":"最大キャッシュサイズは必須です","embeddingUseDimensions":"リクエストで次元数を送信","embeddingUseDimensionsTooltip":"OpenAI 互換の Embedding API リクエストに dimensions パラメータを含めます。一部のサービスはこのパラメータに対応していません","embeddingDimensions":"埋め込み次元数","embeddingDimensionsTooltip":"レスポンス検証、インデックス、キャッシュに使用する想定ベクトル次元数です。リクエストでの送信を無効にした場合も、モデルが実際に出力する次元数を入力してください","embeddingDimensionsRequired":"埋め込み次元数は必須です","embeddingDimensionsMin":"次元数は1以上である必要があります","embeddingMaxInputLength":"入力ごとの文字数予算","embeddingMaxInputLengthTooltip":"各 Embedding 入力のおおよその文字数予算です。リクエスト前にテキストを切り詰め、CJK などの全角文字はより保守的に見積もります。正確なトークン上限ではありません","embeddingMaxInputLengthRequired":"入力ごとの文字数予算は必須です","embeddingMaxBatchSize":"最大バッチサイズ","embeddingHealthCheckTimeout":"初期化タイムアウト","embeddingHealthCheckTimeoutTooltip":"接続テストと ReMe 起動時の埋め込みヘルスチェックにおける各試行のタイムアウト","embeddingHealthCheckTimeoutRequired":"初期化タイムアウトは必須です","embeddingMaxBatchSizeTooltip":"単一バッチ埋め込みリクエストの最大アイテム数","embeddingMaxBatchSizeRequired":"最大バッチサイズは必須です","maxContextLength":"最大コンテキスト長","maxContextLengthTooltip":"モデルコンテキストウィンドウの最大トークン数。
181各リクエストで保持できる最大履歴長を決定します","maxContextLengthRequired":"最大コンテキスト長は必須です","maxContextLengthMin":"最大コンテキスト長は1000以上である必要があります","maxContextLengthPlaceholder":"最大コンテキスト長を入力","embeddingActivationNote":"選択したバックエンドの必須項目が入力されると埋め込み機能が有効になります","embeddingEnableHint":"選択したバックエンドの必須項目が入力されると埋め込み機能が有効になります。OpenAI互換またはGeminiではモデル名とAPI Key、Ollamaではモデル名が必要です。","rebuildMemoryIndex":"記憶インデックスを再構築","rebuildMemoryIndexWarning":"この操作は記憶検索インデックスを消去して再構築するため、多くのCPUとメモリを消費する可能性があります。インデックスの破損や検索結果の異常を修復する場合にのみ使用してください。","rebuildMemoryIndexConfirmTitle":"記憶インデックスを再構築しますか?","rebuildMemoryIndexConfirm":"再構築中はCPUとメモリの使用量が大幅に増加する可能性があります。インデックスが破損している、または修復が必要な場合を除き、実行は推奨されません。","rebuildMemoryIndexSuccess":"記憶インデックスの再構築が完了しました","rebuildMemoryIndexFailed":"記憶インデックスの再構築に失敗しました:{{error}}","rebuildMemoryIndexRequired":"Embedding設定が変更されました。Embeddingインデックスが再構築されるまで、ベクトル検索は無効になり、記憶検索にはBM25が使用されます。","embeddingIndexReady":"Embeddingインデックスは現在の設定と一致しています。","embeddingIndexStatus":"Embeddingインデックス","embeddingIndexAvailable":"最新","embeddingSearchModeHybrid":"現在の検索:ベクトル + BM25","embeddingSearchModeBm25":"現在の検索:BM25のみ","embeddingSearchModeBm25Pending":"現在の検索:BM25のみ · 再構築待ち","embeddingIndexNeedsRebuild":"再構築が必要","embeddingIndexRebuilding":"再構築中","embeddingIndexRebuildingHint":"メモリベクトルを生成しています","embeddingIndexSaveFirst":"先に設定を保存してください","embeddingIndexUnsavedHint":"インデックスを再構築する前に変更を保存してください","embeddingIndexMatchesConfig":"現在の設定と一致","embeddingIndexBm25Fallback":"ベクトル検索は無効 · BM25を使用中","rebuildEmbeddingIndex":"Embeddingインデックスを再構築","rebuildEmbeddingIndexConfirmTitle":"Embeddingインデックスを再構築しますか?","rebuildEmbeddingIndexConfirm":"現在の設定ですべての記憶チャンクのEmbeddingを再生成します。正常に完了するまで、ベクトル検索は無効のままです。","rebuildEmbeddingIndexSuccess":"Embeddingインデックスを再構築しました","rebuildEmbeddingIndexFailed":"Embeddingインデックスの再構築に失敗しました:{{error}}","undoEmbeddingChange":"変更を元に戻す","undoEmbeddingChangeConfirmTitle":"インデックス作成時のEmbedding設定を復元しますか?","undoEmbeddingChangeConfirm":"既存のベクトルインデックスと一致する直前の設定を復元します。","undoEmbeddingChangeSuccess":"インデックス作成時のEmbedding設定を復元しました","undoEmbeddingChangeFailed":"Embedding設定の復元に失敗しました:{{error}}","rebuildBm25Index":"BM25インデックスを再構築","rebuildBm25IndexDescription":"現在の記憶チャンクからキーワード検索インデックスを再生成します。","rebuildBm25IndexConfirmTitle":"BM25インデックスを再構築しますか?","rebuildBm25IndexConfirm":"現在の記憶チャンクからキーワード検索インデックスを再生成します。","rebuildBm25IndexSuccess":"BM25インデックスを再構築しました","goToLongTermMemory":"長期記憶へ移動","toolResultCompactRecentGtOld":"最新メッセージの閾値は古いメッセージの閾値以上である必要があります","lightContextTitle":"コンテキスト管理","visualCompactCollapseLabel":"ビジュアル圧縮","visualCompactDescription":"古く長いコンテキストをビジュアルページに圧縮して入力トークンを削減します。最近の会話はテキストのまま保持されます。","visualCompactEnabled":"Visual Compact を有効にする","visualCompactEffort":"圧縮強度","visualCompactLow":"低","visualCompactMedium":"中","visualCompactHigh":"高","visualCompactLowDescription":"圧縮する内容を抑え、読みやすさを優先します。","visualCompactMediumDescription":"トークン削減と視認性のバランスを取ります。","visualCompactHighDescription":"対象コンテキストをより多く圧縮し、トークン削減を優先します。","visualCompactQualityNote":"圧縮強度を上げても、回答品質が向上するとは限りません。","visualCompactCapabilityNote":"画像入力に対å¿
181œã™ã‚‹ãƒ¢ãƒ‡ãƒ«ã§ã®ã¿æœ‰åŠ¹ã§ã™ã€‚","remeLightMemoryTitle":"長期記憶","toolExecutionLevelTitle":"ツール承認モード","toolExecutionLevelTooltip":"承認モード","toolExecutionLevel":{"title":"ツール承認モード","alertMessage":"ツール呼び出し前の承認を設定します。ファイル保護ルールは独立して適用されます。","strict":"厳格モード","strictDesc":"すべてのツール呼び出しと外部ファイルへのアクセス前に承認が必要です","smart":"スマートモード","smartDesc":"低リスクのツール呼び出しと外部ファイルアクセスは自動実行され、中〜高リスクの操作には承認が必要です","auto":"自動モード","autoDesc":"ツールとファイルの承認ルールに一致する操作のみ承認が必要です(デフォルト)","off":"オフモード","offDesc":"ツールとファイルの承認を無効にします"},"saveLevelSuccess":"ツール承認モードを保存しました","saveLevelFailed":"ツール承認モードの保存に失敗しました","adbpgMemoryTitle":"ADBPG Long-term Memory","powercontextMemoryTitle":"PowerContext メモリ","powercontextConfig":{"title":"PowerContext メモリ設定","baseUrl":"サーバー URL","token":"Bearer トークン","scopeId":"メモリスコープ","scopeIdPlaceholder":"空欄の場合、このインストール固有のエージェントスコープを使用します","scopeIdInvalid":"メモリスコープを空白文字だけにすることはできません。","timeout":"リクエストタイムアウト","maxContextBytes":"注入するコンテキストの最大量(バイト)","maxContextBytesTooltip":"1回のモデル呼び出しに追加される PowerContext 検索結果の合計量を制限します。"},"adbpgConfig":{"title":"ADBPG Memory Configuration","restBaseUrl":"REST Base URL","restApiKey":"REST API Key","memoryIsolation":"Memory Isolation (per-agent)","searchTimeout":"Search Timeout"}}'),MI={title:"ビルトインツール",description:"ビルトインツールとその有効状態を管理します。無効なツールはエージェントで使用できません。",emptyState:"ツールが設定されていません",loadError:"ツールの読み込みに失敗しました",enableSuccess:"ツールを有効化しました",disableSuccess:"ツールを無効化しました",toggleError:"ツール状態の切り替えに失敗しました",enableAll:"すべて有効化",disableAll:"すべて無効化",enableAllSuccess:"すべてのツールを有効化しました",disableAllSuccess:"すべてのツールを無効化しました",allEnabled:"すべてのツールは既に有効です",allDisabled:"すべてのツールは既に無効です",asyncExecution:"非同期実行",asyncExecutionEnabled:"非同期実行が有効です",asyncExecutionDisabled:"非同期実行が無効です",browserUnifiedMode:"統合ブラウザー(ベータ)",browserLegacyMode:"レガシー互換モード",browserUnifiedModeButton:"新版(ベータ)",browserLegacyModeButton:"旧版(互換)",browserUnifiedDescription:"新しい統合ブラウザー機能を使用します。",browserLegacyDescription:"従来の動作が必要な場合は、元のブラウザー実装を使用します。",browserRestartPending:"サービスの再起動後に {{mode}} へ切り替わります。",configure:"設定",configured:"設定済み",requiresConfig:"設定が必要です",configSaved:"設定を保存しました",configSaveError:"設定の保存に失敗しました",webSearchProviderLabel:"プロバイダー",webSearchApiKeyLabel:"APIキー(任意)",webSearchQuotaHintBefore:"未登録時は1日100回まで。",webSearchQuotaHintAfter:"で登録すると1日1,000回無料に。",active:"個が有効",available:"利用可能",noEnabled:"有効なツールはありません",goEnableBtn:"有効にする",configureAction:"設定 →",enableAction:"有効化 →"},DI={promptTitle:"LLMモデルが必要です — 設定後にChatページで選択",promptMessage:"チャット機能にはLLMモデルが必要です。まずモデルを設定し、設定完了後にChatページ上部のモデルセレクターで選択してください。",configureButton:"モデルを設定",skipButton:"スキップ",chatDisabledTitle:"チャット無効",chatDisabledMessage:"モデルが設定されていないためチャット機能が無効です。チャットを有効にするにはモデルを設定してください。",configureNow:"モデルを設定",modelNotConfigured:"チャットを使用する前に設定でモデルを設定してください"},xI={changelog:"変更履歴",docs:"ドキュメント",tutorial:"チュートリアル",featureDemos:"機能デモ",faq:"よくある質問",github:"GitHub",resources:"ドキュメント資料",updateAvailable:"利用可能な更新"},RI={dark:"ダーク",light:"ライト",system:"システムに従う"},II={newVersion:"新しいバージョンが利用可能です: v{{version}}、クリックしてアップグレード",updateModal:{title:"新しいバージョンが利用可能です: v{{version}}",viewReleases:"リリースを見る",installDesktopUpdate:"今すぐ更新",desktopInstallHint:"QwenPaw Desktop {{version}} のインストール準備が整いました。更新後にアプリが再起動します。",checking:"更新を確認中…",checkingHint:"最新バージョンを確認しています",downloading:"更新をダウンロード中",downloadingTo:"バージョン {{version}} に更新中",downloadProgress:"{{done}} / {{total}} · {{rate}}",installing:"更新をインストール中",willRestart:"アプリはインストール完了後に自動的に再起動します",stepPrepare:"準備",stepDownloading:"ダウンロード",stepInstalling:"インストール",failedTitle:"更新に失敗しました",back:"戻る",retry:"再試
181行",errors:{network:"更新サーバーに接続できませんでした。インターネット接続を確認して再試行してください。",signature:"更新ファイルの署名検証に失敗しました。もう一度ダウンロードしてください。",appLocation:"QwenPaw は読み取り専用の macOS の場所から実行されています。QwenPaw.app を Applications フォルダーへ移動し、そこから起動してからもう一度更新してください。",other:"更新に失敗しました。"},updateLater:"バックグラウンドでダウンロード",backgroundDownloading:"バックグラウンドでダウンロード中…",readyToInstall:"更新の準備が完了",readyToInstallHint:"v{{version}} の更新をダウンロードしました。再起動してインストールし、新しいバージョンを起動します。",restartNow:"今すぐ更新",backgroundFailed:"バックグラウンドダウンロード失敗"},settings:{language:"言語",theme:"テーマ",mode:"モード",desktopMode:"デスクトップモード"},simpleMode:"シンプルモード",fullMode:"フルモード",toggleAgentNavigation:"エージェントナビゲーションを展開または折りたたむ"},_I={groups:{cronShort:"定期タスク",subagentShort:"サブエージェント"},fileReference:{codeSnippet:"コードスニペット · {{count}} 行"},modelSelectTooltip:"モデルを選択",newChatTooltip:"新しいチャット",searchTooltip:"すべてのチャットを検索",chatHistoryTooltip:"チャット履歴",wideModeTooltip:"ワイドモード",normalModeTooltip:"標準モード",messageDisplay:{stepsRunning:"実行中… · {{count}} ステップ",stepsCanceled:"キャンセル済み · {{count}} ステップ",stepsFailed:"実行失敗 · {{count}} ステップ",stepsCompleted:"{{count}} ステップ完了"},allChats:"すべてのチャット",createNewChat:"新しいチャットを作成",pinDrawer:"固定",unpinDrawer:"固定解除",statusIdle:"待機",statusInProgress:"処理中",disclaimer:"あなたのために働き、あなたと共に成長します",greeting:"こんにちは、今日はどんなお手伝いができますか?",description:"私はあなたの質問をサポートするAIアシスタントです。",prompt1:"新しい旅を始めましょう!",prompt2:"あなたのスキルを教えてください。",inputPlaceholder:'"↑↓"でメッセージ移動 · "/"でクイックコマンド',longTextUploadPrompt:"アップロードされたプロンプトファイルを読み、その内容に基づいて回答してください。",emptyOutputError:"アシスタントが空のレスポンスを返しました。",commands:{clear:{description:"会話のコンテキストをクリア"},compact:{description:"会話コンテキストを圧縮して要約を生成。追加指示にも対応"},approve:{description:"保留中のツール操作を承認して実行を続行"},deny:{description:"保留中のツール操作を拒否"},mission:{description:"Missionモード — タスクをサブエージェントに分解委任、独立コンテキストでメイン会話を汚染しない"},skills:{description:"チャットで利用可能なスキルを一覧し、明示的なスキルコマンドを表示します"},agents:{description:"現在のランタイムで利用可能なエージェントを一覧表示"},review:{description:"Codex で未コミットのワークスペース変更をレビュー"},status:{description:"現在のエージェントアカウント、モデル、ワークスペースを表示"},goal:{description:"Goalループ — エージェントが目標に向かって継続実行し、Rubric評価で完了を自動判定"}},attachments:{tooltip:"ドキュメント、画像、動画、音声など、様々な形式に対応",tooltipImageOnly:"現在のモデルは画像アップロードのみ対応",tooltipNoMultimodal:"現在のモデルにマルチモーダル機能が検出されていません。画像や動画が正しく処理されない場合があります",fileSizeLimit:"1ファイルあたり最大{{limit}}MB",fileSizeExceeded:"ファイルサイズが{{limit}}MBの制限を超えています。現在のファイル: {{size}}MB",multimodalDisabled:"現在のモデルはファイルアップロードに対å¿
181œã—ていません",multimodalWarning:"現在のモデルにマルチモーダル機能が検出されていません。画像や動画が正しく処理されない場合があります",imageOnlyAccept:"現在のモデルは画像ファイルのみ対応しています",imageOnlyWarning:"現在のモデルは画像のみ対応しています。動画などの非画像ファイルは正しく処理されない場合があります"},rateLimitHit:"現在のモデルがレート制限されています。他の無料モデルに切り替えてみてください。",turnUsagePopover:{ariaLabel:"このターンのトークンとコンテキスト使用量を表示",turn:"このターン",turnEstimated:"このターン約",tok:"tok",inOut:"入力 {{inTok}} · 出力 {{outTok}}",contextLabel:"コンテキストウィンドウ:",outerRing:"Outer ring",cacheLabel:"Cache hit rate",centerValue:"Center",cacheTokens:"ヒット {{readTok}} / 入力 {{inputTok}}",manageContext:"コンテキスト管理",compact:"圧縮",new:"新しい会話"},rateLimitMessage:"レート制限に達しました。他の無料モデルに切り替え:",rateLimitSwitched:"{{model}} に切り替えました",speech:{startRecording:"音声録音を開始 (Ctrl+Shift+M)",stopRecording:"録音を停止 (Ctrl+Shift+M)",transcribing:"文字起こし中...",transcriptionDisabled:"文字起こしは無効です。設定 > 音声文字起こしでプロバイダーを設定してください。",transcriptionFailed:"音声文字起こしに失敗しました",microphoneError:"マイクにアクセスできません",fileTooLarge:"録音ファイルが大きすぎます({{size}}MB)。上限: {{limit}}MB",recordingTooLong:"録音時間が制限を超えています(上限: {{limit}}秒)"},search:{title:"チャットを検索",tooltip:"現在のチャットを検索",placeholder:"メッセージを検索...",noResults:"結果が見つかりません",resultsCount:"{{count}} 件の結果が見つかりました",searching:"検索中 {{progress}}...",loading:"読み込み中...",userMessage:"ユーザー",assistantMessage:"アシスタント",titleMatch:"タイトル"},contextMenu:{open:"開く",rename:"名前を変更",pin:"ピン留め",unpin:"ピン留め解除",delete:"削除"},queue:{title:"メッセージキュー",paused:"一時停止中",sendFailed:"送信失敗",resume:"キューを再開",pause:"キューを一時停止",clear:"キューをクリア",dragSort:"ドラッグで並べ替え",edit:"編集",retry:"再試行",skip:"スキップ",interruptAndSend:"中断して送信",delete:"削除",file:"ファイル",noChatWarning:"キューを使用する前に、まずメッセージを送信して会話を作成してください",queueFull:"キューが満杯です(最大 {{max}} 件)。メッセージを送信または削除してください",otherTabOwner:"This tab queues only; sending is handled by another tab"},group:{pinned:"ピン留め",today:"今日",week:"7日以内",month:"30日以内",older:"それ以前"},sessionPanel:{searchConversations:"会話を検索…",noResults:"結果なし",noConversations:"会話なし",loadingConversations:"読み込み中…"},conversationHistory:"会話履歴",history:{empty:"チャット履歴なし"},sessionGroup:{today:"今日",recent:"過去7日間",earlier:"それ以前"}},LI={parent:"設定",security:"セキュリティ",title:"セキュリティ",description:"ツールとスキルのセキュリティ機能を管理します。",toolGuardTitle:"ツールガード",toolGuardDescription:"ツール呼び出しのセキュリティスキャンを設定します。危険な操作は実行前に明示的な承認が必要になります。",enabled:"ツールガードを有効にする",enabledTooltip:"有効にすると、ツール呼び出しが実行前に危険なパターンをスキャンされます",guardedTools:"保護対象ツール",guardedToolsTooltip:"危険なパターンが検出された場合に承認が必要なツール。空の場合はデフォルトセットが使用されます。",guardedToolsPlaceholder:"ツールを選択またはカスタムツール名を入力",deniedTools:"拒否ツール",deniedToolsTooltip:"承認なしで常に拒否されるツール",deniedToolsPlaceholder:"常に拒否するツールを選択",saveSuccess:"ツールガード設定を保存しました",saveFailed:"ツールガード設定の保存に失敗しました",loadFailed:"ツールガード設定の読み込みに失敗しました",rules:{title:"検
181出ルール",description:"ルールはセキュリティアラートをトリガーする正規表現パターンを定義します。組み込みルールは無効化でき、カスタムルールは追加・編集・削除できます。",id:"ルール ID",severity:"重要度",descriptionCol:"説明",source:"ソース",actions:"操作",builtin:"組み込み",custom:"カスタム",enable:"有効化",disable:"無効化",edit:"編集",delete:"削除",add:"ルール追加",addTitle:"カスタムルールを追加",editTitle:"カスタムルールを編集",ruleId:"ルール ID",ruleIdRequired:"ルール ID は必須です",duplicateId:"このIDのルールは既に存在します",tools:"対象ツール",toolsPlaceholder:"空白の場合はすべてのツールに一致",params:"対象パラメータ",paramsPlaceholder:"空白の場合はすべてのパラメータに一致",severityLabel:"重要度",categoryLabel:"カテゴリ",patterns:"正規表現パターン",patternsRequired:"パターンが少なくとも1つ必要です",patternsTooltip:"1行に1つの正規表現。ツールパラメータ値に対してマッチング(大文字小文字区別なし)。",excludePatterns:"除外パターン",excludePatternsTooltip:"1行に1つの正規表現。マッチした場合、そのルールはスキップされます。",descriptionLabel:"説明",descriptionPlaceholder:"このルールは何を検出しますか?",remediationLabel:"修正提案",remediationPlaceholder:"ルールがトリガーされた場合の推奨アクション",preview:"プレビュー",previewTitle:"ルール詳細",actionLabel:"アクション",actionApproval:"承認待ち",autoDeny:"自動拒否",autoDenyTooltip:"有効にすると、このルールに一致するツール呼び出しは手動承認なしで自動的に拒否されます",autoDenyEnable:"このルールの自動拒否を有効にする",autoDenyDisable:"このルールの自動拒否を無効にする",allTools:"すべてのツール",allParams:"すべてのパラメータ",descriptions:{TOOL_CMD_CONTROL_CHARS:"セキュリティチェックをバイパスする可能性のある非印刷制御文字を含むコマンドを検出",TOOL_CMD_DANGEROUS_MV:"ファイルを意図せず移動・上書きする可能性のある mv コマンドを検出",TOOL_CMD_DANGEROUS_RM:"データ損失を引き起こす可能性のある rm コマンドを検出",TOOL_CMD_DOS_FORK_BOMB:"Bash フォーク爆弾および大量プロセス終了を検出",TOOL_CMD_FIND_DELETE:"データ損失を引き起こす可能性のある find -delete コマンドを検出",TOOL_CMD_FS_DESTRUCTION:"低レベルのディスクフォーマットまたはワイプコマンドを検出",TOOL_CMD_IFS_INJECTION:"$IFS変数を使用してセキュリティ検証をバイパスする可能性のあるコマンドを検出",TOOL_CMD_JQ_FILE_FLAGS:"任意のファイルを読み取ったり外部コードを実行する可能性のあるフラグを使用するjqコマンドを検出",TOOL_CMD_JQ_SYSTEM:"任意のシェルコマンドを実行できるsystem()関数を含むjqコマンドを検出",TOOL_CMD_OBFUSCATED_EXEC:"base64 エンコード文字列をシェルインタプリタに直接渡して実行する操作を検出",TOOL_CMD_PIPE_TO_SHELL:"リモートペイロードをダウンロードして即座に実行する 'curl | bash' パターンを検出",TOOL_CMD_PRIVILEGE_ESCALATION:"sudo、su、doas、pkexec、または runas を使用した権限昇格の試みを検出",TOOL_CMD_PROCESS_KILL:"重要なプロセスを終了させる可能性のあるプロセス終了コマンドを検出",TOOL_CMD_PROC_ENVIRON:"機密の環境変数を公開する可能性のある /proc/*/environ にアクセスするコマンドを検出",TOOL_CMD_REVERSE_SHELL:"リバースシェルまたは不正なネットワークトンネルの確立を検出",TOOL_CMD_SERVICE_RESTART:"システムサービスを中断させる可能性のあるサービス管理コマンドを検出",TOOL_CMD_SYSTEM_REBOOT:"ホストシステムを終了させるシステム再起動またはシャットダウンコマンドを検出",TOOL_CMD_SYSTEM_TAMPERING:"cron ジョブ、SSH キー、sudo 権限へのアクセス(読み取り・変更を含む)を検出",TOOL_CMD_UNICODE_WHITESPACE:"解析の不整合を引き起こす可能性のあるUnicode空白文字を含むコマンドを検出",TOOL_CMD_UNSAFE_PERMISSIONS:"グローバル権限の引き下げ(chmod 777)や不変フラグの設定を検出",TOOL_CMD_ZSH_DANGEROUS:"セキュリティチェックをバイパスする可能性のあるZsh固有のビルトインを使用するコマンドを検出"},categories:{command_injection:"コマンドインジェクション",code_execution:"コード実行",data_exfiltration:"データ漏洩",path_traversal:"パストラバーサル",sensitive_file_access:"機密ファイルアクセス",network_abuse:"ネットワーク不正利用",credential_exposure:"認証情報漏洩",resource_abuse:"リソース不正利用",privilege_escalation:"権限昇格",prompt_injection:"プロンプトインジェクション",other:"その他"}},fileGuard:{title:"ファイルガード",description:"機密ファイルやディレクトリをエージェントツールからのアクセスから保護します。追加されたパスは、すべてのツール呼び出しでブロックされます。",enableLabel:"ファイルガードを有効にする",path:"パス",actions:"操作",add:"追加",inputPlaceholder:"ファイルまたはディレクトリパスを入力(例: ~/.ssh/ または /etc/passwd)",empty:"カスタム機密パスが設定されていません",directory:"ディレクトリ",removeConfirm:"このパスを保護リストから削除しますか?",duplicate:"このパスは既にリストに存在します",saveSuccess:"ファイルガード設定を保存しました",saveFailed:"ファイルガード設定の保存に失敗しました",loadFailed:"ファイルガード設定の読み込みに失敗しました",allowPreviewOutsideWorkspace:"コンソールでワークスペース外ファイルのプレビューを許可",allowPreviewOutsideWorkspaceDesc:"コンソールでワークスペースディレクトリ外のファイルをプレビューできるようにします。機密ファイル保護は引き続き有効です。"},allowNoAuthHosts:{title:"認証不要ホスト",warningTitle:"セキュリティ警告",warningDescription:"このリストのIPアドレスは認証なしでAPIエンドポイントにアクセスできます。デフォルトでは、ローカルホスト(127.0.0.1と::1)がCLIアクセスのために許可されています。信頼できるIPアドレスのみを追加してください。警告:信頼できないIPを追加すると、深刻なセキュリティリスクが生じます。",ipAddress:"IPアドレス",actions:"操作",add:"追加",inputPlaceholder:"IPアドレスを入力(例:192.168.1.100 または ::1)",empty:"IPアドレスが設定されていません",default:"デフォルト",removeConfirm:"このIPアドレスをホワイトリストから削除しますか?",duplicate:"このIPアドレスは既にリストに存在します",
181invalidIP:"無効なIPアドレス形式",saveSuccess:"認証不要ホスト設定を保存しました",saveFailed:"認証不要ホスト設定の保存に失敗しました",loadFailed:"認証不要ホスト設定の読み込みに失敗しました"},skillScanner:{title:"スキルスキャナー",description:"スキルを有効化・インストールする前にセキュリティ脅威を自動スキャンします。",mode:"スキャンモード",modeTooltip:"スキャナーが安全でないスキルをどう処理するかを制御: ブロック、警告のみ、オフ",modeBlock:"ブロック",modeWarn:"警告のみ",modeOff:"オフ",timeout:"スキャンタイムアウト(秒)",timeoutTooltip:"スキャン完了を待つ最大時間(5-300秒)",saveSuccess:"スキルスキャナー設定を保存しました",saveFailed:"スキルスキャナー設定の保存に失敗しました",scanAlerts:{title:"スキャンアラート",empty:"セキュリティアラートはありません",clearAll:"すべてクリア",clearConfirm:"すべてのスキャンアラートをクリアしますか?",skillName:"スキル",action:"アクション",actionBlocked:"ブロック済み",actionWarned:"警告済み",time:"日時",actions:"操作",allowSkill:"ホワイトリストに追加",remove:"削除",viewFindings:"詳細を表示"},whitelist:{title:"ホワイトリスト",empty:"ホワイトリストにスキルがありません",skillName:"スキル",addedAt:"追加日時",contentHash:"コンテンツハッシュ",actions:"操作",remove:"削除",removeConfirm:"このスキルをホワイトリストから削除しますか?",addSuccess:"スキルをホワイトリストに追加しました",removeSuccess:"スキルをホワイトリストから削除しました",addFailed:"ホワイトリストへの追加に失敗しました",removeFailed:"ホワイトリストからの削除に失敗しました",removeWillDisable:"削除後、このスキルも無効化されます。",removeAndDisabled:"スキルをホワイトリストから削除し、無効化しました"},scanError:{title:"セキュリティ問題が検出されました",description:"以下のセキュリティ問題が見つかりました:",warnDescription:"セキュリティ問題が見つかりましたが、スキルは引き続き有効です(警告モード):",goToWhitelist:"ホワイトリストへ",moreFindings:"他に {{count}} 件は表示していません(一覧は 設定 → セキュリティ → スキルスキャナ を参照)。"}}},EI={brand:{title:"Hub 管理",subtitle:"ローカルワークスペース",controlPlane:"管理基盤"},navigation:{workspace:"ワークスペース",overview:"運用状況",runtimes:"ランタイム",users:"ユーザー",credentials:"認証情報",audit:"監査ログ",settings:"システム設定"},actions:{backToQwenPaw:"QwenPawに戻る",useLightTheme:"ライトテーマを使用する",useDarkTheme:"ダークテーマを使用する",signOut:"サインアウト",start:"開始",stop:"停止",disable:"無効化",rebuild:"再構築",enableAndStart:"有効化して開始"},roles:{admin:"管理者",user:"ユーザー"},userStates:{active:"有効",disabled:"無効"},runtimeStates:{created:"作成済み",starting:"起動中",running:"実行中",stopped:"停止",failed:"失敗"},runtimePolicies:{owner_allowed:"オーナーは再起動できる",admin_only:"管理者によりロック"},errors:{actionFailed:"アクションが失敗しました",createFailed:"作成に失敗しました",updateFailed:"アップデートに失敗しました",saveFailed:"保存に失敗しました",pullTimedOut:"イメージのプルを待機中にタイムアウトしました"},messages:{runtimeCreated:"ランタイムが作成されました",accountCreated:"アカウントが作成されました",credentialStored:"保存された認証情報",settingsSaved:"ハブ設定が保存されました",imagePulled:"Docker イメージのプルが完了しました"},validation:{required:"この項目は必須です",runtimeIdInvali
181d:"文字または数字で始まる 1 ~ 64 の文字、数字、ドット、アンダースコア、またはハイフンを使用します",passwordMin:"パスワードには少なくとも 8 文字を含める必要があります",credentialNameInvalid:"OPENAI_API_KEY などの大文字の環境変数名を使用します。"},runtimes:{eyebrow:"Hub 管理",title:"ランタイムの概要",description:"ユーザーごとに専用のランタイムがあり、ファイルとキーは互いに分離されています。",newRuntime:"ランタイムを作成",managed:"管理対象ランタイム",localBoundaries:"ローカルプロセス境界",runningNow:"現在実行中",needsAttention:"{{count}} ランタイムには注意が必要です",healthy:"すべてのランタイムは正常です",isolationPolicy:"隔離ポリシー",available:"利用可能",unavailable:"利用不可",failClosed:"異常時は起動を拒否",noFallback:"サンドボックスなしでは実行しない",executionBlocked:"ランタイムの実行がブロックされています",isolationTitle:"異常時に起動を拒否するローカル分離",isolationDescription:"ランタイム プロセス ツリー全体がサンドボックス化されます。ネイティブ分離プローブが失敗した場合、QwenPaw はその開始を拒否します。",unavailableTitle:"セキュアなランタイム バックエンドが利用できない",unavailableDescription:"{{provisioner}} は利用できません: {{reason}} バックエンドのインストール、実行状態、システム設定を確認してから、QwenPaw Hub を再起動してください。",unavailableUserDescription:"ランタイムバックエンドは一時的に利用できません。管理者に連絡してください。",preflightFailed:"セキュリティチェックに失敗しました。",localEndpoint:"ローカルエンドポイント · {{endpoint}}",provisioner:"実行タイプ",localExecution:"ローカル分離",dockerExecution:"Dockerコンテナ",security:"安全",tenant:"テナント",removeTitle:"{{id}} を削除しますか?",removeDescription:"登録は削除されます。実行時データは保持されます。",disableTitle:"{{id}}を無効にしますか?",disableDescription:"プロセスは停止し、管理者が有効にするまで所有者は再起動できません。",rebuildTitle:"現在のイメージで {{id}} を再構築しますか?",rebuildDescription:"コンテナはシステム設定のイメージを使用して置き換えられます。永続的なワークスペース、シークレット、バックアップは保持されます。",emptyTitle:"ランタイムはまだありません",emptyDescription:"最初の分離されたローカル QwenPaw ランタイムを作成します。"},users:{eyebrow:"アイデンティティとアクセス",title:"ユーザーアクセス",description:"ローカル アカウントを作成し、管理アクセスを割り当て、セッションを 1 か所から取り消します。",addAccount:"アカウントを追加",publicRegistration:"公的登録",publicRegistrationDescription:"無効にすると、管理者のみがアカウントを作成できます。",currentAccountProtected:"現在のアカウントは保護されています",empty:"これらのフィルターに一致するユーザーはいません"},credentials:{eyebrow:"テナント限定のコンテナー",title:"認証情報",description:"プロバイダー キーを明示的なテナントまたはランタイム スコープ内に保存します。シークレット値は暗号化され、API によって返されることはありません。",storeCredential:"認証情報を保存",updated:"{{date}} に更新",deleteTitle:"{{name}}を削除しますか?",deleteDescription:"この資格情報を使用するランタイムは動作を停止する可能性があります。",emptyTitle:"金庫は空です",emptyDescription:"テナントまたはランタイムスコープの API キーを保存します。",encrypted:"保存時は暗号化さã
181‚Œã¾ã™ã€‚平文は読み取れません"},overview:{eyebrow:"オペレーションコックピット",title:"ハブ運用の概要",description:"実際の実行時状態、ホスト リソース、監査イベントを使用してハブの健全性を理解します。",availability:"ランタイムの可用性",availabilityDetail:"{{total}} ランタイム中 {{running}} は現在オンラインです",totalRuntimes:"ランタイム合計",failedCount:"{{count}} ランタイムには注意が必要です",totalUsers:"ハブユーザー",managedLocally:"ローカル ID とアクセス管理",hostResources:"ホストリソース",liveSnapshot:"現在のライブスナップショット",memory:"メモリ",dataDisk:"データディスク",recentActivity:"最近の活動",auditBacked:"永続的な監査ログによる裏付け",systemHealthy:"すべてのシステムが稼働中",systemDegraded:"システムが劣化しました",localIsolation:"ローカルで分離された実行"},table:{searchRuntimes:"ランタイム、所有者、またはエンドポイントを検索する",searchUsers:"ユーザー名またはユーザー ID を検索する",searchCredentials:"認証情報の名前またはスコープを検索する",searchAudit:"アクターまたはリソースを検索する",allStates:"すべての状態",allOwners:"すべての所有者",allExecutions:"すべての実行タイプ",allRoles:"すべての役割",allUserStates:"すべてのユーザー状態",allScopes:"すべてのスコープ",allActions:"すべてのアクション",runtime:"ランタイム",status:"状態",owner:"所有者",endpoint:"エンドポイント",execution:"実行",updated:"更新日時",user:"ユーザー",role:"役割",created:"作成日時",credential:"認証情報",scope:"スコープ",event:"イベント",actor:"操作者",resource:"リソース",result:"結果",time:"時間",total:"{{total}} ä»¶"},audit:{eyebrow:"セキュリティとガバナンス",title:"監査ログ",description:"各ハブ管理アクションを実行した人、その目標、結果、時間を確認します。機密値は決して監査されません。",empty:"管理イベントはまだありません"},settings:{eyebrow:"プラットフォーム構成",title:"システム設定",description:"1 つの監査済みの信頼できる情報源から完全なハブ構成を管理します。変更はすぐに有効になり、再起動しても維持されます。",save:"設定を保存する",meta:"リビジョン {{revision}} · 更新された {{date}}",tabs:{access:"アクセスセキュリティ",runtime:"ランタイム"},access:{title:"アクセスと登録",description:"ブラウザーから到達可能なハブ アドレスとパブリック アカウント ポリシーを構成します。",publicBaseUrl:"パブリックベースURL",publicBaseUrlHint:"OAuth コールバックに使用されます。ループバックのみの展開の場合のみ空のままにしてください。",registration:"公的登録",registrationHint:"無効にすると、管理者のみがアカウントを作成できます。",defaultRole:"デフォルトの登録ロール",defaultRoleHint:"セキュリティのために、自己登録アカウントは常に一般ユーザーになります。"},security:{title:"認証保護",description:"ログインと登録の不正行為を制限し、アドレスやネットワークをブロックします。",ipBlacklist:"IPブラックリスト",ipBlacklistHint:"IPv4、IPv6、CIDRをサポートします。各値の後に Enter キーを押します。",trustedProxyIps:"信頼できるリバース プロキシ",trustedProxyIpsHint:"X-Forwarded-For は、これらのアドレスによって送信された場合にのみ信頼されます。",loginRateLimit:"ログイン失敗率制限",loginRateLimitHint:"1 つのアドレスからの繰り返し失敗したサインイン試行を一時的にブロックします。",registrationRateLimit:"登録レート制限",registrationRateLimitHint:"1 つのアドレスからの新しいアカウントの大量作成を制限します。",maxAttempts:"最大試行回数",windowSeconds:"ウィンドウ (秒)",blockSeconds:"ブロック期間 (秒)"},runtime:{title:"ランタイムポリシー",description:"ランタイム バックエンドを選択します。既存のランタイムは、次回の再起動時に切り替わります。",provisioner:"ランタイムバックエンド",localBackend:"ローカルプロセス",localBackendHint:"分離されたプロセスをこのホスト上で直接実行します。",dockerBackend:"Dockerコンテナ",dockerBackendHint:"管理されたコンテナーで各アカウントを実行します。",backendUnavailable:"このホストでは利用できません",localIsolationHint:"ローカル モードはホスト プロセスを使用し、Docker イメージ設定を使用しません。",dockerIsolationHint:"Docker モードでは、以下のイメージとリソースのポリシーがすべてのアカウントに適用されます。"},docker:{title:"Dockerポリシー",description:"イメージ、プル動作、コンテナーごとのリソース制限を一元管理します。ユーザーはこれらの設定を上書きできません。",unavailable:"Docker エンジンは使用できません",source:"画像ソース",dockerHub:"公式Dockerハブ",aliyunAcr:"公式 Alibaba Cloud レジストリ",custom:"カスタムイメージ",customHint:"ポリシーで許可されている画像参照を入力します。",customRegistry:"カスタムレジストリまたはイメージ参照",localHost:"ローカル画像",localHostHint:"このホストにすでに存在するイメージ タグを使用します。",noLocalImages:"タグ付けされたローカル画像が見つかりません",image:"画像とタグ",selectLocalImage:"ローカルイメージタグを選択してください",selectedImage:"効果的なイメージ",repository:"リポジトリ",localStatus:"現地の状況",downloaded:"ダウンロード済み",notDownloaded:"ダウンロードされていません",pullPolicy:"自動プルポリシー",ifNotPresent:"ローカルで欠落した場合にプルする",always:"最初の作成前にプルする",never:"ローカル画像のみを使用する",pullImage:"今すぐ画像をプルします",localImages:"{{count}} ローカル画像参照",resources:"コンテナリソースの制限",cpuLimit:"CPUコア",memoryLimit:"メモリ(MB)",pidsLimit:"最大プロセス数",shmSize:"共有メモリ (MB)"},quotas:{title:"グローバルなランタイム容量",description:"各テナントはランタイムを 1 つだけ所有します。これにより、ハブ全体での同時実行時間が制限されます。",maxRunningRuntimes:"最大実行ランタイム",unlimitedHint:"空とは無制限を意味します。"}},auditActions:{runtime:{create:"作成されたランタイム",start:"ランタイムを開始しました",stop:"停止したランタイム",disable:"無効化されたランタイム",rebuild:"再構築されたランタイム",delete:"削除されたランタイム"},image:{pull:"Docker イメージをプルしました"},user:{create:"作成されたユーザー",update:"更新されたユーザー"}
181,credential:{store:"保存された資格情報",delete:"削除された認証情報"},settings:{update:"更新されたハブ設定"},auth:{register:"登録済みの Hub ユーザー"}},auditOutcomes:{success:"成功",failure:"失敗"},runtimeForm:{title:"ランタイムの作成",hint:"ランタイムはネイティブのローカル サンドボックス内で開始されます。そのファイル、シークレット、プロセス ツリーは他のユーザーから分離されたままになります。",runtimeId:"ランタイムID",startImmediately:"すぐに開始",submit:"ランタイムの作成"},userForm:{title:"アカウントを追加",hint:"8 文字以上の一時パスワードを使用してください。ユーザーは、個人テナントが所有するランタイムにのみアクセスできます。",username:"ユーザー名",temporaryPassword:"仮パスワード",role:"役割",submit:"アカウントを作成する"},credentialForm:{title:"認証情報を保存",hint:"テナント スコープはすべてのランタイムに適用されます。ランタイム スコープは、選択した 1 つのプロセスのプライベート オーバーライドです。",scope:"範囲",allRuntimes:"私のすべてのランタイム",environmentName:"環境名",secretValue:"秘密の値",submit:"暗号化して保存する"}},FI={title:"QwenPaw にログイン",registerTitle:"アカウント作成",firstUserHint:"管理者アカウントを作成して始めましょう",usernamePlaceholder:"ユーザー名",passwordPlaceholder:"パスワード",usernameRequired:"ユーザー名を入力してください",passwordRequired:"パスワードを入力してください",submit:"ログイン",register:"登録",failed:"ログインに失敗しました。認証情報を確認してください",registerSuccess:"登録が完了しました",registerFailed:"登録に失敗しました",authNotEnabled:"認証は有効になっていません",logout:"ログアウト",logoutSuccess:"正常にログアウトしました",sessionExpired:"セッションが期限切れです。再度ログインしてください",unauthorized:"未認証です。ログインしてください"},OI={title:"アカウント管理",currentPassword:"現在のパスワード",currentPasswordRequired:"現在のパスワードを入力してください",newUsername:"新しいユーザー名",newUsernamePlaceholder:"変更しない場合は空欄",newPassword:"新しいパスワード",newPasswordPlaceholder:"変更しない場合は空欄",confirmPassword:"新しいパスワードの確認",confirmPasswordPlaceholder:"新しいパスワードを再入力",passwordMismatch:"パスワードが一致しません",save:"変更を保存",updateSuccess:"アカウントが更新されました",updateFailed:"アカウントの更新に失敗しました",wrongPassword:"現在のパスワードが正しくありません",nothingToUpdate:"新しいユーザー名またはパスワードを入力してください",passwordEmpty:"パスワードを空白にすることはできません",usernameEmpty:"ユーザー名を空白にすることはできません",username:"ユーザー名",passwordRequired:"新しいパスワードを入力してください",hubPasswordPlaceholder:"8文字以上入力してください",runtimeTitle:"個人ランタイム",runtimeDescription:"ワークスペースが利用できない場合に再起動します。実行中のタスクは中断されますが、保存済みデータは保持されます。",runtimeRestartConfirmTitle:"ランタイムを再起動しますか?",runtimeRestartConfirmDescription:"再起動中は実行中のタスクが中断されます。",runtimeRestart:"ランタイムを再起動",runtimeRestartSuccess:"ランタイムを再起動しました",runtimeRestartFailed:"ランタイムの再起動に失敗しました"},BI={title:"音声文字起こし",description:"受信した音声メッセージの処理方法を設定します。",loadFailed:"音声モード設定の読み込みに失敗しました",saveSuccess:"音声モードを保存しました",saveFailed:"音声モードの保存に失敗しました",audioModeLabel:"音声モード",audioModeDescription:"チャンネル(Discord、Telegram など)からの音声メッセージをモデルに送信する前にどのように処理するかを選択します。",modeAuto:"自動(推奨)",modeAutoDesc:"選択した文字起こしプロバイダーで音声をテキストに変換してからモデルに送信します。文字起こしが無効または利用できない場合、ファイルアップロードのプレースホルダーが表示されます。このモードでは音声はモデルに直接送信されません。すべてのモデルで動作します。",modeNative:"ネイティブ音声",modeNativeDesc:"文字起こしせずに音声ファイルをモデルに直接送信します。音声をモデルに送信する唯一のモードです。音声対応モデル(例: gpt-4o-audio)でのみ動作します。ほとã
181‚“どのモデルはこのモードをサポートしていません。",ffmpegReady:"ffmpegがインストールされています。ネイティブモードの音声変換が利用可能です。",ffmpegMissing:"ffmpegがインストールされていません。",ffmpegMissingDesc:"ネイティブ音声モードでは、音声形式の変換(.oggから.wavなど)にffmpegが必要です。このモードを有効にするには、ffmpegをシステムパッケージとしてインストールしてください。",providerTypeLabel:"文字起こしプロバイダー",providerTypeDescription:"文字起こしバックエンドを選択します。音声文字起こしが不要な場合は「無効」を選択してください。",providerTypeDisabled:"無効",providerTypeDisabledDesc:"文字起こしなし。音声メッセージはファイルアップロードのプレースホルダーとして表示されます。",providerTypeWhisperApi:"Whisper API",providerTypeWhisperApiDesc:"設定済みプロバイダー(OpenAI、Ollama など)の OpenAI 互換 Whisper API エンドポイントを使用します。",providerTypeLocalWhisper:"ローカル Whisper",providerTypeLocalWhisperDesc:"ローカルにイãƒ
181³ã‚¹ãƒˆãƒ¼ãƒ«ã•れた openai-whisper Python ライブラリで文字起こしを実行します。ffmpeg と openai-whisper の両方のインストールが必要です。",localWhisperReady:"ローカル Whisper は準備完了です。ffmpeg と openai-whisper がインストールされています。",localWhisperMissing:"ローカル Whisper は準備ができていません。不足している依存関係をインストールしてください。",localWhisperMissingDesc:"ffmpeg: {{ffmpeg}} | openai-whisper: {{whisper}}。不足している依存関係をインストールしてください:ffmpeg(システムパッケージ)と openai-whisper(uv pip install openai-whisper、または QwenPaw を [whisper] エクストラ付きでインストール)。",providerLabel:"Whisper API プロバイダー",providerDescription:"Whisper API による音声文字起こしに使用するプロバイダーを選択します。Whisper 対応エンドポイントを持つプロバイダーのみ表示されます。",providerPlaceholder:"プロバイダーを選択...",noProvidersWarning:"文字起こし対応のプロバイダーが見つかりません。音声文字起こしを有効にするには、OpenAI プロバイダーを設定してください。",transcriptionInfoTitle:"文字起こしの仕組み",transcriptionInfoDesc:"Whisper API 文字起こしは OpenAI 互換の /v1/audio/transcriptions エンドポイントを使用します。Whisper 対応エンドポイントを持つプロバイダー(例: OpenAI)の設定が必要です。上記で具体的なプロバイダーを選択して文字起こしを有効にしてください。",transcriptionInfoDescLocal:"ローカル Whisper 文字起こしは、お使いのマシン上で直接 openai-whisper ライブラリを実行します。ffmpeg(音声デコード用)と openai-whisper Python パッケージの両方のインストールが必要です。API キーやネットワーク接続は不要です。インストール:uv pip install 'qwenpaw[whisper]'。"},NI={title:"ACP",loading:"ACP 設定を読み込み中...",builtin:"組み込み",custom:"カスタム",create:"カスタム Agent を追加",createTitle:"ACP Agent を作成",createSuccess:"ACP Agent を作成しました",editTitle:"ACP 設定を編集",agentKey:"Agent Key",agentKeyRequired:"Agent Key を入力してください",agentKeyInvalid:"Agent Key には英字、数字、アンダースコア、ハイフンのみ使用できます",agentKeyExists:"この Agent Key は既に存在します",enabled:"有効",command:"コマンド",commandRequired:"コマンドを入力してください",args:"引数",argsHelp:"1 行につき 1 つの引数",env:"環境変数",envHelp:"各行を KEY=VALUE 形式で入力してください",envInvalidLine:"無効な環境変数形式: {{line}}",trusted:"信頼済み",toolParseMode:"ツール解析モード",toolParseModeRequired:"ツール解析モードを選択してください",stdioBufferLimit:"Stdio バッファ上限",stdioBufferLimitHelp:"ACP サブプロセスの stdio 1 行読み取りバッファの最大バイト数です。",stdioBufferLimitRequired:"stdio バッファ上限を入力してください",stdioBufferLimitMin:"stdio バッファ上限は 1 バイト以上である必要があります",docs:"設定ドキュメント",docsHelp:"ACP 統合ドキュメントを開き、「How to configure external runners」セクションへ移動します",notSet:"未設定",configSaved:"ACP 設定を保存しました",configFailed:"ACP 設定の保存に失敗しました",deleteTitle:"{{name}} を削除",deleteConfirm:"この ACP Agent を削除しますか?この操作は元に戻せません。",deleteSuccess:"ACP Agent を削除しました",deleteFailed:"ACP Agent の削除に失敗しました",nodeSettings:"Node 設定",nodePath:"Node パス",chooseOtherNode:"別の Node を選択...",selectNodePath:"Node パスを選択",nodePathPrompt:"node 実行ファイルのパスを入力してください",nodeSaved:"Node 設定を保存しました",nodeLoadFailed:"Node 設定の読み込みに失敗しました",nodeSaveFailed:"Node パスを利用できません",nodeRuntime:{bundled:"同梱 N
181ode",system:"システム Node",custom:"カスタム Node"},nodeRuntimeReason:{systemNodeMissing:"システム Node が検出されませんでした",nodeMissing:"Node パスが存在しません",npxMissing:"npx が見つかりません",versionCheckFailed:"バージョン確認に失敗しました",unavailable:"利用不可"}},HI={title:"バックアップ",description:"エージェントのワークスペースと設定をバックアップ・復元します。",create:"バックアップ作成",import:"インポート",export:"エクスポート",restore:"復元",delete:"削除",batchDelete:"一括削除",batchDeleteConfirm:"{{count}}件のバックアップを削除しますか?この操作は元に戻せません。",deleteConfirm:"このバックアップを削除しますか?この操作は元に戻せません。",name:"名前",createdAt:"作成日時",scopeSummary:"バックアップ範囲",descriptionLabel:"説明",noBackups:"バックアップがありません。現在の設定をバックアップするために作成してください。",loadFailed:"バックアップ一覧の読み込みに失敗しました",createTitle:"バックアップ作成",backupMode:"バックアップモード",fullBackup:"完全バックアップ",fullBackupDesc:"すべてのエージェントワークスペース、グローバル設定、スキルプール、シークレット情報を含むすべてをバックアップ",customBackup:"カスタムバックアップ",partialBackup:"部分バックアップ",partialBackupDesc:"バックアップする内容をカスタマイズ",nameRequired:"バックアップ名は必須です",namePlaceholder:"バックアップ名を入力",descriptionPlaceholder:"説明(任意)...",scopeAgents:"エージェントワークスペース",scopeGlobalConfig:"グローバル設定",scopeSkillPool:"スキルプール",scopeSecrets:"シークレット情報",scopeSecretsHint:"モデルプロバイダーシークレット(API キー)、環境変数などの機密情報を含みます",securityNotice:"このバックアップには機密 credential 情報が含まれる可能性があります。エージェントワークスペースにはチャネル認証情報(bot トークン、アプリシークレットなど)が含まれ、モデルプロバイダーシークレットには API キーが含まれます。バックアップファイルを他人と共有しないでください。",searchPlaceholder:"名前または ID でバックアップを検索...",total:"合計 {{count}} 件",agentsPlaceholder:"エージェントワークスペースを選択(空白の場合はすべて)",selectAll:"すべて選択",deselectAll:"選択解除",createSuccess:"バックアップを作成しました",createFailed:"バックアップの作成に失敗しました",restoreTitle:"バックアップを復元",restoreScope:"復元範囲",restoreFullWarning:"全体復元は現在のインスタンスのすべての内容(すべてのエージェント、グローバル設定、スキルプール、シークレット)を完全に置き換えます。この操作は元に戻せません。復元中は関連機能が利用できません。復元完了後にサービスを再起動してください。",agentGroupExisting:"既存",agentGroupNew:"新規",agentExists:"既存",agentNew:"新規",agentActionReplace:"置き換え",agentActionAdd:"追加",agentColumnName:"エージェント",agentColumnWorkspace:"ワークスペース",agentTotal:"合計 {{count}} 件",noAgentsInBackup:"バックアップにエージェントワークスペースがありません",loadingAgents:"エージェントリストを読み込み中...",agentSearchPlaceholder:"名前またはIDで検索...",agentSearchTotal:"{{total}} 件中 {{count}} 件",restoreCustomSummary:"既存 {{existing}} 件 · 新規 {{added}} 件を選択",defaultWorkspaceDirUnused:"新規エージェントなし",otherOptions:"その他のオプション",defaultWorkspaceDirDefault:"<デフォルトパス>/{{aid}}",restoreWarningModify:"復元操作により現在の設定が変更されます。この操作は元に戻せません。",restoreWarningRestart:"復元中は関連機能が利用できません。復元完了後にサービスを再起動してください。",preRestoreBackupTitle:"復元前バックアップの作成",preRestoreBackupContent:"復元操作は不可逆です。まず現在の状態のバックアップを作成しますか?復元中に問題が発生した場合、現在の状態にロールバックできます。",preRestoreBackupYes:"はい、先にバックアップを作成",preRestoreBackupNo:"いいえ、直接復元",preRestoreBackupDesc:"復元前に自動作成されたバックアップ",preRestoreBackupFailed:"復元前バックアップの作成に失敗しました",preRestoreBackupSuccess:"復元前バックアップが作成されました。ID:{{id}}",creatingPreRestoreBackup:"復元前バックアップを作成中...",skipAndRestore:"スキップして復元を続行",restoreConfirm:"このバックアップを復元することを確認します",restoreMode:"復元モード",restoreModeFull:"全体復元",restoreModeFullDesc:"現在のインスタンスのすべての内容を完全に置き換えます。すべてのエージェント、グローバル設定、スキルプール、シークレットが含まれます",restoreModeCustom:"カスタム復元",restoreModeCustomDesc:"復元する内容を選択します(特定のエージェント、設定など);今回の復元範囲外の既存エージェントは削除されません",restoreModeFullDisabled:"フルバックアップのみ",defaultWorkspaceDir:"エージェントデフォルトワークスペースディレクトリ",defaultWorkspaceDirPlaceholder:"空欄の場合は ~/.qwenpaw/workspaces を使用",defaultWorkspaceDirHint:"エージェントの元のワークスペースパスが存在しない場合、エージェントは <デフォルトパス>/<エージェントID>
181 に保存されます。存在する場合は元のパスが使用されます。",restoreStrategy:"復元戦略",restoreStrategyPreserve:"ローカルのセキュリティ設定と MCP を保持",restoreStrategyPreserveDesc:"このインスタンスのセキュリティ保護と MCP 設定を保持します。",restoreStrategyRestore:"これらの設定をバックアップから復元",restoreStrategyRestoreDesc:"バックアップ内のセキュリティ設定と MCP 設定を使用します。",restoreSuccess:"バックアップを復元しました。サービスを再起動してください。",restoreSuccessPreserved:"バックアップを復元しました。ローカル設定を保持しました: {{keys}}。サービスを再起動してください。",restoreSuccessWithBackup:"バックアップを復元しました。復元前バックアップID:{{preRestoreId}}。サービスを再起動してください。",restoreFailed:"バックアップの復元に失敗しました",restoreTimedOut:"復元はまだ実行中か、5 分を超えています。バックアップのサイズ、ディスク容量、サービスログを確認してから再試行してください。",restoreTargetBusy:"これらのディレクトリが使用中のため、復元に失敗しました。使用しているブラウザまたはプロセスを閉じてから再試行してください。それでもロックが解除されない場合は、システムを再起動してからもう一度お試しください。",detailLoa
181dFailed:"バックアップ詳細の読み込みに失敗しました。復元はできません",trustLocalBanner:"ローカルバックアップ - 既定では完全復元",trustForeignBanner:"インポートされたバックアップ - 既定ではローカルのセキュリティ設定と MCP を保持します",trustLegacyBanner:"レガシーバックアップ - 復元前に信頼の確認が必要です",trustForeignTitle:"このバックアップを信頼しますか?",trustLegacyTitle:"レガシーバックアップを信頼しますか?",unknownBackupName:"バックアップアーカイブ",trustForeignDesc:"このバックアップはこのインスタンスで署名されていません。提供元を信頼できる場合のみ続行してください。復元時には既定でローカルのセキュリティ設定と MCP 設定が保持されます。",trustLegacyDesc:"この古いバックアップにはローカル署名がありません。提供元を信頼できる場合のみ続行してください。復元前にこのインスタンスで署名します。",deleteSuccess:"バックアップを削除しました",deleteFailed:"バックアップの削除に失敗しました",exportFailed:"バックアップのエクスポートに失敗しました",exportWarningTitle:"機密情報の警告",exportWarningContent:"このバックアップには機密の認証情報が含まれている可能性があります。エージェントワークスペースにはチャネル認証情報(ボットトークン、アプリシークレットなど)が含まれ、モデルプロバイダーのシークレットにはAPIキーが含まれます。バックアップファイルを他人と共有しないでください。",exportConfirm:"エクスポートを確認",importTitle:"バックアップをインポート",importSuccess:"バックアップをインポートしました",importFailed:"バックアップのインポートに失敗しました",importConflictTitle:"バックアップが既に存在します",importConflictDesc:"同じIDのバックアップが既に存在しています。既存のバックアップを上書きしますか?",importReplace:"上書き",agents:"{{count}}個のエージェント",allAgents:"すべてのエージェント",globalConfig:"グローバル設定",skillPool:"スキルプール",secrets:"シークレット",selected:"{{count}}件選択中",fileCount:"{{count}}ファイル",totalSize:"{{size}}",progressStarting:"バックアップを初期化中...",progressAgent:"エージェント {{index}} / {{total}} をバックアップ中...",progressSaving:"バックアップファイルを保存中...",progressDone:"バックアップ完了",localModelsNotice:"バックアップファイルにはローカルモデルファイルは含まれません。デバイス間の移行の場合は、対象デバイスで必要なローカルモデルを再ダウンロードしてください。"},UI={title:"セキュリティ承認が必要です",tool:"ツール",severity:"重要度",findings:"検出件数",parameters:"パラメータ",approve:"承認",deny:"拒否",source:"ソース",subSession:"サブエージェント",approved:"ツール呼び出しが承認されました",denied:"ツール呼び出しが拒否されました",approveFailed:"承認に失敗しました",denyFailed:"拒否に失敗しました",approvePattern:"常に許可",strictModeHint:"厳格モードでは常に許可できません",approveExact:"今回のみ",approvalScope:"承認スコープ",details:"詳細",timeoutAutoDenied:"タイムアウト、自動拒否",acknowledge:"了解",builtinSource:"組み込み",ownerAgent:"オーナーエージェント",executingAgent:"実行エージェント"},qI={title:"プラグインマネージャー",description:"サービスを再起動せずにプラグインのインストール、管理、削除を行います。",installed:"インストール済みプラグイン",noPlugins:"プラグインがまだインストールされていません",installBtn:"プラグインをインストール",installTitle:"プラグインのインストール",dropPrimary:"フォルダまたはZIPファイルをドロップ",dropSecondary:"またはクリックしてZIPファイルを選択",orFromUrl:"またはURLから",installFromUrl:"URLからインストール",urlPlaceholder:"https://example.com/plugin.zip",zipOnly:"ファイルとしてドロップできるのはZIPファイルのみです — ディレクトリからインストールする場合はフォルダをドラッグしてください",dropFailed:"ドロップされたフォルダの読み取りに失敗しました",restartHint:"一部のプラグイン(例:フック、monkey-patch)は、完全に有効化または削除するためにアプリの再起動が必要な場合があります。",installing:"インストール中...",installSuccess:"プラグインのインストールに成功しました",installFailed:"プラグインのインストールに失敗しました",uninstall:"アンインストール",uninstallConfirm:'プラグイン "{{name}}" をアンインストールしますか?この操作は取り消せません。一部のプラグインは、完全に削除するためにアプリの再起動が必要な場合があります。',uninstalling:"アンインストール中...",uninstallSuccess:"プラグインのアンインストールに成功しました",uninstallFailed:"プラグインのアンインストールに失敗しました",statusLoaded:"実行中",statusUnloaded:"未ロード",type:"タイプ",version:"バージョン",author:"作成者",unknown:"不明",noMatchingPlugins:"現在の条件に一致するプラグインはありません",loadFailed:"プラグイン一覧の読み込みに失敗しました",confirmTitle:"アンインストールの確認",officialTitle:"公式プラグイン",officialDesc:"ダウンロード CDN から公開済みプラグインをインストールします。",catalogRefresh:"更新",catalogEmpty:"利用可能な公式プラグインがありません(CDN カタログが空の可能性があります)",catalogLoadFailed:"公式プラグインカタログの読み込みに失敗しました",catalogInstall:"インストール",catalogRe
181install:"再インストール",catalogUpgrade:"アップグレード可能",catalogUpgradeBtn:"アップグレード",catalogInstalled:"インストール済み",catalogSha256:"SHA256",kindBundle:"バンドル",kindTool:"ツール",filterByName:"名前で絞り込み",filterByKind:"タグで絞り込み",marketTitle:"プラグインマーケット",marketEmpty:"No plugins found in market",marketLoadFailed:"Failed to load plugin market",marketUnavailable:"Plugin Market is currently under maintenance, please try again later",marketAll:"All",marketSearch:"Search plugins...",marketCategory:"Filter by category",marketSearchResult:'Found {{count}} plugins matching "{{keyword}}"',marketDetails:"Details",marketDownloads:"Downloads",marketDeveloper:"Developer",marketSortLabel:"Sort plugins",marketSortDownloads:"Most downloaded",marketSortUpdated:"Recently updated",marketSortFavorites:"Most favorited"},jI={title:"受信トレイ",tabApprovals:"承認",tabPushMessages:"プッシュ通知",tabHarvests:"AI Harvest",summaryApprovals:"承認件数",summaryPushUnread:"未読通知",summaryHarvests:"Harvest",from:"送信元:",requestedBy:"リクエスト元",markRead:"既読にする",markAllRead:"すべて既読",markAllReadNoUnread:"未読メッセージはありません",markAllReadSuccess:"{{count}} 件を既読にしました",selectAllCurrentPage:"このページを全選択",selectedItems:"{{count}} 件選択中",batchDeleteButton:"一括削除",batchOperation:"一括操作",exitBatch:"一括終了",batchDeleteConfirm:"選択した {{count}} 件の通知を削除しますか?",batchDeleteSuccess:"{{count}} 件の通知を削除しました",pushCronHeader:"定期実行:{{name}}",viewDetails:"詳細を見る",deleteMessageConfirm:"この通知を削除しますか?",viewAll:"すべて表示",read:"既読",approve:"承認",reject:"拒否",ready:"準備完了",harvestNow:"今すぐ実行",createHarvest:"Harvest を作成",createFirstHarvest:"最初の Harvest を作成",createSuccess:"Harvest を作成しました",emptyApprovals:"保留中の承認はありません",emptyPush:"通知はありません",wobbleEnable:"承認の揺れ通知を有効にする",wobbleDisable:"承認の揺れ通知を無効にする",emptyHarvests:"Harvest はまだありません",statusReadyToHarvest:"実行可能",statusGrowing:"実行中",harvestedTimes:"{{count}} 回実行済み",harvestSuccessRate:"成功率 {{rate}}%",messageDetailComingSoon:"詳細表示は準備中です",harvestSettingsComingSoon:"Harvest 設定は準備中です",messageDetailTitle:"実行詳細",detailCronTitle:"定期実行:{{name}}",detailHeartbeatTitle:"ハートビート",messageNotFound:"メッセージが見つかりません",detailTaskName:"タスク名",detailTaskId:"タスクID",detailStatus:"実行ステータス",detailSeverity:"重要度",detailAgent:"所属Agent",detailSource:"ソース",detailSourceCronJob:"定期実行",detailSourceHeartbeat:"ハートビート",detailTrigger:"トリガー",detailDuration:"所要時間",detailExecutedAt:"実行時刻",detailReceivedAt:"受信時刻",detailRunId:"実行ID",detailContent:"出力",detailPayload:"追加情報",detailExecutionTrace:"実行トレース",detailTraceEmpty:"実行トレースはありません",mailDetailSender:"差出人",mailDetailSubject:"件名",mailDetailDate:"メール日時",mailDetailBody:"本文プレビュー",mailDetailProcess:"処理プロセス",filterByAgent:"エージェントで絞り込み",filterBySourceType:"ソースで絞り込み",sourceTypeCron:"Cron",sourceTypeHeartbeat:"Heartbeat",sourceTypeMemory:"Memory",sourceTypeMail:"Mail",mailAccessControl:"メールアクセス制御",pendingSenders:"承認待ちの差出人",senderLists:"差出人リスト",addSender:"差出人を追加",domainWildcardHint:"ドメインワイルドカードに対応(例:*@example.com)",invalidAddress:"メールアドレスの形式が正しくありません。[email protected] または *@domain.com の形式で入力してください",whitelist:"ホワイトリスト",blacklist:"ブラックリスト",approveSender:"承認",deny:"ブロック",dismiss:"無視",batchApprove:"一括承認",batchDeny:"一括ブロック",batchDismiss:"一括無視",batchRemove:"一括削除",confirmApprove:"選択した差出人を承認しますか?",confirmDeny:"選択した差出人を拒否しますか?",confirmDismiss:"選択した差出人を無視しますか?",confirmRemove:"削除してもよろしいですか?",removeSuccess:"削除しました",addedToAllAgents:"追加してすべてのエージェントに同期しました",senderAddress:"差出人アドレス",displayName:"差出人名",emailSubject:"件名",bodyPreview:"本文プレビュー",selectAgent:"エージェントを選択",allAgents:"すべてのエージェント",time:"時刻",remark:"備考",actions:"操作",optional:"(任意)",required:"(必須)"},GI={title:"コーディングモード",experimental:"実験的機能",experimentalDesc:"コーディングモードは QwenPaw を軽量な Web IDE に変換し、コードエディター、ファイルツリー、Git 統合、AI コーディング支援を提供します。",experimentalNote:"この機能は実験的であり、現在も積極的に開発中です。一部の機能は制限されているか、将来のアップデートで変更される場合があります。",confirmBtn:"コーディングモードを有効にする",enterTooltip:"コーディングモードに入る",exitTooltip:"コーディングモードを終了する",btnCode:"コード",btnChat:"チャット",selectProject:"プロジェクトディレクトリを選択",selectProjectDesc:"作業するプロジェクトを選択するか、デフォルトのワークスペースを使用してください",tabWorksp
181ace:"デフォルトワークスペース",tabClone:"リポジトリをクローン",tabLocal:"ローカルプロジェクトをインポート",tabNew:"新規プロジェクト",workspaceDesc:"現在のエージェントのワークスペースディレクトリを使用",cloneUrl:"GitリポジトリURL",cloneUrlPlaceholder:"https://github.com/user/repo.git",cloneName:"プロジェクト名(オプション)",cloneNamePlaceholder:"空白の場合はURLから推測",cloneBtn:"クローン開始",cloning:"クローン中...",localPath:"ローカルディレクトリパス",localPathPlaceholder:"/Users/yourname/my-project",localPathHint:"ローカルプロジェクトへの絶対パスを入力してください",openBtn:"インポート",newName:"プロジェクト名",newNamePlaceholder:"my-project",createBtn:"プロジェクト作成",switchProject:"プロジェクト切替",currentProject:"現在のプロジェクト",resetToWorkspace:"デフォルトワークスペースにリセット",dropPrimary:"フォルダをここにドラッグ、またはクリックして参照",dropSecondary:"Finderからドラッグするか、下にパスを貼り付け",pathHint:"絶対パスを入力してください(/ または ~ で始まる)",importing:"インポート中...",dropFailed:"フォルダの読み取りに失敗",workingDir:"作業ディレクトリ",importCopyNote:"フォルダは QwenPaw の管理対象プロジェクトライブラリにコピーされます。元のファイルは変更されません。",importCopyDesc:"インポートするとフォルダのコピーが作成され、Agent はコピー上で作業します。元のファイルは変更されません。元のディレクトリで直接作業するには「ディレクトリを開く」を使用してください。",tabOpenDir:"ディレクトリを開く",openDirDesc:"ローカルの既存ディレクトリを直接開きます(ファイルはコピーされません)",openDirBtn:"このディレクトリを開く",openDirLoading:"読み込み中...",openDirEmpty:"サブディレクトリがありません",openDirHome:"ホーム",openDirRefresh:"更新",openDirHiddenFolders:"隠しフォルダ"},VI={searchPlaceholder:"プラットフォームを横断してスキルを検索",categoryAll:"すべて",categoryPlaceholder:"カテゴリを検索",searchResult:"「{{keyword}}」に一致するスキルが {{count}} 件見つかりました",providerUnavailable:"ソースが利用できません",noResults:"結果が見つかりません",startTyping:"上の検索ボックスにキーワードを入力してスキルを探します",browseHint:"{{providers}} のスキルを閲覧するには、カテゴリを選択するかキーワードを入力してください",noDescription:"説明はありません",browseMarket:"マーケットを閲覧",installQueue:"インストールキュー",clearCompleted:"クリア",retry:"再試行",status:{queued:"待機中",installing:"インストール中",completed:"完了",failed:"失敗",cancelled:"キャンセル済み"},loadMore:"もっと読み込む",noMoreResults:"これ以上ありません",detail:{title:"スキルの詳細",version:"バージョン",author:"作成者",sourceUrl:"インストール URL",slug:"識別子",missing:"—"},stats:{downloads:"ダウンロード数",stars:"スター",installs:"インストール数",likes:"いいね数",views:"閲覧数",category:"カテゴリ",updatedAt:"更新日"},queueMsg:{timedOut:"インストールがタイムアウトしました",failedPrefix:"失敗:{{msg}}"}},WI={starting:"バックエンドを起動中...",checking:"バックエンドに接続中...",error:"バックエンドの起動に失敗しました。",errorHint:"バックエンドプロセスを起動できませんでした。詳細はアプリケーションログを確認してください。",errorDetails:"エラーの詳細を表示",timeout:"{{seconds}} 秒以内にバックエンドの起動に失敗しました。",timeoutHint:"バックエンドの起動に失敗しました。再試行するか、アプリケーションのログを確認してください。",retry:"再試
181行"},zI={error:{SENSITIVE_FILE_BLOCKED:"このファイルはファイルガードによりブロックされています(機密ファイル保護)。",OUTSIDE_WORKSPACE:"このファイルはワークスペースの範囲外です。設定 → セキュリティ → ファイルガード で「コンソールでワークスペース外ファイルのプレビューを許可」を有効にしてください。",FORBIDDEN:"アクセス拒否:このファイルをプレビューする権限がありません。",NOT_FOUND:"ファイルが見つかりません。移動または削除された可能性があります。相対パスを使用している場合は、絶対パスをお試しください。",LOAD_FAILED:"ファイルプレビューの読み込みに失敗しました。",LOAD_FAILED_DETAIL:"ファイルプレビューの読み込みに失敗しました: {{detail}}"}},KI={readFile:"{{file}} を読み込む",readFileDefault:"ファイルを読み込む",writeFile:"{{file}} を作成",writeFileDefault:"ファイルを作成",editFile:"{{file}} を編集",editFileDefault:"ファイルを編集",appendFile:"{{file}} に追記",appendFileDefault:"ファイルに追記",grepSearch:"Grep {{pattern}}",grepSearchDefault:"Grep 検索",globSearch:"Glob {{pattern}}",globSearchDefault:"Glob 検索",viewImage:"画像 {{file}} を表示",viewImageDefault:"画像を表示",viewVideo:"動画 {{file}} を表示",viewVideoDefault:"動画を表示",desktopScreenshot:"デスクトップのスクリーンショット",sendFile:"{{file}} を送信",sendFileDefault:"ファイルを送信",browserUse:"{{detail}} をブラウズ",browserNavigate:"{{url}} を開く",browserNavigateDefault:"ページを開く",browserClick:"クリック",browserType:"テキストを入力",browserSnapshot:"スナップショットを取得",browserScroll:"スクロール",getCurrentTime:"現在時刻を取得",setTimezone:"{{timezone}} に設定",getTokenUsage:"トークン使用量を照会",memorySearch:"メモリで {{query}} を検索",memorySearchDefault:"メモリを検索",listAgents:"エージェント一覧",chatWithAgent:"{{agent}} とチャット",chatWithAgentDefault:"エージェントとチャット",submitToAgent:"{{agent}}{{task}} に送信",submitToAgentDefault:"タスクを送信",checkAgentTask:"{{agent}} #{{taskId}} を確認",checkAgentTaskAgent:"{{agent}} を確認",checkAgentTaskDefault:"タスクを確認",delegateExternalAgent:"{{runner}} に委任",delegateExternalAgentDefault:"外部エージェントに委任",shell:"{{command}} を実行",shellDefault:"コマンドを実行",formatTable:{file:"ファイル",lineNumber:"行番号",score:"スコア",summary:"概要",name:"名前",id:"ID",description:"説明",status:"ステータス"},loading:"読み込み中...",rawInputPreview:"リアルタイムの未加工入力(末尾 4,096 文字)",largeOutputOmitted:"{{count}} 行を省略しました — 利用可能な出力をコピーするか、復元手順に従ってください",largeOutputTruncated:"表示用に出力を省略しました — 利用可能な出力をコピーするか、復元手順に従ってください",browserAction:{startHeaded:"ブラウザを起動(表示あり)",start:"ブラウザを起動",stop:"ブラウザを停止",open:"{{url}} を開く",openDefault:"ページを開く",navigate:"{{url}} に移動",navigateDefault:"ページに移動",navigateBack:"戻る",click:"{{selector}} をクリック",clickDefault:"要素をクリック",type:"{{text}} を入力",typeDefault:"テキストを入力",snapshot:"スナップショットを取得",screenshot:"スクリーンショット {{path}}",screenshotDefault:"スクリーンショット",eval:"{{code}} を評価",evalDefault:"コードを評価",runCode:"{{code}} を実行",runCodeDefault:"コードを実行",closePage:"ページを閉じる",tabs:"タブ {{action}}",tabsDefault:"タブを管理",fillForm:"フォームを入力",fileUpload:"{{filename}} をアップロード",fileUploadDefault:"ファイルをアップロード",fileDownload:"{{target}} をダウンロード",fileDownloadDefault:"ファイルをダウンロード",pressKey:"{{key}} を押す",pressKeyDefault:"キーを押す",hover:"{{selector}} にホバー",hoverDefault:"要素にホバー",drag:"ドラッグ",selectOption:"オプションを選択",waitFor:"{{target}} を待機",waitForDefault:"要素を待機",resize:"{{w}}x{{h}} にリサイズ",resizeDefault:"ウィンドウをリサイズ",pdf:"PDF {{path}} に出力",pdfDefault:"PDF に出力",install:"インストール",batch:"バッチ"},lineBadge:{lines:"{{count}} 行",addLines:"+{{count}} 行",delLines:"-{{count}} 行",matches:"{{count}} 件",files:"{{count}} ファイル"}
181,inlineResult:{taskId:"タスク #{{id}}",submitted:"送信済み"},execute:"{{tool}} を実行",executeDefault:"ツールを実行"},$I={gotoSettings:"エージェント Loop 設定",selectorTitle:"Loop モード",selectorHint:"エージェントの進め方を選択",selectorAria:"Loop モードを選択",builtInModes:"組み込み",customModes:"カスタムとプラグイン",starting:"開始中",running:"実行中",awaiting_user:"返信待ち",activePersistentDescription:"このモードは完了するか会話をリセットするまで有効です。",activeCustomDescription:"このカスタムモードは /mode off、/clear、/new のいずれかを使用するまで有効です。",loadError:"一部の Loop モードを読み込めませんでした。",retry:"再試行",modes:{default:{name:"デフォルト",description:"標準の制御されたエージェント Loop。"},goal:{name:"目標",description:"具体的で検証可能な目標に向かって継続的に取り組みます。"},mission:{name:"ミッション",description:"構造化された複数ステップのタスクを継続的に実行します。"}}},QI={common:tI,harnesses:aI,desktop:nI,chunkError:oI,appCenter:iI,nav:sI,os:rI,debug:lI,agent:dI,checkpoints:cI,workspace:uI,skills:pI,skillPool:mI,mcp:hI,heartbeat:gI,cronJobs:fI,channels:bI,sessions:kI,environments:yI,tokenUsage:vI,agentStats:TI,modelSelector:SI,models:CI,files:wI,projectDirectory:PI,agentConfig:AI,tools:MI,modelConfig:DI,header:xI,theme:RI,sidebar:II,chat:_I,security:LI,hub:EI,login:FI,account:OI,voiceTranscription:BI,acp:NI,backup:HI,approval:UI,pluginManager:qI,inbox:jI,codingMode:GI,market:VI,startup:WI,preview:zI,tool:KI,loop:$I},JI={save:"Salvar",reset:"Redefinir",cancel:"Cancelar",confirm:"Confirmar",apply:"Aplicar",delete:"Excluir",edit:"Editar",create:"Criar",upload:"Enviar",download:"Baixar",refresh:"Atualizar",retry:"Tentar novamente",search:"Pesquisar",enable:"Ativar",disable:"Desativar",enabled:"Ativado",disabled:"Desativado",preview:"Visualizar",raw:"Código-fonte",view:"Visualizar",content:"Conteudo",loading:"Carregando...",saving:"Salvando...",copy:"Copiar",copied:"Copiado para a area de transferencia",copyFailed:"Falha ao copiar para a area de transferencia",contentPlaceholder:"Digite o conteudo...",help:"Ajuda",close:"Fechar",actions:"Acoes",total:"Total {{count}}",clear:"Limpar",paste:"Colar",yes:"Sim",no:"Nao"},YI={connected:"Conectado",disconnected:"Desconectado",notConnected:"Não conectado",comingSoon:"Em breve",connect:"Conectar com o ChatGPT",disconnect:"Desconectar",apiKeyAuthenticated:"Autenticado com chave de API",chatGptAuthenticated:"Conectado ao ChatGPT",cliAuthenticated:"{{type}} CLI autenticado"},XI={closeWindow:{title:"Fechar Janela",description:"O que deseja fazer ao fechar a janela? Sair do aplicativo interrompe todas as tarefas em execução e tarefas agendadas.",remember:"Lembrar minha escolha",showWindow:"Mostrar janela",minimizeToTray:"Minimizar para a bandeja",quitApp:"Sair do aplicativo",preference:"Fechar Janela",askEveryTime:"Perguntar sempre"}},ZI={title:"Falha ao carregar pagina",subTitle:"This may be caused by a network issue or an application update.",genericTitle:"Algo deu errado",genericSubTitle:"An unexpected error occurred while rendering this page.",reload:"Recarregar"},e_={backToList:"Voltar",subtitle:"Gerencie os aplicativos instalados ou amplie seu espaço de trabalho pelo mercado de aplicativos.",myApps:"Meus aplicativos",officialApps:"Aplicativos oficiais",appMarket:"Mercado de aplicativos",browseOfficialApps:"Explorar aplicativos oficiais",browseMarket:"Explorar mercado de aplicativos",officialAppsEmpty:"Ainda não há aplicativos oficiais",searchOfficial:"Pesquisar aplicativos oficiais...",installedCount:"{{count}} aplicativos",clearFilters:"Limpar filtros",moreActions:"Mais ações",openApp:"Abrir aplicativo",noDescription:"Sem descrição",search:"Pesquisar aplicativos...",allCategories:"Todos",noApps:"Nenhum aplicativo instalado",noResults:"Nenhum aplicativo corresponde à pesquisa",loadFailed:"Falha ao carregar aplicativos. Tente novamente.",appNotLoaded:"Este aplicativo ainda não foi carregado. Abra-o uma vez pela barra lateral e tente novamente.",uninstall:"Desinstalar",uninstallConfirmTitle:"Desinstalar aplicativo?",uninstallConfirmContent:'Isso excluirá o diretório do aplicativo "{{name}}". Esta ação não pode ser desfeita.',uninstallSuccess:"Aplicativo desinstalado",uninstallFailed:"Falha ao desinstalar",installing:"Instalando",installSuccess:"Instalado",installFailed:"Falha na instalação",installedStatus:"Instalado",update:"Atualizar",searchMarket:"Pesquisar no mercado de aplicativos...",marketFilters:"Filtros do mercado de aplicativos",filterAll:"Todos",trending:"Em alta",marketEmpty:"Nenhum aplicativo encontrado",loadMore:"Carregar mais",noMoreApps:"Não há mais aplicativos",install:"Instalar",details:"Detalhes",featured:"Em destaque",refreshApp:"Atualizar aplicativo",appRefreshed:"Aplicativo atualizado",aboutApp:"Sobre o aplicativo",exitApp:"Sair do aplicativo",moreOptions:"Mais opções",backToListHint:"Voltar à lista de aplicativos (ESC)",version:"Versão",id:"ID",category:"Categoria",description:"Descrição"},t_={chat:"Chat",files:"Arquivos",control:"Controle",channels:"Canais",sessions:"Sessoes",cronJobs:"Tarefas Cron",heartbeat:"Heartbeat",agent:"Workspace",workspace:"Arquivos",skills:"Skills",skillPool:"Pool de Skills",marketplace:"Extensões",tools:"Ferramentas",mcp:"MCP",acp:"ACP",agentConfig:"Configuracao",agents:"Gerenciamento de Agentes",settings:"Configuracoes",models:"Modelos",environments:"Environments",security:"Seguranca",tokenUsage:"Uso de Tokens",agentStats:"Estatisticas dos Agentes",voiceTranscription:"Transcricao de Voz",debug:"Depuracao",plugins:"Plugins",backups:"Backups",pluginManager:"Gerenciador de Plugins"},a_={console:"Console",appStore:"App Store",appStoreDesc:"Instale ou remova aplicativos da área de trabalho",arrangeDesktop:"Organizar área de trabalho",approvalActionFailed:"Falha na ação, tente novamente",booting:"Iniciando…",changeWallpaper:"Alterar papel de parede",clearAll:"Limpar tudo",closeApp:"Fechar",currentSpace:"Espaço atual",currentSpaceLabel:"Espaço atual: {{name}}",currentAppLabel:"Aplicativo atual: {{name}}",desktopApps:"Aplicativos de desktop",finder:"Área de trabalho",focusApp:"Focar",install:"Instalar",installed:"instalado",installedApp:"Instalado",installedApps:"Aplicativos instalados",launchpad:"Launchpad",moveDockLeft:"Mover para a esquerda",moveDockRight:"Mover para a direita",missionControl:"Mission Control",noInstalledApps:"Nenhum aplicativo instalado",noNotifications:"Sem notificações",noOpenWindows:"Nenhuma janela aberta neste espaço",noSettings:"Nenhuma configuração disponível",notInstalled:"não instalado",notifications:"Notificações",notificationSummary:"Aprovações {{approvals}} · Caixa de entrada {{inbox}}",notifyApproval:"Aprovação",notifyInbox:"Caixa de entrada",openApp:"Abrir",keepInDock:"Manter no Dock",removeFromDock:"Remover do Dock",refreshDesktop:"Atualizar área de trabalho",appMarket:"Mercado de aplicativos",appMarketRefresh:"Atualizar",appMarketSearch:"Pesquisar aplicativos...",appMarketEmpty:"Nenhum aplicativo encontrado",appMarketUnavailable:"O mercado de aplicativos está indisponível no momento. Tente novamente mais tarde.",appMarketInstall:"Instalar",appMarketDetails:"Detalhes",appMarketDeveloper:"Desenvolvedor",appMarketDownloads:"Downloads",appInstalled:"Aplicativo instalado com sucesso",appInstallFailed:"Falha na instalação do aplicativo",appCompatibilityWarningTitle:"Aviso de compatibilidade do aplicativo",appCompatibilityWarningContent:"Este aplicativo é destinado ao QwenPaw {{labels}}, mas a versão atual do QwenPaw é {{version}}
181. A instalação pode causar erros. Continuar?",appCompatibilityWarningConfirm:"Instalar mesmo assim",appCompatibilityUnverified:"A compatibilidade com a versão atual do QwenPaw não foi verificada.",restoreAll:"Restaurar tudo",returnToConsole:"Voltar ao console",desktopMode:"Modo desktop",qwenpawMenu:"Menu QwenPaw",restoredAll:"Todos os aplicativos restaurados",sortBy:"Ordenar por",sortFree:"Organização livre",sortName:"Nome",sortType:"Tipo",systemSettings:"Configurações do sistema",uninstall:"Desinstalar",uninstallConfirmTitle:"Desinstalar aplicativo?",uninstallFailed:"Falha ao desinstalar",uninstalledApp:"Desinstalado",update:"Atualizar",wallpaper:"Papel de parede",windows:"janelas"},n_={title:"Depuracao",desc:"View the backend daemon log file to help diagnose issues. Logs refresh automatically while this page is open.",level:{all:"Todos"},backend:{title:"Logs do backend",autoRefresh:"Atualizacao automatica",newestFirst:"Mais recentes primeiro",updatedAt:"Atualizado em",path:"Arquivo de log",notFound:"Backend log file was not found yet.",placeholder:"Backend log output will appear here.",loadFailed:"Falha ao load Backend Logs",searchPlaceholder:"Pesquisar logs do backend..."},actions:{refreshBackend:"Atualizar logs do backend",refreshSuccess:"Logs atualizados",copyBackend:"Copiar logs do backend"}},o_={title:"ACP",loading:"Carregando configuracao ACP...",builtin:"Integrado",custom:"Personalizado",create:"Adicionar Personalizado Agente",createTitle:"Criar ACP Agente",createSuccess:"Agente ACP criado",editTitle:"Editar ACP Configuracao",agentKey:"Chave do Agente",agentKeyRequired:"Digite a chave do agente",agentKeyInvalid:"A chave pode conter apenas letras, numeros, sublinhados e hifens",agentKeyExists:"Esta chave de agente ja existe",enabled:"Ativado",command:"Command",commandRequired:"Digite um comando",args:"Arguments",argsHelp:"Um argumento por linha",env:"Variaveis de Ambiente",envHelp:"Use o formato CHAVE=VALOR em cada linha",envInvalidLine:"Formato de variavel de ambiente invalido: {{line}}",trusted:"Trusted",toolParseMode:"Modo de Parse de Ferramentas",toolParseModeRequired:"Selecione um modo de parse",stdioBufferLimit:"Limite do Buffer Stdio",stdioBufferLimitHelp:"Tamanho maximo do buffer de linha stdio para o subprocesso ACP em bytes.",stdioBufferLimitRequired:"Digite o limite do buffer stdio",stdioBufferLimitMin:"O limite deve ser de pelo menos 1 byte",docs:"Documentacao de Setup",docsHelp:"Abrir a documentacao ACP e ir para a secao de configuracao de runners externos",notSet:"Nao definido",configSaved:"Configuracao ACP salva",configFailed:"Falha ao salvar configuracao ACP",deleteTitle:"Excluir {{name}}",deleteConfirm:"Excluir este agente ACP? Esta acao nao pode ser desfeita.",deleteSuccess:"Agente ACP excluido",deleteFailed:"Falha ao excluir agente ACP",nodeSettings:"Configuracoes do Node",nodePath:"Caminho do Node",chooseOtherNode:"Escolher outro Node...",selectNodePath:"Selecionar caminho do Node",nodePathPrompt:"Informe o caminho do executavel node",nodeSaved:"Configuracoes do Node salvas",nodeLoadFailed:"Falha ao carregar configuracoes do Node",nodeSaveFailed:"Caminho do Node indisponivel",nodeRuntime:{bundled:"Node embutido",system:"Node do sistema",custom:"Node personalizado"},nodeRuntimeReason:{systemNodeMissing:"Node do sistema nao detectado",nodeMissing:"Caminho do Node nao existe",npxMissing:"npx nao encontrado",versionCheckFailed:"Falha na verificacao de versao",unavailable:"Indisponivel"}},i_={title:"Transcricao de Voz",description:"Configure como mensagens de audio e voz recebidas sao processadas.",saveSuccess:"Modo de audio salvo",saveFailed:"Falha ao salvar modo de audio",audioModeLabel:"Modo de Audio",audioModeDescription:"Escolha como mensagens de voz dos canais (Discord, Telegram, etc.) sao processadas antes de serem enviadas ao modelo.",modeAuto:"Auto (Recomendado)",modeAutoDesc:"Transcribe audio to text using the selected transcription provider, then send the text to the model. If transcription is unavailable or disabled, a file-uploaded placeholder is shown instead. Audio is never sent directly to the model in this mode. Works with all models.",modeNative:"Audio Nativo",modeNativeDesc:"Send the audio file directly to the model without transcription. This is the only mode that sends audio to the model. Only works with specific audio-capable models (e.g. gpt-4o-audio). Most models do not support this and will reject the message.",ffmpegReady:"ffmpeg is installed. Audio conversion is available for native mode.",ffmpegMissing:"ffmpeg is not installed.",ffmpegMissingDesc:"Native audio mode requires ffmpeg to convert audio formats (e.g. .ogg to .wav). Install ffmpeg as a system package to enable this mode.",providerTypeLabel:"Provedor de Transcricao",providerTypeDescription:"Choose the transcription backend. Select Disabled if you do not need voice transcription.",providerTypeDisabled:"Desativado",providerTypeDisabledDesc:"No transcription. Voice messages will show a file-uploaded placeholder.",providerTypeWhisperApi:"Whisper API",providerTypeWhisperApiDesc:"Use an OpenAI-compatible Whisper API endpoint from a configured provider (e.g. OpenAI, Ollama).",providerTypeLocalWhisper:"Local Whisper",providerTypeLocalWhisperDesc:"Ru
181n transcription locally using the openai-whisper Python library. Requires both ffmpeg and openai-whisper to be installed.",localWhisperReady:"Local Whisper is ready. Both ffmpeg and openai-whisper are installed.",localWhisperMissing:"Local Whisper is not ready. Missing dependencies must be installed.",localWhisperMissingDesc:"ffmpeg: {{ffmpeg}} | openai-whisper: {{whisper}}. Install missing dependencies: ffmpeg (system package) and openai-whisper (uv pip install openai-whisper, or install QwenPaw with the [whisper] extra).",providerLabel:"Whisper API Provedor",providerDescription:"Select which provider to use for audio transcription via the Whisper API. Only providers with a Whisper-compatible endpoint are shown.",providerPlaceholder:"Selecionar a provider...",noProvidersWarning:"No transcription-capable providers found. Configure an OpenAI provider to enable voice transcription.",transcriptionInfoTitle:"How transcription works",transcriptionInfoDesc:"Whisper API transcription uses an OpenAI-compatible /v1/audio/transcriptions endpoint. This requires a configured provider with a Whisper-compatible endpoint — for example, an OpenAI provider. Select a specific provider above to enable transcription.",transcriptionInfoDescLocal:"Local Whisper transcription runs the openai-whisper library directly on your machine. It requires both ffmpeg (for audio decoding) and the openai-whisper Python package to be installed. No API key or network connection is needed. Install with: uv pip install 'qwenpaw[whisper]'."},s_={title:"Backups",description:"Backup and restore agent workspaces and configurations.",create:"Criar Backup",import:"Importar",export:"Exportar",restore:"Restore",delete:"Excluir",batchDelete:"Excluir Selecionado",batchDeleteConfirm:"Are you sure you want to delete {{count}} backup(s)? This action cannot be undone.",deleteConfirm:"Are you sure you want to delete this backup? This action cannot be undone.",name:"Nome",createdAt:"Criado",scopeSummary:"Escopo",descriptionLabel:"Descricao",noBackups:"No backups yet. Create one to backup your current configuration.",loadFailed:"Falhou to load Backups",createTitle:"Criar Backup",backupMode:"Backup Modo",fullBackup:"Full Backup",fullBackupDesc:"Backup everything including all agent workspaces, global settings, skill pool, and secrets",customBackup:"Personalizado Backup",partialBackup:"Partial Backup",partialBackupDesc:"Customize what to backup",nameRequired:"Backup Nome is Obrigatorio",namePlaceholder:"Enter backup Nome",descriptionPlaceholder:"Opcional description...",scopeAgents:"Agente Workspaces",scopeGlobalConfig:"Global Configuracoes",scopeSkillPool:"Pool de Skills",scopeSecrets:"Secrets",scopeSecretsHint:"Includes model provider secrets (API keys), environment variables, and other sensitive information",securityNotice:"This backup may contain sensitive credentials. Agent workspaces include channel credentials (bot tokens, app secrets, etc.), and model provider secrets include API keys. Do not share backup files with others.",searchPlaceholder:"Search backups by name or ID...",total:"Total {{count}}",agentsPlaceholder:"Select agent workspaces (leave empty for all)",selectAll:"Selecionar Todos",deselectAll:"Deselect Todos",createSuccess:"Backup Criado successfully",createFailed:"Falhou to Criar backup",restoreTitle:"Restore Backup",restoreScope:"Restore Escopo",restoreFullWarning:"Full restore will completely replace all contents of the current instance (including all agents, global config, skill pool, and secrets). This action cannot be undone. Related features will be unavailable during restore. Please restart the service after restoration is complete.",agentGroupExisting:"Existing",agentGroupNew:"Novo",agentExists:"Exists",agentNew:"Novo",agentActionReplace:"Overwrite",agentActionAdd:"Novo",agentColumnName:"Agente",agentColumnWorkspace:"Workspace",agentTotal:"{{count}} Agentes total",noAgentsInBackup:"No agent workspaces in this backup",loadingAgents:"Carregando Agente list...",agentSearchPlaceholder:"Search by name or ID...",agentSearchTotal:"{{count}} of {{total}} Agentes",restoreCustomSummary:"{{existing}} existing · {{added}} new selected",defaultWorkspaceDirUnused:"Nao Novo Agentes Selecionado",otherOptions:"Other Options",defaultWorkspaceDirDefault:"<Default path>/{{aid}}",restoreWarningModify:"Restoring will modify current configurations. This action cannot be undone.",restoreWarningRestart:"Related features will be unavailable during restore. Please restart the service after restoration is complete.",preRestoreBackupTitle:"Criar Pre-Restore Backup",preRestoreBackupContent:"The restore operation is irreversible. Would you like to create a backup of the current state first? This allows you to rollback if any issues occur during restoration.",preRestoreBackupYes:"Yes, Criar backup first",preRestoreBackupNo:"No, restore directly",preRestoreBackupDesc:"Auto-created backup before restore",preRestoreBackupFailed:"Falha ao Criar pre-restore backup",preRestoreBackupSuccess:"Pre-restore backup created successfully, ID: {{id}}",creatingPreRestoreBackup:"Creating pre-restore backup...",skipAndRestore:"Skip and continue to restore",restoreConfirm:"I confirm that I want to restore this backup",restoreMode:"Restore Modo",restoreModeFull:"Full Restore",restoreModeFullDesc:"Completely replace all contents of the current instance, including all agents, global config, skill pool and secrets",restoreModeCustom:"Personalizado Restore",restoreModeCustomDesc:"Select the contents to restore, such as specific agents, config, etc.; existing agents not included in this restore will be preserved",restoreModeFullDisabled:"Full backup only",defaultWorkspaceDir:"Agente Padrao Workspace Directory",defaultWorkspaceDirPlaceholder:"Leave empty to use ~/.qwenpaw/workspaces",defaultWorkspaceDirHint:"If the agent's original workspace path does not exist, the agent will be saved under <default path>/<agent ID>. If it exists, the agent's original workspace path will be used.",restoreStrategy:"Estratégia de restauração",restoreStrategyPreserve:"Preservar segurança local e MCP",restoreStrategyPreserveDesc:"Mantenha as proteções de segurança e a configuração MCP desta instância.",restoreStrategyRestore:"Restaurar estas configurações do backup",restoreStrategyRestoreDesc:"Use a configuração de segurança e MCP do backup.",restoreSuccess:"Backup restored successfully. Please restart the service.",restoreSuccessPreserved:"Backup restaurado com sucesso. Configurações locais preservadas: {{keys}}. Reinicie o serviço.",restoreSuccessWithBackup:"Backup restored successfully. Pre-restore backup ID: {{preRestoreId}}. Please restart the service.",restoreFailed:"Falhou to restore backup",restoreTimedOut:"A restauração ainda está em andamento ou excedeu 5 minutos. Verifique o tamanho do backup, o espaço em disco e os logs do serviço antes de tentar novamente.",restoreTargetBusy:"A restauração falhou porque estes diretórios ainda estão em uso. Feche o navegador ou processo que os utiliza e tente novamente. Se continuarem bloqueados, reinicie o sistema e tente de novo.",detailLoa
181dFailed:"Failed to load backup details; restore is unavailable",trustLocalBanner:"Backup local - restauração completa por padrão",trustForeignBanner:"Backup importado - segurança local e MCP são preservados por padrão",trustLegacyBanner:"Backup legado - confirmação de confiança necessária antes da restauração",trustForeignTitle:"Confiar neste backup?",trustLegacyTitle:"Confiar no backup legado?",unknownBackupName:"Arquivo de backup",trustForeignDesc:"Este backup não foi assinado por esta instância. Continue apenas se confiar na origem; as configurações locais de segurança e MCP serão preservadas por padrão ao restaurar.",trustLegacyDesc:"Este backup antigo não tem assinatura local. Continue apenas se confiar na origem; esta instância o assinará antes da restauração.",deleteSuccess:"Backup(s) deleted successfully",deleteFailed:"Falhou to Excluir backup(s)",exportFailed:"Falhou to Exportar backup",exportWarningTitle:"Sensitive Information Aviso",exportWarningContent:"This backup may contain sensitive credential information. Agent workspaces contain channel credentials (such as bot tokens, app secrets, etc.), and model provider secrets contain API Keys. Do not share backup files with others.",exportConfirm:"Confirmar Exportar",importTitle:"Importar Backup",importSuccess:"Backup imported successfully",importFailed:"Falhou to Importar backup",importConflictTitle:"Backup Already Exists",importConflictDesc:"A backup with the same ID already exists. Do you want to overwrite it?",importReplace:"Overwrite",agents:"{{count}} Agent(s)",allAgents:"Todos Agentes",globalConfig:"Global Configuracoes",skillPool:"Pool de Skills",secrets:"Secrets",selected:"{{count}} Selecionado",fileCount:"{{count}} Arquivos",totalSize:"{{size}}",progressStarting:"Starting backup...",progressAgent:"Backing up agent {{index}} / {{total}}...",progressSaving:"Saving backup file...",progressDone:"Backup complete",localModelsNotice:"Backup files do not include local model files. For cross-device migration, you will need to re-download the required local models on the target device."},r_={nav:"Pontos de controle",title:"Pontos de controle de estado",auto:"Automático",autoEnabled:"Pontos automáticos ativados",autoDisabled:"Pontos automáticos desativados",refresh:"Atualizar",snapshot:"Snapshot",snapshotCreated:"Snapshot criado",graph:"Grafo",checkpoint:"Ponto de controle",type:"Tipo",commit:"Commit",createdAt:"Criado em",session:"Sessão",channel:"Canal",parent:"Pai",details:"Detalhes",search:"Pesquisar consulta, nome, sessão ou SHA",allTypes:"Todos os tipos",allSessions:"Todas as sessões",showingLatest:"Exibindo os {{count}} mais recentes",loadFailed:"Não foi possível carregar",retry:"Tentar novamente",more:"Mais ações",noMatches:"Nenhum ponto corresponde aos filtros.",empty:"Ainda não há pontos de controle. O histórico aparecerá aqui.",kind:{auto:"Auto",snapshot:"Snapshot",safety:"Segurança",commit:"Commit"},summary:{total:"pontos"},snapshotDialog:{title:"Criar snapshot",session:"Sessão",name:"Nome",placeholder:"Nome opcional"},gc:{settingsAction:"Configurações de limpeza automática",settingsTitle:"Configurações de limpeza automática",keepCount:"Pontos automáticos a manter",keepDays:"Retenção de pontos automáticos (dias)",preRestoreDays:"Retenção de snapshots pré-restauração (dias)",settingsSaved:"Configurações de limpeza automática salvas",thoroughAction:"Thoroughly compact checkpoints",thoroughTitle:"Thoroughly compact checkpoints?",thoroughDescription:"Remove {{count}} ponto(s), ignorando a retenção de pontos automáticos. O HEAD de cada sessão será mantido.",thoroughConfirm:"Thoroughly compact",thoroughSuccess:"Removed {{count}} checkpoint(s) during thorough compaction",action:"Limpar pontos",title:"Limpar pontos conforme a política de retenção?",description:"Remove {{count}} ponto(s) expirado(s) conforme a política de retenção atual. O HEAD de cada sessão será mantido.",confirm:"Limpar",success:"{{count}} ponto(s) removidos"},reset:{action:"Redefinir dados",title:"Redefinir todos os dados?",description:"Isso remove permanentemente todos os pontos e desativa a criação automática.",confirm:"Redefinir",success:"Dados redefinidos"},restore:{action:"Restaurar",title:"Restaurar ponto",preview:"Visualizar restauração",confirm:"Restaurar",conversation:"Conversa",memory:"Memória",files:"Arquivos do workspace",refreshWarning:"A conversa será alterada. Atualize-a após a restauração.",selectedCount:"{{count}} arquivos selecionados",selectAll:"Selecionar todos os arquivos alterados",delete:"Excluir",restore:"Restaurar",noFileChanges:"Nenhuma alteração de arquivo é necessária.",success:"Ponto restaurado. Atualize a conversa para carregar o estado."}}
181,l_={title:"Arquivos",workspacePath:"Workspace:",noFiles:"Nao Arquivos",coreFiles:"Core Arquivos",coreFilesDesc:"Bootstrap persona, identity, and tool guidance.",uploadTooltip:"ZIP files only",uploadTooltipWithLimit:"ZIP files only, max {{limit}}MB",selectFile:"Selecione um arquivo para editar",fileContent:"File content...",uploadSuccess:"Arquivo enviado com sucesso",uploadFailed:"Falha ao enviar arquivo",downloadPreparing:"Preparando download do workspace...",downloadSuccess:"Workspace downloaded successfully",downloadFailed:"Workspace Baixar Falhou",zipOnly:"Only .zip files are supported for upload",fileSizeExceeded:"File size exceeds {{limit}}MB limit. Current file: {{size}}MB",systemPromptToggleTooltip:"Enable/disable this file in system prompt",memoryFileWarning:"MEMORY.md is typically queried on-demand by the agent using tools. Loading it into the system prompt may cause the context to become too long.",configUpdated:"System prompt Configuracao Atualizado",configUpdateFailed:"Falha ao Atualizar system prompt Configuracao",attribution:"Workspace design partly inspired by the OpenClaw project — thank you! 🐾",saveSuccess:"Salvo com sucesso",saveFailed:"Falha ao salvar"},d_=JSON.parse(`{"parent":"Configuracoes","agents":"Agentes","management":"Gerenciamento de Agentes","pageDescription":"Create, configure, and manage multiple AI agents with custom workspaces and identities.","name":"Nome","id":"ID","description":"Descricao","workspace":"Caminho do Workspace","backend":{"column":"Backend","eyebrow":"Arquitetura do agente","typeTitle":"Escolha como este agente funciona","typeDescription":"O tipo de agente controla todas as conversas no Chat, Coding e Channel.","nativeTitle":"Agente nativo do QwenPaw","nativeBadge":"Nativo","nativeDescription":"Usa o LLM, Skills, ferramentas, memória e runtime do QwenPaw configurados.","thirdPartyTitle":"Agente de terceiros","thirdPartyBadge":"Terceiros","thirdPartyDescription":"Usa um runtime de agente externo autorizado em vez de um modelo do QwenPaw.","providerTitle":"Escolha um agente de terceiros","providerDescription":"A autenticação é compartilhada neste dispositivo; projetos e conversas permanecem isolados por agente.","codexHint":"ChatGPT OAuth · Workspace do agente","qoderHint":"Conta Qoder ou PAT · Workspace do agente","account":"Conta do Codex","qoderAccount":"Conta do Qoder","binary":"Executável do Codex","binaryHelp":"Deixe em branco para priorizar o Codex CLI incluído no SDK Python e detectar uma instalação independente. Se preencher, informe o caminho completo para codex no macOS/Linux ou codex.exe no Windows. Binários internos do aplicativo ChatGPT ou de extensões do editor não são compatíveis. O QwenPaw também lê CODEX_BINARY e o PATH do backend.","binaryPlaceholder":"Detectar automaticamente ou colar o caminho do executável Codex","qoderBinary":"Executável do Qoder","qoderBinaryHelp":"Deixe em branco para usar o qodercli incluído no SDK Python ou detectar uma instalação existente. Se preencher, informe o caminho completo para qodercli no macOS/Linux ou qodercli.exe no Windows. O QwenPaw também lê QODERCLI_PATH e o PATH do backend.","qoderBinaryPlaceholder":"Detectar automaticamente ou colar o caminho do qodercli","detect":"Detectar","detectedBinary":"Codex detectado","qoderDetectedBinary":"Qoder detectado","apiKeyLoginHint":"Você também pode autenticar no terminal com: codex login --with-api-key","qoderAuthHint":"Conectar abre o login do Qoder no navegador. Você também pode executar qodercli login ou definir QODER_PERSONAL_ACCESS_TOKEN antes de iniciar o backend.","qoderConnect":"Conectar ao Qoder","model":"Modelo do agente","modelDefault":"Usar o padrão do agente","defaultBadge":"Padrão","reasoningEffort":"Nível de raciocínio","reasoningDefault":"Usar o padrão do modelo","codexNotFound":"O runtime do Codex não foi encontrado. Instale qwenpaw[codex] ou forneça um Codex CLI independente.","qoderNotFound":"O runtime do Qoder não foi encontrado. Instale qwenpaw[qoder] ou forneça o qodercli.","chatSettingsHint":"Escolha o modelo, o nível de raciocínio e as permissões de execução na barra de ferramentas do Chat.","capabilityTitle":"Recursos do QwenPaw","inheritedSkills":"Skills","inheritedMcp":"Servidores MCP","runtimeInherited":"Herdado em execução · novas sessões","notSupported":"Não compatível com este provedor","policyCompatibility":"Política MCP","toolAllowlistSupported":"Lista de ferramentas compatível","policyLimited":"Aplicam-se limites do provedor","chatModelHint":"C
181onfigurações por agente · aplicadas no próximo turno","appliesNextTurn":"Aplicado no próximo turno","approvalMode":"Permissões de execução","approvalPresets":{"ask":{"name":"Perguntar antes de alterar","description":"Permite alterações no workspace e solicita confirmação antes de ações elevadas."},"read-only":{"name":"Somente leitura","description":"Inspeciona arquivos sem alterá-los."},"workspace":{"name":"Acesso ao workspace","description":"Permite alterações no workspace sem confirmação."},"accept-edits":{"name":"Aceitar edições","description":"Permite edições de arquivos mantendo as demais proteções."},"plan":{"name":"Somente planejar","description":"Analisa e planeja sem alterar arquivos."},"auto":{"name":"Automático","description":"Deixa o Qoder decidir quais ações seguras podem ser executadas."},"full-access":{"name":"Acesso total","description":"Permite execução local irrestrita sem confirmação."}}},"create":"Criar Agente","createTitle":"Criar Novo Agente","createSuccess":"Agente Criado successfully","createFailed":"Falhou to Criar Agente","edit":"Editar","editTitle":"Editar Agente - {{name}}","updateSuccess":"Agente Atualizado successfully","updateFailed":"Falhou to Atualizar Agente","delete":"Excluir","deleteConfirm":"Confirmar Excluir Agente","deleteConfirmDesc":"Agent will be unavailable after deletion, but workspace files will be kept","deleteSuccess":"Agente deleted successfully","deleteFailed":"Falhou to Excluir Agente","selectAgent":"Selecionar Agente","defaultDisplayName":"Agente Padrao","currentWorkspace":"Agente Atual","switchSuccess":"Agente switched successfully","switchFailed":"Falhou to switch Agente","loadFailed":"Falha ao load Agente list","loadConfigFailed":"Falha ao load Agente Configuracao","saveFailed":"Falhou to Salvar Agente","idRequired":"Please enter Agente ID","idLabel":"Agente ID (optional)","idHelp":"Leave empty to auto-generate. Only letters, digits, hyphens and underscores allowed.","idPattern":"ID can only contain letters, numbers, underscores and hyphens","idPlaceholder":"e.g.: my-agent","nameRequired":"Please enter Agente Nome","namePlaceholder":"e.g.: My Agente","descriptionPlaceholder":"Briefly describe this agent's purpose...","workspaceHelp":"Leave empty to auto-generate in ~/.qwenpaw/workspaces/<id>","dragHandleTooltip":"Drag to reorder Agentes","reorderSuccess":"Agente order saved","reorderFailed":"Falha ao Salvar Agente order","defaultNotEditable":"Default agent cannot be edited","defaultNotDeletable":"Default agent cannot be deleted","disable":"Desativar","enable":"Ativar","disabled":"Desativado","disableConfirm":"Confirmar Desativar Agente","disableConfirmDesc":"The agent instance will not start after disabling, but will remain visible in the list","enableConfirm":"Confirmar Ativar Agente","enableConfirmDesc":"The agent will be available for switching after enabling","disableSuccess":"Agente Desativado successfully","enableSuccess":"Agente Ativado successfully","toggleFailed":"Falha ao toggle Agente state","enableAgent":"Ativar {{name}}","disableAgent":"Desativar {{name}}","disabledAgents":"Desativados ({{count}})","pinnedAgents":"Fixados","otherAgents":"Outros agentes","pinned":"Fixado","defaultPinned":"O agente padrão está sempre fixado","longPressToPin":"Pressione e segure para fixar","longPressToUnpin":"Pressione e segure para desafixar","pinAgent":"Fixar agente","unpinAgent":"Desafixar agente","pinSuccess":"Agente fixado","unpinSuccess":"Agente desafixado","pinFailed":"Falha ao atualizar o estado de fixação","status":{"disabled":"Desativado","pending":"Aguardando inicialização","starting":"Inicializando","running":"Em execução","failed":"Falha na inicialização","waitUntilStarted":"Disponível após concluir a inicialização"},"defaultNotDisablable":"Default agent cannot be disabled","currentAgentDeleted":"Current agent has been deleted, automatically switched to default agent","currentAgentDisabled":"Current agent has been disabled, automatically switched to default agent","switchedToDefault":"Automatically switched to default agent","cannotSwitchToDisabled":"This agent is disabled, please enable it in the management page first","initialSkills":"Initial Skills","initialSkillsHelp":"Select skills to add from the pool. You can add or remove skills later.","selectAll":"Todos","selectBuiltin":"Builtin","
181selectNone":"Nenhum","noPoolSkills":"No skills available in pool","addSkillsToAgent":"Adicionar Skills","model":"Modelo","modelHelp":"Assign a specific LLM model to this agent. Leave empty to use the global default.","modelPlaceholder":"Use global Padrao","noConfiguredModels":"Nao configured Modelos","modelColumn":"Modelo","copyTooltip":"Copiar configuracao do agente","copyDefaultTooltip":"Copiar usando o agente padrao como modelo","copyTitle":"Copiar Configuracao do Agente","copyNameLabel":"Nome do novo agente","copyOptionsLabel":"Conteudo a copiar","copyOptionAgentJson":"agent.json (obrigatorio)","copyOptionAgentJsonHint":"Sempre copia a configuracao de origem analisada e redefine ID, nome, workspace e channels. Nao e uma copia byte a byte do agent.json no disco.","copyOptionMdFiles":"AGENTS / SOUL / PROFILE / HEARTBEAT / BOOTSTRAP.md","copyOptionSkills":"skills/ + manifest","copyOptionJobs":"jobs.json","copyOptionJobsHint":"Copia apenas as definicoes de tarefas, sem historico. O novo agente as executara conforme o agendamento logo apos a criacao.","copySuccess":"Configuracao do agente copiada com sucesso","copyFailed":"Falha ao copiar a configuracao do agente","mailManagement":"Gerenciamento de Email","mailModeNone":"Sem gerenciamento de email","mailModePersonal":"Gerenciar sua caixa de email pessoal","mailModeDedicated":"Provisionar uma caixa de email dedicada","mailName":"Nome da caixa de email","mailNameOptional":"Nome da caixa de email (opcional)","mailDomain":"Dominio de email","mailPassword":"Senha","mailPhone":"Numero de telefone","mailAuthCode":"Codigo de autorizacao de 16 digitos","mailNameRequired":"Informe o nome da caixa de email","mailPasswordRequired":"Informe a senha","mailPhoneRequired":"Informe o numero de telefone","mailAuthCodeRequired":"Informe o codigo de autorizacao","mailAuthCodeLength":"O codigo de autorizacao deve ter 16 caracteres","mailDomainRequired":"Selecione um dominio de e-mail","mailDomainInvalid":"Insira um dominio de e-mail valido, ex.: mycompany.com","mailDomainPlaceholder":"Selecione ou insira um dominio de e-mail","mailProvider":"Provedor de e-mail","mailProviderRequired":"Selecione um provedor de e-mail","mailProviderPlaceholder":"Selecione o provedor que hospeda este dominio","mailProviderTencentExmail":"Tencent Exmail","mailProviderAliyunQiye":"Alibaba Enterprise Mail","mailProviderNeteaseQiye":"Netease Enterprise Mail","mailCredentialLabel":"Credencial","mailCredentialRequired":"Insira a credencial","mailCredentialHintAuthCode":"Insira o codigo de autorizacao de 16 digitos gerado nas configuracoes da caixa de e-mail","mailCredentialHintGmail":"Insira uma senha de app do Gmail (requer verificacao em duas etapas ativada)","mailCredentialHintAliyun":"Insira a senha de login da caixa de e-mail","mailCredentialHintEnterprise":"Insira a senha especifica do cliente ou a senha de login da caixa de e-mail","mailPushTitle":"Resposta automatica a novos e-mails","mailAccessControl":"Controle de acesso de e-mail","mailAccessControlTip":"Quando ativado, e-mails de remetentes desconhecidos precisam de aprovacao antes de serem processados","mailPushModeOff":"Desativado","mailPushModeRulesOnly":"Apenas regras","mailPushModeRulesThenAgent":"Regras + despertar sob demanda","mailPushModeAgentAll":"Despertar para cada e-mail","mailPushModeOffDesc":"Nao processar novos e-mails automaticamente","mailPushModeRulesOnlyDesc":"Processar novos e-mails apenas com as regras abaixo, sem despertar o agente","mailPushModeRulesThenAgentDesc":"Aplicar as regras primeiro; despertar o agente apenas quando uma acao de despertar corresponder","mailPushModeAgentAllDesc":"Despertar o agente para cada novo e-mail e deixar que ele decida como tratar de forma autonoma","mailPushModeLegacySuffix":" (legado)","mailPushFieldFrom":"Remetente","mailPushFieldSubject":"Assunto","mailPushFieldContent":"Conteudo","mailPushFieldKeyword":"Palavra-chave","mailPushActionMarkRead":"Marcar como lido","mailPushActionMove":"Mover para pasta","mailPushActionNotify":"Apenas notificar","mailPushActionWakeAgent":"Despertar agente","mailPushContainsPlaceholder":"Contem o texto","mailPushParamMovePlaceholder":"Pasta de destino","mailPushParamWakePlaceholder":"Instrucao adicional (opcional)","mailPushParamRequired":"Informe a pasta de destino","mailPushAddRule":"Adicionar regra","mailPushWakeOptionInvoice":"Baixar e arquivar anexos de emails de fatura/cobranca","mailPushWakeOptionReply":"Responder educadamente a emails de consulta","mailPushWakeOptionOtp":"Extrair o codigo de verificacao e me notificar","mailPushWakeOptionSummary":"Resumir os pontos do email na caixa de entrada"}`),c_={title:"Skills",description:"Manage agent skills and capabilities.",preload:"Pré-carregar",preloadHint:"Quando ativado, o agente pré-carrega esta Skill e não precisa procurá-la e carregá-la durante a conversa.",qwenpawManaged:"Gerenciado pelo QwenPaw",qwenpawManagedHint:"Editável e projetado em agentes de terceiros compatíveis durante a execução.",providerManaged:"Skills do agente de terceiros",providerManagedHint:"Descobertas no agente de terceiros atual e exibidas somente para leitura.",providerOnly:"Somente o agente de terceiros atual",readOnly:"Somente leitura",noDescription:"Nenhuma descrição disponível.",providerSkillDetails:"Detalhes da Skill do agente de terceiros",providerManagedDetailHint:"Esta Skill é gerenciada pelo agente de terceiros. O QwenPaw pode exibi-la e usá-la, mas não pode modificá-la.",provider:"Agente de terceiros",scope:"Escopo",statusLabel:"Status",descriptionLabel:"Descrição",importHub:"Enviar via URL",supportedSources:"Fontes suportadas:",importSkills:"Importar Skill",enterSkillUrl:"Enter Skill URL",supportedSkillUrlSources:"Supported Skill Marketplaces:",urlExamples:"URL examples:",urlValid:"Valid URL from {{source}}
181",invalidUrl:"Invalid URL",clickToFill:"Click to fill in URL",invalidSkillUrlSource:"Please verify the skill URL is from a supported marketplace",type:"Tipo",installedFrom:"Instalado de",source:"Origem",path:"Caminho",tags:"Tags",builtin:"Integrado",custom:"Personalizado",addSkill:"Adicionar Skill",createSkill:"Criar Skill",viewSkill:"Visualizar Skill",editSkill:"Editar Skill",skillName:"Skill Nome",skillContent:"Skill Conteudo",pleaseInputName:"Please input Skill Nome",pleaseInputContent:"Please input Skill Conteudo",skillNamePlaceholder:"e.g., weather_query",contentPlaceholder:`[Format]
182---
183name: skill_name (required, lowercase with underscores)
184description: Brief description (required)
185---
186
187Skill implementation (Markdown format)
188
189[Example]
190---
191name: weather_query
192description: Query weather info for a city
193---
194
195## Features
196Query real-time weather data.
197
198## Usage
199User inputs city name, returns weather info.`,createSuccess:"Skill Criado successfully",createFailed:"Falhou to Criar Skill",deleteConfirm:"Are you sure you want to delete this skill?",deleteSuccess:"Skill deleted successfully",deleteFailed:"Falhou to Excluir Skill",batchEnable:"Ativar",batchDisable:"Desativar",batchEnableSuccess:"{{count}} skills ativadas",batchEnablePartial:"{{enabled}} ativadas, {{failed}} falharam",batchEnableFailed:"Falha ao ativar em lote",batchDisableSuccess:"{{count}} skills desativadas",batchDisablePartial:"{{disabled}} desativadas, {{failed}} falharam",batchDisableFailed:"Falha ao desativar em lote",batchDeleteTitle:"Excluir {{count}} skills?",batchDeleteSuccess:"{{count}} Skills deleted",batchDeletePartial:"{{deleted}} deleted, {{failed}} Falhou",batchDeleteFailed:"Batch Excluir Falhou",selectedCount:"{{count}} Selecionado",updateSuccess:"Skill Atualizado successfully",updateFailed:"Falhou to Atualizar Skill",frontmatterRequired:"Skills must start and end with ---",frontmatterNameRequired:"Skills missing required field : name",frontmatterDescriptionRequired:"Skills missing required field : description",editNotSupported:"Falhou to Editar Skill",editNote:"Tip: You can edit skill content, channels, and config here.",create:"Criar",optimizeWithAI:"AI Optimize",stopOptimize:"Parar",optimizeSuccess:"Skill optimized successfully",optimizeFailed:"Falhou to optimize Skill",noContentToOptimize:"Nao Conteudo to optimize",cancelImport:"Cancelar Importar",importCancelled:"Skill Importar cancelled",importTimeout:"Skill import timed out. Please retry or check your network.",uploadSkill:"Enviar Skill",uploadZip:"Enviar via Zip",uploadSuccess:"Skill uploaded successfully",uploadFailed:"Skill Enviar Falhou",uploadNoChange:"No new skills were imported. They may already exist.",zipOnly:"Only .zip files are supported for upload",fileSizeExceeded:"File size exceeds {{limit}}MB limit. Current file: {{size}}MB",channels:"Canais",allChannels:"Todos",lastUpdated:"Atualizado",searchPlaceholder:"Filtrar by Nome",listView:"List Visualizar",gridView:"Grid Visualizar",refreshHint:"Atualizar Skills from disk",poolSync:"Sync Status",uploadedToPool:"Uploaded to Skill pool",downloadedToWorkspace:"Downloaded to Atual Workspace",builtinUpgradeTitle:"Upgrade Integrado Skill",builtinUpgradeContent:'A newer version of built-in skill "{{name}}" is available in the pool. Overwrite the current version?',languageSwitchTitle:"Switch Skill Idioma",languageSwitchContent:"The following skills have a different language version in the pool and will be overwritten:",overwriteExistingList:"The following skills already exist and will be overwritten:",nameConflict:"Name conflict detected. Suggested rename has been filled.",uploadToPoolHint:"Upload selected workspace skills to the shared local skill pool",downloadFromPool:"Carregar do Skill Pool",uploadToPool:"Sync to Skill Pool",selectWorkspaceSkill:"Selecionar Atual Workspace Skill",selectPoolItem:"Selecionar Skill pool item",renameOptional:"Rename (optional)",renamePlaceholder:"Suggested rename will appear here on conflict",renameSingleOnly:"Rename is available only when exactly one skill is selected.",selectAll:"Selecionar Todos",clearSelection:"Limpar",downloadSkillPool:"Baixar Skill Pool",uploadSkillPool:"Enviar Skill Pool",config:"Configuracao",configPlaceholder:'{"KEY": "value"}',configInvalidJson:"Invalid JSON Formato",configSaved:"Configuracao saved",emptyStateBadge:"Novo workspaces Iniciar empty",emptyStateTitle:"This agent does not have any skills yet",emptyStateText:"This is expected. New workspaces do not come with skills automatically. Download skills from the local pool or create one here to equip this agent.",emptyStateDownload:"Baixar from Skill Pool",emptyStateCreate:"Criar First Skill",loadFailed:"Falhou to load Skills",refreshFailed:"Falhou to Atualizar Skills",createdSuccessfully:"Criado successfully",saveFailed:"Falhou to Salvar",importFailed:"Importar Falhou",disabledSuccessfully:"Desativado successfully",enabledSuccessfully:"Ativado successfully",operationFailed:"Operation Falhou",provideUrl:"Please provide a hub skill URL",validUrl:"Please enter a valid URL starting with http:// or https://",importedSkill:"Imported skill: {{name}}",batchOperation:"Batch Operation",exitBatch:"Exit Batch",noSearchResults:"No skills found matching your search",filterByTag:"Filtrar by tag",noTags:"Na
199o Tags available",enabledSkills:"Skills Ativadas",disabledSkills:"Skills Desativadas",active:"ativas"},u_={description:"Shared local skill pool for built-in skills and workspace uploads. External hub imports such as ClawHub or LobeHub are separate.",broadcast:"Broadcast to Agentes",broadcastHint:"Broadcast skills to selected agents",refreshHint:"Refresh skill pool from disk",deleteExternalConfirm:"Exclui os arquivos da skill externa em {{path}} do disco.",deleteExternalBatchWarning:"As skills externas selecionadas serão excluídas permanentemente do disco.",broadcastTitle:"Broadcast {{name}}",automation:"Automação",builtinAutoUpdate:"Atualização automática",builtinAutoUpdateFlow:"Pacote integrado → Pool de skills",autoSyncFlow:"Pool de skills → Espaços de trabalho dos agentes",automationBoth:"Atualização + sincronização automáticas",automationMixedHint:"Abra os detalhes para escolher atualização automática ou sincronização automática.",automationEnableHint:"Ative a atualização e a sincronização automáticas.",automationDisableHint:"Desative a atualização e a sincronização automáticas.",automationEnabled:"Atualização e sincronização automáticas ativadas para {{name}}",automationDisabled:"Atualização e sincronização automáticas desativadas para {{name}}",automationFailed:"Falha ao atualizar as configurações de automação",automationNeedsAttention:"Configurações salvas. {{count}} item(ns) exigem atenção; veja a Caixa de entrada.",autoSync:"Sincronização automática",autoSyncEnableHint:"Ative a sincronização automática.",autoSyncDisableHint:"Desative a sincronização automática.",autoSyncEnabled:"Sincronização automática ativada para {{name}}",autoSyncDisabled:"Sincronização automática desativada para {{name}}",autoSyncAgentsPlaceholder:"Todos os agentes com esta skill",autoSyncAgentsHint:"Deixe em branco para sincronizar as cópias existentes ou selecione agentes específicos.",importBuiltin:"Atualizar Integrado Skills",importBuiltinHint:"Update built-in skills to the latest version",importBuiltinAlertHint:"{{count}} built-in changes need review",importBuiltinSuccess:"Built-ins imported: {{names}}",importBuiltinConflicts:"Skipped due to name conflicts: {{names}}",importBuiltinNoChanges:"No built-in changes to import",importBuiltinFailed:"Integrado Importar Falhou",importBuiltinConflictTitle:"Builtin conflicts detected",importBuiltinConflictContent:"The following built-ins differ from the current pool copy. Confirm to overwrite them from source.",sourceVersion:"Origem Versao",currentVersion:"Atual Versao",builtinLanguage:"Idioma",langDefault:"Padrao",langDefaultTooltip:"Keep each skill in its current language",langEn:"English",langZh:"Chinese",builtinLanguageChangeTitle:"Switch built-in language?",builtinLanguageChangeContent:'Overwrite the pool copy of "{{name}}" with the {{language}} built-in version?',builtinLanguageChangeSuccess:'"{{name}}" switched to {{language}}',builtinLanguageChangeFailed:"Falha ao switch built-in Idioma",importStatusMissing:"Missing in pool",importStatusCurrent:"Already Atual",importStatusOutdated:"Outdated",importStatusLanguageSwitchTo:"Overwrite with the {{language}} version",importStatusConflict:"Conflict",builtinNoticeSummary:"{{count}} built-in changes detected",builtinNoticeLineAdded:"Added: {{names}}",builtinNoticeLineMissing:"Missing: {{names}}",builtinNoticeLineUpdated:"Updated: {{names}}",builtinNoticeLineRemoved:"Removed: {{names}}",zipImport:"ZIP Importar",create:"Criar",edit:"Editar",delete:"Excluir",descriptionLabel:"Descricao",tags:"Tags",tagsPlaceholder:"Select or type to add tags",tagTooLong:"Tag must be at most {{max}} characters",filterByTag:"Filtrar by tag",version:"Versao",createTitle:"Criar Skill Pool Item",editTitle:"Editar {{name}}",skillNamePlaceholder:"Skill Nome",contentPlaceholder:"SKILL.md Conteudo",nameConflict:"Name conflict detected. Suggested rename applied.",deletedFromPool:"Deleted from Skill pool",deleteBuiltinConfirm:"This removes the built-in skill from the pool. You can import it again later from source.",deleteConfirm:"This removes the skill from the shared local skill pool.",deleteTitle:"Excluir {{name}}?",batchDeleteTitle:"Excluir {{count}} pool skills?",batchDeleteSuccess:"{{count}} pool Skills deleted",batchDeletePartial:"{{deleted}} deleted, {{failed}} Falhou",batchDeleteFailed:"Batch Excluir Falhou",zipImportFailed:"ZIP Importar Falhou",externalHubHint:"External hub import is separate from the local Skill Pool.",imported:"Imported: {{names}}",noNewImports:"Nao Novo Skills imported",allBuiltin:"Todos Integrado",selectWorkspaces:"Broadcast to workspace(s)",allWorkspaces:"Todos Workspaces",optionalRename:"Opcional rename",back:"Voltar",skillCount:"{{count}} Skills",skillName:"Skill Nome",status:"Status",installedFrom:"Instalado de",updateBuiltin:"Atualizar",updateConfirmTitle:"Atualizar {{name}}",updateConfirmContent:"Update to version {{version}}? This will replace the current pool copy with the latest built-in version.",updateSuccess:"Atualizado successfully",updateFailed:"Atualizar Falhou",broadcastSuccess:"Broadcast Concluido",broadcastFailed:"Broadcast Falhou",overwriteConfirm:"Overwrite existing skills?",overwriteTargetsContent:"The following existing targets will be overwritten:",builtinOverwriteTargetsContent:"The following built-in targets have different versions and will be overwritten:",renameAndRetry:"A skill with this name already exists. Use the suggested name?",multiConflictTitle:"Multiple Conflicts Detected",multiConflictDesc:"The following skills already exist. Please resolve conflicts individually and retry:",singleConflictRename:'"{{name}}" already exists. Rename to "{{suggested}}" to proceed?',statusUpToDate:"Up-to-date",statusSynced:"Synced",statusOutdated:"Outdated",statusNotSynced:"Not synced",statusConflict:"Conflict",renameEntry:'Novo Nome for "{{name}}":',builtin:"Integrado",custom:"Personalizado"},p_={title:"MCP Clients",qwenpawManaged:"Gerenciado pelo QwenPaw",qwenpawManagedHint:"A configuração compartilhada do painel é injetada nos Agents de terceiros compatíveis durante a execução.",providerManaged:"MCP local do {{provider}}",providerManagedHint:"Detectado na configuração do agente de terceiros; é somente leitura e exclusivo desse agente.",providerOnly:"Somente o agente de terceiros",readOnly:"Somente leitura",create:"Criar Client",formatSupport:"Supported formats",standardFormat:"Padrao (mcpServers wrapper)",directFormat:"Direct (key → config object)",singleFormat:"Single client (flat fields)",emptyState:"No MCP clients configured yet",loadError:"Falha ao load MCP clients",createSuccess:"MCP client Criado successfully",createError:"Falha ao Criar MCP client",updateSuccess:"MCP client Atualizado successfully",updateError:"Falha ao Atualizar MCP client",enableSuccess:"MCP client Ativado successfully",disableSuccess:"MCP client Desativado successfully",toggleError:"Falha ao toggle MCP client Status",deleteConfirm:"Are you sure you want to delete this MCP client?",deleteSuccess:"MCP client deleted successfully",deleteError:"Falha ao Excluir MCP client",maskedFieldHint:"Sensitive fields are masked with ***. In-place edits on masked values are not supported — replace with the full new value to modify.",tools:"Ferramentas e Permissões",noTools:"No tools available from this MCP server",toolsLoadError:"Failed to load tools from MCP server",toolsConnecting:"MCP server is still connecting, please try again in a moment",toolSchema:"Input Schema",access:{title:"Acesso",button:"Acesso",summary:"Política de acesso MCP",clientSection:"Acesso geral",toolSection:"Acesso à ferramenta",default:"Padrão",sourceType:"Origem",sourceValue:"Valor da origem",sourceValueAllChannels:"Todos os canais",subjectType:"Objeto",subjectValue:"Valor do objeto",effectLabel:"Política",source:{channel:"Canal"},subjectTypeOption:{all:"Todos",user:"Usuário"},sourceValuePlaceholder:{channel:"console / dingtalk"},subjectValuePlaceholder:"ex.: alice",subjectValuePlaceholderSelectedSource:"ID de usuário na origem selecionada",subjectValuePlaceholderScoped:"ID de usuário de {{source}}",subjectValueAll:"Todos",recentUserPlaceholder:"O ID de usuário é limitado à origem selecionada; digite ou selecione novamente",noRecentUsers:"Nenhum usuário recente para esta origem; digite um ID manualmente",ambiguousUserSourceWarning:"IDs de usuário são únicos apenas dentro da origem. Selecione um canal específico para evitar correspondência entre canais.",unknownUserValueWarning:"Este ID de usuário não está nos usuários ativos recentes. Ainda é possível salvar.",validation:{missingUserValue:"Selecione uma origem específica e informe um ID de usuário válido.",ambiguousUserSource:"Regras de usuário devem mirar um canal específico, não todos os canais.",unknownUserValue:"Este ID de usuário não está nos usuários ativos recentes. Ainda é possível salvar."},addRule:"Adicionar regra",deleteRule:"Excluir regra",noClientRules:"Nenhuma regra",noRules:"Nenhuma regra, usa a política padrão",inherit:"Herdar ({{effect}})",stale:"Não encontrado",disabledTools:"Este cliente MCP está desativado; as regras de acesso salvas ainda podem ser editadas.",discardTitle:"Descartar alterações não salvas?",discardContent:"As alterações não salvas da política de acesso serão perdidas.",loadError:"Falha ao carregar política de acesso MCP",saveSuccess:"Política de acesso MCP salva",saveError:"Falha ao salvar política de acesso MCP",unmanagedRules:"{{count}} regra(s) avançada(s)",effect:{allow:"Permitir",ask:"Perguntar",deny:"Negar"}},tab:{json:"Importação JSON",form:"Modo formulário"},form:{key:"Chave do cliente",keyPlaceholder:"my-mcp-server",keyRequired:"A chave do cliente é obrigatória",name:"Nome de exibição",namePlaceholder:"My MCP Server",n
199ameRequired:"O nome de exibição é obrigatório",transport:"Transporte",url:"URL do servidor",urlRequired:"A URL é obrigatória para servidores MCP remotos",command:"Comando",commandRequired:"O comando é obrigatório para transporte stdio",args:"Argumentos (separados por espaço ou nova linha)",description:"Descrição",descriptionPlaceholder:"Descrição opcional",env:"Variáveis de ambiente",envPlaceholder:"KEY=VALUE (uma por linha)"},oauth:{enableOAuth:"Usar autorização OAuth",manage:"OAuth",authorized:"Autorizado",notAuthorized:"Não autorizado",expired:"Token expirado",failed:"Falha na autorização",waiting:"Aguardando autorização...",authorize:"Autorizar",reauthorize:"Reautorizar",revoke:"Revogar",startFailed:"Falha ao iniciar fluxo OAuth",authFailed:"Falha na autorização OAuth",popupBlocked:"O popup foi bloqueado pelo navegador. Permita popups e tente novamente.",windowClosed:"Janela de autorização fechada. Tente novamente.",noUrl:"Insira a URL do servidor primeiro",noClientKey:"Crie o cliente primeiro",showAdvanced:"Opções avançadas",hideAdvanced:"Ocultar opções avançadas",clientId:"Client ID (opcional)",clientIdPlaceholder:"Deixe em branco para usar registro dinâmico",scope:"Scope (opcional)",scopePlaceholder:"openid profile email",authEndpoint:"Authorization Endpoint (substituir)",tokenEndpoint:"Token Endpoint (substituir)",endpointHint:"Deixe em branco para descoberta automática do servidor MCP."}},m_={title:"Batimento",description:"Execute HEARTBEAT.md em intervalo fixo para autoverificações. Por padrão roda em silêncio sem afetar conversas atuais; opcionalmente envie respostas ao último canal de chat.",enabled:"Ativar heartbeat",every:"Intervalo",everyRequired:"Obrigatório",everyMin:"Deve ser no mínimo 1",timeoutSeconds:"Tempo limite de execução (segundos)",timeoutRequired:"Obrigatório",timeoutMin:"Deve ser no mínimo 1",timeoutMax:"Deve ser no máximo 3600",unitMinutes:"Minutos",unitHours:"Horas",target:"Destino da resposta",targetMain:"Modo silencioso (padrão, sem saída no canal)",targetLast:"Enviar para o último canal de chat",activeHours:"Horário ativo (opcional)",activeStart:"Hora de início",activeEnd:"Hora de término",loadFailed:"Falha ao carregar configuração do heartbeat",saveSuccess:"Salvo com sucesso; heartbeat recarregado em tempo real",saveFailed:"Falha ao salvar configuração do heartbeat",targetInbox:"Enviar para o Inbox",runNow:"Executar agora",runNowSuccess:"Heartbeat disparado. Verifique o Inbox ou o canal de destino em instantes.",runNowFailed:"Falha ao disparar execução do heartbeat"},h_=JSON.parse(`{"title":"Tarefas Cron","description":"Crie e gerencie tarefas agendadas executadas automaticamente nos horários definidos.","createJob":"Criar job","editJob":"Editar job","confirmDelete":"Confirmar exclusão","deleteConfirm":"Tem certeza de que deseja excluir este Cron Job?","okText":"OK","cancelText":"Cancelar","deleteText":"Excluir","id":"ID do job","name":"Nome do job","enabled":"Estado","scheduleType":"Tipo de agendamento","scheduleCron":"Agendamento (Cron)","scheduleCronLabel":"Agendamento (Cron)","scheduleTimezone":"Fuso horário","cronType":"Frequência","cronTypeHourly":"A cada hora","cronTypeDaily":"Diário","cronTypeWeekly":"Semanal","cronTypeCustom":"Personalizado","cronTime":"Horário","cronDaysOfWeek":"Dias da semana","cronDayMon":"Segunda-feira","cronDayTue":"Terça-feira","cronDayWed":"Quarta-feira","cronDayThu":"Quinta-feira","cronDayFri":"Sexta-feira","cronDaySat":"Sábado","cronDaySun":"Domingo","cronCustomExpression":"Expressão Cron","taskText":"Conteúdo da mensagem","action":"Ação","disable":"Desativar","executeNow":"Executar agora","edit":"Editar","delete":"Excluir","totalItems":"Total de {{count}} itens","perPage":"/ página","pleaseInputId":"Informe o ID do job","pleaseInputName":"Informe o nome do job","pleaseInputCron":"Informe a expressão cron","pleaseSelectTaskType":"Selecione o tipo de tarefa","pleaseInputRequest":"Informe o conteúdo da requisição","pleaseInputMessageContent":"Informe o conteúdo da mensagem","pleaseInputChannel":"Informe o canal de destino","pleaseInputUserId":"Informe o ID do usuário de destino","pleaseInputSessionId":"Informe o ID da sessão de destino","jobIdPlaceholder":"ex.: daily-report-job","jobNamePlaceholder":"ex.: Relatório matinal diário","selectTimezone":"Selecionar fuso horário","taskDescriptionPlaceholder":"Para tarefas de texto simples, digite o corpo da mensagem a enviar...","invali
199dJsonFormat":"Formato JSON inválido","jsonFormatRequired":"Formato JSON obrigatório","taskType":"Tipo de tarefa","text":"Conteúdo da mensagem","requestInput":"Conteúdo da requisição","requestSessionId":"ID da sessão da requisição","requestUserId":"ID do usuário da requisição","dispatchChannel":"Canal de destino","dispatchTargetUserId":"ID do usuário de destino","dispatchTargetSessionId":"ID da sessão de destino","dispatchMode":"Modo de entrega","silentDelivery":"Entrega silenciosa","runtimeMaxConcurrency":"Concorrência máxima","runtimeTimeoutSeconds":"Tempo limite (segundos)","runtimeMisfireGraceSeconds":"Tolerância de execução perdida (segundos)","runtimeToolSafety":"Verificação de aprovação de ferramentas","idTooltip":"Gerado pelo sistema, não editável: UUID único atribuído na criação da tarefa.","nameTooltip":"Um nome amigável para identificar este job.","cronTooltip":"Define quando a tarefa deve ser executada","cronExample":"Exemplos comuns: '0 9 * * *' = 9h diariamente | '*/30 * * * *' = a cada 30 min | '0 */2 * * *' = a cada 2 horas | '0 0 * * 0' = meia-noite de domingo","cronHelper":"Novo em expressões Cron?","cronHelperLink":"Usar gerador online","timezoneTooltip":"Fuso horário do agendamento cron. Padrão: UTC","taskTypeTooltip":"Escolha 'text' para mensagens simples ou 'agent' para fluxos complexos com agente.","textTooltip":"Tarefa de mensagem simples: este é o corpo da mensagem. Obrigatório quando o tipo é 'text'.","requestInputTooltip":"Conteúdo da mensagem em JSON. É o que o agente receberá e processará. Obrigatório quando o tipo é 'agent'.","requestInputExample":"Formato: [{\\"role\\":\\"user\\",\\"content\\":[{\\"type\\":\\"text\\",\\"text\\":\\"Sua mensagem aqui\\"}]}]","requestSessionIdTooltip":"ID da sessão para o contexto da requisição. Use 'default' se não tiver certeza.","requestUserIdTooltip":"ID do usuário que inicia a requisição. Use 'system' para tarefas automatizadas.","dispatchChannelTooltip":"Canal de destino onde a resposta será enviada (ex.: 'console', 'discord', 'imessage').","dispatchTargetUserIdTooltip":"ID do usuário que receberá a resposta no canal de destino.","dispatchTargetSessionIdTooltip":"ID da sessão em que a resposta será entregue no canal de destino.","dispatchModeTooltip":"Escolha 'stream' para respostas em tempo real ou 'final' apenas para respostas completas.","silentDeliveryTooltip":"Executa a tarefa do agente e mantém a sessão e o rastreamento, mas não envia o resultado ao canal.","maxConcurrencyTooltip":"Número máximo de execuções simultâneas deste job. Padrão: 1","timeoutSecondsTooltip":"Tempo máximo de execução em segundos. O job será encerrado se ultrapassar.","misfireGraceSecondsTooltip":"Período de tolerância para execuções perdidas. Se o job atrasar mais que isso em relação ao horário agendado, não será executado.","toolSafetyTooltip":"Quando ativado, chamadas de ferramentas de risco requerem aprovação do usuário (pode bloquear jobs cron sem supervisão). Quando desativado, as chamadas não pedem aprovação; as regras do File Guard continuam válidas. Padrão: desativado","executeNowTitle":"Executar tarefa agora","executeNowContent":"Deseja executar \\"{{name}}\\" agora?","executeNowConfirm":"Executar agora","createFromTemplate":"Criar a partir de modelo","templateModalTitle":"Escolha um modelo de tarefa","templateModalDescription":"Escolha um modelo integrado e ajuste os principais parâmetros no painel antes de salvar.","useTemplate":"Usar modelo","templateTagPersonal":"Pessoal","templateTagTeam":"Equipe","templateTagReminder":"Lembrete","templateTagCalendar":"Calendário","templateTagCalendarRecommended":"Recomendado no calendário","saveResultToInbox":"Salvar resultado no Inbox","saveResultToInboxTooltip":"Quando ativado, execuções com entrega bem-sucedida ficam no Inbox. Falhas de entrega sempre são gravadas no Inbox como contingência.","scheduleFilterAll":"Todos os tipos de agendamento","scheduleTypeRecurring":"Recorrente","scheduleTypeOnce":"Agendada","onceRunAt":"Executar em","repeatEnabled":"Repetir","repeatEnabledTooltip":"Ativa agendamento recorrente a partir deste horário inicial","repeatFrequency":"Frequência de repetição","repeatEveryDays":"Repetir a cada (dias)","repeatEveryPrefix":"A cada","repeatEverySuffix":"dia(s)","repeatEndType":"Fim da repetição","repeatEndNever":"Nunca","repeatEndUntil":"Encerrar em data","repeatEndCount":"Contagem limitada","repeatUntil":"Data final","repeatCount":"Número de execuções","pleaseSelectScheduleType":"Selecione o tipo de agendamento","pleaseInputRunAt":"Selecione o horário de execução","pleaseInputRepeatEveryDays":"Informe o intervalo de repetição (dias)","pleaseSelectRepeatEndType":"Selecione a condição de término","pleaseInputRepeatUntil":"Selecione a data final","pleaseInputRepeatCount":"Informe o número de execuções","validation":{"cronRequired":"A expressão cron é obrigatória para agendamentos recorrentes.","runAtRequired":"O horário de execução é obrigatório para agendamentos únicos.","repeatUntilRequired":"Ao usar \\"Encerrar em data\\", selecione a data final.","repeatCountRequired":"Ao usar \\"Contagem limitada\\", informe o número de execuções.","repeatUntilAfterRunAt":"A data final deve ser posterior ao horário de execução. Escolha uma data final após o horário de execução.","textRequired":"O conteúdo da mensagem é obrigatório quando o tipo da tarefa é text.","requestRequired":"O conteúdo da requisição é obrigatório quando o tipo da tarefa é agent.","invali
199dCronExpression":"Expressão cron inválida. Use o formato cron de 5 campos."},"runtimeShareSession":"Compartilhar sessão","shareSessionTooltip":"Quando ativado, compartilha a sessão com o usuário de destino. Quando desativado, cada execução cria contexto isolado com ID de execução único. Adequado para tarefas independentes sem memória. Padrão: ativado","listView":"Lista","calendarView":"Calendário","calendarEmptyHint":"Ainda não há jobs agendados. Crie jobs agendados para vê-los no calendário.","calendarMoreItems":"+{{count}} a mais","calendarDayListTitle":"Jobs agendados em {{date}}","executionHistory":"Histórico","historyTitle":"Histórico — {{name}}","historyEmpty":"Ainda não há registros de execução.","historyStatusSuccess":"Sucesso","historyStatusFailed":"Falhou","historyStatusRunning":"Em execução","historyStatusCancelled":"Cancelado","historyTriggerScheduled":"Disparado pelo agendamento","historyTriggerManual":"Disparado manualmente","historyExpand":"Expandir","historyCollapse":"Recolher","templates":{"dailyTechNewsBrief":{"title":"Resumo diário de notícias de tecnologia","description":"Às 09:30 em dias úteis, compila manchetes em alta em um breve resumo.","frequency":"Dias úteis 09:30 (30 9 * * 1-5)"},"dailyEveningReflection":{"title":"Reflexão vespertina diária","description":"Às 20:00 em dias úteis, sugere uma reflexão rápida sobre o trabalho do dia.","frequency":"Dias úteis 20:00 (0 20 * * 1-5)"},"weekendRelaxationReminder":{"title":"Lembrete de descanso no fim de semana","description":"Nas manhãs de fim de semana, envia sugestões de filmes em alta para um descanso mais leve.","frequency":"Fins de semana 10:00 (0 10 * * 6,0)"},"pomodoroBreakReminder":{"title":"Lembrete de pausa Pomodoro","description":"No horário comercial, lembre a cada 25 minutos de se hidratar ou descansar os olhos.","frequency":"Dias úteis 09:00–17:59 a cada 25 min (*/25 9-17 * * 1-5)"},"petCareReminder":{"title":"Lembrete de vermifugação/vacina do pet","description":"No dia 15 de cada mês à noite, lembre sobre vermifugação ou retorno de vacina do pet.","frequency":"Mensalmente no dia 15 às 20:00 (0 20 15 * *)"},"onceTextBirthdayReminder":{"title":"Lembrete de aniversário","description":"Lembrar que xx faz aniversário em 1º de janeiro.","frequency":"Execução: 2026-01-01 09:00"},"onceAgentBusinessTripPrep":{"title":"Preparação para viagem de trabalho","description":"Consultar o clima do destino e sugerir preparativos para a viagem.","frequency":"Execução: 2026-01-01 20:00"},"repeatCountTextMedicineReminder":{"title":"Lembrete de medicação (14 vezes)","description":"Lembrar de tomar o remédio no horário por um ciclo de 14 execuções.","frequency":"Primeira execução: 2026-01-01 09:00 | A cada 1 dia | 14 execuções"},"repeatCountAgentDietPlan":{"title":"Plano alimentar de 14 dias","description":"Gerar e enviar sugestões diárias de alimentação por 14 dias.","frequency":"Primeira execução: 2026-01-01 08:00 | A cada 1 dia | 14 execuções"},"repeatUntilTextWeeklyMeeting":{"title":"Lembrete de reunião semanal (2 meses)","description":"Enviar lembrete semanal da reunião até a data limite configurada.","frequency":"Primeira execução: 2026-01-02 08:45 | A cada 7 dias | Até 2026-03-01"},"repeatUntilAgentWeeklySummary":{"title":"Resumo semanal antes da reunião","description":"Antes de cada reunião semanal, gerar um resumo de trabalho com base na memory da última semana.","frequency":"Primeira execução: 2026-01-02 08:30 | A cada 7 dias | Até 2026-03-01"}}}`),g_=JSON.parse(`{"title":"Canais","description":"Manage and configure message channels","loading":"Carregando channels...","configSaved":"Configuracao saved successfully","configFailed":"Falhou to Salvar Configuracao","botConflictTitle":"Bot já está em uso","botConflictDescription":"Este Bot já está sendo usado por {{agents}} no mesmo canal. Salvar mesmo assim pode causar conflitos de mensagens.","botConflictConfirm":"Salvar mesmo assim","channelType":"Channel Tipo","status":"Status","totalItems":"Total {{count}} items","botPrefix":"Bot Prefix","showToolCalls":"Mostrar Informações de Chamada de Ferramenta","showToolCallsTooltip":"Mostrar informações de chamada de ferramenta aos usuários (desative para ocultar)","showToolResults":"Mostrar Informações do Resultado da Ferramenta","showToolResultsTooltip":"Mostrar informações do resultado da ferramenta aos usuários (desative para ocultar)","toolCallMaxLength":"Comprimento Máximo de Exibição da Chamada de Ferramenta","toolResultMaxLength":"Comprimento Máximo de Exibição do Resultado da Ferramenta","toolMaxLengthTooltip":"Defina como 0 para não limitar o comprimento","onebotMediaBase64":"Enviar mídia local como Base64","onebotMediaBase64Tooltip":"Escolha como os arquivos de mídia são enviados. Quando desativado, o caminho do arquivo é enviado; quando ativado, o arquivo é codificado em Base64. URLs remotas permanecem inalteradas.","onebotMediaBase64MaxMb":"Limite de tamanho do arquivo Base64","onebotMediaBase64MaxMbTooltip":"Arquivos de mídia acima deste limite são enviados usando o caminho original do arquivo.","onebotMediaBase64MaxMbRequired":"Informe o limite de tamanho do arquivo Base64","onebotMediaBase64MaxMbMin":"O limite de tamanho do arquivo Base64 deve ser de pelo menos 1 MB","onebotMediaDir":"Diretório de mídia","onebotMediaDirTooltip":"Diretório usado para armazenar a mídia baixada. Por padrão, usa o diretório media no workspace do agente.","onebotMediaDownloadMaxMb":"Limite de tamanho da mídia recebida","onebotMediaDownloadMaxMbTooltip":"Tamanho máximo de cada imagem, áudio, vídeo ou arquivo baixado do OneBot.","onebotMediaDownloadMaxMbRequired":"Informe o limite de tamanho da mídia recebida","onebotMediaDownloadMaxMbMin":"O limite de tamanho da mídia recebida deve ser de pelo menos 1 MB","onebotWsHostTooltip":"Endereço de escuta do servidor WebSocket reverso. Mantenha 127.0.0.1 para que apenas clientes OneBot nesta máquina possam conectar. Qualquer outro endereço expõe a porta à rede e exige um token de acesso.","onebotAccessTokenTooltip":"Token compartilhado que o cliente OneBot envia no cabeçalho Authorization. Obrigatório quando o endereço de escuta não é um endereço de loopback.","onebotAccessTokenRequired":"Um token de acesso é obrigatório quando o host do WebSocket não é um endereço de loopback","showThinking":"Mostrar Thinking","showThinkingTooltip":"Show model thinking/reasoning content to users (turn off to hide)","noTextDebounce":"Debounce sem texto","noTextDebounceTooltip":"Quando ativado, mensagens apenas com mídia (imagem/vídeo/arquivo) são armazenadas em buffer até que uma mensagem de texto chegue, depois mescladas. Desative para processar todas as mensagens imediatamente. Mensagens de voz são sempre processadas imediatamente.","streamingEnabled":"Saída em Streaming","streamingEnabledDingtalkHint":"Apenas efetivo quando o tipo de mensagem é Card","streamingEnabledFeishuHint":"Requer habilitar a permissão cardkit:card:write na página de gerenciamento de permissões da Plataforma Aberta Feishu","ackMessage":"Acknowledgment Message","ackMessageTooltip":"Send an instant reply when a message is received, before agent processing begins. Leave empty to disable.","ackMessagePlaceholder":"⏳ Processing...","notSet":"Nao definido","clickCardToEdit":"Click card to Editar","settings":"Configuracoes","channelSettings":"Channel Configuracoes","pleaseInputDbPath":"Please input DB Caminho","pleaseInputPollInterval":"Please input poll interval","discordBotToken":"Discord bot token","acceptBotMessages":"Accept Bot Messages","acceptBotMessagesTooltip":"When enabled, messages from other bots will be accepted","httpProxyPlaceholder":"http://127.0.0.1:18118","httpProxyAuthPlaceholder":"user:password","dbPathPlaceholder":"~/Library/Messages/chat.db","botPrefixPlaceholder":"@bot","dmPolicy":"DM Policy","dmPolicyTooltip":"Control who can interact with the bot via direct message. Open: everyone; Allowlist: authorized users only","groupPolicy":"Group Policy","groupPolicyTooltip":"Control who can interact with the bot in group chats. Open: everyone; Allowlist: authorized users only","requireMention":"Require @Mention","requireMentionTooltip":"When enabled, bot only responds in group chats when explicitly @mentioned","policyOpen":"Abrir","policyAllowlist":"Allowlist","allowFrom":"Allowlist Users","allowFromTooltip":"List of user IDs allowed to interact with the bot. Enable allowlist first, then DM the bot to see your ID in the deny message","allowFromPlaceholder":"Enter user ID and press Enter to add","denyMessage":"Access Denied Message","denyMessageTooltip":"Custom message shown to users when access is denied","twilioAccountSid":"Twilio Account SID","twilioAuthToken":"Twilio Auth Token","phoneNumber":"Phone Number","phoneNumberSid":"Phone Number SID","phoneNumberSidHelp":"Found under Phone Numbers → Active Numbers in the Twilio Console.","ttsProvider":"TTS Provedor","ttsVoice":"TTS Voice","sttProvider":"STT Provedor","language":"Idioma","welcomeGreeting":"Welcome Greeting","
199welcomeText":"Welcome Message","welcomeTextTooltip":"Message automatically sent when a user enters a single chat session with the bot for the first time that day","welcomeTextPlaceholder":"e.g. Hello! I'm QwenPaw. How can I help you?","loginWeCom":"Get WeCom QR Code","wecomSetupGuide":"When creating a bot via QR code, please select \\"Skip Authorization\\" when asked to authorize bot capabilities. If you select \\"Confirm Authorization\\", users other than the bot creator may not be able to interact with the bot.","wecomScanAuth":"Scan to Authorize","wecomAuthHint":"Scan the QR code above with WeCom to authorize. Bot ID and Secret will be filled in automatically.","wecomAuthSuccess":"WeCom bot authorized. Bot ID and Secret have been filled in.","wecomQrcodeFailed":"Failed to get WeCom QR code. Please try again.","slackBotToken":"Bot Token","slackBotTokenTooltip":"Slack Bot User OAuth Token, começa com xoxb-","slackAppToken":"App Token","slackAppTokenTooltip":"Slack App-Level Token para Socket Mode, começa com xapp-","slackProxyTooltip":"URL de proxy HTTP para conectar à API do Slack","dingtalkSetupGuide":"Scan the QR code with DingTalk to create a bot instantly. A DingTalk app will be created automatically and Client ID / Client Secret will be filled in.","dingtalkScanAuth":"Scan to Criar Bot","dingtalkGetQrcode":"Get DingTalk QR Code","dingtalkScanHint":"Scan the QR code above with DingTalk. Client ID and Client Secret will be filled in automatically after authorization.","dingtalkAuthSuccess":"DingTalk bot created. Client ID and Client Secret have been filled in.","dingtalkQrcodeFailed":"Failed to get DingTalk QR code. Please try again.","dingtalkQrcodeExpired":"QR code expired, please get a new one.","qqSetupGuide":"Use o QQ para escanear o código QR e autorizar o bot. Após escanear o código, o APP ID e o Client Secret serão obtidos automaticamente e preenchidos.","qqScanAuth":"Escanear o código QR para autorizar o bot","qqGetQrcode":"Obter o código QR do QQ","qqScanHint":"Use o QQ para escanear o código QR acima. Após concluir a autorização, o APP ID e o Client Secret serão preenchidos automaticamente.","qqAuthSuccess":"A autorização do bot do QQ foi bem-sucedida. O APP ID e o Client Secret já foram preenchidos automaticamente.","qqQrcodeFailed":"Falha ao obter o código QR do QQ. Tente novamente mais tarde","qqQrcodeExpired":"O código QR expirou. Obtenha-o novamente","atSenderOnReply":"@ Sender Ligado Reply","atSenderOnReplyTooltip":"When enabled, the bot will @mention the sender in its first reply message in group chats. Note: In card mode, @mention only works for enterprise internal members.","dingtalkEndpoint":"API Endpoint","dingtalkEndpointTooltip":"Endpoint de API personalizado para implantações privadas do DingTalk. Deixe em branco para usar o padrão oficial.","cardAutoLayout":"Cartão em tela ampla (layout automático)","cardAutoLayoutTooltip":"Quando ativado, o DingTalk renderiza cartões de IA em tela ampla no desktop. Aplica-se apenas quando o tipo de mensagem é card. O modelo do cartão deve estar publicado.","wecomCancelled":"Autorizacao cancelled","wecomAuthFailed":"Autorizacao failed: {{msg}}","voiceSetupGuide":"Set up a Twilio account, purchase a phone number, then enter your credentials below. Find your Account SID and Auth Token on the Twilio Console dashboard. The Phone Number SID is listed under Phone Numbers → Active Numbers.","voiceSetupLink":"Abrir Twilio Console","sipSetupGuide":"Configure a SIP registrar (e.g. Asterisk, FreeSWITCH) and enter your SIP credentials below. In Dev mode, pyVoIP handles SIP/RTP locally. In Production mode, LiveKit SIP Server is used.","sipMode":"SIP Modo","sipModeTooltip":"Dev: pure-Python pyVoIP for local testing. Production: LiveKit SIP Server for high concurrency.","sipServer":"SIP Server","sipServerPlaceholder":"Leave empty to use built-in registrar","sipServerPlaceholderLivekit":"Not needed for LiveKit mode","sipUsername":"SIP Username","sipPassword":"SIP Password","sipPort":"SIP Port","sipTransport":"Transport","sipDashscopeApiKey":"DashScope API Chave","sipDashscopeApiKeyTooltip":"API key for Aliyun DashScope STT/TTS. If empty, falls back to the DASHSCOPE_API_KEY environment variable.","livekitUrl":"LiveKit URL","livekitApiKey":"LiveKit API Chave","livekitApiSecret":"LiveKit API Secret","livekitSipTrunkId":"LiveKit SIP Trunk ID","livekitRoomName":"LiveKit Room Nome","livekitRoomNameTooltip":"The LiveKit room name to join and wait for SIP calls. Must match the room name in your SIP Dispatch Rule.","xiaoyiSetupGuide":"Please create an agent on Huawei Developer Platform and get AK/SK and Agent ID. AK/SK can be found in the credential management page.","filterAll":"Todos","builtin":"Integrado","custom"
199:"Personalizado","feishuRegion":"Region","feishuRegionTooltip":"Choose Feishu for China or Lark for International","feishuChina":"Feishu (China)","feishuInternational":"Lark (International)","feishuScanGuide":"Scan the QR code with Feishu to create a bot instantly. A Feishu app will be created automatically and App ID / App Secret will be filled in.","feishuScanLogin":"Scan to Criar Bot","feishuGetQrcode":"Get Feishu QR Code","feishuScanHint":"Scan the QR code above with Feishu. App ID and App Secret will be filled in automatically after authorization.","feishuAuthSuccess":"Feishu bot created. App ID and App Secret have been filled in.","feishuQrcodeExpired":"QR code expired, please get a new one.","feishuQrcodeFailed":"Failed to get Feishu QR code. Please try again.","wechatSetupGuide":"WeChat personal account Bot (iLink protocol). On first start without a Bot Token, a QR code login URL will be printed; scan to authorize. The token is saved locally for future use.","wechatContextTokenLimit":"WeChat iLink platform limitation: each user message's context_token allows a maximum of 10 reply messages. This is a hard limit enforced by the platform. It is recommended to disable thinking and tool output, or enable Message Merge to avoid exceeding the limit and causing message send failures.","wechatBotToken":"Bot Token","wechatBotTokenTooltip":"Bearer token obtained after QR code login. Leave empty to trigger QR code login on startup.","wechatBotTokenPlaceholder":"Auto-filled after QR login, or paste manually","wechatBotTokenFile":"Token File Caminho","wechatBotTokenFileTooltip":"Path to persist the bot token. Defaults to ~/.qwenpaw/wechat_bot_token","wechatMediaDir":"Media Directory","wechatMessageMerge":"Message Merge","wechatMessageMergeTooltip":"Merge multiple reply messages into fewer messages to avoid hitting the WeChat 10-message limit per context_token. When enabled with delay 0, all text replies are merged into a single message sent at the end. A positive delay (in ms) merges adjacent messages within that time window.","wechatMessageMergeDelayMs":"Merge Delay (ms)","wechatMessageMergeDelayMsTooltip":"Time window for adjacent message merging. Set to 0 to merge all messages into one final reply. A positive value (e.g. 1000) will buffer messages for that duration before sending.","wechatMessageMergeDelayMsValidation":"Digite a valid non-negative integer","wechatScanLogin":"Scan to Login","wechatGetQrcode":"Get Login QR Code","wechatScanHint":"Scan the QR code with WeChat, then click Save","wechatQrcodeFailed":"Failed to fetch QR code, please try again","wechatLoginSuccess":"WeChat login successful, token has been filled in","wechatQrcodeExpired":"QR code expired, please get a new one","shareSessionInGroup":"Compartilhar Contexto em Grupo","shareSessionInGroupTooltip":"Quando ativado, todos os membros do grupo compartilham o mesmo contexto de conversa. Quando desativado, cada membro tem seu próprio contexto independente.","accessControlEnabled":"Controle de Acesso","accessControlEnabledTooltip":"Quando ativado, apenas usuários na lista branca podem interagir com o bot. Usuários desconhecidos receberão seu ID e serão adicionados à lista de aprovação pendente.","accessControlDm":"Controle de Acesso em DM","accessControlDmTooltip":"Quando ativado, apenas usuários na lista branca podem interagir com o bot em mensagens diretas","accessControlGroup":"Controle de Acesso em Grupo","accessControlGroupTooltip":"Quando ativado, apenas usuários na lista branca podem interagir com o bot em chats de grupo","dmDisabled":"Desativar DM","dmDisabledTooltip":"Quando ativado, o bot ignorará completamente todas as mensagens diretas","groupDisabled":"Desativar Grupo","groupDisabledTooltip":"Quando ativado, o bot ignorará completamente todas as mensagens de grupo","manageAccessControl":"Controle de Acesso","pendingApprovals":"Aprovações Pendentes","whitelist":"Lista Branca","blacklist":"Lista Negra","addUser":"Adicionar","addUserPlaceholder":"Digite o ID do usuário","userId":"ID do Usuário","username":"Nome de usuário","channel":"Canal","firstMessage":"Primeira Mensagem","time":"Hora","actions":"Ações","approve":"Lista Branca","deny":"Lista Negra","dismiss":"Dispensar","noWhitelistUsers":"Nenhum usuário na lista branca","noBlacklistUsers":"Nenhum usuário na lista negra","noPendingApprovals":"Nenhuma aprovação pendente","userAdded":"Usuário adicionado","userRemoved":"Usuário removido","approveSuccess":"Adicionado à lista branca","denySuccess":"Adicionado à lista negra","dismissSuccess":"Dispensado","operationFailed":"Operação falhou","remark":"Observação","usernamePlaceholder":"Digite o nome de usuário (opcional)","remarkPlaceholder":"Digite uma observação (opcional)","filterByChannel":"Filtrar por c
199anal","selectToOperate":"Selecione itens para operar","selectedCount":"{{count}} selecionados","batchApprove":"Aprovar","batchDeny":"Lista negra","batchDismiss":"Remover","batchApproveConfirm":"Aprovar {{count}} usuários?","batchDenyConfirm":"Adicionar {{count}} usuários à lista negra?","batchDismissConfirm":"Remover {{count}} usuários?","batchSuccess":"{{count}} usuários processados com sucesso","batchRemove":"Excluir","batchRemoveConfirm":"Excluir {{count}} usuários selecionados?","enabledSection":"Ativados","enabledCount":"{{count}}","availableSection":"Disponíveis","enableAction":"Ativar","noEnabledChannels":"Nenhum canal ativado","goEnableChannels":"Ativar canais"}`),f_={title:"Sessoes",description:"View and manage active chat sessions",loading:"Carregando sessions...",confirmDelete:"Confirmar Excluir",deleteConfirm:"Are you sure you want to delete this session?",batchDeleteConfirm:"Are you sure you want to delete selected {{count}} sessions?",deleteSuccess:"Session deleted successfully",deleteFailed:"Falhou to Excluir session",batchDeleteSuccess:"Successfully deleted {{count}} session(s)",batchDeleteFailed:"Falha ao batch Excluir Sessoes",saveSuccess:"Session saved successfully",saveFailed:"Falhou to Salvar session",batchDeleteButton:"Batch Excluir",filterTitle:"Filtrar por Título",filterUserId:"Filtrar by Usuario ID",filterChannel:"Filtrar by Channel",allChannels:"Todos Canais",totalItems:"Total {{count}} items",selectedItems:"Selecionado {{count}} items",editSession:"Editar Session",pleaseInputName:"Please input session Nome",sessionNamePlaceholder:"Session Nome",activeTab:"Ativas",archivedTab:"Arquivadas",archivedAtColumn:"Arquivado em",archive:{action:"Arquivar",unaction:"Desarquivar",batchAction:"Arquivar em lote",batchUnaction:"Desarquivar em lote",success:"Conversa arquivada",successHint:"Conversa arquivada. Veja em Controle > Sessões > Arquivadas.",failed:"Falha ao arquivar",unarchiveSuccess:"Conversa desarquivada",unarchiveFailed:"Falha ao desarquivar",batchSuccess:"{{count}} conversa(s) arquivada(s)",batchFailed:"Falha ao arquivar em lote",batchUnarchiveSuccess:"{{count}} conversa(s) desarquivada(s)",batchUnarchiveFailed:"Falha ao desarquivar em lote",groupLabel:"Arquivadas ({{count}})",modalTitle:"Conversas Arquivadas",unarchiveAll:"Desarquivar Todas",noArchived:"Nenhuma conversa arquivada"}},b_={parent:"Configuracoes",environments:"Variaveis de Ambiente",title:"Variaveis de Ambiente",description:"Configure key-value environment variables for agents and skills.",key:"Chave",value:"Value",variableNamePlaceholder:"VARIABLE_NAME",valuePlaceholder:"value",insertRowBelow:"Insert row below",deleteRow:"Excluir row",deleteVariable:"Excluir Variable",deleteConfirm:'Excluir "{{name}}"?',deleteSelected:"Excluir Selecionado",deleteSelectedConfirm:"Excluir {{label}}?",keyRequired:"Chave is Obrigatorio",invalidKeyFormat:"Invalid Chave Formato",duplicateKey:"Duplicate Chave",saveSuccess:"Environment variables saved",saveFailed:"Falhou to Salvar",deleteSuccess:'"{{name}}" deleted',deleteFailed:"Falhou to Excluir",noVariables:"No environment variables configured yet.",addVariable:"Adicionar Variable",loading:"Loading…",retry:"Tentar novamente",of:"of",selected:"Selecionado",variable:"variable",variables:"variables",showValue:"Mostrar value",hideValue:"Ocultar valor",searchPlaceholder:"Buscar variáveis",liveSettings:"Configurações em tempo real",noLiveVariables:"Nenhuma configuração em tempo real corresponde ao filtro.",customSettings:"Variáveis personalizadas",noCustomVariables:"Nenhuma variável personalizada adicionada.",editVariable:"Editar variável",applyNow:"Aplicar agora",applyHint:"O processo atual do QwenPaw é atualizado imediatamente. Processos MCP em execução precisam ser recarregados.",applied:"Variável de ambiente aplicada",appliedWithFailures:"Salvo, mas {{count}} processo(s) MCP não puderam ser recarregados",resetVariable:"Redefinir variável",resetSuccess:"Valor do sistema ou padrão restaurado",readonlySettings:"Configurações somente leitura",noReadonlyVariables:"Nenhuma configuração somente leitura corresponde ao filtro.",impactTitle:"Impacto nos processos",explicitConsumers:"{{count}} processo(s) MCP usam esta variável explicitamente",implicitConsumers:"{{count}} processo(s) stdio MCP podem herdá-la implicitamente",restartMode:"Processos MCP em execução",restartAffected:"Recarregar MCPs afetados",restartNone:"Não recarregar",restartAllStdio:"Recarregar todos os MCPs stdio",readonlyReason:{startup:"Definido quando o QwenPaw inicia",agent_owned:"Gerenciado pela configuração de cada Agent",initial_default:"Usado apenas como padrão 
199inicial do Agent"},mutabilityDescription:{hot_runtime:"Lido do processo QwenPaw atual no início de cada operação.",hot_process:"Disponível por os.getenv() e herdado por futuros subprocessos.",startup_only:"Somente para referência; não pode ser alterado durante a execução.",internal:"Gerenciado internamente pelo QwenPaw."},variableDescriptions:{QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT:"Espera máxima pelo primeiro conteúdo relevante do stream; zero desativa o monitoramento.",QWENPAW_LLM_STREAM_IDLE_TIMEOUT:"Espera máxima entre partes relevantes do stream; zero desativa o monitoramento."},source:{user:"QwenPaw",system:"Sistema",default:"Padrão"}},k_={selectModel:"Selecionar Modelo",noConfiguredModels:"Nenhum modelo configurado",noFreeModels:"Nenhum modelo gratuito disponível",switchFailed:"Falha ao trocar modelo",searchModels:"Buscar modelos...",noModelsFound:"Nenhum modelo encontrado",free:"Grátis",vision:"Visão",freeBannerText:"Modelos gratuitos podem ter limites de uso e instabilidade. Consulte o provedor para detalhes.",moreProviders:"Mais provedores gratuitos (requer API Key)",proBannerText:"Exibindo modelos configurados em Configurações.",connectToUse:"Conectar {{provider}} para modelos gratuitos",configureApiKey:"Configurar API Key do {{provider}} para modelos gratuitos",configureApiKeyTitle:"Ir para Configuração",configureApiKeyConfirm:"Você será redirecionado para a página de Modelos para configurar a API Key do {{provider}}. Continuar?",goToConfigure:"Ir para Configurar",noModelsDiscovered:"Conectado. Carregando modelos...",oauthTitle:"Conectar ao {{provider}}",oauthDescription:"Uma nova janela do navegador será aberta para autorizar o acesso ao {{provider}}. A chave API será salva automaticamente.",oauthContinue:"Continuar",oauthWaiting:"Aguardando autorização...",oauthWaitingDescription:"Por favor, conclua a autorização na janela do navegador.",oauthConnected:"Conectado ao {{provider}} com sucesso",oauthFailed:"Autorização falhou, tente novamente",oauthTimeout:"Autorização expirou, tente novamente",viewMore:"Ver mais ({{count}})"},y_={title:"Uso de Tokens",description:"View LLM token consumption over time, by date and model.",totalTokens:"Total Tokens",totalCalls:"Chamadas LLM",toolCalls:"Tool Calls",llmAndToolTrend:"Tendência de LLM & Tool Calls",llmAndToolTrendTooltip:"Turnos do assistente com metadados de uso mais intents de ferramenta em todos os agentes. Não é Total Calls (contagem bruta de API); sessões antigas podem ter 0 turnos registrados.",llmAndToolTrendLoadFailed:"Falha ao carregar tendência de LLM e ferramentas",recordedTurnsAllAgents:"Chamadas LLM",byAgent:"Por agente",agent:"Agente",unattributed:"Não atribuído",promptTokens:"Prompt Tokens",completionTokens:"Completion Tokens",cacheRead:"Tokens com acerto no cache",cacheHitRate:"Taxa de acerto do cache",byModel:"By Modelo",byDate:"By Date",provider:"Provedor",model:"Modelo",date:"Date",refresh:"Atualizar",loadFailed:"Falha ao load token usage",noData:"No token usage data in the selected period"},v_={title:"Estatisticas dos Agentes",totalSessions:"Total Sessoes",totalMessages:"Total Messages",userMessages:"Usuario Messages",assistantMessages:"Assistant Messages",promptTokens:"Prompt Tokens",totalInputTokens:"Total de tokens de prompt",completionTokens:"Completion Tokens",toolCalls:"Tool Calls",newSessions:"Novo Sessoes",activeSessions:"Ativo Sessoes",messageTrend:"Message Trend",sessionTrend:"Session Trend",tokenTrend:"Token Trend",llmAndToolTrend:"LLM & Tool Call Trend",sessionsByChannel:"Sessoes by Channel",messagesByChannel:"Messages by Channel",totalSessionsTooltip:"Total chat sessions created, each session is an independent conversation context",totalMessagesTooltip:"Total messages across all sessions, including both user and assistant messages",toolCallsTooltip:"Number of times the agent decided to invoke a tool; a single LLM call may produce multiple tool-use intents",messageTrendTooltip:"Trend comparing user messages vs assistant messages",sessionTrendTooltip:"Trend comparing new sessions vs active sessions; orange bars are sessions created that day, blue bars are sessions with messages that day",llmAndToolTrendTooltip:"Tendencia de turnos LLM do agente atual vs intents de ferramenta",sessionsByChannelTooltip:"Distribution of sessions by messaging channel; sessions without a channel are grouped under Console",messagesByChannelTooltip:"Distribution of total messages by messaging channel",currentAgentLlmCalls:"Turnos registrados",currentAgentTokenTrendTooltip:"Tendencias de tokens de prompt, completion e acerto no cache nos metadados por turno do agente atual; os tokens com acerto no cache fazem parte dos tokens de prompt",currentAgentPromptTokensTooltip:"Tokens de prompt do agente atual em suas sessoes no periodo selecionado (requer metadados de uso por turno; sessoes antigas podem mostrar 0)",currentAgentCacheHitRateTooltip:"Taxa de acerto do cache ponderada por tokens para chamadas observadas do agente atual no periodo selecionado (tokens com acerto no cache / tokens de entrada elegiveis; — quando indisponivel)",currentAgentCompletionTokensTooltip:"Tokens de completion do agente atual em suas sessoes no periodo selecionado (requer metadados de uso por turno; sessoes antigas podem mostrar 0)",currentAgentLlmCallsTooltip:"Numero de turnos do assistente com metadados de uso registrados para o agente atual (nao e a contagem bruta de chamadas API; sessoes antigas podem mostrar 0)",loadFailed:"Falhou to load statistics",noData:"No statistics data in the selected period",retry:"Tentar novamente"},T_=JSON.parse('{"discoveryOriginApi":"Detectado via API","discoveryOriginCatalog":"Catálogo oficial","discoveryOriginBoth":"API + catálogo","availabilityAvailable":"Disponível","availabilityPermissionDenied":"Sem permissão","availabilityNotFound":"Não encontrado","availabilityIncompatible":"Incompatível com chat","availabilityRateLimited":"Limite de requisições","availabilityTransientError":"Temporariamente indisponível","availabilityUnverified":"Não verificado","modelAlreadyConfigured":"Configurado","llmConfiguration":"LLM Configuracao","providersTitle":"Providers","providersDescription":"Configure API keys and endpoints for each provider.","llmTitle":"Modelos","defaultLlm":"Padrao LLM","llmDescription":"Set the global default LLM model from an authorized provider. You can choose a specific model for each Agent in the Chat page.","configureProvider":"Configure {{name}}","baseURL":"URL Base","apiKey":"Chave da API","advancedConfig":"Avancado Configuracao","authMode":"Modo de Autenticação","authModeApiKey":"API Key (x-api-key)","authModeAuthToken":"Auth Token (Authorization: Bearer)","customHeaders":"Cabeçalhos Personalizados","customHeadersHint":"Adicionados a todas as requisições de API, ex: x-app: cli","customHeaderKey":"Nome do Cabeçalho","customHeaderValue":"Valor do Cabeçalho","addHeader":"+ Adicionar Cabeçalho","generateConfig":"Generation Parameters","generateConfigHint":"Generation parameters expressed as a JSON object. They will be expanded and passed into the generation request (`openai.chat.completions` or `anthropic.messages`).","generateConfigInvalidJson":"Please enter valid JSON","generateConfigMustBeObject":"Generation parameters must be a JSON object","modelAdvancedConfig":"Modelo Avancado Configuracao","modelGenerateConfig":"Modelo Generation Parameters","modelGenerateConfigHint":"Generation parameters expressed as a JSON object for this model. They will be expanded and passed into the generation request. These override provider-level advanced configuration.","modelConfigSaved":"Configuration saved for model {{name}}","modelConfigSaveFailed":"Falha ao Salvar Modelo Configuracao","modelConfigLabel":"Modelo Configuracao","maxTokensLabel":"Máx. Tokens","maxTokensHint":"Número máximo de tokens de saída por resposta","maxInput
199LengthLabel":"Comprimento Máximo do Contexto","maxInputLengthHint":"Tamanho da janela de contexto do modelo, controla o limite de compactação do contexto (≥1000)","relayReasoningLabel":"Retransmitir Raciocínio","relayReasoningHint":"Retransmitir o conteúdo de raciocínio para os turnos de conversa subsequentes","thinkingModeLabel":"Ativar Pensamento","thinkingModeHint":"Ative para habilitar pensamento/raciocínio. Desative para desabilitar o pensamento.","thinkingBudgetLabel":"Orçamento de Pensamento","thinkingBudgetHint":"Usando orçamento de pensamento padrão do modelo","switchToManual":"Manual","switchToAuto":"Auto","reasoningEffortLabel":"Profundidade de Raciocínio","reasoningEffortHint":"Controla a profundidade do raciocínio (família OpenAI)","protocol":"Protocol","protocolHint":"Choose the provider API protocol for this configuration.","selectProtocol":"Please Selecionar a protocol","protocolOpenAI":"OpenAI-compatible (Chat Completions)","protocolOpenAIResponse":"OpenAI-compatible (Response API)","protocolAnthropic":"Anthropic (Messages API)","currentKey":"Current: {{key}}","startsWith":"Starts with \\"{{prefix}}\\"","optionalSelfHosted":"Opcional for self-hosted services","leaveBlankKeep":"Leave blank to keep current key","enterApiKey":"Enter API Chave ({{prefix}}...)","enterApiKeyOptional":"Enter API Chave (optional)","openAIEndpoint":"OpenAI endpoint, e.g. https://api.openai.com/v1","openAICompatibleEndpoint":"OpenAI-compatible endpoint, e.g. https://api.example.com (append /v1 only if your provider requires it)","azureEndpointHint":"Azure OpenAI endpoint, e.g. https://<resource>.openai.azure.com/openai/v1","anthropicEndpointHint":"Anthropic endpoint, e.g. https://api.anthropic.com","ollamaEndpointHint":"Ollama endpoint, e.g. http://localhost:11434","lmstudioEndpointHint":"LM Studio endpoint, e.g. http://localhost:1234/v1","apiEndpointHint":"API endpoint, e.g. https://api.example.com","pleaseEnterBaseURL":"Digite the API base URL","selectBaseURL":"Selecione uma URL base","selectBaseURLHint":"Selecione o endpoint regional deste provedor","pleaseEnterValidURL":"Digite a valid URL","apiKeyShouldStart":"API Key should start with \\"{{prefix}}\\"","configurationSaved":"{{name}} Configuracao saved","failedToSaveConfig":"Falhou to Salvar Configuracao","revokeAuthorization":"Revoke Autorizacao","revokeConfirmContent":"Are you sure you want to remove the API key for {{name}}? The current LLM model configuration will also be cleared.","revokeConfirmSimple":"Are you sure you want to remove the API key for {{name}}?","authorizationRevoked":"{{name}} authorization revoked, LLM model cleared","authorizationRevokedSimple":"{{name}} Autorizacao revoked","failedToRevoke":"Falhou to revoke Autorizacao","active":"Active: {{provider}} / {{model}}","provider":"Provedor","model":"Modelo","selectProvider":"Select provider (must be authorized)","selectModel":"Selecionar a Modelo","llmModelUpdated":"LLM Modelo Atualizado","failedToSave":"Falhou to Salvar","freeModelWarningTitle":"Aviso sobre Modelo Gratuito","freeModelWarningMessage":"Modelos gratuitos podem ser instáveis. Consulte os termos de serviço do provedor:","freeModelWarningDontShowAgain":"Do not show this again","saved":"Saved","save":"Salvar","cancel":"Cancelar","loading":"Carregando...","retry":"Tentar novamente","notSet":"Nao definido","notRequired":"Nao necessario","available":"Available","unavailable":"Unavailable","providerAvailable":"Ready (with models)","providerNoModels":"Not Ready (no models)","providerNotConfigured":"Not Ready (not configured)","settings":"Configuracoes","actions":"Acoes","search":"Pesquisar","searchPlaceholder":"Pesquisar providers...","searchModelPlaceholder":"Pesquisar models...","custom":"Personalizado","builtin":"Integrado","freeTierGroup":"Gratuito","paidGroup":"Pago","localCustomGroup":"Local e Personalizado","endpointCount":"{{count}} endpoints","connect":"OAuth","saveApiKey":"Salvar","addProvider":"Adicionar Provedor","addProviderTitle":"Adicionar Personalizado Provedor","providerIdLabel":"Provedor ID","providerIdPlaceholder":"e.g. openai, google, anthropic","providerIdHint":"Lowercase letters, digits, hyphens, underscores. Cannot be changed later.","providerNameLabel":"Display Nome","providerNamePlaceholder":"e.g. OpenAI, Google Gemini","defaultBaseUrlLabel":"Padrao Base URL","defaultBaseUrlPlaceholder":"e.g. https://api.example.com","apiKeyPrefixLabel":"API Chave Prefix (optional)","apiKeyPrefixPlaceholder":"e.g. sk-","providerCreated":"Provedor \\"{{name}}\\" Criado","providerCreateFailed":"Falhou to Criar Provedor","deleteProvider":"Excluir Provedor","deleteProviderConfirm":"Delete custom provider \\"{{name}}\\" and all its models? This cannot be undone.","providerDeleted":"Provedor \\"{{name}}\\" deleted","providerDeleteFailed":"Falhou to Excluir Provedor","manageModels":"Modelos","models":"Modelos","manageModelsTitle":"{{provider}} — Modelo Management","userAdded":"User-added","addModel":"Adicionar Modelo","addModels":"Adicionar Modelos","autoDiscoverModels":"Automatico Discover Modelos","addModelTitle":"Adicionar Modelo to {{provider}}","modelIdLabel":"Modelo ID","modelIdPlaceholder":"e.g. gpt-4o, gemini-2.0-flash","modelDiscoveryUnavailableHint":"No available models were found. This provider may 
199not support model list discovery, so please enter the model ID manually.","modelNameLabel":"Modelo Nome","modelNameRequired":"Please enter Modelo Nome","modelNamePlaceholder":"e.g. GPT-4o, Gemini 2.0 Flash","modelAdded":"Modelo \\"{{name}}\\" added","modelAddFailed":"Falhou to Adicionar Modelo","modelAlreadyExists":"Modelo ID \\"{{id}}\\" ja existe","autoDiscoverModelsSuccess":"Auto discovery complete. Added {{count}} models","autoDiscoverModelsNoNew":"Auto discovery complete. No new models were added","autoDiscoverModelsFailed":"Falha ao Automatico discover Modelos","removeModel":"Remover","removeModelConfirm":"Remove model \\"{{name}}\\" from {{provider}}?","modelRemoved":"Modelo \\"{{name}}\\" removed","modelRemoveFailed":"Falhou to Remover Modelo","loadMore":"Carregar mais ({{count}})","modelsCount":"{{count}} Modelos","noModels":"Nao Modelos","addModelFirst":"Please add a model first","modelList":"Modelo List","clearAll":"Limpar Todos","filteredModelsLoaded":"Filtered Modelos loaded: {{count}}","filterFailed":"Falhou to Filtrar Modelos","clearAllModels":"Limpar Todos Modelos","clearAllModelsConfirm":"Clear all {{count}} extra models? This cannot be undone.","allModelsCleared":"Cleared {{count}} Modelos","filterModels":"Filtrar Modelos","filterByProvider":"Provider:","searchProviderPlaceholder":"Pesquisar Provedor Nome","selectAllProviders":"Selecionar Todos","clearProviderSelection":"Deselect Todos","noMatchingProviders":"Nao matching providers","filterByModality":"Input Modality:","filterFreeOnly":"Free Modelos Only:","getModels":"Get Modelos","discovered":"Available Models:","add":"Adicionar","local":"Local","localType":"Tipo","localEmbedded":"Embedded (in-process)","localDownloadFirst":"Modelo service not started","localDownloadModel":"Baixar Modelo","localModelsTitle":"{{provider}} — Local Modelos","localNoModels":"Nao downloaded Modelos yet","localRepoId":"Modelo Repository ID","localRepoIdRequired":"Digite a Modelo repository ID","localRepoIdPlaceholder":"e.g. Qwen/Qwen3-0.6B-GGUF","localFilename":"Filename (optional)","localFilenamePlaceholder":"e.g. mistral-7b.Q4_K_M.gguf","localFilenameHint":"Leave empty to auto-select the best quantization","localSource":"Origem","localDownloadSuccess":"Modelo downloaded successfully","localDownloadFailed":"Falhou to Baixar Modelo","localDeleteModel":"Excluir Modelo","localDeleteConfirm":"Delete local model \\"{{name}}\\"? The model file will be removed from disk.","localModelDeleted":"Modelo \\"{{name}}\\" deleted","localDeleteFailed":"Falhou to Excluir Modelo","localDownloadPending":"Preparing to download...","localDownloading":"Downloading {{repo}}... This may take a few minutes.","localDownloadNavigateHint":"You can navigate away — the download will continue in the background.","localDownloadInProgress":"A download is already in progress","localDownloaded":"Downloaded","localNotDownloaded":"Not downloaded","localNoRecommendedModels":"This device is not powerful enough to run local models","localCancelDownloadTitle":"Cancelar Baixar","localCancelDownloadAction":"Cancelar Baixar","localCancelDownloadConfirm":"Cancelar Baixar of \\"{{repo}}\\"?","localDownloadCancelled":"Baixar cancelled","localCancelDownloadFailed":"Falhou to Cancelar Baixar","localLlamacppName":"Inferencia engine","localLlamacppInstallHint":"Install the local runtime before downloading or starting a model.","localInstallLlamacpp":"Install llama.cpp","localLlamacppInstallStarted":"llama.cpp Baixar started","localLlamacppInstallSuccess":"llama.cpp installed successfully","localLlamacppInstallFailed":"Falhou to install llama.cpp","localRuntimeSectionTitle":"Inferencia Engine","localRuntimeSectionDescription":"Powered by Llama.cpp","localRuntimeComputeHint":"CPU is used by default. For GPU acceleration, use Ollama or LM Studio.","localRuntimeInstalled":"Installed","localRuntimeUpdateAvailable":"Atualizar available","localRuntimeUpdateAction":"Click to download the latest version","localRuntimeUpdateConfirmTitle":"Confirmar llama.cpp Atualizar","localRuntimeUpdateConfirmContent":"Updating will overwrite the currently installed llama.cpp version. Confirm to start downloading and installing the latest version.","localRuntimeUpdate
199ConfirmContentWithServer":"Updating will overwrite the currently installed llama.cpp version and stop the currently running model service ({{model}}). Confirm to start downloading and installing the latest version.","localRuntimeUnsupported":"Unsupported","localRuntimeMissing":"Missing","localServerRunningTitle":"Atual local server","localServerOnline":"Executando","localServerIdle":"Dead","localServerUnavailable":"Issue","localNoActiveModel":"Nao Ativo Modelo","localNoDownloadedModelsHint":"Download a suitable model before starting the local inference service.","localDownloadModelFirst":"Baixar the Modelo first","localEngineInstallStateLabel":"Install","localEngineRunStateLabel":"Status","localEngineCurrentModelLabel":"Atual served Modelo","localEngineNextStepLabel":"Proximo step","localEngineHealthLabel":"Engine health","localEngineStatusHint":"Please download and start a suitable model from the list below","localStartServer":"Iniciar","localStopServer":"Parar","localServerStartFailed":"Falha ao Iniciar local server","localServerStopFailed":"Falha ao Parar local server","localServerSwitchTitle":"Switch Executando Modelo","localServerSwitchConfirm":"The current server is running {{current}}. Switch to {{next}}?","localSwitchModel":"Switch","localModelPathMissing":"This downloaded model is missing a local path.","localModelsSectionTitle":"Local Modelos","localModelsSectionDescription":"Downloaded models can be started immediately. Only one model download and one local server instance can run at a time.","localModelsLockedHint":"Please install llama.cpp first","localAlternativeRuntimeHint":"Please try Ollama or LM Studio","localModelsCount":"Downloaded {{downloaded}} / {{total}}","localCurrentDownloadTitle":"Atual Baixar","localAdvancedConfigTitle":"Avancado Local Configuracoes","localAdvancedConfigDescription":"These settings apply to the embedded local inference runtime. Max context length changes take effect the next time the local server starts.","localAdvancedConfigSaved":"Avancado local Configuracoes saved","localAdvancedConfigSaveFailed":"Falha ao Salvar Avancado local Configuracoes","localMaxContextLengthLabel":"Max Context Length","localMaxContextLengthHint":"Maximum token count for the model context window, determining how much history fits in each request. Changes take effect the next time the local server starts.","localMaxContextLengthRequired":"Digite max context length","localMaxContextLengthMin":"Max context length must be at least {{min}}","localMaxContextLengthPlaceholder":"Enter max context length","localServerPortLabel":"Server Port","localServerPortHint":"Leave this empty to let llama.cpp bind an available port automatically. Enter a port to reuse that fixed port on future startups. Changes take effect the next time the local server starts.","localServerPortRange":"Server port must be between {{min}} and {{max}}","localServerPortPlaceholder":"Leave empty to auto-select a port","localGenerateConfigHint":"Configure local model generation parameters as a JSON object. These fields will be expanded into subsequent generation requests.","localCustomModelTitle":"Personalizado Modelo Baixar","localCustomModelHint":"Enter a model repository ID. GGUF format only.","localSourceHuggingFace":"Hugging Face","localSourceModelScope":"ModelScope","ollamaModelNamePlaceholder":"e.g. mistral:7b, qwen3:8b","testConnection":"Testar Connection","testConnectionSuccess":"Connection Testar successful","testConnectionFailed":"Connection Testar Falhou","testConnectionFailedWithMessage":"Connection Testar failed: {{message}}","testConnectionError":"An error occurred while testing connection","discoverModels":"Discover Modelos","discoverModelsFailed":"Falhou to discover Modelos","ollamaFetchModelsFailed":"Failed to fetch Ollama models. Please check the error details.","modelTestFailed":"Model validation failed, please check if the model ID is correct","modelTestFailedConfirm":"Model connection test failed: {{message}}. Do you still want to add this model?","autoDiscoveredAndAdded":"Auto-discovered {{count}} models and added {{added}} new model(s)","autoDiscoveredNoNew":"Auto-discovered {{count}} models; model list is already up to date","autoDiscoverFailed":"Automatic model discovery failed; you can add models manually","tagImage":"Image","tagVideo":"Video","tagTextOnly":"Text Only","tagMultimodal":"Multimodal","tagVision":"Vision","tagText":"Text","free":"Free","probeMultimodal":"Testar Multimodal","probeImage":"Image","probeVideo":"Video","probeSupported":"Supported: {{types}}","probeNotSupported":"This model does not support multimodal input","probeFailed":"Probe Falhou","tagNotProbed":"Not Probed","modalityVision":"Image","modalityAudio":"Audio","modalityVideo":"Video","modalityFile":"File","modalityText":"Text only","perMillionIn":"/1M in","perMillionOut":"/1M out"}'),S_={title:"Arquivos",navigator:"Navegador de arquivos",source:"Fonte",workspace:"Workspace",profile:"Perfil",memory:"Memória de Longo Prazo",daily:"Diário",digest:"Base de Conhecimento",memoryGraph:"Grafo de Memória",memoryGraphShort:"Grafo",memoryGraphLoading:"Carregando grafo de memória…",memoryGraphLoadFailed:"Falha ao carregar o grafo de memória.",memoryGraphCounts:"{{nodes}} nós · {{edges}} links",memoryGraphEmpty:"Ainda não há links de memória indexados.",memoryGraphZoomOut:"Diminuir zoom",memoryGraphZoomIn:"Aumentar zoom",memoryGraphFit:"Ajustar grafo",memoryGraphRoot:"Raiz",memoryGraphRootDirect:"Arquivo direto",memoryGraphOtherFile:"Outro arquivo",memoryGraphIndexed:"Arquivo indexado",memoryGraphUnresolved:"Link não resolvido",memoryGraphDirection:"Direção do Wiki link",memoryGraphOpenFile:"Abrir Markdown",memoryGraphOutbound:"Saída · {{count}}
199",memoryGraphInbound:"Entrada · {{count}}",projectDirectory:"Diretório do projeto",workspaceDirectory:"Diretório de configuração",switchRoot:"Alternar diretório",manageDirs:"Gerenciar diretórios…",primaryRoot:"Principal",rootMissing:"Ausente",rootsPending:"{{count}} mais disponíveis após a primeira mensagem",sourceEmpty:"Ainda não há arquivos nesta fonte.",loadMore:"Carregar próximos 200",upload:"Enviar arquivos",conflictPolicy:"Política de conflito de upload",conflictRename:"Manter ambos",conflictRenameDescription:"Adiciona um número ao novo arquivo e mantém o existente.",conflictSkip:"Manter existente",conflictSkipDescription:"Ignora novos arquivos com conflito e continua os demais uploads.",conflictOverwrite:"Usar novo arquivo",conflictOverwriteDescription:"Substitui o arquivo existente pelo novo.",uploadConflictTitle:"Já existem arquivos com o mesmo nome",uploadConflictDescription:"Estes arquivos já existem: {{files}}. Escolha como continuar.",promptToggle:"Alternar se {{name}} entra no prompt do sistema",addSystemPrompt:"Adicionar do workspace",addSystemPromptTitle:"Adicionar arquivo de prompt do sistema",addSystemPromptDescription:"Escolha um arquivo Markdown do workspace para incluir no prompt do sistema.",searchSystemPromptFiles:"Buscar arquivos Markdown do workspace",noSystemPromptCandidates:"Nenhum arquivo correspondente está disponível.",sourceControl:"Controle de código-fonte",preview:"Preview",edit:"Editar",selectFile:"Selecione um arquivo para abrir",closeTab:"Fechar aba",closeOtherTabs:"Fechar outras abas",closeAllTabs:"Fechar todas as abas",openFiles:"Arquivos abertos, {{count}}",openFilesLabel:"Arquivos abertos",openFileCount:"{{count}} abertos",searchOpenFiles:"Buscar por arquivo ou caminho",noOpenFilesFound:"Nenhum arquivo aberto correspondente",scrollTabsLeft:"Rolar abas para a esquerda",scrollTabsRight:"Rolar abas para a direita",agentChangedFile:"O agente alterou este arquivo",keep:"Manter",keepAll:"Manter tudo",undo:"Desfazer",undoAll:"Desfazer tudo",copySelectionToChat:"Copiar seleção para o Chat",copyFileToChat:"Copiar arquivo para o Chat",previewSize:"Preview · {{size}} bytes",backToPreview:"Voltar ao Preview",download:"Baixar",downloadFailed:"Falha ao baixar o arquivo",resize:"Redimensionar painel de arquivos",loadFailed:"Falha ao carregar o arquivo. Verifique se ele ainda está no diretório de trabalho principal do workspace do agente atual.",previewUnavailable:"Preview indisponível. Metadados e download continuam disponíveis.",mentionInChat:"Mencionar no Chat",expandWorkspace:"Expandir workspace",openWorkspace:"Abrir workspace",closeWorkspace:"Fechar workspace"},C_={agentTitle:"Diretório de projeto do agente",sessionTitle:"Diretório de projeto da sessão",pathPlaceholder:"Digite um caminho absoluto",recentProjects:"Projetos recentes",browseDirectory:"Explorar diretórios",no
199RecentProjects:"Nenhum projeto recente",clearSelection:"Limpar projeto selecionado",homeDirectory:"Diretório inicial",parentDirectory:"Diretório pai",refreshDirectory:"Atualizar diretório",restoreDefault:"Restaurar padrão",createDirectory:"Criar nova pasta",directoryNamePlaceholder:"Digite o nome da pasta",createDirectoryFailed:"Falha ao criar pasta",useWorkspace:"Usar diretório de configuração",createSessionHint:"Envie a primeira mensagem para definir um diretório da sessão.",sessionSource:"Sessão",agentSource:"Agente",makePrimary:"Definir como primário",remove:"Remover",add:"Adicionar",boundDirs:"Diretórios de projeto adicionados",primaryHint:"Chamadas de ferramentas e comandos são executados no diretório principal por padrão.",primaryTag:"Principal",unbound:"Nenhum diretório vinculado",unavailable:"Ausente",alreadyBound:"Já vinculado",tooMany:"No máximo {{max}} diretórios podem ser vinculados.",countTitle:"Número de diretórios vinculados"},w_=JSON.parse(`{"title":"Configuracao","projectDirectoryTitle":"Diretório de projeto padrão","projectDirectoryDescription":"Diretório padrão usado para arquivos e comandos.","projectDirectoryDefault":"Padrão do agente","changeProjectDirectory":"Alterar diretório","projectDirectoryWorkspaceFallback":"Usando o workspace do agente","enhancedCodeCapability":"Aprimorar capacidade de código","enhancedCodeCapabilityTooltip":"Adiciona ferramentas de código sem alterar o diretório do projeto.","enhancedCodeCapabilityDescription":"Ative AST, LSP, prompts de código, contexto Git e controle de versão.","description":"Configure Agente runtime parameters","reactAgentTitle":"React Agente","llmRetryTitle":"LLM Automatico Tentar novamente","llmRetryEnabled":"Ativar Automatico Tentar novamente","llmRetryEnabledTooltip":"Automatically retry transient LLM API failures such as rate limits, timeouts, or connection errors. Applies to new requests after saving.","llmMaxRetries":"Max Retries","llmMaxRetriesTooltip":"Maximum number of extra retry attempts for a retryable LLM request failure.","llmMaxRetriesPlaceholder":"Enter max retries","llmMaxRetriesRequired":"Max retries is Obrigatorio","llmMaxRetriesMin":"Max retries must be at least 1","llmBackoffBase":"Backoff Base Delay (s)","llmBackoffBaseTooltip":"Base delay before the first retry. Later retries use exponential backoff from this value.","llmBackoffBasePlaceholder":"Enter base delay","llmBackoffBaseRequired":"Backoff base delay e obrigatorio","llmBackoffBaseMin":"Backoff base delay must be at least 0.1 seconds","llmBackoffCap":"Backoff Max Delay (s)","llmBackoffCapTooltip":"Maximum cap for exponential retry backoff delays.","llmBackoffCapPlaceholder":"Enter max delay","llmBackoffCapRequired":"Backoff max delay e obrigatorio","llmBackoffCapMin":"Backoff max delay must be at least 0.5 seconds","llmBackoffCapGteBase":"Backoff max delay must be greater than or equal to the base delay","llmRateLimiterTitle":"LLM Rate Limiter","llmMaxConcurrent":"Max Concurrent Calls","llmMaxConcurrentTooltip":"Maximum number of LLM calls allowed in-flight at the same time. Shared across all agents; only the first initialization takes effect until restart.","llmMaxConcurrentPlaceholder":"Enter max concurrent calls","llmMaxConcurrentRequired":"Max concurrent calls e obrigatorio","llmMaxConcurrentRange":"Max concurrent calls must be at least 1","llmMaxQpm":"Max QPM (Queries Per Minute)","llmMaxQpmTooltip":"Maximum requests allowed within a 60-second sliding window. Requests exceeding this limit wait before being dispatched — proactively preventing 429 rate-limit errors. 0 = disabled.","llmMaxQpmPlaceholder":"Enter max QPM (0 = unlimited)","llmMaxQpmRequired":"Max QPM is Obrigatorio","llmMaxQpmRange":"Max QPM must be at least 0","llmRateLimitPause":"Rate Limite Pause (s)","llmRateLimitPauseTooltip":"Default pause duration (seconds) applied globally when a 429 rate-limit response is received. Overridden by the API's Retry-After header when present.","llmRateLimitPausePlaceholder":"Enter pause duration","llmRateLimitPauseRequired":"Rate Limite pause e obrigatorio","llmRateLimitPauseMin":"Rate limit pause must be at least 1 second","llmRateLimitJitter":"Rate Limite Jitter (s)","llmRateLimitJitterTooltip":"Random jitter range (seconds) added on top of the pause so concurrent waiters stagger their wake-up and avoid a new burst.","llmRateLimitJitterPlaceholder":"Enter jitter range","llmRateLimitJitterRequired":"Rate Limite jitter e obrigatorio","llmRateLimitJitterMin":"Rate limit jitter must be at least 0 seconds","llmAcquireTimeout":"Slot Acquire Tempo limite (s)","llmAcquireTimeoutTooltip":"Maximum time (seconds) a caller will wait to acquire a rate-limiter slot before giving up with an error.","llmAcquireTimeoutPlaceholder":"Enter acquire Tempo limite","llmAcquireTimeoutRequired":"Slot acquire Tempo limite e obrigatorio","llmAcquireTimeoutMin":"Slot acquire timeout must be at least 10 seconds","llmAcquireTimeoutGtPauseJitter":"Slot acquire timeout must be greater than rate limit pause + jitter","contextManagementTitle":"Context Management","memoryManagerBackend":"Backend de gerenciamento de memória de longo prazo","memoryManagerBackendTooltip":"Backend para o gerenciador de memória. Escolha remelight (arquivos locais), adbpg (banco de dados na nuvem), PowerContext (serviço remoto de memória) ou none (desativar memória).","memoryManagerBackendRestartWarning":"A troca do backend de gerenciamento de memória de longo prazo não permite recarregamento a quente. Salve e reinicie o QwenPaw para aplicar as alterações.","maxIters":"Max Iterations","maxItersTooltip":"Maximum number of reasoning-acting iterations for ReAct agent","maxItersPlaceholder":"Enter max iterations","maxItersRequired":"Max iterations is Obrigatorio","maxItersMin":"Max iterations must be at least 1","agentLoopTitle":"Configurações de Loop do Agente","loopMode":{"builtIn":"Integrado","builtInNote":"Pipeline bloqueado · Valores editáveis","templateSectionTitle":"Modelos de Loop","templateSectionDescription":"Escolha um modelo integrado ou adicione o seu.","defaultTab":"Padrão","goalTab":"Meta","missionTab":"Missão","defaultDescription":"Loop ReAct protegido padrão usado fora de um modo explícito.","goalDescription":"Loop persistente e limitado para metas verificáveis.","missionDescription":"Pipeline persistente para missões longas e com várias etapas.","gatePipeline":"Pipeline de Gates","repetitionTitle":"Proteção contra repetição","repetitionDescription":"Detecta chamadas repetidas e intervém.","iterationTitle":"Limite de iterações","iterationDescription":"Limita o número de iterações ReAct.","retryTitle":"Verificação qualitativa de conclusão","retryDescription":"Acionada somente quando o agente produz uma resposta de texto sem chamadas de ferramentas.","goalTurnTitle":"Limite de turnos da meta","goalTurnDescription":"Limita os turnos em uma meta ativa.","maxGoalTurns":"Máximo de turnos da meta","goalBudgetTitle":"Orçamento de tokens da meta","goalBudgetDescription":"Para quando a meta completa atinge o orçamento.","maxGoalTokens":"Máximo de tokens da meta","goalCompletionTitle":"Verificação de conclusão da meta","goalCompletionDescription":"Lê o status explícito da meta antes de parar.","goalCompletionReadOnly":"A conclusão é 
199controlada pelo protocolo integrado de status da meta.","missionProgressTitle":"Verificação do progresso da missão","missionProgressDescription":"Continua até as histórias passarem ou atingir o limite.","missionProgressReadOnly":"A conclusão é controlada pelo status integrado das Stories da Mission.","missionIterationTitle":"Limite de iterações da Mission","missionIterationDescription":"Defina o limite de execução padrão para novas Missions.","workerAttemptsTitle":"Tentativas do Worker","workerAttemptsDescription":"Limite as novas tentativas do Worker após uma Story falhar na verificação.","missionVerificationTitle":"Política de verificação da Mission","missionVerificationDescription":"Defina a orientação de verificação e o comando de teste padrão.","defaultMaxMissionIterations":"Máximo padrão de rodadas de execução","defaultMaxMissionIterationsTooltip":"Usado quando /mission não especifica --max-iterations.","maxRetriesPerStory":"Máximo de tentativas por Story","maxRetriesPerStoryTooltip":"Tentativas do Worker após resultado FAIL ou PARTIAL do Verifier.","defaultVerificationInstructions":"Orientações de verificação (opcional)","defaultVerificationInstructionsHelp":"Orientações em linguagem natural aplicadas a cada Mission Verifier.","defaultVerificationInstructionsPlaceholder":"Por exemplo: verifique caminhos do Windows e a interface renderizada.","defaultVerifyCommand":"Comando de teste padrão (opcional)","defaultVerifyCommandHelp":"O Verifier tenta executá-lo com ferramentas e permissões normais. /mission --verify substitui o valor.","defaultVerifyCommandPlaceholder":"Por exemplo: pytest -q","enableRepetitionProtection":"Ativar proteção contra repetição","removeRule":"Remover regra","custom":"Personalizado","customDescription":"Crie um pipeline salvo com Gates integrados do QwenPaw.","duplicate":"Duplicar","delete":"Excluir","displayName":"Nome de exibição","duplicateModeName":"Já existe um modo de Loop com este nome.","slashCommand":"Comando com barra","description":"Descrição","availableToAgent":"Disponível para este agente","runsTopToBottom":"Executa de cima para baixo","addGate":"Adicionar Gate","emptyPipeline":"Adicione ao menos um Gate para disponibilizar este modo.","iterationGateTitle":"Limite de iterações","iterationGateDescription":"Para após um número fixo de iterações do Loop.","doomGateTitle":"Proteção contra repetição","doomGateDescription":"Detecta chamadas repetidas e muda a estratég
199ia.","tokenGateTitle":"Orçamento de tokens","tokenGateDescription":"Limita o uso de tokens de entrada e saída.","timeoutGateTitle":"Limite de tempo do Loop","timeoutGateDescription":"Para no próximo limite do Loop após o tempo, sem interromper o trabalho em execução.","toolBudgetGateTitle":"Orçamento de chamadas de ferramentas","toolBudgetGateDescription":"Limita todas as chamadas e ferramentas selecionadas.","retryGateTitle":"Revisão de parada antecipada","retryGateDescription":"Pede ao agente para verificar antes de encerrar.","rubricGateTitle":"Rubrica de conclusão","rubricGateDescription":"Avalia critérios explícitos e revisa quando necessário.","qualitativeRubricTitle":"Verificação qualitativa de conclusão","qualitativeRubricDescription":"Verifica respostas de texto sem chamadas de ferramentas usando critérios em linguagem natural.","qualitativeRubric":"Critérios de conclusão em linguagem natural","qualitativeRubricHelp":"Acionada somente para respostas de texto sem chamadas de ferramentas; o agente continua se ainda houver trabalho.","completionRubricTitle":"Verificação do sinal de conclusão","completionRubricDescription":"Verifica o sinal de conclusão em respostas de texto sem chamadas de ferramentas.","completionRubricHelp":"Acionada após respostas de texto sem chamadas de ferramentas. O agente produz o sinal de conclusão quando termina; caso contrário, continua trabalhando até atingir o máximo de rodadas de avaliação.","completionPrompt":"Prompt de verificação da conclusão","completionPromptHelp":"Descreva quando o resultado está completo. O QwenPaw injeta automaticamente a instrução de saída do sinal de conclusão.","completionSignal":"Sinal de conclusão","completionSignalHelp":"O QwenPaw injeta este sinal e a instrução para produzir somente ele no prompt de verificação. Somente uma correspondência exata, sem diferenciar maiúsculas e após remover espaços, encerra o Loop.","removeCriterion":"Remover critério {{number}}","totalTokensHelp":"Limite combinado de tokens de entrada e saída usados neste turno.","promptTokensHelp":"Inclui instruções do sistema, contexto da conversa, esquemas e resultados de ferramentas.","completionTokensHelp":"Limite de tokens gerados pelo modelo neste turno.","maxIterations":"Máximo de iterações","historyWindow":"Janela de histórico","similarityThreshold":"Limite de similaridade","totalTokens":"Máximo de tokens totais","promptTokens":"Máximo de tokens de entrada","completionTokens":"Máximo de tokens de saída","maxSeconds":"Máximo de segundos","maxSecondsHelp":"O tempo é verificado após a resposta do modelo ou chamada de ferramenta atual terminar. O trabalho em execução não é interrompido.","allToolCalls":"Todas as chamadas de ferramentas","perToolLimits":"Limites por ferramenta","toolName":"Nome da ferramenta","callLimitAria":"Limite de chamadas de {{name}}","removeToolLimitAria":"Remover limite de {{name}}","addToolLimit":"Adicionar limite por ferramenta","maxRetries":"Máximo de tentativas","retryInstruction":"Instrução de nova tentativa","passThreshold":"Limite de aprovação","maxEvaluations":"Máximo de rodadas de avaliação","graderError":"Erro do avaliador","stopSafely":"Parar com segurança","verifyOnceMore":"Verificar mais uma vez","completionCriteria":"Critérios de conclusão","criterionPlaceholder":"Descreva uma conclusão observável","required":"Obrigatório","weight":"Peso","addCriterion":"Adicionar critério","moveGateAria":"Mover {{title}}","removeGate":"Remover Gate","newModeName":"Novo modo de Loop","defaultCustomDescription":"Um pipeline de Gates personalizado.","copyName":"Cópia de {{name}}","createModeAria":"Criar modo de Loop personalizado","createModeTitle":"Criar modo de Loop personalizado","startingTemplate":"Modelo inicial","startingPipeline":"Pipeline inicial","blankPipelineHint":"Comece vazio e adicione gates depois","safeTemplate":"Execução segura","researchTemplate":"Pesquisa com orçamento","qualityTemplate":"Qualidade primeiro","blankTemplate":"Pipeline vazio"},"doomLoopEnabled":"Proteção contra Repetição","doomLoopEnabledTooltip":"Intervir automaticamente quando o agente fica preso repetindo as mesmas ações","doomLoopAfter":"Após","doomLoopRepetitions":"ações idênticas","doomLoopStopAction":"Pausar e Pedir Ajuda","doomLoopWarnAction":"Env
199iar Lembrete","doomLoopSimpleMode":"Simples","doomLoopAdvancedMode":"Avançado","doomLoopWindowSize":"Alcance de Detecção","doomLoopWindowSizeTooltip":"Quantas ações recentes verificar para repetição","doomLoopSimilarity":"Sensibilidade de Correspondência","doomLoopSimilarityTooltip":"Quão similares as ações devem ser para contar como repetição (menor = mais rigoroso)","doomLoopStages":"Regras de Intervenção","doomLoopAction":"Ação","doomLoopPrompt":"Mensagem","doomLoopPromptPlaceholder":"Mensagem de lembrete ou motivo da pausa...","doomLoopAddStage":"Adicionar Regra","iterationTitle":"Limite de Iteração","iterationEnabled":"Ativar Limite de Iteração","iterationEnabledTooltip":"Parar o agente após um número fixo de turnos de loop","iterationMaxIterations":"Iterações Máximas","iterationMaxIterationsTooltip":"Número máximo de turnos de loop antes de parar","rubricTitle":"Verificação Qualitativa de Conclusão","rubricEnabled":"Ativar Verificação Qualitativa de Conclusão","rubricEnabledTooltip":"Acionada somente quando o agente produz uma resposta de texto sem chamadas de ferramentas.","rubricPrompt":"Critérios de Conclusão em Linguagem Natural","rubricPromptTooltip":"O prompt injetado para pedir ao agente que avalie a conclusão da tarefa","rubricDesc":"Aplica critérios de conclusão em linguagem natural a respostas de texto sem chamadas de ferramentas e pede ao agente para continuar se ainda houver trabalho.","rubricPromptPlaceholder":"Você não chamou nenhuma ferramenta. Se a tarefa está completa, confirme. Caso contrário, continue com chamadas de ferramentas.","rubricMaxInterventions":"Máximo de Rodadas de Avaliação","rubricMaxInterventionsTooltip":"Máximo de verificações de conclusão para respostas de texto sem chamadas de ferramentas em um turno.","inLoopModes":"Ativar nos modos /goal e /mission","inLoopModesTooltip":"Também aplicar quando o modo /goal ou /mission estiver ativo","comingSoonEditable":"Configuração personalizada estará disponível em uma versão futura.","simpleMode":"Simples","advancedMode":"Avançado","comingSoon":"Em breve","reactModeTab":"Modelo Loop - Padrão","goalModeTab":"Modelo Loop - Goal","missionModeTab":"Modelo Loop - Mission","goalModeInfoTitle":"Modo Goal vs Padrão","goalModeInfo":"O modo padrão para após produzir uma resposta. O modo Goal mantém o agente em loop em direção a um objetivo, usando avaliação Rubric para determinar a conclusão. Todas as operações são executadas no contexto atual do agente.","missionModeInfoTitle":"Modo Mission vs Goal","missionModeInfo":"O modo Mission auto-decompõe tarefas complexas em subtarefas, executadas por sub-agentes Worker independentes e verificadas por sub-agentes Verifier. Cada subtarefa é executada em seu próprio contexto, evitando poluição da sessão principal.","goalIterationGate":"Gate de Iteração de Objetivo","goalIterationGateDesc":"Limita o número de turnos do agente em uma sessão de objetivo, rastreando iterações e uso de tokens.","goalBudgetGate":"Gate de Orçamento de Tokens","goalBudgetGateDesc":"Define um limite de gasto de tokens para a sessão de objetivo. Para o agente quando o orçamento é excedido.","goalRubricGate":"Rubrica de Conclusão de Objetivo","goalRubricGateDesc":"Avalia se o objetivo foi alcançado verificando o status da sessão.","goalDoomGate":"Proteção contra Repetição","goalDoomGateDesc":"Detecta padrões repetitivos durante a execução do objetivo e aciona intervenção.","missionProgressGate":"Gate de Progresso da Missão","missionProgressGateDesc":"Rastreia a conclusão das user stories do PRD. Continua até que todas passem ou o máximo de iterações seja atingido.","missionIterBypass":"Bypass de Iteração","missionIterBypassDesc":"Remove temporariamente o limite de iteração do ReAct durante a execução da missão para permitir fases longas.","customLoopTitle":"Modos de Loop Personalizados","customLoopDesc":"Crie seus próprios modos de loop com combinações personalizadas de gates. Em breve.","autoContinueOnTextOnly":"Auto-continue Ligado text-only step","autoContinueOnTextOnlyTooltip":"If the model ends a reasoning step with only text (no tool calls), inject a hint and run one extra reasoning pass with the same tool policy so multi-step tasks are less likely to stop silently. Turn off to match legacy behavior. May increase token usage when enabled.","shell
199CommandTimeout":"Shell Command Tempo limite (s)","shellCommandTimeoutTooltip":"Default timeout in seconds for the execute_shell_command tool. The LLM can still override this per-call via the timeout parameter. Useful for long-running tasks like compilation or data processing.","shellCommandTimeoutPlaceholder":"Enter Tempo limite","shellCommandTimeoutRequired":"Shell command Tempo limite e obrigatorio","shellCommandTimeoutMin":"Shell command timeout must be at least 1 second","shellCommandExecutable":"Shell Executável","shellCommandExecutableTooltip":"Caminho para o shell usado pelo execute_shell_command. Linux/macOS: ex. /bin/bash, /bin/zsh. Windows: suporta powershell.exe, pwsh.exe ou shells POSIX como Git Bash. Quando vazio, usa a variável de ambiente $SHELL, depois o padrão da plataforma (/bin/sh no Unix, cmd.exe no Windows).","shellCommandExecutablePlaceholder":"ex.: /bin/bash ou powershell.exe (vazio = detecção automática)","maxInputLength":"Max Input Length","maxInputLengthTooltip":"Maximum input length (tokens) for the model context window","maxInputLengthPlaceholder":"Enter max input length","maxInputLengthRequired":"Max input length e obrigatorio","maxInputLengthMin":"Max input length must be at least 1000","contextCompactRatio":"Compaction Threshold Ratio","contextCompactRatioTooltip":"Compaction is triggered when the context length reaches this fraction of the max context length","contextCompactRatioRequired":"Context compact ratio e obrigatorio","contextCompactThreshold":"Compaction Threshold (tokens)","contextCompactThresholdTooltip":"Auto-calculated from max context length × compaction ratio. Compaction triggers when context exceeds this value.","contextCompactThresholdPlaceholder":"Auto-calculated","contextCompactReserveRatio":"Reserve Threshold Ratio","contextCompactReserveRatioTooltip":"Calculates the target recent-tail budget. Scroll also applies a minimum recent budget and a 40K cap, and always keeps the complete active turn.","contextCompactReserveRatioRequired":"Context reserve ratio e obrigatorio","contextCompactReserveThreshold":"Reserve Threshold (tokens)","contextCompactReserveThresholdTooltip":"The effective target used to split the recent tail. This is a soft target; boundary messages and the complete active turn may increase the retained amount.","contextCompactReserveThresholdPlaceholder":"Auto-calculated","toolResultCompactRecentN":"Recent Tool Results Range","toolResultCompactRecentNTooltip":"Number of recent tool-result-bearing messages that use the larger recent preview limit in Native context mode","toolResultCompactRecentNRequired":"Recent tool results range e obrigatorio","toolResultCompactOldThreshold":"Older Tool Result Preview Bytes","toolResultCompactOldThresholdTooltip":"Maximum preview bytes for older tool results in Native context mode.","toolResultCompactOldThresholdPlaceholder":"Enter preview byte limit","toolResultCompactOldThresholdRequired":"Older tool result preview bytes is required","toolResultCompactRecentThreshold":"Recent Tool Result Preview Bytes","toolResultCompactRecentThresholdTooltip":"Maximum preview bytes before a tool result enters agent context. In Scroll mode, this also limits each recall_history page and read_file response.","toolResultCompactRecentThresholdPlaceholder":"Enter preview byte limit","toolResultCompactRecentThresholdRequired":"Recent tool result preview bytes is required","toolResultCompactRetentionDays":"Complete Tool Result Retention Days","toolResultCompactRetentionDaysTooltip":"Independent retention period for complete tool result artifacts. After cleanup, history.db may still retain a bounded preview.","toolResultCompactRetentionDaysRequired":"Complete tool result retention days is required","historyRetentionDays":"Dias de Retenção do Histórico","historyRetentionDaysTooltip":"Dias de histórico de conversa persistente a manter. Linhas mais antigas são removidas automaticamente na inicialização e no encerramento do agente.","historyRetentionDaysRequired":"Os dias de retenção do histórico são obrigatórios","historyRetentionDaysForeverWarning":"Definir como 0 mantém o histórico para sempre — o armazenamento crescerá sem limite.","historyRetentionDaysLargeWarning":"Um período de retenção grande pode consumir bastante armazenamento.","exemptFileExtensions":"Exempt File Extensions","exemptFileExtensionsTooltip":"In Native context mode, read_file results for these extensions always use the larger recent preview limit","exemptFileExtensionsPlaceholder":".md, .txt, .json","exemptToolNames":"Exempt Tool Names","exemptToolNamesTooltip":"In Native context mode, results from these tools always use the larger recent preview limit","exemptToolNamesPlaceholder":"chat_with_agent, list_agents","language":"Agente Idioma","languageTooltip":"Language for agent persona files (SOUL.md, AGENTS.md, etc.). Changing this will re-copy MD files in the selected language.","languageConfirmTitle":"Change Agente Idioma","languageConfirmContent":"Changing the language will over
199write the following files with the new language version:\\n\\n  SOUL.md, AGENTS.md, PROFILE.md, MEMORY.md, BOOTSTRAP.md, HEARTBEAT.md\\n\\nIf you have customized any of these files, please back them up first. Your other files will not be affected.","languageConfirmOk":"Change Idioma","languageSaveSuccess":"Idioma Atualizado successfully","languageSaveSuccessWithFiles":"Language updated, {{count}} MD file(s) copied","languageSaveFailed":"Falhou to Atualizar Idioma","saveSuccess":"Configuracao saved successfully","saveFailed":"Falhou to Salvar Configuracao","timezone":"Usuario Timezone","timezoneTooltip":"Used for scheduled tasks, time display, and agent context. Defaults to your system timezone.","timezoneRequired":"Please Selecionar a timezone","selectTimezone":"Selecionar timezone","timezoneSaveSuccess":"Timezone Atualizado successfully","timezoneSaveFailed":"Falhou to Atualizar timezone","loadFailed":"Falhou to load Configuracao","historyMaxLength":"Max History Length","historyMaxLengthTooltip":"Maximum output length (characters) for the /history command","historyMaxLengthRequired":"Max history length e obrigatorio","historyMaxLengthMin":"Max history length must be at least 1000","historyMaxLengthPlaceholder":"Enter max length","contextCompactTitle":"Context Compact Configuracao","contextCompactEnabled":"Ativar Context Compaction","contextCompactEnabledTooltip":"Automatically compact the context to prevent context window overflow","tokenCountModel":"Token Count Modelo","tokenCountModelTooltip":"Model name used for precise token counting; set to \\"default\\" to use built-in estimation","tokenCountModelPlaceholder":"Modelo Nome or Padrao","tokenCountUseMirror":"Use HuggingFace Mirror","tokenCountUseMirrorTooltip":"Use a HuggingFace mirror site when downloading tokenizers","tokenCountEstimateDivisor":"byte/Token Estimate Divisor","tokenCountEstimateDivisorTooltip":"Divisor for byte-based token estimation (tokens ≈ byte_length / divisor). Recommended value: 3.75 ~ 4.","tokenCountEstimateDivisorRequired":"Estimate divisor is Obrigatorio","tokenCountEstimateDivisorMin":"Estimate divisor must be between 2 and 5","toolResultCompactTitle":"Tool Result Compact Configuracao","toolResultCompactEnabled":"Ativar Tool Result Compaction","toolResultCompactEnabledTooltip":"Compact oversized tool call results to save context space","memorySummaryTitle":"Long-term Memory Configuracao","memorySummaryEnabled":"Activate Memory Summary","memorySummaryEnabledTooltip":"Automatically generate and save memory summaries during context compaction","dreamCronEnabled":"Ativar Dream","dreamCronEnabledTooltip":"Ativa a tarefa agendada de otimização de memória por Dream","dreamCron":"Agendamento do Dream","dreamCronTooltip":"Expressão Cron para otimizar periodicamente memórias de longo prazo; use o interruptor acima para ativar ou desativar","dreamCronPlaceholder":"0 23 * * *","dreamCronRequired":"Insira uma expressão Cron quando o Dream estiver ativado","dreamCronInvalid":"Insira uma expressão Cron válida de 5 campos","autoMemorySearch":"Busca automática na memória (Beta)","autoMemorySearchTooltip":"Auto memory search to run on every conversation turn. Each query will automatically invoke memory search capabilities, helping QwenPaw understand you better — but this increases token consumption.","autoMaxResults":"Automatico Pesquisar Max Results","autoMaxResultsTooltip":"Maximum number of results returned when auto memory search is enabled","autoMaxResultsRequired":"Max results is Obrigatorio","autoMaxResultsMin":"Max results must be at least 1","embeddingConfigTitle":"Embedding Modelo Configuracao","embeddingModelTitle":"Modelo de embedding","embeddingBackend":"Tipo de SDK de Embedding","embeddingBackendTooltip":"Tipo de SDK usado para chamar o modelo de embedding","embeddingBackendPlaceholder":"Selecione um tipo de SDK","embeddingApiKey":"Chave da API","embeddingApiKeyTooltip":"API key for the embedding provider; leave blank if no authentication is required","embeddingApiKeyPlaceholder":"Leave blank if not required","embeddingBaseUrl":"URL Base","embeddingBaseUrlTooltip":"URL Base da API de embedding. Para backends compatíveis com OpenAI, este endpoint customizado é opcional; Chave da API e Nome do Modelo são obrigatórios.","embeddingBaseUrlPlaceholder":"https://dashscope.aliyuncs.com/compatible-mode/v1","embeddingHost":"Host","embeddingHostTooltip":"URL do serviço Ollama. Deixe em branco para usar o host padrão do Ollama.","embeddingHostPlaceholder":"http://localhost:11434","embeddingModelName":"Modelo Nome","embeddingModelNameTooltip":"Nome do modelo de embedding. Obrigatório para todos os backends de embedding.","embeddingModelNamePlaceholder":"text-embedding-v4","embeddingEnableCache":"Ativar Embedding Cache","embeddingEnableCacheTooltip":"Cache embedding results to reduce repeated computation","embeddingMaxCacheSize":"Max Cache Tamanho","embeddingMaxCacheSizeTooltip":"Maximum number of entries in the embedding cache","embeddingMaxCacheSizeRequired":"Max cache Tamanho e obrigatorio","embeddingUseDimensions":"Enviar dimensões na solicitação","embeddingUseDimensionsTooltip":"Envia o parâmetro dimensions nas solicitações à API de Embedding compatível com OpenAI; alguns serviços não oferecem suporte a esse parâmetro","embeddingDimensions":"Embedding Dimensions","embeddingDimensionsTooltip":"Dimensão esperada do vetor, usada para validar respostas, índices e cache; quando o envio estiver desativado, informe a dimensão real de saída do modelo","embeddingDimensionsRequired":"Embedding dimensions is Obrigatorio","embeddingDimensionsMin":"Dimensions must be at least 1","embeddingMaxInputLength":"Orçamento de caracteres por entrada","embeddingMaxInputLengthTooltip":"Orçamento a
199proximado de caracteres para cada entrada de Embedding. O texto é truncado antes da solicitação, com uma estimativa mais conservadora para CJK e outros caracteres de largura completa; não é um limite exato de tokens","embeddingMaxInputLengthRequired":"O orçamento de caracteres por entrada é obrigatório","embeddingMaxBatchSize":"Max Batch Tamanho","embeddingHealthCheckTimeout":"Tempo limite de inicialização","embeddingHealthCheckTimeoutTooltip":"Tempo limite por tentativa para o teste de conexão e a verificação de embedding na inicialização do ReMe","embeddingHealthCheckTimeoutRequired":"O tempo limite de inicialização é obrigatório","embeddingMaxBatchSizeTooltip":"Maximum number of items in a single batch embedding request","embeddingMaxBatchSizeRequired":"Max batch Tamanho e obrigatorio","toolExecutionLevelTitle":"Modo de Aprovação de Ferramentas","toolExecutionLevelTooltip":"Modo de Aprovação","toolExecutionLevel":{"title":"Modo de Aprovação de Ferramentas","alertMessage":"Configure a aprovação antes das chamadas de ferramentas. As regras do File Guard são aplicadas separadamente.","strict":"Modo Estrito","strictDesc":"Toda chamada de ferramenta e acesso a arquivos externos requer aprovação prévia","smart":"Modo Inteligente","smartDesc":"Chamadas de ferramentas de baixo risco e acessos a arquivos externos são executados automaticamente; operações de médio e alto risco requerem aprovação","auto":"Modo Automático","autoDesc":"Somente operações que correspondem às regras de aprovação de ferramentas e arquivos exigem aprovação (padrão)","off":"Modo Desativado","offDesc":"As aprovações de ferramentas e arquivos são desativadas"},"saveLevelSuccess":"Modo de aprovação de ferramentas salvo","saveLevelFailed":"Falha ao salvar o modo de aprovação de ferramentas","maxContextLength":"Max Context Length","maxContextLengthTooltip":"Maximum token count for the model context window, determining how much history fits in each request","maxContextLengthRequired":"Max context length e obrigatorio","maxContextLengthMin":"Max context length must be at least 1000","maxContextLengthPlaceholder":"Enter max context length","embeddingActivationNote":"Embedding é ativado quando os campos obrigatórios do backend selecionado são preenchidos.","embeddingEnableHint":"Embedding é ativado quando os campos obrigatórios são preenchidos: Nome do Modelo e Chave da API para backends compatíveis com OpenAI ou Gemini; Nome do Modelo para Ollama.","rebuildMemoryIndex":"Reconstruir índice de memória","rebuildMemoryIndexWarning":"Esta operação limpa e reconstrói o índice de pesquisa da memória e pode consumir muita CPU e memória. Use-a apenas para reparar um índice danificado ou resultados de pesquisa anormais.","rebuildMemoryIndexConfirmTitle":"Reconstruir o índice de memória?","rebuildMemoryIndexConfirm":"O uso de CPU e memória pode aumentar significativamente durante a reconstrução. Esta operação não é recomendada, a menos que o índice esteja danificado ou precise de reparo.","rebuildMemoryIndexSuccess":"Reconstrução do índice de memória concluída","rebuildMemoryIndexFailed":"Falha ao reconstruir o índice de memória: {{error}}","rebuildMemoryIndexRequired":"A configuração de Embedding foi alterada. A pesquisa vetorial está desativada e a pesquisa de memória usará o BM25 até que o índice de Embedding seja reconstruído.","embeddingIndexReady":"O índice de Embedding corresponde à configuração atual.","embeddingIndexStatus":"Índice de Embedding","embeddingIndexAvailable":"Atualizado","embeddingSearchModeHybrid":"Pesquisa atual: Vetor + BM25","embeddingSearchModeBm25":"Pesquisa atual: Apenas BM25","embeddingSearchModeBm25Pending":"Pesquisa atual: Apenas BM25 · aguardando reconstrução","embeddingIndexNeedsRebuild":"Reconstrução necessária","embeddingIndexRebuilding":"Reconstruindo","embeddingIndexRebuildingHint":"Os vetores de memória estão sendo gerados","embeddingIndexSaveFirst":"Salve a configuração primeiro","embeddingIndexUnsavedHint":"Salve as alterações antes de reconstruir o índice","embeddingIndexMatchesConfig":"Corresponde à configuração atual","embeddingIndexBm25Fallback":"Pesquisa vetorial desativada · usando BM25","rebuildEmbeddingIndex":"Reconstruir índice de Embedding","rebuildEmbeddingIndexConfirmTitle":"Reconstruir o índice de Embedding?","rebuildEmbeddingIndexConfirm":"Todos os fragmentos de memória serão processados com a configuração atual de Embedding. A pe
199squisa vetorial permanecerá desativada até que o processo seja concluído com sucesso.","rebuildEmbeddingIndexSuccess":"Índice de Embedding reconstruído","rebuildEmbeddingIndexFailed":"Falha ao reconstruir o índice de Embedding: {{error}}","undoEmbeddingChange":"Desfazer alteração","undoEmbeddingChangeConfirmTitle":"Restaurar a configuração de Embedding usada pelo índice?","undoEmbeddingChangeConfirm":"A última configuração correspondente ao índice vetorial existente será restaurada.","undoEmbeddingChangeSuccess":"Configuração de Embedding usada pelo índice restaurada","undoEmbeddingChangeFailed":"Falha ao restaurar a configuração de Embedding: {{error}}","rebuildBm25Index":"Reconstruir índice BM25","rebuildBm25IndexDescription":"Recrie o índice de pesquisa por palavras-chave a partir dos fragmentos de memória atuais.","rebuildBm25IndexConfirmTitle":"Reconstruir o índice BM25?","rebuildBm25IndexConfirm":"O índice de pesquisa por palavras-chave será recriado a partir dos fragmentos de memória atuais.","rebuildBm25IndexSuccess":"Índice BM25 reconstruído","goToLongTermMemory":"Ir para memória de longo prazo","toolResultCompactRecentGtOld":"Recent tool result preview bytes must be greater than or equal to compact preview bytes","lightContextTitle":"Context Management","visualCompactCollapseLabel":"Compactação Visual","visualCompactDescription":"Compacte contextos antigos e longos em páginas visuais para reduzir tokens de entrada. As conversas recentes permanecem em texto.","visualCompactEnabled":"Ativar Visual Compact","visualCompactEffort":"Intensidade da compactação","visualCompactLow":"Baixa","visualCompactMedium":"Média","visualCompactHigh":"Alta","visualCompactLowDescription":"Compacta menos conteúdo e prioriza a legibilidade.","visualCompactMediumDescription":"Equilibra a economia de tokens com a legibilidade visual.","visualCompactHighDescription":"Compacta mais contexto elegível e prioriza a economia de tokens.","visualCompactQualityNote":"Uma compactação maior não melhora necessariamente a qualidade da resposta.","visualCompactCapabilityNote":"Só funciona com modelos que aceitam entrada de imagem.","remeLightMemoryTitle":"Long-term Memory","powercontextMemoryTitle":"PowerContext Memory","powercontextConfig":{"title":"PowerContext Memory Configuration","baseUrl":"Server URL","token":"Bearer Token","scopeId":"Memory Scope","scopeIdPlaceholder":"Deixe em branco para usar o escopo de agente exclusivo desta instalação","scopeIdInvalid":"O escopo de memória não pode conter apenas espaços.","timeout":"Request Timeout","maxContextBytes":"Contexto injetado máximo (bytes)","maxContextBytesTooltip":"Limita o total de resultados de pesquisa do PowerContext adicionados a um turno do modelo."},"dialogPath":"Dialog Storage Caminho","dialogPathTooltip":"Relative path for dialog persistence storage (relative to working_dir)","dialogPathPlaceholder":"dialog","contextCompactCollapseLabel":"Context Compaction","toolResultPruningCollapseLabel":"Tool Result Pruning","autoMemorySearchCollapseLabel":"Automatico Memory Pesquisar","embeddingConfigCollapseLabel":"Embedding Modelo Configuracao","summarizeWhenCompact":"Memory Ligado Compact","summarizeWhenCompactTooltip":"Automatically generate and save memory during context compaction","inboxPushEnabled":"Notificações de resultados da memória","inboxPushEnabledTooltip":"Envia resultados de memória, sonho e Daily Paper para a caixa de entrada. Desativar não interrompe as tarefas de memória.","autoMemoryInterval":"Intervalo de Memória Automática","autoMemoryIntervalTooltip":"Acione a memória automática a cada N consultas do usuário. 0 desativa a memória automática periódica. 1 significa memória automática após cada consulta. Recomendado: 2-5; usar 1 exige atenção ao alto consumo de tokens.","autoMemoryIntervalPlaceholder":"Digite 0 para desativar a memória automática periódica","autoMemoryIntervalRequired":"O intervalo de memória automática é obrigatório","autoMemoryIntervalMin":"O intervalo de memória automática deve ser no mínimo 0","contextManagerBackend":"Context Manager Backend","contextManagerBackendTooltip":"Backend type for the context manager. Currently only Light is supported.","contextStrategy":"Context Strategy","contextStrategyTooltip":"How the agent manages long context. Scroll (recommended) persists evicted turns to a durable history store and recalls them on demand; Native uses in-place compression. Restart QwenPaw for changes to take effect.","contextStrategyScroll":"Scroll","contextStrategyNative":"Native","backendRestartWarning":"Switching backends does not support hot reload. Save and restart QwenPaw for changes to take effect."}`),P_={title:"Integrado Ferramentas",description:"Manage built-in tools and their enabled status. Disabled tools will not be available to the agent.",emptyState:"Nao Ferramentas configured",loadError:"Falhou to load Ferramentas",enableSuccess:"Tool Ativado successfully",disableSuccess:"Tool Desativado successfully",toggleError:"Falha ao toggle tool Status",enableAll:"Ativar Todos",disableAll:"Desativar Todos",enableAllSuccess:"Todos Ferramentas Ativado",disableAllSuccess:"Todos Ferramentas Desativado",allEnabled:"All tools are already enabled",allDisabled:"All tools are already disabled",asyncExecution:"Async Execution",asyncExecutionEnabled:"Async execution Ativado",asyncExecutionDisabled:"Async execution Desativado",browserUnifiedMode:"Navegador unificado (Beta)",browserLegacyMode:"Modo de compatibilidade legado",browserUnifiedModeButton:"Novo (Beta)",browserLegacyModeButton:"Legado (Compatível)",browserUnifiedDescription:"Use os novos recursos do navegador unificado.",browserLegacyDescription:"Use a implementação original do navegador para o comportamento legado.",browserRestartPending:"O serviço mudará para {{mode}} após reiniciar.",configure:"Configurar",configured:"Configurado",requiresConfig:"Requer configuração",configSaved:"Configuração salva",configSaveError:"Falha ao salvar configuração",webSearchProviderLabel:"Provedor",webSearchApiKeyLabel:"Chave de API (opcional)",webSearchQuotaHintBefore:"Grátis: 100 chamadas/dia. Registre-se em ",webSearchQuotaHintAfter:" para 1.000/dia.",active:"ativo(s)",available:"Disponível",noEnabled:"Nenhuma ferramenta ativada",goEnableBtn:"Ativar agora",configureAction:"Configurar →",enableAction:"Ativar →"},A_={promptTitle:"LLM Model Required — Select in Chat After Configuration",promptMessage:"Chat requires an LLM model to function. Please configure a model first, then select it from the model selector at the top of the Chat page.",configureButton:"Configure Modelo",
199skipButton:"Skip",chatDisabledTitle:"Chat Desativado",chatDisabledMessage:"Chat functionality is disabled because no model is configured. Please configure a model to enable chat.",configureNow:"Configure Modelo",modelNotConfigured:"Please configure a model in Settings before using chat"},M_={changelog:"Registro de Alterações",docs:"Documentação",tutorial:"Tutorial",featureDemos:"Demonstração de Funções",faq:"Perguntas Frequentes",github:"GitHub",resources:"Documentação",updateAvailable:"Atualização Disponível"},D_={dark:"Dark",light:"Light",system:"System"},x_={newVersion:"New version available: v{{version}}, click to upgrade",updateModal:{title:"Novo Versao available: v{{version}}",viewReleases:"Visualizar Releases",installDesktopUpdate:"Atualizar agora",desktopInstallHint:"QwenPaw Desktop {{version}} está pronto para instalar. O aplicativo será reiniciado após a atualização.",checking:"Verificando atualizações…",checkingHint:"Confirmando a versão mais recente",downloading:"Baixando atualização",downloadingTo:"Atualizando para a versão {{version}}",downloadProgress:"{{done}} / {{total}} · {{rate}}",installing:"Instalando atualização",willRestart:"O aplicativo será reiniciado automaticamente após a conclusão.",stepPrepare:"Preparar",stepDownloading:"Baixar",stepInstalling:"Instalar",failedTitle:"Falha na atualização",back:"Voltar",retry:"Tentar Novamente",errors:{network:"Não foi possível alcançar o servidor de atualização. Verifique sua internet e tente novamente.",signature:"Assinatura do arquivo de atualização inválida. Tente baixar novamente.",appLocation:"O QwenPaw está sendo executado a partir de um local somente leitura do macOS. Mova QwenPaw.app para a pasta Aplicativos, abra-o a partir de lá e tente atualizar novamente.",other:"Falha na atualização."},updateLater:"Baixar em segundo plano",backgroundDownloading:"Baixando em segundo plano…",readyToInstall:"Atualização pronta",readyToInstallHint:"A atualização v{{version}} foi baixada. Reinicie para instalar e abrir a nova versão.",restartNow:"Atualizar agora",backgroundFailed:"Falha no download em segundo plano"},settings:{language:"Idioma",theme:"Tema",mode:"Modo",desktopMode:"Modo Desktop"},simpleMode:"Modo simples",fullMode:"Modo completo",toggleAgentNavigation:"Expandir ou recolher a navegação do agente"},R_={groups:{cronShort:"Agendado",subagentShort:"Subagente"},fileReference:{codeSnippet:"Trecho de código · {{count}} linhas"},modelSelectTooltip:"Selecionar Modelo",newChatTooltip:"Novo Chat",searchTooltip:"Pesquisar Todos chats",chatHistoryTooltip:"Chat history",wideModeTooltip:"Modo amplo",normalModeTooltip:"Modo normal",messageDisplay:{stepsRunning:"Em execução… · {{count}} etapas",stepsCanceled:"Cancelado · {{count}} etapas",stepsFailed:"Falhou · {{count}} etapas",stepsCompleted:"{{count}} etapas concluídas"},allChats:"Todos Chats",createNewChat:"Criar Novo Chat",pinDrawer:"Fixar",unpinDrawer:"Desafixar",statusIdle:"Idle",statusInProgress:"In progress",disclaimer:"Works for you, grows with you",greeting:"Hello, how can I help you today?",description:"I am a helpful assistant that can help you with your questions.",prompt1:"Let's start a new journey!",prompt2:"Can you tell me what skills you have?",inputPlaceholder:'"↑↓" for message navigation · "/" for quick commands',longTextUploadPrompt:"Please read the uploaded prompt file and answer it.",emptyOutputError:"O assistente retornou uma resposta vazia.",commands:{clear:{description:"Limpar the conversation context"},compact:{description:"Compact the conversation context; optional instruction supported"},approve:{description:"Approve the pending tool action and continue execution"},deny:{description:"Deny the pending tool action"},mission:{description:"Modo Mission — Decompõe tarefas em sub-agentes com contexto isolado"},skills:{description:"List chat-available skills and expose explicit skill commands"},agents:{description:"Listar os agentes disponíveis no runtime atual"},review:{description:"Revisar com o Codex as alterações não commitadas no workspace"},status:{description:"Mostrar a conta, o modelo e o workspace atuais do agente"}
199,goal:{description:"Loop Goal — Agente persegue objetivo continuamente, auto-avalia via Rubric"}},attachments:{tooltip:"Supports documents, images, videos, audio and more formats",tooltipImageOnly:"Current model supports image upload only",tooltipNoMultimodal:"No multimodal capability detected for current model, images or videos may not be processed correctly",fileSizeLimit:"File size limit: {{limit}}MB",fileSizeExceeded:"File size exceeds {{limit}}MB limit. Current file: {{size}}MB",multimodalDisabled:"Current model does not support file upload",multimodalWarning:"No multimodal capability detected for current model, images or videos may not be processed correctly",imageOnlyAccept:"Current model only supports image files",imageOnlyWarning:"Current model only supports images, non-image files like videos may not be processed correctly"},rateLimitHit:"O modelo atual está com limite de taxa. Tente mudar para outro modelo gratuito.",turnUsagePopover:{ariaLabel:"Ver uso de tokens e contexto desta rodada",turn:"Esta rodada",turnEstimated:"Esta rodada ~",tok:"tok",inOut:"in {{inTok}} · out {{outTok}}",contextLabel:"Janela de contexto:",outerRing:"Outer ring",cacheLabel:"Cache hit rate",centerValue:"Center",cacheTokens:"acerto {{readTok}} / entrada {{inputTok}}",manageContext:"Gerenciar contexto",compact:"Compactar",new:"Nova conversa"},rateLimitMessage:"Limite de taxa atingido. Mude para outro modelo gratuito:",rateLimitSwitched:"Mudou para {{model}}",speech:{startRecording:"Iniciar gravação de voz (Ctrl+Shift+M)",stopRecording:"Parar gravação (Ctrl+Shift+M)",transcribing:"Transcrevendo...",transcriptionDisabled:"A transcrição está desativada. Configure um provedor em Configurações > Transcrição de Voz.",transcriptionFailed:"Falha na transcrição de voz",microphoneError:"Não foi possível acessar o microfone",fileTooLarge:"O arquivo de gravação é muito grande ({{size}}MB). Máximo permitido: {{limit}}MB",recordingTooLong:"A gravação excede o limite de duração ({{limit}}s)"},search:{title:"Pesquisar Chat",tooltip:"Pesquisar Atual Chat",placeholder:"Pesquisar messages...",noResults:"Nao results found",resultsCount:"Found {{count}} result(s)",searching:"Searching {{progress}}...",loading:"Carregando...",userMessage:"Usuario",assistantMessage:"Assistant",titleMatch:"Title"},contextMenu:{open:"Abrir",rename:"Rename",pin:"Pin",unpin:"Unpin",delete:"Excluir"},queue:{title:"Fila de mensagens",paused:"Pausado",sendFailed:"Falha no envio",resume:"Retomar fila",pause:"Pausar fila",clear:"Limpar fila",dragSort:"Arraste para reordenar",edit:"Editar",retry:"Tentar novamente",skip:"Pular",interruptAndSend:"Interromper e enviar",delete:"Excluir",file:"Arquivo",noChatWarning:"Envie uma mensagem primeiro para criar uma conversa antes de usar a fila",queueFull:"Fila cheia (máx. {{max}} itens). Envie ou remova algumas mensagens primeiro",otherTabOwner:"This tab queues only; sending is handled by another tab"},group:{pinned:"Fixados",today:"Hoje",week:"Últimos 7 dias",month:"Últimos 30 dias",older:"Anteriores"},sessionPanel:{searchConversations:"Pesquisar…",noResults:"Nenhum resultado",noConversations:"Sem conversas",loadingConversations:"Carregando…"},conversationHistory:"Histórico de conversas",history:{empty:"Sem histórico de conversas"},sessionGroup:{today:"Hoje",recent:"Últimos 7 dias",earlier:"Anteriores"}},I_=JSON.parse(`{"parent":"Configuracoes","security":"Seguranca","title":"Seguranca","description":"Manage security features for tools and skills.","toolGuardTitle":"Tool Guard","toolGuardDescription":"Configure security scanning for tool calls. Dangerous operations will require your explicit approval before execution.","enabled":"Ativar Tool Guard","enabledTooltip":"When enabled, tool calls are scanned for dangerous patterns before execution","guardedTools":"Guarded Ferramentas","guardedToolsTooltip":"Tools that require approval when dangerous patterns are detected. Leave empty to use the built-in default set.","guardedToolsPlaceholder":"Select tools or type custom tool names","deniedTools":"Denied Ferramentas","deniedToolsTooltip":"Tools that are always rejected without asking for approval","deniedToolsPlaceholder":"Select tools to always deny","saveSuccess":"Tool guard Configuracoes saved","saveFailed":"Falha ao Salvar tool guard Configuracoes","loadFailed":"Falha ao load tool guard Configuracoes","rules":{"title":"Detection Rules","de
199scription":"Rules define regex patterns that trigger security alerts. Built-in rules can be disabled; custom rules can be added, edited, or deleted.","id":"Rule ID","severity":"Severity","descriptionCol":"Descricao","source":"Origem","actions":"Acoes","builtin":"Integrado","custom":"Personalizado","enable":"Ativar","disable":"Desativar","edit":"Editar","delete":"Excluir","add":"Adicionar Rule","addTitle":"Adicionar Personalizado Rule","editTitle":"Editar Personalizado Rule","ruleId":"Rule ID","ruleIdRequired":"Rule ID is Obrigatorio","duplicateId":"A rule with this ID already exists","tools":"Target Ferramentas","toolsPlaceholder":"Leave empty to match all tools","params":"Target Parameters","paramsPlaceholder":"Leave empty to match all parameters","severityLabel":"Severity","categoryLabel":"Category","patterns":"Regex Patterns","patternsRequired":"At least one pattern e obrigatorio","patternsTooltip":"One regex per line. Matched against tool parameter values (case-insensitive).","excludePatterns":"Exclude Patterns","excludePatternsTooltip":"One regex per line. If any matches, the rule is skipped for that value.","descriptionLabel":"Descricao","descriptionPlaceholder":"What does this rule detect?","remediationLabel":"Remediation","remediationPlaceholder":"Suggested action when this rule triggers","preview":"Visualizar","previewTitle":"Rule Detalhes","actionLabel":"Action","actionApproval":"Require Approval","allTools":"Todos Ferramentas","allParams":"Todos parameters","descriptions":{"TOOL_CMD_CONTROL_CHARS":"Detects commands with non-printable control characters that may bypass security checks","TOOL_CMD_DANGEROUS_MV":"Detects 'mv' command that may move or overwrite files unexpectedly","TOOL_CMD_DANGEROUS_RM":"Detects 'rm' command that may cause data loss","TOOL_CMD_DOS_FORK_BOMB":"Detects classic Bash fork bombs and mass process termination","TOOL_CMD_FIND_DELETE":"Detects 'find -delete' command that may cause data loss","TOOL_CMD_FS_DESTRUCTION":"Detects low-level disk formatting or wiping commands","TOOL_CMD_IFS_INJECTION":"Detects commands using $IFS variable that may bypass security validation","TOOL_CMD_JQ_FILE_FLAGS":"Detects jq commands using flags that may read arbitrary files or execute external code","TOOL_CMD_JQ_SYSTEM":"Detects jq commands with system() function that may execute arbitrary shell commands","TOOL_CMD_OBFUSCATED_EXEC":"Detects execution of base64 encoded strings passed directly to a shell interpreter","TOOL_CMD_PIPE_TO_SHELL":"Detects 'curl | bash' patterns used to download and immediately execute remote payloads","TOOL_CMD_PRIVILEGE_ESCALATION":"Detects privilege escalation attempts using sudo, su, doas, pkexec, or runas","TOOL_CMD_PROCESS_KILL":"Detects process termination commands that may kill critical processes","TOOL_CMD_PROC_ENVIRON":"Detects commands accessing /proc/*/environ that may expose sensitive environment variables","TOOL_CMD_REVERSE_SHELL":"Detects attempts to establish reverse shells or unauthorized network tunnels","TOOL_CMD_SERVICE_RESTART":"Detects service management commands that can disrupt system services","TOOL_CMD_SYSTEM_REBOOT":"Detects system reboot or shutdown commands that will terminate the host system","TOOL_CMD_SYSTEM_TAMPERING":"Detects access to cron jobs, SSH keys, or sudo permissions (including reads and modifications)","TOOL_CMD_UNICODE_WHITESPACE":"Detects commands with Unicode whitespace characters that may cause parsing issues","TOOL_CMD_UNSAFE_PERMISSIONS":"Detects global permission downgrades (chmod 777) or setting immutable flags","TOOL_CMD_ZSH_DANGEROUS":"Detects commands using Zsh-specific builtins that may bypass security checks"},"categories":{"command_injection":"Command Injection","code_execution":"Code Execution","data_exfiltration":"Data Exfiltration","path_traversal":"Caminho Traversal","sensitive_file_access":"Sensitive File Access","network_abuse":"Network Abuse","credential_exposure":"Credential Exposure","resource_abuse":"Resource Abuse","privilege_escalation":"Privilege Escalation","prompt_injection":"Prompt Injection","other":"Other"}},"shellEvasion":{"title":"Shell Evasion Detection","description":"Configure which shell evasion and obfuscation detection checks are enabled. These checks detect techniques that attempt to hide malicious intent from simpler regex-only detection.","checks":{"command_substitution":{"name":"Command Substitution","description":"Detects $(), backticks, process substitution, and other command substitution patterns"}
199,"obfuscated_flags":{"name":"Obfuscated Flags","description":"Detects ANSI-C quoting, locale quoting, and empty-quote flag obfuscation"},"backslash_escaped_whitespace":{"name":"Backslash Escaped Whitespace","description":"Detects backslash-escaped spaces/tabs that can alter command parsing"},"backslash_escaped_operators":{"name":"Backslash Escaped Operators","description":"Detects backslash before shell operators (;|&<>) that can hide command structure"},"newlines":{"name":"Hidden Newlines","description":"Detects newlines and carriage returns that could separate hidden commands"},"comment_quote_desync":{"name":"Comment Quote Desync","description":"Detects quote characters inside # comments that can desync quote tracking"},"quoted_newline":{"name":"Quoted Newline","description":"Detects newlines inside quoted strings followed by #-prefixed lines that can hide arguments"}}},"fileGuard":{"title":"File Guard","description":"Protect sensitive files and directories from being accessed by agent tools. Paths added here will be blocked across all tool calls.","enableLabel":"Ativar File Guard","path":"Caminho","actions":"Acoes","add":"Adicionar","inputPlaceholder":"Enter file or directory path (e.g. ~/.ssh/ or /etc/passwd)","empty":"No custom sensitive paths configured","directory":"Directory","removeConfirm":"Remove this path from the protected list?","duplicate":"This path is already in the list","saveSuccess":"File guard Configuracoes saved","saveFailed":"Falha ao Salvar file guard Configuracoes","loadFailed":"Falha ao load file guard Configuracoes","allowPreviewOutsideWorkspace":"Permitir Preview Fora do Workspace no Console","allowPreviewOutsideWorkspaceDesc":"Permite visualizar arquivos fora do diretório do workspace no console. A proteção de arquivos sensíveis continua ativa."},"allowNoAuthHosts":{"title":"Allow Nao Auth Hosts","warningTitle":"Seguranca Aviso","warningDescription":"IP addresses in this list can access API endpoints without authentication. By default, localhost (127.0.0.1 and ::1) are allowed for CLI access. Only add trusted IP addresses. WARNING: Adding untrusted IPs poses a serious security risk.","ipAddress":"IP Address","actions":"Acoes","add":"Adicionar","inputPlaceholder":"Enter IP address (e.g., 192.168.1.100 or ::1)","empty":"Nao IP addresses configured","default":"Padrao","removeConfirm":"Remove this IP address from the whitelist?","duplicate":"This IP address is already in the list","invalidIP":"Invalid IP address Formato","saveSuccess":"Allow no auth hosts settings saved","saveFailed":"Failed to save allow no auth hosts settings","loadFailed":"Failed to load allow no auth hosts settings"},"skillScanner":{"title":"Skill Scanner","description":"Automatically scan skills for security threats before enabling or installing. Unsafe skills can be blocked or whitelisted.","mode":"Scanner Modo","modeTooltip":"Controls how the scanner handles unsafe skills: block, warn only, or disabled","modeBlock":"Block","modeWarn":"Warn Only","modeOff":"Desligado","timeout":"Scan Tempo limite (seconds)","timeoutTooltip":"Maximum time to wait for a scan to complete (5-300 seconds)","saveSuccess":"Skill scanner Configuracoes saved","saveFailed":"Falha ao Salvar Skill scanner Configuracoes","scanAlerts":{"title":"Scan Alerts","empty":"Nao Seguranca alerts","clearAll":"Limpar Todos","clearConfirm":"Limpar Todos scan alerts?","skillName":"Skill","action":"Action","actionBlocked":"Blocked","actionWarned":"Warned","time":"Time","actions":"Acoes","allowSkill":"Adicionar to Whitelist","remove":"Remover","viewFindings":"Visualizar Detalhes"},"whitelist":{"title":"Whitelist","empty":"Nao Skills are whitelisted","skillName":"Skill","addedAt":"Added At","contentHash":"Conteudo Hash","actions":"Acoes","remove":"Remover","removeConfirm":"Remove this skill from the whitelist?","addSuccess":"Skill added to whitelist","removeSuccess":"Skill removed from whitelist","addFailed":"Falha ao Adicionar Skill to whitelist","removeFailed":"Falha ao Remover Skill from whitelist","removeWillDisable":"The skill will also be disabled after removal.","removeAndDisabled":"Skill removed from whitelist and disabled"},"scanError":{"title":"Seguranca Issues Detected","description":"The following security issues were found:","warnDescription":"Security issues were found but the skill was still enabled (warn mode):","goToWhitelist":"Go to Whitelist","moreFindings":"{{count}} more issues not shown (see Security → Skill Scanner for the full list)."}}}`),__=JSON.parse('{"brand":{"title":"Administração do Hub","subtitle":"Espaço de trabalho local","controlPlane":"Plano de controle"}
199,"navigation":{"workspace":"Espaço de trabalho","overview":"Operações","runtimes":"Tempos de execução","users":"Usuários","credentials":"Credenciais","audit":"Registro de auditoria","settings":"Configurações do sistema"},"actions":{"backToQwenPaw":"Voltar para QwenPaw","useLightTheme":"Use tema claro","useDarkTheme":"Usar tema escuro","signOut":"Sair","start":"Iniciar","stop":"Parar","disable":"Desativar","rebuild":"Recriar","enableAndStart":"Ativar e iniciar"},"roles":{"admin":"Administrador","user":"Usuário"},"userStates":{"active":"Ativo","disabled":"Desabilitado"},"runtimeStates":{"created":"Criado","starting":"Iniciando","running":"Em execução","stopped":"Parado","failed":"Falhou"},"runtimePolicies":{"owner_allowed":"O proprietário pode reiniciar","admin_only":"Bloqueado pelo administrador"},"errors":{"actionFailed":"Falha na ação","createFailed":"Falha na criação","updateFailed":"Falha na atualização","saveFailed":"Falha ao salvar","pullTimedOut":"Tempo limite esgotado aguardando a extração da imagem"},"messages":{"runtimeCreated":"Tempo de execução criado","accountCreated":"Conta criada","credentialStored":"Credencial armazenada","settingsSaved":"Configurações do hub salvas","imagePulled":"Extração de imagem Docker concluída"},"validation":{"required":"Este campo é obrigatório","runtimeIdInvalid":"Use de 1 a 64 letras, números, pontos, sublinhados ou hifens, começando com uma letra ou número","passwordMin":"A senha deve conter pelo menos oito caracteres","credentialNameInvalid":"Use um nome de variável de ambiente em letras maiúsculas, como OPENAI_API_KEY"},"runtimes":{"eyebrow":"Administração do hub","title":"Visão geral do tempo de execução","description":"Cada usuário tem um ambiente de execução próprio, com arquivos e chaves separados dos demais.","newRuntime":"Novo tempo de execução","managed":"Tempos de execução gerenciados","localBoundaries":"Limites locais do processo","runningNow":"Correndo agora","needsAttention":"O tempo de execução {{count}} precisa de atenção","healthy":"Todos os estados observados são saudáveis","isolationPolicy":"Política de isolamento","available":"Disponível","unavailable":"Indisponível","failClosed":"Falha fechada","noFallback":"Nenhum substituto sem sandbox","executionBlocked":"A execução do tempo de execução está bloqueada","isolationTitle":"Isolamento local com falha fechada","isolationDescription":"Toda a árvore do processo de tempo de execução está em área restrita. Se a sonda de isolamento nativo falhar, QwenPaw se recusará a iniciá-la.","unavailableTitle":"Back-end de tempo de execução seguro indisponível","unavailableDescription":"{{provisioner}} está indisponível: {{reason}} Verifique a instalação, o status de execução e a configuração do sistema do backend e reinicie o QwenPaw Hub.","unavailableUserDescription":"O backend de runtime está temporariamente indisponível. Entre em contato com um administrador.","preflightFailed":"A simulação de segurança falhou.","localEndpoint":"Ponto de extremidade local · {{endpoint}}","provisioner":"Tipo de execução","localExecution":"Isolamento local","dockerExecution":"Contêiner Docker","security":"Segurança","tenant":"Inquilino","removeTitle":"Remover {{id}}?","removeDescription":"O registro é removido; os dados de tempo de execução são retidos.","disableTitle":"Desativar {{id}}?","disableDescription":"O processo será interrompido e o proprietário não poderá reiniciá-lo até que um administrador o habilite.","rebuildTitle":"Reconstruir {{id}} com a imagem atual?","rebuildDescription":"O contêiner será substituído usando a imagem nas configurações do sistema. Espaço de trabalho persistente, segredos e backups são mantidos.","emptyTitle":"Ainda não há tempos de execução","emptyDescription":"Crie o primeiro tempo de execução QwenPaw local isolado."},"users":{"eyebrow":"Identidade e acesso","title":"Acesso do usuário","description":"Crie contas locais, atribua acesso administrativo e revogue sessões em um só lugar.","addAccount":"Adicionar conta","publicRegistration":"Registro público","publicRegistrationDescription":"Quando desativado, apenas administradores podem criar contas.","currentAccountProtected":"Conta atual protegida","empty":"Nenhum usuário corresponde a esses filtros"},"credentials":{"eyebrow":"Cofre com escopo de locatário","title":"Credenciais","description":"Armazene chaves de provedor dentro de um locatário explícito ou escopo de tempo de execução. Os valores secretos são criptografados e nunca retornados pelo API.","storeCredential":"Salvar credencial","updated":"Atualizado em {{date}}","deleteTitle":"Excluir {{name}}?","deleteDescription":"Os tempos de execução que usam essa credencial podem parar de funcionar.","emptyTitle":"O cofre está vazio","emptyDescription":"Armazene uma chave API com escopo de locatário ou tempo de execução.","encrypted":"Criptografado em repouso; texto simples não pode ser lido"},"overview":{"eyebrow":"Painel de operações","title":"Visão geral do Hub","description":"Entenda a integridade do Hub usando estado de tempo de execução real, recursos de host e eventos de auditoria.","availability":"Disponibilidade de tempo de execução","availabilityDetail":"{{running}} dos tempos de execução {{total}} estão atualmente online","totalRuntimes":"Total de ambientes","failedCount":"Os tempos de execução {{count}} precisam de atenção","totalUsers":"Usuários do hub","managedLocally":"Gerenciamento local de identidade e acesso","hostResources":"Recursos de hospedagem","liveSnapshot":"Instantâneo ao vivo atual","memory":"Memória","dataDisk":"Disco de dados","recentActivity":"Atividade recente","auditBacked":"Apoiado pelo log de auditoria persistente","systemHealthy":"Todos os sistemas funcionando","systemDegraded":"Sistema degradado","localIsolation":"Execução isolada local"},"table":{"searchRuntimes":"Pesquise tempos de execução, proprietários ou endpoints","searchUsers":"Pesquise nomes de usuário ou IDs de usuário","searchCredentials":"Pesquisar nomes de credenciais ou escopos","searchAudit":"Pesquisar atores ou recursos","allStates":"Todos os estados","allOwners":"Todos os proprietários","allExecutions":"Todos os tipos de execução","allRoles":"Todas as funções","allUserStates":"Todos os estados do usuário","allScopes":"Todos os escopos","allActions":"Todas as ações","runtime":"Tempo de execução","
199status":"Status","owner":"Proprietário","endpoint":"Endpoint","execution":"Execução","updated":"Atualizado","user":"Usuário","role":"Função","created":"Criado","credential":"Credencial","scope":"Escopo","event":"Evento","actor":"Ator","resource":"Recurso","result":"Resultado","time":"Tempo","total":"{{total}} itens"},"audit":{"eyebrow":"Segurança e governança","title":"Registro de auditoria","description":"Revise quem executou cada ação de gerenciamento do Hub, seu objetivo, resultado e prazo. Valores sensíveis nunca são auditados.","empty":"Ainda não há eventos de gerenciamento"},"settings":{"eyebrow":"Configuração da plataforma","title":"Configurações do sistema","description":"Gerencie a configuração completa do Hub a partir de uma fonte confiável auditada. As alterações entram em vigor imediatamente e persistem durante as reinicializações.","save":"Salvar configurações","meta":"Revisão {{revision}} · {{date}} atualizado","tabs":{"access":"Segurança de acesso","runtime":"Tempos de execução"},"access":{"title":"Acesso e registro","description":"Configure o endereço do Hub acessível pelo navegador e a política de conta pública.","publicBaseUrl":"URL base pública","publicBaseUrlHint":"Usado para retornos de chamada OAuth. Deixe em branco apenas para implantações somente de loopback.","registration":"Registro público","registrationHint":"Quando desativado, apenas administradores podem criar contas.","defaultRole":"Função de registro padrão","defaultRoleHint":"As contas auto-registradas são sempre de usuários comuns por questões de segurança."},"security":{"title":"Proteção de autenticação","description":"Limite o abuso de login e registro e bloqueie endereços ou redes.","ipBlacklist":"Lista negra de IP","ipBlacklistHint":"Suporta IPv4, IPv6 e CIDR; pressione Enter após cada valor.","trustedProxyIps":"Proxies reversos confiáveis","trustedProxyIpsHint":"X-Forwarded-For é confiável apenas quando enviado por esses endereços.","loginRateLimit":"Falha no limite de taxa de login","loginRateLimitHint":"Bloqueie temporariamente repetidas tentativas de login malsucedidas de um endereço.","registrationRateLimit":"Limite de taxa de registro","registrationRateLimitHint":"Restrinja a criação de novas contas a partir de um endereço.","maxAttempts":"Máximo de tentativas","windowSeconds":"Janela (segundos)","blockSeconds":"Duração do bloco (segundos)"},"runtime":{"title":"Política de tempo de execução","description":"Selecione o back-end do tempo de execução. Os tempos de execução existentes são ativados na próxima reinicialização.","provisioner":"Back-end de tempo de execução","localBackend":"Processo local","localBackendHint":"Executa processos isolados diretamente neste host.","dockerBackend":"Contêiner Docker","dockerBackendHint":"Executa cada conta em um contêiner gerenciado.","backendUnavailable":"Indisponível neste host","localIsolationHint":"O modo local usa processos de host e não usa nenhuma configuração de imagem Docker.","dockerIsolationHint":"O modo Docker aplica a política de imagem e recursos abaixo a todas as contas."},"docker":{"title":"Política Docker","description":"Gerencie centralmente a imagem, o comportamento de pull e os limites de recursos por contêiner. Os usuários não podem substituir essas configurações.","unavailable":"O mecanismo Docker não está disponível","source":"Fonte da imagem","dockerHub":"Docker Hub oficial","aliyunAcr":"Registro oficial do Alibaba Cloud","custom":"Imagem personalizada","customHint":"Insira qualquer referência de imagem permitida pela política.","customRegistry":"Registro personalizado ou referência de imagem","localHost":"Imagem local","localHostHint":"Use uma tag de imagem já presente neste host.","noLocalImages":"Nenhuma imagem local marcada foi encontrada","image":"Imagem e etiqueta","selectLocalImage":"Selecione uma tag de imagem local","selectedImage":"Imagem eficaz","repository":"Repositório","localStatus":"Situação local","downloaded":"Baixado","notDownloaded":"Não baixado","pullPolicy":"Política de pull automático","ifNotPresent":"Puxe quando estiver faltando localmente","always":"Puxe antes da primeira criação","never":"Use apenas imagens locais","pullImage":"Extraia a imagem agora","localImages":"Referências de imagem local {{count}}","resources":"Limites de recursos do contêiner","cpuLimit":"Núcleos de CPU","memoryLimit":"Memória (MB)","pidsLimit":"Máximo de processos","shmSize":"Memória compartilhada (MB)"},"quotas":{"title":"Capacidade de tempo de execução global","description":"Cada locatário possui exatamente um runtime; isso limita os tempos de execução simultâneos no Hub.","maxRunningRuntimes":"Tempos máximos de execução","unlimitedHint":"Vazio significa ilimitado."}},"auditActions":{"runtime":{"create":"Tempo de execução criado","start":"Tempo de execução iniciado","stop":"Tempo de execução interrompido","disable":"Tempo de execução desativado","rebuild":"Tempo de execução reconstruído","delete":"Tempo de execução excluído"},"image":{"pull":"Imagem Docker extraída"},"user":{"create":"Usuário criado","update":"Usuário atualizado"}
199,"credential":{"store":"Credencial armazenada","delete":"Credencial excluída"},"settings":{"update":"Configurações atualizadas do Hub"},"auth":{"register":"Usuário registrado do Hub"}},"auditOutcomes":{"success":"Sucesso","failure":"Falha"},"runtimeForm":{"title":"Criar tempo de execução","hint":"O tempo de execução começa dentro da sandbox local nativa. Seus arquivos, segredos e árvore de processos permanecem separados de outros usuários.","runtimeId":"ID do tempo de execução","startImmediately":"Comece imediatamente","submit":"Criar tempo de execução"},"userForm":{"title":"Adicionar conta","hint":"Use uma senha temporária com pelo menos oito caracteres. O usuário só pode acessar tempos de execução pertencentes ao seu locatário pessoal.","username":"Nome de usuário","temporaryPassword":"Senha temporária","role":"Papel","submit":"Criar uma conta"},"credentialForm":{"title":"Salvar credencial","hint":"O escopo do locatário se aplica a todos os seus tempos de execução. O escopo do tempo de execução é uma substituição privada para um processo selecionado.","scope":"Escopo","allRuntimes":"Todos os meus tempos de execução","environmentName":"Nome do ambiente","secretValue":"Valor secreto","submit":"Criptografar e armazenar"}}'),L_={title:"Login to QwenPaw",registerTitle:"Criar Account",firstUserHint:"Create your admin account to get started",usernamePlaceholder:"Username",passwordPlaceholder:"Password",usernameRequired:"Please enter your username",passwordRequired:"Please enter your password",submit:"Login",register:"Register",failed:"Login failed, please check your credentials",registerSuccess:"Registration successful",registerFailed:"Registration Falhou",authNotEnabled:"Autenticacao is not Ativado",logout:"Logout",logoutSuccess:"Logged out successfully",sessionExpired:"Session expired, please login again",unauthorized:"Unauthorized, please login"},E_={title:"Account",currentPassword:"Atual Password",currentPasswordRequired:"Digite your Atual password",newUsername:"Novo Username",newUsernamePlaceholder:"Leave blank to keep current",newPassword:"Novo Password",newPasswordPlaceholder:"Leave blank to keep current",confirmPassword:"Confirmar Novo Password",confirmPasswordPlaceholder:"Re-enter Novo password",passwordMismatch:"Passwords do not match",save:"Salvar Changes",updateSuccess:"Account Atualizado successfully",updateFailed:"Falhou to Atualizar account",wrongPassword:"Atual password is incorrect",nothingToUpdate:"Please enter a new username or password",passwordEmpty:"Password cannot be blank",usernameEmpty:"Username cannot be blank",username:"Nome de usuário",passwordRequired:"Digite uma nova senha",hubPasswordPlaceholder:"Digite pelo menos oito caracteres",runtimeTitle:"Ambiente pessoal",runtimeDescription:"Reinicie o ambiente se o espaço de trabalho ficar indisponível. As tarefas em execução serão interrompidas, mas os dados salvos serão mantidos.",runtimeRestartConfirmTitle:"Reiniciar o ambiente?",runtimeRestartConfirmDescription:"As tarefas em execução serão interrompidas durante a reinicialização.",runtimeRestart:"Reiniciar ambiente",runtimeRestartSuccess:"Ambiente reiniciado",runtimeRestartFailed:"Falha ao reiniciar o ambiente"},F_={title:"Seguranca Approval Obrigatorio",tool:"Tool",severity:"Severity",findings:"Findings",parameters:"Parameters",approve:"Approve",deny:"Deny",source:"Origem",subSession:"Sub-Agent",approved:"Tool call approved",denied:"Tool call denied",approveFailed:"Falhou ao aprovar",denyFailed:"Falhou ao negar",approvePattern:"Sempre Permitir",strictModeHint:"Sempre permitir não está disponível no modo estrito",approveExact:"Apenas Desta Vez",approvalScope:"Escopo de aprovação",details:"Detalhes",timeoutAutoDenied:"Tempo esgotado, negado automaticamente",acknowledge:"Entendi",builtinSource:"Integrado",ownerAgent:"Agente Proprietário",executingAgent:"Agente Executando"},O_={title:"Gerenciador de Plugins",description:"Instalar, gerenciar e remover plugins sem reiniciar o serviço.",installed:"Plugins Instalados",noPlugins:"Nenhum plugin instalado ainda",installBtn:"Instalar Plugin",installTitle:"Instalar Plugin",dropPrimary:"Solte a pasta ou arquivo ZIP aqui",dropSecondary:"ou clique para selecionar um arquivo ZIP",orFromUrl:"ou a partir de URL",installFromUrl:"Instalar a partir de URL",urlPlaceholder:"https://example.com/plugin.zip",zipOnly:"Apenas arquivos ZIP podem ser soltos como arquivos — arraste uma pasta para instalação de diretório",dropFailed:"Falha ao ler a pasta solta",restartHint:"Alguns plugins (por exemplo, hooks, monkey-patches) podem exigir uma reinicialização do aplicativo para entrar em vigor ou serem completamente removidos.",installing:"Instalando...",installSuccess:"Plugin instalado com sucesso",installFailed:"Falha na instalação do plugin",uninstall:"Desinstalar",uninstallConfirm:'Desinstalar plugin "{{name}}"? Esta ação não pode ser desfeita. Alguns plugins podem exigir uma reinicialização do aplicativo para serem completamente removidos.',uninstalling:"Desinstalando...",uninstallSuccess:"Plugin desinstalado com sucesso",uninstallFailed:"Falha na desinstalação do plugin",statusLoaded:"Em execução",statusUnloaded:"Não carregado",type:"Tipo",ver
199sion:"Versão",author:"Autor",unknown:"Desconhecido",noMatchingPlugins:"Nenhum plugin corresponde aos filtros atuais",loadFailed:"Falha ao carregar lista de plugins",confirmTitle:"Confirmar Desinstalação",officialTitle:"Plugins Oficiais",officialDesc:"Instale plugins publicados a partir do CDN de downloads.",catalogRefresh:"Atualizar",catalogEmpty:"Nenhum plugin oficial disponível (o catálogo CDN pode estar vazio)",catalogLoadFailed:"Falha ao carregar o catálogo de plugins oficiais",catalogInstall:"Instalar",catalogReinstall:"Reinstalar",catalogUpgrade:"Atualização disponível",catalogUpgradeBtn:"Atualizar",catalogInstalled:"Instalado",catalogSha256:"SHA256",kindBundle:"Pacote",kindTool:"Ferramenta",filterByName:"Filtrar por nome",filterByKind:"Filtrar por tipo",marketTitle:"Mercado de Plugins",marketEmpty:"No plugins found in market",marketLoadFailed:"Failed to load plugin market",marketUnavailable:"Plugin Market is currently under maintenance, please try again later",marketAll:"All",marketSearch:"Search plugins...",marketCategory:"Filter by category",marketSearchResult:'Found {{count}} plugins matching "{{keyword}}"',marketDetails:"Details",marketDownloads:"Downloads",marketDeveloper:"Developer",marketSortLabel:"Sort plugins",marketSortDownloads:"Most downloaded",marketSortUpdated:"Recently updated",marketSortFavorites:"Most favorited"},B_={title:"Colheita diária de IA",tabApprovals:"Aprovações",tabPushMessages:"Mensagens push",tabHarvests:"Colheita de IA",summaryApprovals:"Aprovações",summaryPushUnread:"Push não lidas",summaryHarvests:"Colheitas",from:"De:",requestedBy:"Por",markRead:"Marcar como lida",markAllRead:"Marcar todas como lidas",markAllReadNoUnread:"Nenhuma mensagem não lida",markAllReadSuccess:"{{count}} mensagens marcadas como lidas",selectAllCurrentPage:"Selecionar página atual",selectedItems:"{{count}} selecionado(s)",batchDeleteButton:"Exclusão em lote",batchOperation:"Operação em lote",exitBatch:"Sair do lote",batchDeleteConfirm:"Excluir {{count}} mensagens push selecionadas?",batchDeleteSuccess:"{{count}} mensagens push excluídas",pushCronHeader:"Tarefa Cron: {{name}}",viewDetails:"Ver detalhes",deleteMessageConfirm:"Excluir esta mensagem push?",viewAll:"Ver todas",read:"Lida",approve:"Aprovar",reject:"Rejeitar",ready:"Pronto",harvestNow:"Colher agora",createHarvest:"Criar colheita",createFirstHarvest:"Crie sua primeira colheita",createSuccess:"Colheita criada com sucesso",emptyApprovals:"Nenhuma aprovação pendente",emptyPush:"Nenhuma mensagem push",wobbleEnable:"Ativar notificação de aprovação por vibração",wobbleDisable:"Desativar notificação de aprovação por vibração",emptyHarvests:"Ainda não há colheitas",statusReadyToHarvest:"Pronto para colher",statusGrowing:"Em crescimento",harvestedTimes:"Colhido {{count}} vez(es)",harvestSuccessRate:"Taxa de sucesso {{rate}}%",messageDetailComingSoon:"Visualização de detalhes da mensagem — em breve!",harvestSettingsComingSoon:"Configurações de colheita — em breve!",messageDetailTitle:"Detalhe da execução",detailCronTitle:"Tarefa Cron: {{name}}",detailHeartbeatTitle:"Batimento",messageNotFound:"Mensagem não encontrada",detailTaskName:"Nome da tarefa",detailTaskId:"ID da tarefa",detailStatus:"Estado",detailSeverity:"Gravidade",detailAgent:"Agente",detailSource:"Origem",detailSourceCronJob:"Tarefa Cron",detailSourceHeartbeat:"Batimento",detailTrigger:"Disparo",detailDuration:"Duração",detailExecutedAt:"Executado em",detailReceivedAt:"Recebido em",detailRunId:"ID da execução",detailContent:"Saída",detailPayload:"Dados",detailExecutionTrace:"Rastro de execução",detailTraceEmpty:"Nenhum rastro de execução disponível",mailDetailSender:"Remetente",mailDetailSubject:"Assunto",mailDetailDate:"Hora do email",mailDetailBody:"Prévia do corpo",mailDetailProcess:"Processo de tratamento",filterByAgent:"Filtrar por agente",filterBySourceType:"Filtrar por origem",sourceTypeCron:"Cron",sourceTypeHeartbeat:"Heartbeat",sourceTypeMemory:"Memory",sourceTypeMail:"Mail",mailAccessControl:"Controle de Acesso de E-mail",pendingSenders:"Remetentes Pendentes",senderLists:"Listas de Remetentes",addSender:"Adicionar Remetente",domainWildcardHint:"Suporta curinga de dominio, ex.: *@example.com",invalidAddress:"Endereco de e-mail invalido. Use um formato como [email protected] ou *@domain.com",whitelist:"Lista Branca",blacklist:"Lista Negra",approveSender:"Aprovar",deny:"Bloquear",dismiss:"Ignorar",batchApprove:"Aprovar em Lote",batchDeny:"Bloquear em Lote",batchDismiss:"Ignorar em Lote",batchRemove:"Remover em Lote",confirmApprove:"Aprovar os remetentes selecionados?",confirmDeny:"Bloquear os remetentes selecionados?",confirmDismiss:"Ignorar os remetentes selecionados?",confirmRemove:"Confirmar remocao?",removeSuccess:"Removido com sucesso",addedToAllAgents:"Adicionado e sincronizado com todos os agentes",senderAddress:"Endereco do Remetente",displayName:"Nome do Remetente",emailSubject:"Assunto",bodyPreview:"Previa do Conteudo",selectAgent:"Selecionar Agente",allAgents:"Todos os Agentes",time:"Hora",remark:"Observacao",actions:"Acoes",o
199ptional:" (opcional)",required:" (obrigatorio)"},N_={title:"Modo de Codificação",experimental:"Funcionalidade Experimental",experimentalDesc:"O Modo de Codificação transforma o QwenPaw em uma IDE Web leve com editor de código, árvore de arquivos, integração Git e assistência de codificação por IA.",experimentalNote:"Esta funcionalidade é experimental e ainda está em desenvolvimento ativo. Algumas funcionalidades podem ser limitadas ou mudar em atualizações futuras.",confirmBtn:"Ativar Modo de Codificação",enterTooltip:"Entrar no Modo de Codificação",exitTooltip:"Sair do Modo de Codificação",btnCode:"Código",btnChat:"Chat",selectProject:"Selecionar Diretório do Projeto",selectProjectDesc:"Escolha um projeto para trabalhar ou use o workspace padrão",tabWorkspace:"Workspace Padrão",tabClone:"Clonar Repositório",tabLocal:"Importar Projeto Local",tabNew:"Novo Projeto",workspaceDesc:"Usar o diretório de workspace do agente atual",cloneUrl:"URL do Repositório Git",cloneUrlPlaceholder:"https://github.com/user/repo.git",cloneName:"Nome do Projeto (opcional)",cloneNamePlaceholder:"Deixe vazio para inferir da U
199RL",cloneBtn:"Iniciar Clone",cloning:"Clonando...",localPath:"Caminho do Diretório Local",localPathPlaceholder:"/Users/seunome/meu-projeto",localPathHint:"Insira o caminho absoluto do seu projeto local",openBtn:"Importar",newName:"Nome do Projeto",newNamePlaceholder:"meu-projeto",createBtn:"Criar Projeto",switchProject:"Trocar Projeto",currentProject:"Projeto Atual",resetToWorkspace:"Redefinir para Workspace Padrão",dropPrimary:"Arraste uma pasta aqui ou clique para navegar",dropSecondary:"Arraste do Finder ou cole um caminho abaixo",pathHint:"Insira o caminho absoluto completo (começando com / ou ~)",importing:"Importando...",dropFailed:"Falha ao ler a pasta",workingDir:"Diretório de trabalho",importCopyNote:"A pasta será copiada para a biblioteca de projetos gerenciada do QwenPaw. Os arquivos originais não serão modificados.",importCopyDesc:'A importacao cria uma copia da pasta. O Agent trabalha na copia e seus arquivos originais nao sao alterados. Para trabalhar diretamente no original, use "Abrir diretorio".',tabOpenDir:"Abrir diretório",openDirDesc:"Abrir um diretório local existente — nenhum arquivo será copiado",openDirBtn:"Abrir este diretório",openDirLoading:"Carregando...",openDirEmpty:"Sem subdiretórios",openDirHome:"Início",openDirRefresh:"Atualizar",openDirHiddenFolders:"Pastas Ocultas"},H_={searchPlaceholder:"Buscar habilidades em várias plataformas",categoryAll:"Todos",categoryPlaceholder:"Buscar categoria",searchResult:'{{count}} habilidades encontradas para "{{keyword}}"',providerUnavailable:"Provedor indisponível",noResults:"Nenhum resultado",startTyping:"Digite uma consulta acima para buscar no mercado",browseHint:"Escolha uma categoria ou digite uma palavra-chave para navegar pelos skills em {{providers}}",noDescription:"Nenhuma descrição fornecida",browseMarket:"Explorar Mercado",installQueue:"Fila de instalação",clearCompleted:"Limpar",retry:"Tentar novamente",status:{queued:"Na fila",installing:"Instalando",completed:"Concluído",failed:"Falhou",cancelled:"Cancelado"},loadMore:"Carregar mais",noMoreResults:"Sem mais resultados",detail:{title:"Detalhes da habilidade",version:"Versão",author:"Autor",sourceUrl:"URL de instalação",slug:"Identificador",missing:"—"},stats:{downloads:"Downloads",stars:"Estrelas",installs:"Instalações",likes:"Curtidas",views:"Visualizações",category:"Categoria",updatedAt:"Atualizado em"},queueMsg:{timedOut:"A instalação expirou",failedPrefix:"Falhou: {{msg}}"}},U_={starting:"Iniciando backend...",checking:"Conectando ao backend...",error:"Falha ao iniciar o backend.",errorHint:"Nao foi possivel iniciar o processo do backend. Verifique os logs do aplicativo para detalhes.",errorDetails:"Mostrar detalhes do erro",timeout:"O backend nao iniciou em {{seconds}} segundos.",timeoutHint:"Falha ao iniciar o backend. Tente novamente ou verifique os logs do aplicativo.",retry:"Tentar novamente"},q_={error:{SENSITIVE_FILE_BLOCKED:"Este arquivo está bloqueado pelo File Guard (proteção de arquivos sensíveis).",OUTSIDE_WORKSPACE:'Este arquivo está fora do escopo do workspace. Ative "Permitir Preview Fora do Workspace no Console" em Configurações → Segurança → File Guard.',FORBIDDEN:"Acesso negado: permissões insuficientes para visualizar este arquivo.",NOT_FOUND:"Arquivo não encontrado. Pode ter sido movido ou excluído. Se foi usado um caminho relativo, tente usar um caminho absoluto.",LOAD_FAILED:"Falha ao carregar a visualização do arquivo.",LOAD_FAILED_DETAIL:"Falha ao carregar a visualização do arquivo: {{detail}}"}},j_={readFile:"Ler {{file}}",readFileDefault:"Ler arquivo",writeFile:"Criar {{file}}",writeFileDefault:"Criar arquivo",editFile:"Editar {{file}}",editFileDefault:"Editar arquivo",appendFile:"Adicionar em {{file}}",appendFileDefault:"Adicionar ao arquivo",grepSearch:"Grep {{pattern}}",grepSearchDefault:"Busca grep",globSearch:"Glob {{pattern}}",globSearchDefault:"Busca glob",viewImage:"Ver imagem {{file}}",viewImageDefault:"Ver imagem",viewVideo:"Ver vídeo {{file}}",viewVideoDefault:"Ver vídeo",desktopScreenshot:"Captura de tela do desktop",sendFile:"Enviar {{file}}",sendFileDefault:"Enviar arquivo",browserUse:"Navegar {{detail}}",browserNavigate:"Abrir {{url}}",browserNavigateDefault:"Abrir página",browserClick:"Clicar",browserType:"Digitar",browserSnapshot:"Tirar snapshot",browserScroll:"Rolar página",getCurrentTime:"Obter hora atual",setTimezone:"Definir {{timezone}}",getTokenUsage:"Consultar uso de tokens",memorySearch:"Buscar na memória {{query}}",memorySearchDefault:"Buscar na memória",listAgents:"Listar agentes",chatWithAgent:"Conversar com {{agent}}",chatWithAgentDefault:"Conversar com agente",submitToAgent:"Enviar para {{agent}}{{task}}",submitToAgentDefault:"Enviar tarefa",checkAgentTask:"Verificar {{agent}} #{{taskId}}",checkAgentTaskAgent:"Verificar {{agent}}",checkAgentTaskDefault:"Verificar tarefa",delegateExternalAgent:"Delegar {{runner}}",delegateExternalAgentDefault:"Delegar agente externo",shell:"Executar {{command}}
199",shellDefault:"Executar comando",formatTable:{file:"Arquivo",lineNumber:"Linha",score:"Pontuação",summary:"Resumo",name:"Nome",id:"ID",description:"Descrição",status:"Status"},loading:"Carregando...",rawInputPreview:"Entrada bruta em tempo real (últimos 4.096 caracteres)",largeOutputOmitted:"{{count}} linhas omitidas — copie a saída disponível ou siga as instruções de recuperação",largeOutputTruncated:"Saída truncada para exibição — copie a saída disponível ou siga as instruções de recuperação",browserAction:{startHeaded:"Iniciar navegador (com interface)",start:"Iniciar navegador",stop:"Parar navegador",open:"Abrir {{url}}",openDefault:"Abrir página",navigate:"Navegar para {{url}}",navigateDefault:"Navegar",navigateBack:"Voltar",click:"Clicar em {{selector}}",clickDefault:"Clicar no elemento",type:"Digitar {{text}}",typeDefault:"Digitar texto",snapshot:"Obter snapshot",screenshot:"Captura de tela {{path}}",screenshotDefault:"Captura de tela",eval:"Avaliar {{code}}",evalDefault:"Avaliar código",runCode:"Executar {{code}}",runCodeDefault:"Executar código",closePage:"Fechar página",tabs:"Abas {{action}}",tabsDefault:"Gerenciar abas",fillForm:"Preencher formulário",fileUpload:"Fazer upload de {{filename}}",fileUploadDefault:"Fazer upload de arquivo",fileDownload:"Baixar {{target}}",fileDownloadDefault:"Baixar arquivo",pressKey:"Pressionar {{key}}",pressKeyDefault:"Pressionar tecla",hover:"Passar o mouse sobre {{selector}}",hoverDefault:"Passar o mouse sobre elemento",drag:"Arrastar",selectOption:"Selecionar opção",waitFor:"Aguardar {{target}}",waitForDefault:"Aguardar elemento",resize:"Redimensionar {{w}}x{{h}}",resizeDefault:"Redimensionar janela",pdf:"Exportar PDF {{path}}",pdfDefault:"Exportar PDF",install:"Instalar",batch:"Lote"},lineBadge:{lines:"{{count}} linhas",addLines:"+{{count}} linhas",delLines:"-{{count}} linhas",matches:"{{count}} correspondências",files:"{{count}} arquivos"},inlineResult:{taskId:"Tarefa #{{id}}",submitted:"Enviado"},execute:"Executar {{tool}}",executeDefault:"Executar ferramenta"},G_={gotoSettings:"Configurações de Loop do Agente",selectorTitle:"Modo de Loop",selectorHint:"Escolha como o agente deve continuar",selectorAria:"Selecionar modo de Loop",builtInModes:"Integrados",customModes:"Personalizados e plugins",starting:"Iniciando",running:"Em execução",awaiting_user:"Aguardando sua resposta",activePersistentDescription:"Este modo permanece ativo na conversa até terminar ou a conversa ser reiniciada.",activeCustomDescription:"Este modo personalizado permanece ativo até usar /mode off, /clear ou /new.",loadError:"Não foi possível carregar alguns modos de Loop.",retry:"Tentar novamente",modes:{default:{name:"Padrão",description:"O Loop de agente controlado padrão."},goal:{name:"Objetivo",description:"Trabalhe continuamente em um objetivo concreto e verificável."},mission:{name:"Missão",description:"Execute uma tarefa estruturada e persistente em várias etapas."}}},V_={common:JI,harnesses:YI,desktop:XI,chunkError:ZI,appCenter:e_,nav:t_,os:a_,debug:n_,acp:o_,voiceTranscription:i_,backup:s_,checkpoints:r_,workspace:l_,agent:d_,skills:c_,skillPool:u_,mcp:p_,heartbeat:m_,cronJobs:h_,channels:g_,sessions:f_,environments:b_,modelSelector:k_,tokenUsage:y_,agentStats:v_,models:T_,files:S_,projectDirectory:C_,agentConfig:w_,tools:P_,modelConfig:A_,header:M_,theme:D_,sidebar:x_,chat:R_,security:I_,hub:__,login:L_,account:E_,approval:F_,pluginManager:O_,inbox:B_,codingMode:N_,market:H_,startup:U_,preview:q_,tool:j_,loop:G_},W_={save:"Simpan",reset:"Atur ulang",cancel:"Batal",confirm:"Konfirmasi",apply:"Terapkan",delete:"Hapus",edit:"Edit",create:"Buat",upload:"Unggah",download:"Unduh",refresh:"Segarkan",retry:"Coba lagi",search:"Cari",enable:"Aktifkan",disable:"Nonaktifkan",enabled:"Aktif",disabled:"Nonaktif",preview:"Pratinjau",raw:"Sumber",view:"Lihat",content:"Konten",loading:"Memuat...",saving:"Menyimpan...",copy:"Salin",copied:"Disalin ke papan klip",copyFailed:"Gagal menyalin ke papan klip",contentPlaceholder:"Masukkan konten...",help:"Bantuan",close:"Tutup",actions:"Tindakan",total:"Total {{count}}",clear:"Bersihkan",paste:"Tempel",yes:"Ya",no:"Tidak"},z_={connected:"Terhubung",disconnected:"Terputus",notConnected:"Belum terhubung",comingSoon:"Segera hadir",connect:"Hubungkan dengan ChatGPT",disconnect:"Putuskan koneksi",apiKeyAuthenticated:"Diautentikasi dengan API key",chatGptAuthenticated:"Terhubung dengan ChatGPT",cliAuthenticated:"{{type}} CLI telah diautentikasi"},K_={closeWindow:{title:"Tutup Jendela",description:"Apa yang ingin Anda lakukan saat menutup jendela? Keluar dari aplikasi akan menghentikan semua tugas yang sedang berjalan dan tugas terjadwal.",remember:"Ingat pilihan saya",showWindow:"Tampilkan Jendela",minimizeToTray:"Minimalkan ke baki sistem",quitApp:"Keluar dari Aplikasi",preference:"Tutup Jendela",askEveryTime:"Tanya setiap saat"}},$_={title:"Gagal memuat halaman",subTitle:"Ini mungkin disebabkan oleh masalah jaringan atau pembaruan aplikasi.",genericTitle:"Terjadi kesalahan",genericSubTitle:"Terjadi kesalahan tak terduga saat merender halaman ini.",reload:"Muat ulang"},Q_={backToList:"Kembali",subtitle:"Kelola aplikasi yang terpasang atau perluas workspace Anda dari pasar aplikasi.",myApps:"Aplikasi Saya",officialApps:"Aplikasi Resmi",appMarket:"Pasar Aplikasi",browseOfficialApps:"Jelajahi Aplikasi Resmi",browseMarket:"Jelajahi Pasar Aplikasi",officialAppsEmpty:"Belum ada aplikasi resmi",searchOfficial:"Cari aplikasi resmi...",installedCount:"{{count}} aplikasi",clearFilters:"Hapus filter",moreActions:"Tindakan lainnya",openApp:"Buka aplikasi",noDescription:"Tidak ada deskripsi",search:"
199Cari aplikasi...",allCategories:"Semua",noApps:"Belum ada aplikasi yang terpasang",noResults:"Tidak ada aplikasi yang cocok dengan pencarian Anda",loadFailed:"Gagal memuat aplikasi. Silakan coba lagi.",appNotLoaded:"Aplikasi ini belum dimuat. Buka sekali dari bilah samping, lalu coba lagi.",uninstall:"Copot",uninstallConfirmTitle:"Copot aplikasi?",uninstallConfirmContent:'Tindakan ini akan menghapus direktori aplikasi "{{name}}" dan tidak dapat dibatalkan.',uninstallSuccess:"Aplikasi dicopot",uninstallFailed:"Gagal mencopot aplikasi",installing:"Menginstal",installSuccess:"Terinstal",installFailed:"Instalasi gagal",installedStatus:"Terpasang",update:"Perbarui",searchMarket:"Cari di pasar aplikasi...",marketFilters:"Filter pasar aplikasi",filterAll:"Semua",trending:"Sedang tren",marketEmpty:"Aplikasi tidak ditemukan",loadMore:"Muat lebih banyak",noMoreApps:"Tidak ada aplikasi lainnya",install:"Instal",details:"Detail",featured:"Unggulan",refreshApp:"Segarkan aplikasi",appRefreshed:"Aplikasi disegarkan",aboutApp:"Tentang aplikasi",exitApp:"Keluar dari aplikasi",moreOptions:"Opsi lainnya",backToListHint:"Kembali ke daftar aplikasi (ESC)",version:"Versi",id:"ID",category:"Kategori",description:"Deskripsi"},J_={chat:"Chat",files:"File",control:"Kontrol",channels:"Saluran",sessions:"Sesi",cronJobs:"Tugas Cron",heartbeat:"Heartbeat",agent:"Workspace",workspace:"File",skills:"Skill",skillPool:"Kumpulan Skill",marketplace:"Ekstensi",tools:"Tool",mcp:"MCP",acp:"ACP",agentConfig:"Konfigurasi",agents:"Manajemen Agen",settings:"Pengaturan",models:"Model",environments:"Environment",security:"Keamanan",tokenUsage:"Penggunaan Token",agentStats:"Statistik Agen",voiceTranscription:"Transkripsi Suara",debug:"Debug",plugins:"Plugin",pluginManager:"Manajer Plugin",backups:"Cadangan"},Y_={console:"Konsol",appStore:"App Store",appStoreDesc:"Pasang atau hapus aplikasi desktop",arrangeDesktop:"Rapikan desktop",approvalActionFailed:"Tindakan gagal, silakan coba lagi",booting:"Memulai…",changeWallpaper:"Ganti wallpaper",clearAll:"Bersihkan semua",closeApp:"Tutup",currentSpace:"Ruang saat ini",currentSpaceLabel:"Ruang saat ini: {{name}}",currentAppLabel:"Aplikasi saat ini: {{name}}",desktopApps:"Aplikasi desktop",finder:"Desktop",focusApp:"Fokus",install:"Pasang",installed:"terpasang",installedApp:"Terpasang",installedApps:"Aplikasi terpasang",launchpad:"Launchpad",moveDockLeft:"Pindahkan ke kiri",moveDockRight:"Pindahkan ke kanan",missionControl:"Mission Control",noInstalledApps:"Belum ada aplikasi terpasang",noNotifications:"Tidak ada notifikasi",noOpenWindows:"Tidak ada jendela terbuka di ruang ini",noSettings:"Tidak ada pengaturan tersedia",notInstalled:"belum terpasang",notifications:"Notifikasi",notificationSummary:"Persetujuan {{approvals}} · Kotak masuk {{inbox}}",notifyApproval:"Persetujuan",notifyInbox:"Kotak masuk",openApp:"Buka",keepInDock:"Pertahankan di Dock",removeFromDock:"Hapus dari Dock",refreshDesktop:"Segarkan desktop",appMarket:"Pasar aplikasi",appMarketRefresh:"Segarkan",appMarketSearch:"
199Cari aplikasi...",appMarketEmpty:"Aplikasi tidak ditemukan",appMarketUnavailable:"Pasar aplikasi sedang tidak tersedia. Silakan coba lagi nanti.",appMarketInstall:"Instal",appMarketDetails:"Detail",appMarketDeveloper:"Pengembang",appMarketDownloads:"Unduhan",appInstalled:"Aplikasi berhasil diinstal",appInstallFailed:"Instalasi aplikasi gagal",appCompatibilityWarningTitle:"Peringatan kompatibilitas aplikasi",appCompatibilityWarningContent:"Aplikasi ini ditujukan untuk QwenPaw {{labels}}, sedangkan versi QwenPaw saat ini adalah {{version}}. Instalasi dapat menyebabkan kesalahan. Lanjutkan?",appCompatibilityWarningConfirm:"Tetap instal",appCompatibilityUnverified:"Kompatibilitas dengan versi QwenPaw saat ini belum diverifikasi.",restoreAll:"Pulihkan semua",returnToConsole:"Kembali ke konsol",desktopMode:"Mode desktop",qwenpawMenu:"Menu QwenPaw",restoredAll:"Semua aplikasi dipulihkan",sortBy:"Urutkan berdasarkan",sortFree:"Susunan bebas",sortName:"Nama",sortType:"Jenis",systemSettings:"Pengaturan sistem",uninstall:"Copot",uninstallConfirmTitle:"Copot aplikasi?",uninstallFailed:"Gagal mencopot",uninstalledApp:"Dicopot",update:"Perbarui",wallpaper:"Wallpaper",windows:"jendela"},X_={changelog:"Catatan Perubahan",docs:"Dokumentasi",tutorial:"Tutorial",featureDemos:"Demo Fitur",faq:"FAQ",github:"GitHub",resources:"Dokumentasi",updateAvailable:"Pembaruan Tersedia"},Z_={dark:"Gelap",light:"Terang",system:"Sistem"},eL={newVersion:"Versi baru tersedia: v{{version}}, klik untuk meningkatkan",updateModal:{title:"Versi baru tersedia: v{{version}}",viewReleases:"Lihat Rilis",installDesktopUpdate:"Perbarui Sekarang",desktopInstallHint:"QwenPaw Desktop {{version}} siap dipasang. Aplikasi akan dimulai ulang setelah pembaruan.",checking:"Memeriksa pembaruan…",checkingHint:"Memeriksa versi terbaru",downloading:"Mengunduh pembaruan",downloadingTo:"Memperbarui ke versi {{version}}",downloadProgress:"{{done}} / {{total}} · {{rate}}",installing:"Memasang pembaruan",willRestart:"Aplikasi akan dimulai ulang otomatis setelah selesai.",stepPrepare:"Persiapan",stepDownloading:"Unduh",stepInstalling:"Pasang",failedTitle:"Pembaruan gagal",back:"Kembali",retry:"Coba Lagi",errors:{network:"Tidak dapat menjangkau server pembaruan. Periksa internet dan coba lagi.",signature:"Tanda tangan file pembaruan tidak valid. Coba unduh lagi.",appLocation:"QwenPaw berjalan dari lokasi macOS yang hanya-baca. Pindahkan QwenPaw.app ke folder Applications, jalankan dari sana, lalu coba perbarui lagi.",other:"Pembaruan gagal."},updateLater:"Unduh di Latar Belakang",backgroundDownloading:"Mengunduh di latar belakang…",readyToInstall:"Pembaruan siap",readyToInstallHint:"Pembaruan v{{version}} telah diunduh. Mulai ulang untuk memasang dan membuka versi baru.",restartNow:"Perbarui Sekarang",backgroundFailed:"Unduhan latar belakang gagal"},settings:{language:"Bahasa",theme:"Tema",mode:"Mode",desktopMode:"Mode Desktop"},simpleMode:"Mode sederhana",fullMode:"Mode lengkap",toggleAgentNavigation:"Buka atau tutup navigasi agen"},tL=JSON.parse('{"brand":{"title":"Administrasi Hub","subtitle":"Ruang kerja lokal","controlPlane":"Pusat kendali"},"navigation":{"workspace":"Ruang kerja","overview":"Operasi","runtimes":"Runtime","users":"Pengguna","credentials":"Kredensial","audit":"Catatan audit","settings":"Pengaturan sistem"},"actions":{"backToQwenPaw":"Kembali ke QwenPaw","useLightTheme":"Gunakan tema terang","useDarkTheme":"Gunakan tema gelap","signOut":"Keluar","start":"Mulai","stop":"Hentikan","disable":"Nonaktifkan","rebuild":"Bangun ulang","enableAndStart":"Aktifkan dan mulai"},"roles":{"admin":"Administrator","user":"Pengguna"},"userStates":{"active":"Aktif","disabled":"Nonaktif"},"runtimeStates":{"created":"Dibuat","starting":"Memulai","running":"Berjalan","stopped":"Dihentikan","failed":"Gagal"},"runtimePolicies":{"owner_allowed":"Pemilik dapat memulai kembali","admin_only":"Dikunci administrator"},"errors":{"actionFailed":"Tindakan gagal","createFailed":"Pembuatan gagal","updateFailed":"Pembaruan gagal","saveFailed":"Gagal menyimpan","pullTimedOut":"Waktu habis menunggu penarikan gambar"},"messages":{"runtimeCreated":"Runtime dibuat","accountCreated":"Akun dibuat","credentialStored":"Kredensial disimpan","settingsSaved":"Pengaturan hub disimpan","imagePulled":"Tarikan gambar Docker selesai"},"validation":{"required":"Bidang ini wajib diisi","runtimeIdInvali
199d":"Gunakan 1–64 huruf, angka, titik, garis bawah, atau tanda hubung, dimulai dengan huruf atau angka","passwordMin":"Kata sandi harus mengandung setidaknya delapan karakter","credentialNameInvalid":"Gunakan nama variabel lingkungan dengan huruf besar, seperti OPENAI_API_KEY"},"runtimes":{"eyebrow":"Administrasi Hub","title":"Ringkasan runtime","description":"Setiap pengguna memiliki runtime terpisah; file dan kuncinya tidak tercampur.","newRuntime":"Runtime baru","managed":"Runtime terkelola","localBoundaries":"Batasan proses lokal","runningNow":"Sedang berjalan","needsAttention":"{{count}} runtime perlu diperhatikan","healthy":"Semua runtime dalam kondisi normal","isolationPolicy":"Kebijakan isolasi","available":"Tersedia","unavailable":"Tidak tersedia","failClosed":"Blokir saat gagal","noFallback":"Tidak berjalan tanpa sandbox","executionBlocked":"Runtime tidak dapat dijalankan","isolationTitle":"Isolasi lokal yang memblokir saat gagal","isolationDescription":"Seluruh pohon proses runtime di-sandbox. Jika pemeriksaan isolasi asli gagal, QwenPaw menolak untuk memulainya.","unavailableTitle":"Backend runtime yang aman tidak tersedia","unavailableDescription":"{{provisioner}} tidak tersedia: {{reason}} Periksa instalasi backend, status berjalan, dan konfigurasi sistem, lalu mulai ulang QwenPaw Hub.","unavailableUserDescription":"Backend runtime sementara tidak tersedia. Hubungi administrator.","preflightFailed":"Pemeriksaan keamanan gagal.","localEndpoint":"Titik akhir lokal · {{endpoint}}","provisioner":"Jenis eksekusi","localExecution":"Isolasi lokal","dockerExecution":"Kontainer Docker","security":"Keamanan","tenant":"Tenant","removeTitle":"Hapus {{id}}?","removeDescription":"Pendaftaran dihapus; data runtime dipertahankan.","disableTitle":"Nonaktifkan {{id}}?","disableDescription":"Proses akan berhenti dan pemilik tidak dapat memulai ulang hingga administrator mengaktifkannya.","rebuildTitle":"Bangun kembali {{id}} dengan gambar saat ini?","rebuildDescription":"Wadah akan diganti menggunakan gambar di pengaturan sistem. Ruang kerja persisten, rahasia, dan cadangan dipertahankan.","emptyTitle":"Belum ada runtime","emptyDescription":"Buat runtime QwenPaw lokal pertama yang terisolasi."},"users":{"eyebrow":"Identitas dan akses","title":"Akses pengguna","description":"Buat akun lokal, tetapkan akses administratif, dan cabut sesi dari satu tempat.","addAccount":"Tambahkan akun","publicRegistration":"Pendaftaran publik","publicRegistrationDescription":"Jika dinonaktifkan, hanya administrator yang dapat membuat akun.","currentAccountProtected":"Akun saat ini dilindungi","empty":"Tidak ada pengguna yang cocok dengan filter ini"},"credentials":{"eyebrow":"Penyimpanan kredensial per tenant","title":"Kredensial","description":"Simpan kunci penyedia di dalam cakupan penyewa atau runtime eksplisit. Nilai rahasia dienkripsi dan tidak pernah dikembalikan oleh API.","storeCredential":"Simpan kredensial","updated":"Diperbarui {{date}}","deleteTitle":"Hapus {{name}}?","deleteDescription":"Runtime yang menggunakan kredensial ini mungkin berhenti berfungsi.","emptyTitle":"Belum ada kredensial","emptyDescription":"Simpan kunci API untuk tenant atau runtime tertentu.","encrypted":"Dienkripsi saat disimpan; nilai aslinya tidak dapat dibaca"},"overview":{"eyebrow":"Kokpit operasi","title":"Ikhtisar operasi hub","description":"Pahami kesehatan Hub menggunakan status runtime nyata, sumber daya host, dan peristiwa audit.","availability":"Ketersediaan runtime","availabilityDetail":"{{running}} dari {{total}} runtime sedang online","totalRuntimes":"Total runtime","failedCount":"{{count}} runtime perlu diperhatikan","totalUsers":"Pengguna Hub","managedLocally":"Identitas lokal dan manajemen akses","hostResources":"Sumber daya host","liveSnapshot":"Cuplikan langsung saat ini","memory":"Memori","dataDisk":"Disk data","recentActivity":"Aktivitas terkini","auditBacked":"Didukung oleh log audit yang persisten","systemHealthy":"Semua sistem beroperasi","systemDegraded":"Sistem terdegradasi","localIsolation":"Eksekusi terisolasi lokal"}
199,"table":{"searchRuntimes":"Cari runtime, pemilik, atau titik akhir","searchUsers":"Cari nama pengguna atau ID pengguna","searchCredentials":"Cari nama atau cakupan kredensial","searchAudit":"Cari aktor atau sumber daya","allStates":"Semua status","allOwners":"Semua pemilik","allExecutions":"Semua jenis eksekusi","allRoles":"Semua peran","allUserStates":"Semua status pengguna","allScopes":"Semua cakupan","allActions":"Semua tindakan","runtime":"Runtime","status":"Status","owner":"Pemilik","endpoint":"Titik akhir","execution":"Eksekusi","updated":"Diperbarui","user":"Pengguna","role":"Peran","created":"Dibuat","credential":"Kredensial","scope":"Cakupan","event":"Peristiwa","actor":"Aktor","resource":"Sumber daya","result":"Hasil","time":"Waktu","total":"item {{total}}"},"audit":{"eyebrow":"Keamanan dan pemerintahan","title":"Catatan audit","description":"Tinjau siapa yang melakukan setiap tindakan pengelolaan Hub, target, hasil, dan waktunya. Nilai-nilai sensitif tidak pernah diaudit.","empty":"Belum ada peristiwa pengelolaan"},"settings":{"eyebrow":"Konfigurasi platform","title":"Pengaturan sistem","description":"Kelola konfigurasi Hub lengkap dari satu sumber kebenaran yang diaudit. Perubahan akan segera berlaku dan tetap ada meskipun dimulai ulang.","save":"Simpan pengaturan","meta":"Revisi {{revision}}
199 · Diperbarui {{date}}","tabs":{"access":"Keamanan akses","runtime":"Waktu proses"},"access":{"title":"Akses dan registrasi","description":"Konfigurasikan alamat Hub dan kebijakan akun publik yang dapat dijangkau browser.","publicBaseUrl":"URL basis publik","publicBaseUrlHint":"Digunakan untuk panggilan balik OAuth. Biarkan kosong hanya untuk penerapan loopback saja.","registration":"Pendaftaran publik","registrationHint":"Jika dinonaktifkan, hanya administrator yang dapat membuat akun.","defaultRole":"Peran pendaftaran default","defaultRoleHint":"Akun yang didaftarkan sendiri selalu menjadi pengguna biasa demi keamanan."},"security":{"title":"Perlindungan otentikasi","description":"Batasi penyalahgunaan login dan registrasi dan blokir alamat atau jaringan.","ipBlacklist":"Daftar hitam IP","ipBlacklistHint":"Mendukung IPv4, IPv6 dan CIDR; tekan Enter setelah setiap nilai.","trustedProxyIps":"Proksi terbalik tepercaya","trustedProxyIpsHint":"X-Forwarded-For hanya dipercaya jika dikirim melalui alamat ini.","loginRateLimit":"Batas kecepatan login gagal","loginRateLimitHint":"Blokir sementara upaya masuk yang gagal berulang kali dari satu alamat.","registrationRateLimit":"Batasan tarif pendaftaran","registrationRateLimitHint":"Batasi semburan pembuatan akun baru dari satu alamat.","maxAttempts":"Upaya maksimal","windowSeconds":"Jendela (detik)","blockSeconds":"Durasi blok (detik)"},"runtime":{"title":"Kebijakan waktu proses","description":"Pilih backend waktu proses. Runtime yang ada akan aktifkan ulang berikutnya.","provisioner":"Bagian belakang waktu proses","localBackend":"Proses lokal","localBackendHint":"Menjalankan proses terisolasi langsung di host ini.","dockerBackend":"wadah Docker","dockerBackendHint":"Menjalankan setiap akun dalam wadah terkelola.","backendUnavailable":"Tidak tersedia di host ini","localIsolationHint":"Mode lokal menggunakan proses host dan tidak menggunakan pengaturan gambar Docker apa pun.","dockerIsolationHint":"Mode Docker menerapkan kebijakan gambar dan sumber daya di bawah ini untuk setiap akun."},"docker":{"title":"kebijakan Docker","description":"Kelola gambar, perilaku penarikan, dan batas sumber daya per kontainer secara terpusat. Pengguna tidak dapat mengabaikan pengaturan ini.","unavailable":"Mesin Docker tidak tersedia","source":"Sumber gambar","dockerHub":"Hub Docker Resmi","aliyunAcr":"Registri resmi Alibaba Cloud","custom":"Gambar khusus","customHint":"Masukkan referensi gambar apa pun yang diizinkan oleh kebijakan.","customRegistry":"Registri khusus atau referensi gambar","localHost":"Gambar lokal","localHostHint":"Gunakan tag gambar yang sudah ada di host ini.","noLocalImages":"Tidak ditemukan gambar lokal yang diberi tag","image":"Gambar dan tag","selectLocalImage":"Pilih tag gambar lokal","selectedImage":"Gambar yang efektif","repository":"Gudang","localStatus":"Status lokal","downloaded":"Diunduh","notDownloaded":"Tidak diunduh","pullPolicy":"Kebijakan penarikan otomatis","ifNotPresent":"Tarik ketika hilang secara lokal","always":"Tarik sebelum kreasi pertama","never":"Gunakan gambar lokal saja","pullImage":"Tarik gambar sekarang","localImages":"Referensi gambar lokal {{count}}","resources":"Batasan sumber daya kontainer","cpuLimit":"inti CPU","memoryLimit":"Memori (MB)","pidsLimit":"Proses maksimal","shmSize":"Memori bersama (MB)"},"quotas":{"title":"Kapasitas waktu proses global","description":"Setiap penyewa memiliki satu runtime; ini membatasi runtime serentak di seluruh Hub.","maxRunningRuntimes":"Waktu proses berjalan maksimum","unlimitedHint":"Kosong artinya tidak terbatas."}},"auditActions":{"runtime":{"create":"Waktu proses yang dibuat","start":"Waktu proses dimulai","stop":"Menghentikan waktu proses","disable":"Waktu proses dinonaktifkan","rebuild":"Waktu proses yang dibangun kembali","delete":"Waktu proses dihapus"},"image":{"pull":"Menarik gambar Docker"},"user":{"create":"Pengguna yang dibuat","update":"Pengguna yang diperbarui"},"credential":{"store":"Kredensial yang disimpan","delete":"Kredensial dihapus"},"settings":{"update":"Pengaturan Hub yang diperbarui"},"auth":{"register":"Pengguna Hub Terdaftar"}},"auditOutcomes":{"success":"Kesuksesan","failure":"Kegagalan"},"runtimeForm":{"title":"Buat waktu proses","hint":"Waktu proses dimulai di dalam kotak pasir lokal asli. File, rahasia, dan pohon prosesnya tetap terpisah dari pengguna lain.","runtimeId":"ID Waktu Proses","startImmediately":"Mulai segera","submit":"Buat waktu proses"},"userForm":{"title":"Tambahkan akun","hint":"Gunakan kata sandi sementara dengan minimal delapan karakter. Pengguna hanya dapat mengakses runtime yang dimiliki oleh penyewa pribadinya.","username":"Nama pengguna","temporaryPassword":"Kata sandi sementara","role":"Peran","submit":"Buat akun"},"credentialForm":{"title":"Simpan kredensial","hint":"Cakupan penyewa berlaku untuk semua waktu proses Anda. Lingkup waktu proses adalah penggantian pribadi untuk satu proses yang dipilih.","scope":"Cakupan","allRuntimes":"Semua runtime saya","environmentName":"Nama lingkungan","secretValue":"Nilai rahasia","submit":"Enkripsi dan simpan"}}'),aL={title:"Masuk ke QwenPaw",registerTitle:"Buat Akun",firstUserHint:"Buat akun admin untuk memulai",usernamePlaceholder:"Nama pengguna",passwordPlaceholder:"Kata sandi",usernameRequired:"Masukkan nama pengguna",passwordRequired:"Masukkan kata sandi",submit:"Masuk",register:"Daftar",failed:"Gagal masuk, periksa kredensial Anda",registerSuccess:"Pendaftaran berhasil",registerFailed:"Pendaftaran gagal",authNotEnabled:"Autentikasi tidak diaktifkan",logout:"Keluar",logoutSuccess:"Berhasil keluar",sessionExpired:"Sesi berakhir, silakan masuk lagi",unauthorized:"Tidak berwenang, silakan masuk"},nL={groups:{cronShort:"Terjadwal",subagentShort:"Subagen"},fileReference:{codeSnippet:"Cuplikan kode · {{count}} baris"}
199,modelSelectTooltip:"Pilih model",newChatTooltip:"Chat baru",searchTooltip:"Cari semua chat",chatHistoryTooltip:"Riwayat chat",wideModeTooltip:"Mode lebar",normalModeTooltip:"Mode normal",messageDisplay:{stepsRunning:"Berjalan… · {{count}} langkah",stepsCanceled:"Dibatalkan · {{count}} langkah",stepsFailed:"Gagal · {{count}} langkah",stepsCompleted:"Selesai {{count}} langkah"},allChats:"Semua Chat",createNewChat:"Buat Chat Baru",pinDrawer:"Sematkan",unpinDrawer:"Lepas sematan",statusIdle:"Idle",statusInProgress:"Sedang berjalan",disclaimer:"Bekerja untuk Anda, berkembang bersama Anda",greeting:"Halo, apa yang bisa saya bantu hari ini?",description:"Saya asisten yang dapat membantu menjawab pertanyaan Anda.",prompt1:"Mari mulai perjalanan baru!",prompt2:"Bisa jelaskan skill apa saja yang Anda miliki?",inputPlaceholder:'"↑↓" untuk navigasi pesan · "/" untuk perintah cepat',longTextUploadPrompt:"Harap baca file prompt yang diunggah dan jawab berdasarkan isinya.",emptyOutputError:"Asisten mengembalikan respons kosong.",commands:{clear:{description:"Bersihkan konteks percakapan"},compact:{description:"Ringkas konteks percakapan; instruksi opsional didukung"},approve:{description:"Setujui tindakan tool yang tertunda dan lanjutkan eksekusi"},deny:{description:"Tolak tindakan tool yang tertunda"},mission:{description:"Mode Mission — Memecah tugas ke sub-agen dengan konteks terisolasi"},skills:{description:"Tampilkan skill yang tersedia untuk chat dan perintah skill eksplisit"},agents:{description:"Tampilkan agen yang tersedia di runtime saat ini"},review:{description:"Tinjau perubahan ruang kerja yang belum di-commit dengan Codex"},status:{description:"Tampilkan akun agen, model, dan ruang kerja saat ini"},goal:{description:"Loop Goal — Agen mengejar tujuan secara terus-menerus, evaluasi otomatis via Rubric"}},attachments:{tooltip:"Mendukung dokumen, gambar, video, audio, dan format lain",tooltipImageOnly:"Model saat ini hanya mendukung unggahan gambar",tooltipNoMultimodal:"Kemampuan multimodal tidak terdeteksi untuk model saat ini. Gambar atau video mungkin tidak diproses dengan benar",fileSizeLimit:"Satu file hingga {{limit}}MB",fileSizeExceeded:"Ukuran file melebihi batas {{limit}}MB. File saat ini: {{size}}MB",multimodalDisabled:"Model saat ini tidak mendukung unggahan file",multimodalWarning:"Kemampuan multimodal tidak terdeteksi untuk model saat ini, gambar atau video mungkin tidak diproses dengan benar",imageOnlyAccept:"Model saat ini hanya mendukung file gambar",imageOnlyWarning:"Model saat ini hanya mendukung gambar, file non-gambar seperti video mungkin tidak diproses dengan benar"},rateLimitHit:"Model saat ini terkena batas laju. Coba beralih ke model gratis lainnya.",turnUsagePopover:{ariaLabel:"Lihat token giliran dan penggunaan konteks",turn:"Giliran ini",turnEstimated:"Giliran ini ~",tok:"tok",inOut:"in {{inTok}} · out {{outTok}}",contextLabel:"Jendela konteks:",outerRing:"Outer ring",cacheLabel:"Cache hit rate",centerValue:"Center",cacheTokens:"hit {{readTok}} / input {{inputTok}}",manageContext:"Kelola konteks",compact:"Kompres",new:"Obrolan baru"},rateLimitMessage:"Batas laju tercapai. Beralih ke model gratis lain:",rateLimitSwitched:"Beralih ke {{model}}",speech:{startRecording:"Mulai rekaman suara (Ctrl+Shift+M)",stopRecording:"Hentikan rekaman (Ctrl+Shift+M)",transcribing:"Mentranskripsi...",transcriptionDisabled:"Transkripsi dinonaktifkan. Konfigurasi provider di Pengaturan > Transkripsi Suara.",transcriptionFailed:"Transkripsi suara gagal",microphoneError:"Tidak dapat mengakses mikrofon",fileTooLarge:"File rekaman terlalu besar ({{size}}MB). Maksimum: {{limit}}MB",recordingTooLong:"Rekaman melebihi batas durasi ({{limit}}s)"},search:{title:"Cari Chat",tooltip:"Cari chat saat ini",placeholder:"Cari pesan...",noResults:"Tidak ada hasil",resultsCount:"Ditemukan {{count}} hasil",searching:"Mencari {{progress}}...",loading:"Memuat...",userMessage:"Pengguna",assistantMessage:"Asisten",titleMatch:"Judul"},contextMenu:{open:"Buka",rename:"Ganti nama",pin:"Sematkan",unpin:"Lepas sematan",delete:"Hapus"},queue:{title:"Antrean pesan",paused:"Dijeda",sendFailed:"Gagal mengirim",resume:"Lanjutkan antrean",pause:"Jeda antrean",clear:"Hapus antrean",dragSort:"Seret untuk mengurutkan",edit:"Edit",retry:"Coba lagi",skip:"Lewati",interruptAndSend:"Hentikan & kirim",delete:"Hapus",file:"File",n
199oChatWarning:"Kirim pesan terlebih dahulu untuk membuat percakapan sebelum menggunakan antrean",queueFull:"Antrean penuh (maks. {{max}} item). Kirim atau hapus beberapa pesan terlebih dahulu",otherTabOwner:"This tab queues only; sending is handled by another tab"},group:{pinned:"Disematkan",today:"Hari ini",week:"7 hari terakhir",month:"30 hari terakhir",older:"Sebelumnya"},sessionPanel:{searchConversations:"Cari…",noResults:"Tidak ada hasil",noConversations:"Tidak ada percakapan",loadingConversations:"Memuat…"},conversationHistory:"Riwayat Percakapan",history:{empty:"Tidak ada riwayat obrolan"},sessionGroup:{today:"Hari ini",recent:"7 hari terakhir",earlier:"Sebelumnya"}},oL={selectModel:"Pilih model",noConfiguredModels:"Tidak ada model yang dikonfigurasi",noFreeModels:"Tidak ada model gratis tersedia",switchFailed:"Gagal mengganti model",searchModels:"Cari model...",noModelsFound:"Tidak ada model yang cocok",free:"Gratis",vision:"Visi",freeBannerText:"Model gratis mungkin memiliki batas penggunaan dan tidak stabil. Lihat penyedia untuk detail.",moreProviders:"Lebih banyak penyedia gratis (perlu API Key)",proBannerText:"Menampilkan model yang dikonfigurasi di Pengaturan.",connectToUse:"Hubungkan {{provider}} untuk model gratis",configureApiKey:"Konfigurasi API Key {{provider}} untuk model gratis",configureApiKeyTitle:"Buka Halaman Konfigurasi",configureApiKeyConfirm:"Anda akan diarahkan ke halaman Model untuk mengonfigurasi API Key {{provider}}. Lanjutkan?",goToConfigure:"Buka Konfigurasi",noModelsDiscovered:"Terhubung. Memuat model...",oauthTitle:"Hubungkan ke {{provider}}",oauthDescription:"Jendela browser baru akan terbuka untuk mengotorisasi akses ke {{provider}}. Kunci API akan disimpan secara otomatis.",oauthContinue:"Lanjutkan",oauthWaiting:"Menunggu otorisasi...",oauthWaitingDescription:"Silakan selesaikan otorisasi di jendela browser.",oauthConnected:"Berhasil terhubung ke {{provider}}",oauthFailed:"Otorisasi gagal, silakan coba lagi",oauthTimeout:"Otorisasi habis waktu, silakan coba lagi",viewMore:"Lihat lebih ({{count}})"},iL=JSON.parse('{"parent":"Pengaturan","agents":"Agen","management":"Manajemen Agen","pageDescription":"Buat, konfigurasi, dan kelola beberapa agen AI dengan workspace dan identitas khusus.","name":"Nama","id":"ID","description":"Deskripsi","workspace":"Path Workspace","backend":{"column":"Backend","eyebrow":"Arsitektur agen","typeTitle":"Pilih cara agen ini bekerja","typeDescription":"Jenis agen mengontrol setiap percakapan Chat, Coding, dan Channel.","nativeTitle":"Agen native QwenPaw","nativeBadge":"Native","nativeDescription":"Menggunakan LLM, Skills, alat, memori, dan runtime QwenPaw yang telah Anda konfigurasi.","thirdPartyTitle":"Agen pihak ketiga","thirdPartyBadge":"Pihak ketiga","thirdPartyDescription":"Menggunakan runtime agen eksternal yang telah diotorisasi, bukan model QwenPaw.","providerTitle":"Pilih agen pihak ketiga","providerDescription":"Autentikasi digunakan bersama di perangkat ini; proyek dan percakapan tetap terisolasi untuk setiap agen.","codexHint":"ChatGPT OAuth · Ruang kerja agen","qoderHint":"Akun Qoder atau PAT · Ruang kerja agen","account":"Akun Codex","qoderAccount":"Akun Qoder","binary":"File executable Codex","binaryHelp":"Kosongkan untuk memprioritaskan Codex CLI bawaan Python SDK dan mendeteksi instalasi mandiri. Jika diisi, masukkan path lengkap ke codex di macOS/Linux atau codex.exe di Windows. Biner bawaan aplikasi ChatGPT atau ekstensi editor tidak didukung. QwenPaw juga membaca CODEX_BINARY dan PATH backend.","binaryPlaceholder":"Deteksi otomatis atau tempel path executable Codex","qoderBinary":"File executable Qoder","qoderBinaryHelp":"Kosongkan untuk memakai qodercli yang disertakan dalam SDK Python atau mendeteksi instalasi yang ada. Jika diisi, masukkan path lengkap ke qodercli di macOS/Linux atau qodercli.exe di Windows. QwenPaw juga membaca QODERCLI_PATH dan PATH backend.","qoderBinaryPlaceholder":"Deteksi otomatis atau tempel path qodercli","detect":"Deteksi","detectedBinary":"Codex terdeteksi","qoderDetectedBinary":"Qoder terdeteksi","apiKeyLoginHint":"Anda juga dapat melakukan autentikasi di terminal dengan: codex login --with-api-key","qoderAuthHint":"Hubungkan akan membuka login Qoder di browser. Anda juga dapat menjalankan qodercli login atau mengatur QODER_PERSONAL_ACCESS_TOKEN sebelum memulai backend.","qoderConnect":"Hubungkan ke Qoder","model":"Model agen","modelDefault":"Gunakan default agen","defaultBadge":"Default","reasoningEffort":"Tingkat pe
199nalaran","reasoningDefault":"Gunakan default model","codexNotFound":"Runtime Codex tidak ditemukan. Instal qwenpaw[codex] atau sediakan Codex CLI mandiri.","qoderNotFound":"Runtime Qoder tidak ditemukan. Instal qwenpaw[qoder] atau sediakan qodercli.","chatSettingsHint":"Pilih model, tingkat penalaran, dan izin eksekusi dari bilah alat Chat.","capabilityTitle":"Kemampuan QwenPaw","inheritedSkills":"Keahlian","inheritedMcp":"Server MCP","runtimeInherited":"Diwarisi saat runtime · sesi baru","notSupported":"Tidak didukung penyedia ini","policyCompatibility":"Kebijakan MCP","toolAllowlistSupported":"Daftar izin alat didukung","policyLimited":"Berlaku batasan penyedia","chatModelHint":"Pengaturan per agen · diterapkan pada giliran berikutnya","appliesNextTurn":"Diterapkan pada giliran berikutnya","approvalMode":"Izin eksekusi","approvalPresets":{"ask":{"name":"Tanyakan sebelum perubahan","description":"Izinkan perubahan ruang kerja dan tanyakan sebelum tindakan dengan hak akses lebih tinggi."},"read-only":{"name":"Hanya baca","description":"Periksa file tanpa mengubahnya."},"workspace":{"name":"Akses ruang kerja","description":"Izinkan perubahan ruang kerja tanpa konfirmasi."},"accept-edits":{"name":"Terima edit","description":"Izinkan pengeditan file sambil mempertahankan perlindungan lain."},"plan":{"name":"Hanya rencana","description":"Analisis dan rencanakan tanpa mengubah file."},"auto":{"name":"Otomatis","description":"Biarkan Qoder menentukan tindakan aman yang dapat dijalankan."},"full-access":{"name":"Akses penuh","description":"Izinkan eksekusi lokal tanpa batasan dan tanpa konfirmasi."}}},"create":"Buat Agen","createTitle":"Buat Agen Baru","createSuccess":"Agen berhasil dibuat","createFailed":"Gagal membuat agen","edit":"Edit","editTitle":"Edit Agen - {{name}}","updateSuccess":"Agen berhasil diperbarui","updateFailed":"Gagal memperbarui agen","delete":"Hapus","deleteConfirm":"Konfirmasi Hapus Agen","deleteConfirmDesc":"Agen tidak akan tersedia setelah dihapus, tetapi file workspace tetap disimpan","deleteSuccess":"Agen berhasil dihapus","deleteFailed":"Gagal menghapus agen","selectAgent":"Pilih Agen","defaultDisplayName":"Agen Default","currentWorkspace":"Agen Saat Ini","switchSuccess":"Agen berhasil diganti","switchFailed":"Gagal mengganti agen","loadFailed":"Gagal memuat daftar agen","loadConfigFailed":"Gagal memuat konfigurasi agen","saveFailed":"Gagal menyimpan agen","idRequired":"Masukkan ID agen","idLabel":"ID Agen (opsional)","idHelp":"Kosongkan untuk dibuat otomatis. Hanya huruf, angka, tanda hubung, dan garis bawah.","idPattern":"ID hanya boleh berisi huruf, angka, garis bawah, dan tanda hubung","idPlaceholder":"contoh: agen-saya","nameRequired":"Masukkan nama agen","namePlaceholder":"contoh: Agen Saya","descriptionPlaceholder":"Jelaskan singkat tujuan agen ini...","workspaceHelp":"Kosongkan untuk dibuat otomatis di ~/.qwenpaw/workspaces/<id>","defaultNotEditable":"Agen default tidak dapat diedit","defaultNotDeletable":"Agen default tidak dapat dihapus","disable":"Nonaktifkan","enable":"Aktifkan","disabled":"Nonaktif","disableSuccess":"Agen berhasil dinonaktifkan","enableSuccess":"Agen berhasil diaktifkan","toggleFailed":"Gagal mengubah status agen","enableAgent":"Aktifkan {{name}}","disableAgent":"Nonaktifkan {{name}}","disabledAgents":"Dinonaktifkan ({{count}})","pinnedAgents":"Disematkan","otherAgents":"Agen lainnya","pinned":"Disematkan","defaultPinned":"Agen default selalu disematkan","longPressToPin":"Tekan lama untuk menyematkan","longPressToUnpin":"Tekan lama untuk melepas","pinAgent":"Sematkan agen","unpinAgent":"Lepas sematan agen","pinSuccess":"Agen disematkan","unpinSuccess":"Sematan agen dilepas","pinFailed":"Gagal memperbarui status sematan","status":{"disabled":"Dinonaktifkan","pending":"Menunggu dimulai","starting":"Memulai","running":"Berjalan","failed":"Gagal memulai","waitUntilStarted":"Tersedia setelah proses mulai selesai"},"defaultNotDisablable":"Agen default tidak dapat dinonaktifkan","initialSkills":"Skill Awal","selectAll":"Semua","selectBuiltin":"Bawaan","selectNone":"Tidak ada","model":"Model","modelHelp":"Tetapkan model LLM khusus untuk agen ini. Kosongkan untuk memakai default global.","modelPlaceholder":"Gunakan default global","noConfiguredModels":"Tidak ada model yang dikonfigurasi","modelColumn":"Model","copyTooltip":"Salin konfigurasi agen","copyDefaultTooltip":"Salin menggunakan agen default sebagai templat","copyTitle":"Salin Konfigurasi Agen","copyNameLabel":"Nama agen baru","copyOptionsLabel":"Konten yang disalin","copyOptionAgentJson":"agent.json (wajib)","copyOptionAgentJsonHint":"Selalu menyalin konfigurasi sumber yang telah diurai dan mereset ID, nama, workspace, serta channels. Ini bukan salinan byte-per-byte dari agent.json di disk.","copyOptionMdFiles":"AGENTS / SOUL / PROFILE / HEARTBEAT / BOOTSTRAP.md","copyOptionSkills":"skills/ + manifest","copyOptionJobs":"jobs.json","copyOptionJobsHint":"Hanya menyalin definisi tugas, tanpa riwayat. Agen baru akan segera menjalankannya sesuai jadwal setelah dibuat.","copySuccess":"Konfigurasi agen berhasil disalin","copyFailed":"Gagal menyalin konfigurasi agen","mailManagement":"Manajemen Email","mailModeNone":"Tanpa manajemen email","mailModePersonal":"Kelola kotak surat pribadi Anda","mailModeDedicated":"Siapkan kotak surat khusus untuk agen","mailName":"Nama kotak surat","mailNameOptional":"Nama kotak surat (opsional)","mailDomain":"Domain email","mailPassword":"Kata sandi","mailPhone":"Nomor telepon","mailAuthCode":"Kode otorisasi 16 digit","mailNameRequired":"Silakan masukkan nama kotak surat","mailPasswordRequired":"Silakan masukkan kata sandi","mailPhoneRequired":"Silakan masukkan nomor telepon","mailAuthCodeRequired":"Silakan masukkan kode otorisasi","mailAuthCodeLength":"Kode otorisasi harus 16 karakter","mailDomainRequired":"Silakan pilih domain email","mailDomainInvalid":"Masukkan domain email yang valid, mis. mycompany.com","mailDomainPlaceholder":"Pilih atau masukkan domain email","mailProvider":"Penyedia email","mailProviderRequired":"Silakan pilih penyedia email","mailProviderPlaceholder":"Pilih penyedia yang menghosting domain ini","mailProviderTencentExmail":"Tencent Exmail","mailProviderAliyunQiye":"Alibaba Enterprise Mail","mailProviderNeteaseQiye":"Netease Enterprise Mail","mailCredentialLabel":"Kredensial","mailCredentialRequired":"Silakan masukkan kredensial","mailCredentialHintAuthCode":"Masukkan kode otorisasi 16 digit yang dibuat di pengaturan kotak surat","mailCredentialHintGmail":"Masukkan sandi khusus aplikasi Gmail 
199(perlu mengaktifkan Verifikasi 2 Langkah)","mailCredentialHintAliyun":"Masukkan kata sandi login kotak surat","mailCredentialHintEnterprise":"Masukkan kata sandi khusus klien atau kata sandi login kotak surat","mailPushTitle":"Respons otomatis email baru","mailAccessControl":"Kontrol akses email","mailAccessControlTip":"Jika diaktifkan, email dari pengirim tak dikenal memerlukan persetujuan sebelum diproses","mailPushModeOff":"Nonaktif","mailPushModeRulesOnly":"Hanya aturan","mailPushModeRulesThenAgent":"Aturan + bangunkan sesuai kebutuhan","mailPushModeAgentAll":"Bangunkan untuk setiap email","mailPushModeOffDesc":"Tidak memproses email baru secara otomatis","mailPushModeRulesOnlyDesc":"Proses email baru hanya dengan aturan di bawah, tanpa membangunkan agen","mailPushModeRulesThenAgentDesc":"Terapkan aturan lebih dulu; bangunkan agen hanya saat aksi bangunkan cocok","mailPushModeAgentAllDesc":"Bangunkan agen untuk setiap email baru dan biarkan agen memutuskan cara menanganinya secara mandiri","mailPushModeLegacySuffix":" (versi lama)","mailPushFieldFrom":"Pengirim","mailPushFieldSubject":"Subjek","mailPushFieldContent":"Konten","mailPushFieldKeyword":"Kata kunci","mailPushActionMarkRead":"Tandai sudah dibaca","mailPushActionMove":"Pindahkan ke folder","mailPushActionNotify":"Hanya beri notifikasi","mailPushActionWakeAgent":"Bangunkan agen","mailPushContainsPlaceholder":"Berisi teks","mailPushParamMovePlaceholder":"Folder tujuan","mailPushParamWakePlaceholder":"Instruksi tambahan (opsional)","mailPushParamRequired":"Silakan isi folder tujuan","mailPushAddRule":"Tambah aturan","mailPushWakeOptionInvoice":"Unduh dan arsipkan lampiran email faktur/tagihan","mailPushWakeOptionReply":"Balas email pertanyaan dengan sopan","mailPushWakeOptionOtp":"Ekstrak kode verifikasi dan beri tahu saya","mailPushWakeOptionSummary":"Rangkum poin email ke kotak masuk"}'),sL={title:"Skill",description:"Kelola skill dan kemampuan agen.",preload:"Pramuat",preloadHint:"Saat diaktifkan, agen memuat skill ini lebih awal sehingga tidak perlu mencari dan memuatnya lagi selama percakapan.",qwenpawManaged:"Dikelola QwenPaw",qwenpawManagedHint:"Dapat diedit dan diproyeksikan ke agen pihak ketiga yang didukung saat runtime.",providerManaged:"Skill agen pihak ketiga",providerManagedHint:"Ditemukan dari agen pihak ketiga saat ini dan ditampilkan hanya-baca.",providerOnly:"Hanya agen pihak ketiga saat ini",readOnly:"Hanya baca",noDescription:"Tidak ada deskripsi.",providerSkillDetails:"Detail Skill agen pihak ketiga",providerManagedDetailHint:"Skill ini dikelola oleh agen pihak ketiga. QwenPaw dapat menampilkan dan menggunakannya, tetapi tidak dapat mengubahnya.",provider:"Agen pihak ketiga",scope:"Cakupan",statusLabel:"Status",descriptionLabel:"Deskripsi",importHub:"Unggah via URL",supportedSources:"Sumber yang didukung:",importSkills:"Impor Skill",enterSkillUrl:"Masukkan URL Skill",invalidUrl:"URL tidak valid",type:"Tipe",installedFrom:"Diinstal dari",source:"Sumber",path:"Path",tags:"Tag",builtin:"Bawaan",custom:"Kustom",addSkill:"Tambah Skill",createSkill:"Buat Skill",viewSkill:"Lihat Skill",editSkill:"Edit Skill",skillName:"Nama Skill",skillContent:"Konten Skill",pleaseInputName:"Masukkan nama skill",pleaseInputContent:"Masukkan konten skill",createSuccess:"Skill berhasil dibuat",createFailed:"Gagal membuat skill",deleteConfirm:"Yakin ingin menghapus skill ini?",deleteSuccess:"Skill berhasil dihapus",deleteFailed:"Gagal menghapus skill",batchEnable:"Aktifkan",batchDisable:"Nonaktifkan",selectedCount:"{{count}} dipilih",updateSuccess:"Skill berhasil diperbarui",updateFailed:"Gagal memperbarui skill",create:"Buat",optimizeWithAI:"Optimalkan dengan AI",stopOptimize:"Berhenti",uploadSkill:"Unggah Skill",uploadZip:"Unggah via ZIP",downloadFromPool:"Muat dari Kumpulan Skill",channels:"Saluran",allChannels:"Semua",lastUpdated:"Diperbarui",searchPlaceholder:"Filter berdasarkan nama",listView:"Tampilan daftar",gridView:"Tampilan grid",enabledSkills:"Skill Aktif",disabledSkills:"Skill Nonaktif",active:"aktif"},rL={description:"Kumpulan skill lokal bersama untuk skill bawaan dan unggahan workspace.",broadcast:"Sebarkan ke Agen",broadcastHint:"Sebarkan skill ke agen yang dipilih",refreshHint:"Segarkan kumpulan skill dari disk",deleteExternalConfirm:"Menghapus file skill eksternal di {{path}} dari disk.",deleteExternalBatchWarning:"Skill eksternal yang dipilih akan dihapus permanen dari disk.",automation:"Otomatisasi",builtinAutoUpdate:"Pembaruan Otomatis",builtinAutoUpdateFlow:"Paket bawaan → Kumpulan skill",autoSyncFlow:"Kumpulan skill → Workspace agen",automationBoth:"Pembaruan + Sinkronisasi Otomatis",automationMixedHint:"Buka detail untuk memilih Pembaruan Otomatis atau Sinkronisasi Otomatis.",automationEnableHint:"Aktifkan Pembaruan Otomatis dan Sinkronisasi Otomatis.",automationDisableHint:"Nonaktifkan Pembaruan Otomatis dan Sinkronisasi Otomatis.",automationEnabled:"Pembaruan Otomatis dan Sinkronisasi Otomatis diaktifkan untuk {{name}}",automationDisabled:"Pembaruan Otomatis dan Sinkronisasi Otomatis dinonaktifkan untuk {{name}}",automationFailed:"Gagal memperbarui pengaturan otomatisasi",automationNeedsAttention:"Tersimpan. {{count}} item perlu ditangani; lihat Kotak Masuk.",autoSync:"Sinkronisasi Otomatis",autoSyncEnableHint:"Aktifkan Sinkronisasi Otomatis.",autoSyncDisableHint:"Nonaktifkan Sinkronisasi Otomatis.",autoSyncEnabled:"Sinkronisasi Otomatis diaktifkan untuk {{name}}",autoSyncDisabled:"Sinkronisasi Otomatis dinonaktifkan untuk {{name}}",autoSyncAgentsPlaceholder:"Semua agen yang memiliki skill ini",autoSyncAgentsHint:"Biarkan kosong untuk menyinkronkan salinan yang ada, atau pilih agen tertentu.",importBuiltin:"Perbarui Skill Bawaan",sourceVersion:"Versi sumber",currentVersion:"Versi saat ini",builtinLanguage:"Bahasa",langDefault:"Default",langDefaultTooltip:"Pertahankan setiap skill dalam bahasa saat ini",langEn:"Inggris",langZh:"Mandarin",builtinLanguageChangeTitle:"Ganti bahasa bawaan?",builtinLanguageChangeContent:'Timpa salinan pool "{{name}}" dengan versi bawaan {{language}}?',builtinLanguageChangeSuccess:'"{{name}}" diganti ke {{language}}',builtinLanguageChangeFailed:"Gagal mengganti bahasa bawaan",create:"Buat",edit:"Edit",delete:"Hapus",descriptionLabel:"Deskripsi",tags:"Tag",version:"Versi",skillName:"Nama Skill",status:"Status",installedFrom:"Diinstal dari",updateBuiltin:"Perbarui",updateSuccess:"Berhasil diperbarui",updateFailed:"Pembaruan gagal"},lL={title:"Saluran",description:"Kelola dan konfigurasi saluran pesan",loading:"Memuat saluran...",configSaved:"Konfigurasi berhasil disimpan",configFailed:"Gagal menyimpan konfigurasi",botConflictTitle:"Bot sudah digunakan",botConflictDescription:"Bot ini sudah digunakan oleh {{agents}} pada saluran yang sama. Tetap menyimpan dapat menyebabkan konflik pesan.",botConflictConfirm:"Tetap simpan",channelType:"Tipe Saluran",status:"Status",totalItems:"Total {{count}} item",botPrefix:"Prefix Bot",showToolCalls:"Tampilkan Informasi Panggilan Alat",showToolCallsTooltip:"Tampilkan informasi panggilan alat kepada pengguna (nonaktifkan untuk menyembunyikan)",showToolResults:"Tampilkan Informasi Hasil Alat",showToolResultsTooltip:"Tampilkan informasi hasil alat kepada pengguna (nonaktifkan untuk menyembunyikan)",toolCallMaxLength:"Panjang Tampilan Maksimum Panggilan Alat",toolResultMaxLength:"Panjang Tampilan Maksimum Hasil Alat",toolMaxLengthTooltip:"Atur ke 0 agar tidak dibatasi",onebotMediaBase64:"Kirim Media Lokal sebagai Base64",onebotMediaBase64Tooltip:"Pilih cara file media dikirim. Saat dinonaktifkan, path file dikirim; saat diaktifkan, file dikodekan sebagai Base64. URL jarak jauh tetap tidak berubah.",onebotMediaBase64MaxMb:"Batas Ukuran File Base64",onebotMediaBase64MaxMbTooltip:"File media yang melebihi batas ini dikirim menggunakan path file aslinya.",onebotMediaBase64MaxMbRequired:"Masukkan batas ukuran file Base64",onebotMediaBase64MaxMbMin:"Batas ukuran file Base64 minimal 1 MB",onebotMediaDir:"Direktori Media",onebotMediaDirTooltip:"Direktori untuk menyimpan media yang diunduh. Secara default menggunakan direktori media di ruang kerja agen.",onebotMediaDownloadMaxMb:"Batas Ukuran Media Masuk",onebotMediaDownloadMaxMbTooltip:"Ukuran maksimum setiap gambar, audio, video, atau file yang diunduh dari OneBot.",onebotMediaDownloadMaxMbRequired:"Masukkan batas ukuran media masuk",onebotMediaDownloadMaxMbMin:"Batas ukuran media masuk minimal 1 MB",onebotWsHostTooltip:"Alamat listen server WebSocket terbalik. Biarkan 127.0.0.1 agar hanya klien OneBot di mesin ini y
199ang dapat terhubung. Alamat lain akan mengekspos port ke jaringan dan memerlukan access token.",onebotAccessTokenTooltip:"Token bersama yang dikirim klien OneBot pada header Authorization. Wajib jika alamat listen bukan alamat loopback.",onebotAccessTokenRequired:"Access token wajib diisi jika host WebSocket bukan alamat loopback",showThinking:"Tampilkan Proses Berpikir",showThinkingTooltip:"Tampilkan proses berpikir/penalaran model kepada pengguna (nonaktifkan untuk menyembunyikan)",settings:"Pengaturan",channelSettings:"Pengaturan Saluran",notSet:"Belum diatur",clickCardToEdit:"Klik kartu untuk mengedit",language:"Bahasa",accessControlEnabled:"Kontrol Akses",accessControlEnabledTooltip:"Saat diaktifkan, hanya pengguna dalam daftar putih yang dapat berinteraksi dengan bot. Pengguna tidak dikenal akan menerima ID mereka dan ditambahkan ke daftar persetujuan.",accessControlDm:"Kontrol Akses DM",accessControlDmTooltip:"Saat diaktifkan, hanya pengguna dalam daftar putih yang dapat berinteraksi dengan bot di pesan langsung",accessControlGroup:"Kontrol Akses Grup",accessControlGroupTooltip:"Saat diaktifkan, hanya pengguna dalam daftar putih yang dapat berinteraksi dengan bot di chat grup",dmDisabled:"Nonaktifkan DM",dmDisabledTooltip:"Saat diaktifkan, bot akan sepenuhnya mengabaikan semua pesan langsung",groupDisabled:"Nonaktifkan Grup",groupDisabledTooltip:"Saat diaktifkan, bot akan sepenuhnya mengabaikan semua pesan grup",shareSessionInGroup:"Bagikan Konteks dalam Grup",shareSessionInGroupTooltip:"Saat diaktifkan, semua anggota grup berbagi konteks percakapan yang sama. Saat dinonaktifkan, setiap anggota memiliki konteks independen.",cardAutoLayout:"Kartu Layar Lebar (Tata Letak Otomatis)",cardAutoLayoutTooltip:"Saat diaktifkan, DingTalk merender kartu AI dalam format layar lebar di desktop. Hanya berlaku jika jenis pesan adalah card. Templat kartu harus sudah dipublikasikan.",manageAccessControl:"Kontrol Akses",pendingApprovals:"Menunggu Persetujuan",whitelist:"Daftar Putih",blacklist:"Daftar Hitam",addUser:"Tambah",addUserPlaceholder:"Masukkan ID pengguna",userId:"ID Pengguna",username:"Nama Pengguna",channel:"Kanal",firstMessage:"Pesan Pertama",time:"Waktu",actions:"Tindakan",approve:"Daftar Putih",deny:"Daftar Hitam",dismiss:"Abaikan",noWhitelistUsers:"Tidak ada pengguna daftar putih",noBlacklistUsers:"Tidak ada pengguna daftar hitam",noPendingApprovals:"Tidak ada persetujuan tertunda",userAdded:"Pengguna ditambahkan",userRemoved:"Pengguna dihapus",approveSuccess:"Ditambahkan ke daftar putih",denySuccess:"Ditambahkan ke daftar hitam",dismissSuccess:"Diabaikan",operationFailed:"Operasi gagal",remark:"Catatan",usernamePlaceholder:"Masukkan nama pengguna (opsional)",remarkPlaceholder:"Masukkan catatan (opsional)",filterByChannel:"Filter berdasarkan channel",selectToOperate:"Pilih item untuk operasi",selectedCount:"{{count}} dipilih",batchApprove:"Setujui",batchDeny:"Daftar hitam",batchDismiss:"Hapus",batchApproveConfirm:"Setujui {{count}} pengguna?",batchDenyConfirm:"Tambahkan {{count}} pengguna ke daftar hitam?",batchDismissConfirm:"Hapus {{count}} pengguna?",batchSuccess:"{{count}} pengguna berhasil diproses",batchRemove:"Hapus",batchRemoveConfirm:"Hapus {{count}} pengguna yang dipilih?",enabledSection:"Diaktifkan",enabledCount:"{{count}}",availableSection:"Tersedia",enableAction:"Aktifkan",noEnabledChannels:"Tidak ada saluran yang diaktifkan",goEnableChannels:"Aktifkan saluran",slackBotToken:"Bot Token",slackBotTokenTooltip:"Slack Bot User OAuth Token, dimulai dengan xoxb-",slackAppToken:"App Token",slackAppTokenTooltip:"Slack App-Level Token untuk Socket Mode, dimulai dengan xapp-",slackProxyTooltip:"URL proxy HTTP untuk menghubungkan ke Slack API"},dL={title:"Tool Bawaan",description:"Kelola tool bawaan dan status aktifnya. Tool yang dinonaktifkan tidak tersedia untuk agen.",emptyState:"Tidak ada tool yang dikonfigurasi",loadError:"Gagal memuat tool",enableSuccess:"Tool berhasil diaktifkan",disableSuccess:"Tool berhasil dinonaktifkan",toggleError:"Gagal mengubah status tool",enableAll:"Aktifkan Semua",disableAll:"Nonaktifkan Semua",enableAllSuccess:"Semua tool diaktifkan",disableAllSuccess:"Semua tool dinonaktifkan",allEnabled:"Semua tool sudah aktif",allDisabled:"Semua tool sudah nonaktif",asyncExecution:"Eksekusi Asinkron",asyncExecutionEnabled:"Eksekusi asinkron aktif",asyncExecutionDisabled:"Eksekusi asinkron nonaktif",browserUnifiedMode:"Browser terpadu (Beta)",browserLegacyMode:"Mode kompatibilitas lama",browserUnifiedModeButton:"Baru (Beta)",browserLegacyModeButton:"Lama (Kompatibel)",browserUnifiedDescription:"Gunakan kemampuan browser terpadu yang baru.",browserLegacyDescription:"Gunakan implementasi browser asli untu
199k perilaku lama.",browserRestartPending:"Layanan akan beralih ke {{mode}} setelah dimulai ulang.",configure:"Konfigurasi",configured:"Terkonfigurasi",requiresConfig:"Perlu konfigurasi",configSaved:"Konfigurasi tersimpan",configSaveError:"Gagal menyimpan konfigurasi",webSearchProviderLabel:"Penyedia",webSearchApiKeyLabel:"Kunci API (opsional)",webSearchQuotaHintBefore:"Gratis 100 panggilan/hari. Daftar di ",webSearchQuotaHintAfter:" untuk 1.000/hari.",active:"aktif",available:"Tersedia",noEnabled:"Tidak ada alat yang diaktifkan",goEnableBtn:"Aktifkan sekarang",configureAction:"Konfigurasi →",enableAction:"Aktifkan →"},cL={promptTitle:"Model LLM Diperlukan - Pilih di Chat Setelah Konfigurasi",promptMessage:"Chat memerlukan model LLM agar berfungsi. Konfigurasi model terlebih dahulu, lalu pilih dari pemilih model di bagian atas halaman Chat.",configureButton:"Konfigurasi Model",skipButton:"Lewati",chatDisabledTitle:"Chat Dinonaktifkan",chatDisabledMessage:"Fungsi chat dinonaktifkan karena tidak ada model yang dikonfigurasi.",configureNow:"Konfigurasi Model",modelNotConfigured:"Konfigurasi model di Pengaturan sebelum memakai chat"},uL={parent:"Pengaturan",security:"Keamanan",title:"Keamanan",description:"Kelola fitur keamanan untuk tool dan skill.",toolGuardTitle:"Tool Guard",toolGuardDescription:"Konfigurasi pemindaian keamanan untuk panggilan tool. Operasi berbahaya akan memerlukan persetujuan eksplisit sebelum dieksekusi.",enabled:"Aktifkan Tool Guard",guardedTools:"Tool yang Diawasi",deniedTools:"Tool yang Ditolak",saveSuccess:"Pengaturan Tool Guard tersimpan",saveFailed:"Gagal menyimpan pengaturan Tool Guard",loadFailed:"Gagal memuat pengaturan Tool Guard",rules:{title:"Aturan Deteksi",description:"Aturan menentukan pola regex yang memicu peringatan keamanan.",id:"ID Aturan",severity:"Tingkat Keparahan",source:"Sumber",actions:"Tindakan",builtin:"Bawaan",custom:"Kustom",enable:"Aktifkan",disable:"Nonaktifkan",edit:"Edit",delete:"Hapus",add:"Tambah Aturan"}},pL={nav:"Checkpoint",title:"Checkpoint Status",auto:"Otomatis",autoEnabled:"Checkpoint otomatis diaktifkan",autoDisabled:"Checkpoint otomatis dinonaktifkan",refresh:"Muat ulang",snapshot:"Snapshot",snapshotCreated:"Snapshot dibuat",graph:"Grafik",checkpoint:"Checkpoint",type:"Jenis",commit:"Commit",createdAt:"Dibuat",session:"Sesi",channel:"Kanal",parent:"Induk",details:"Detail checkpoint",search:"Cari kueri, nama, sesi, atau SHA",allTypes:"Semua jenis",allSessions:"Semua sesi",showingLatest:"Menampilkan {{count}} terbaru",loadFailed:"Checkpoint tidak dapat dimuat",retry:"Coba lagi",more:"Tindakan lainnya",noMatches:"Tidak ada checkpoint yang cocok.",empty:"Belum ada checkpoint status. Riwayat versi akan muncul di sini.",kind:{auto:"Otomatis",snapshot:"Snapshot",safety:"Pengaman",commit:"Commit"},summary:{total:"checkpoint"},snapshotDialog:{title:"Buat snapshot",session:"Sesi",name:"Nama",placeholder:"Nama snapshot opsional"},gc:{settingsAction:"Pengaturan pembersihan otomatis",settingsTitle:"Pengaturan pembersihan otomatis",keepCount:"Jumlah checkpoint otomatis yang disimpan",keepDays:"Retensi checkpoint otomatis (hari)",preRestoreDays:"Retensi snapshot pra-pemulihan (hari)",settingsSaved:"Pengaturan pembersihan otomatis disimpan",thoroughAction:"Thoroughly compact checkpoints",thoroughTitle:"Thoroughly compact checkpoints?",thoroughDescription:"Menghapus {{count}} checkpoint dengan mengabaikan retensi checkpoint otomatis. HEAD setiap sesi tetap disimpan.",thoroughConfirm:"Thoroughly compact",thoroughSuccess:"Removed {{count}} checkpoint(s) during thorough compaction",action:"Bersihkan checkpoint",title:"Bersihkan checkpoint sesuai kebijakan retensi?",description:"Menghapus {{count}} checkpoint kedaluwarsa sesuai kebijakan retensi saat ini. HEAD setiap sesi tetap disimpan.",confirm:"Bersihkan",success:"{{count}} checkpoint dihapus"},reset:{action:"Reset data checkpoint",title:"Reset semua data?",description:"Semua checkpoint akan dihapus permanen dan mode otomatis dinonaktifkan.",confirm:"Reset",success:"Data checkpoint direset"},restore:{action:"Pulihkan",title:"Pulihkan checkpoint",preview:"Pratinjau pemulihan",confirm:"Pulihkan",conversation:"Percakapan",memory:"Memori",files:"File workspace",refreshWarning:"Percakapan akan berubah. Muat ulang setelah pemulihan selesai.",selectedCount:"{{count}} file dipilih",selectAll:"Pilih semua file yang berubah",delete:"Hapus",restore:"Pulihkan",noFileChanges:"Tidak ada perubahan file yang diperlukan.",success:"Checkpoint dipulihkan. Muat ulang percakapan untuk memuat statusnya."}}
199,mL={title:"File",workspacePath:"Workspace:",noFiles:"Tidak ada file",coreFiles:"File Inti",coreFilesDesc:"Persona bootstrap, identitas, dan panduan tool.",selectFile:"Pilih file untuk diedit",fileContent:"Konten file...",uploadSuccess:"File berhasil diunggah",uploadFailed:"Gagal mengunggah file",downloadPreparing:"Mempersiapkan unduhan workspace...",downloadSuccess:"Workspace berhasil diunduh",downloadFailed:"Gagal mengunduh workspace",uploadTooltip:"Hanya file ZIP",uploadTooltipWithLimit:"Hanya file ZIP, maks {{limit}}MB",zipOnly:"Hanya file .zip yang didukung untuk unggahan",saveSuccess:"Berhasil disimpan",saveFailed:"Gagal menyimpan"},hL={title:"Tugas Cron",description:"Buat dan kelola tugas terjadwal yang berjalan otomatis pada waktu tertentu.",createJob:"Buat Tugas",editJob:"Edit Tugas",confirmDelete:"Konfirmasi Hapus",deleteConfirm:"Yakin ingin menghapus tugas Cron ini?",okText:"OK",cancelText:"Batal",deleteText:"Hapus",id:"ID Tugas",name:"Nama Tugas",enabled:"Status",scheduleType:"Tipe Jadwal",scheduleCron:"Jadwal (Cron)",scheduleTimezone:"Zona Waktu",cronType:"Frekuensi",cronTypeHourly:"Per jam",cronTypeDaily:"Harian",cronTypeWeekly:"Mingguan",cronTypeCustom:"Kustom",cronTime:"Waktu",cronDaysOfWeek:"Hari dalam Minggu",cronDayMon:"Senin",cronDayTue:"Selasa",cronDayWed:"Rabu",cronDayThu:"Kamis",cronDayFri:"Jumat",cronDaySat:"Sabtu",cronDaySun:"Minggu",taskText:"Konten pesan",action:"Tindakan",executeNow:"Jalankan Sekarang",totalItems:"Total {{count}} item",selectTimezone:"Pilih zona waktu",silentDelivery:"Pengiriman senyap",silentDeliveryTooltip:"Jalankan tugas agen dan simpan sesi serta pelacakannya, tetapi jangan kirim hasil ke kanal.",validation:{cronRequired:"Ekspresi cron wajib diisi untuk jadwal berulang.",runAtRequired:"Waktu eksekusi wajib diisi untuk jadwal sekali jalan.",repeatUntilRequired:'Saat memilih "Berakhir pada tanggal", tanggal akhir wajib diisi.',repeatCountRequired:'Saat memilih "Jumlah terbatas", jumlah eksekusi wajib diisi.',repeatUntilAfterRunAt:"Tanggal akhir harus lebih lambat daripada waktu eksekusi. Pilih tanggal akhir setelah waktu eksekusi.",textRequired:"Konten pesan wajib diisi saat jenis tugas adalah text.",requestRequired:"Konten request wajib diisi saat jenis tugas adalah agent.",invalidCronExpression:"Ekspresi cron tidak valid. Gunakan format cron 5 kolom."}},gL={title:"Heartbeat",description:"Jalankan HEARTBEAT.md pada interval tetap untuk pemeriksaan mandiri.",enabled:"Aktifkan heartbeat",every:"Interval",everyRequired:"Wajib",everyMin:"Minimal 1",timeoutSeconds:"Batas waktu eksekusi (detik)",timeoutRequired:"Wajib",timeoutMin:"Minimal 1",timeoutMax:"Maksimal 3600",unitMinutes:"Menit",unitHours:"Jam",target:"Target balasan",targetMain:"Mode senyap (default, tanpa output saluran)",targetLast:"Kirim ke saluran chat terakhir",activeHours:"Jam aktif (opsional)",activeStart:"Waktu mulai",activeEnd:"Waktu selesai",loadFailed:"Gagal memuat konfigurasi heartbeat",saveSuccess:"Berhasil disimpan; heartbeat dimuat ulang",saveFailed:"Gagal menyimpan konfigurasi heartbeat"},fL={title:"Cadangan",description:"Cadangkan dan pulihkan workspace serta konfigurasi agen.",create:"Buat Cadangan",import:"Impor",export:"Ekspor",restore:"Pulihkan",delete:"Hapus",batchDelete:"Hapus yang Dipilih",name:"Nama",createdAt:"Dibuat",scopeSummary:"Cakupan",descriptionLabel:"Deskripsi",noBackups:"Belum ada cadangan. Buat cadangan untuk menyimpan konfigurasi saat ini.",loadFailed:"Gagal memuat cadangan",createTitle:"Buat Cadangan",backupMode:"Mode Cadangan",fullBackup:"Cadangan Penuh",customBackup:"Cadangan Kustom",partialBackup:"Cadangan Parsial",scopeGlobalConfig:"Pengaturan global",scopeSkillPool:"Kumpulan skill",scopeSecrets:"Rahasia",scopeSecretsHint:"Mencakup rahasia penyedia model (kunci API), variabel lingkungan, dan informasi sensitif lainnya",createSuccess:"Cadangan berhasil dibuat",createFailed:"Gagal membuat cadangan",restoreTitle:"Pulihkan Cadangan",restoreFullWarning:"Pemulihan penuh akan sepenuhnya mengganti semua konten instance saat ini (termasuk semua agen, konfigurasi global, kumpulan skill, dan rahasia). Tindakan ini tidak dapat dibatalkan. Fitur terkait tidak tersedia selama pemulihan. Silakan mulai ulang layanan setelah pemulihan selesai.",restoreWarningModify:"Pemulihan akan mengubah konfigurasi saat ini. Tindakan ini tidak dapat dibatalkan.",restoreWarningRestart:"Fitur terkait tidak tersedia selama pemulihan. Silakan mulai ulang layanan setelah pemulihan selesai.",restoreConfirm:"Saya mengonfirmasi ingin memulihkan cadangan ini",restoreMode:"Mode pemulihan",restoreModeFull:"Pemulihan penuh",restoreModeFullDesc:"Sepenuhnya mengganti semua konten instance saat ini, termasuk semua agen, konfigurasi global, kumpulan skill, dan rahasia",restoreModeCustom:"Pemulihan khusus",restoreModeCustomDesc:"Pilih konten yang ingin dipulihkan, seperti agen tertentu, konfigurasi, dll.; agen yang sudah ada tetapi tidak termasuk dalam pemulihan ini akan tetap dipertahankan",restoreModeFullDisabled:"Hanya cadangan penuh",restoreCustomSummary:"{{existing}} yang sudah ada · {{added}} baru dipilih",defaultWorkspaceDir:"Direktori ruang kerja default agen",defaultWorkspaceDirPlaceholder:"Biarkan kosong untuk menggunakan ~/.qwenpaw/workspaces",defaultWorkspaceDirHint:"Jika jalur ruang kerja asli agen tidak ada, agen akan disimpan di <jalur default>/<ID agen>. Jika ada, jalur ruang kerja asli agen akan digunakan.",restoreStrategy:"Strategi pemulihan",restoreStrategyPreserve:"Pertahankan keamanan lokal dan MCP",restoreStrategyPreserveDesc:"Perta
199hankan pengaman keamanan dan konfigurasi MCP instance ini.",restoreStrategyRestore:"Pulihkan pengaturan ini dari cadangan",restoreStrategyRestoreDesc:"Gunakan konfigurasi keamanan dan MCP dari cadangan.",restoreSuccess:"Cadangan berhasil dipulihkan. Silakan mulai ulang layanan.",restoreSuccessPreserved:"Cadangan berhasil dipulihkan. Pengaturan lokal dipertahankan: {{keys}}. Silakan mulai ulang layanan.",restoreFailed:"Gagal memulihkan cadangan",restoreTimedOut:"Pemulihan masih berjalan atau telah melebihi 5 menit. Periksa ukuran cadangan, ruang disk, dan log layanan sebelum mencoba lagi.",restoreTargetBusy:"Pemulihan gagal karena direktori berikut masih digunakan. Tutup browser atau proses yang menggunakannya, lalu coba lagi. Jika masih terkunci, mulai ulang sistem dan coba lagi.",detailLoadFailed:"Gagal memuat detail cadangan; pemulihan tidak tersedia",importSuccess:"Cadangan berhasil diimpor",importFailed:"Gagal mengimpor cadangan",trustLocalBanner:"Cadangan lokal - pemulihan penuh secara default",trustForeignBanner:"Cadangan impor - keamanan lokal dan MCP dipertahankan secara default",trustLegacyBanner:"Cadangan lama - konfirmasi kepercayaan diperlukan sebelum pemulihan",trustForeignTitle:"Percayai cadangan ini?",trustLegacyTitle:"Percayai cadangan lama?",unknownBackupName:"Arsip cadangan",trustForeignDesc:"Cadangan ini tidak ditandatangani oleh instance ini. Lanjutkan hanya jika Anda memercayai sumbernya; pengaturan keamanan lokal dan MCP akan dipertahankan secara default saat dipulihkan.",trustLegacyDesc:"Cadangan lama ini tidak memiliki tanda tangan lokal. Lanjutkan hanya jika Anda memercayai asalnya; instance ini akan menandatanganinya sebelum dipulihkan."},bL={title:"Klien MCP",qwenpawManaged:"Dikelola QwenPaw",qwenpawManagedHint:"Konfigurasi panel kontrol bersama disuntikkan ke Agent pihak ketiga yang didukung saat runtime.",providerManaged:"MCP lokal {{provider}}",providerManagedHint:"Ditemukan dari konfigurasi agen pihak ketiga; hanya-baca dan hanya tersedia untuk agen tersebut.",providerOnly:"Khusus agen pihak ketiga",readOnly:"Hanya-baca",create:"Buat Klien",formatSupport:"Format yang didukung",standardFormat:"Standar (pembungkus mcpServers)",directFormat:"Langsung (key → objek konfigurasi)",singleFormat:"Satu klien (field datar)",emptyState:"Belum ada klien MCP yang dikonfigurasi",loadError:"Gagal memuat klien MCP",createSuccess:"Klien MCP berhasil dibuat",createError:"Gagal membuat klien MCP",updateSuccess:"Klien MCP berhasil diperbarui",updateError:"Gagal memperbarui klien MCP",enableSuccess:"Klien MCP berhasil diaktifkan",disableSuccess:"Klien MCP berhasil dinonaktifkan",toggleError:"Gagal mengubah status klien MCP",deleteConfirm:"Yakin ingin menghapus klien MCP ini?",deleteSuccess:"Klien MCP berhasil dihapus",deleteError:"Gagal menghapus klien MCP",maskedFieldHint:"Field sensitif disamarkan dengan ***. Edit langsung pada nilai tersamarkan tidak didukung — ganti dengan nilai lengkap yang baru untuk mengubahnya.",tools:"Tool & Izin",noTools:"Tidak ada tool tersedia dari server MCP ini",toolsLoadError:"Gagal memuat tool dari server MCP",toolsConnecting:"Server MCP masih tersambung, coba lagi sebentar lagi",toolSchema:"Skema Input",access:{title:"Akses",button:"Akses",summary:"Kebijakan akses MCP",clientSection:"Akses keseluruhan",toolSection:"Akses tool",default:"Default",sourceType:"Sumber",sourceValue:"Nilai sumber",sourceValueAllChannels:"Semua saluran",subjectType:"Objek",subjectValue:"Nilai objek",effectLabel:"Kebijakan",source:{channel:"Saluran"},subjectTypeOption:{all:"Semua",user:"Pengguna"},sourceValuePlaceholder:{channel:"console / dingtalk"},subjectValuePlaceholder:"mis. alice",subjectValuePlaceholderSelectedSource:"ID pengguna di sumber yang dipilih",subjectValuePlaceholderScoped:"ID pengguna {{source}}",subjectValueAll:"Semua",recentUserPlaceholder:"ID pengguna dibatasi pada sumber yang dipilih; ketik atau pilih lagi",noRecentUsers:"Tidak ada pengguna terbaru untuk sumber ini; ketik ID pengguna secara manual",ambiguousUserSourceWarning:"ID pengguna hanya unik di dalam sumber. Pilih saluran tertentu untuk menghindari kecocokan lintas saluran.",unknownUserValueWarning:"ID pengguna ini tidak ada di daftar pengguna aktif terbaru. Penyimpanan tetap diizinkan.",validation:{missingUserValue:"Pilih sumber tertentu dan masukkan ID pengguna yang valid.",ambiguousUserSource:"Aturan pengguna harus menargetkan saluran tertentu, bukan semua saluran.",unknownUserValue:"ID pengguna ini tidak ada di daftar pengguna aktif terbaru. Penyimpanan tetap diizinkan."},addRule:"Tambah aturan",deleteRule:"Hapus aturan",noClientRules:"Tidak ada aturan",noRules:"Tidak ada aturan, menggunakan kebijakan default",inherit:"Ikuti ({{effect}})",stale:"Tidak ditemukan",disabledTools:"Klien MCP ini dinonaktifkan; aturan akses yang tersimpan tetap dapat diedit.",discardTitle:"Buang perubahan yang belum disimpan?",discardContent:"Perubahan kebijakan akses yang belum disimpan akan hilang.",loadError:"Gagal memuat kebijakan akses MCP",saveSuccess:"Kebijakan akses MCP tersimpan",saveError:"Gagal menyimpan kebijakan akses MCP",unmanagedRules:"{{count}} aturan lanjutan",effect:{allow:"Izinkan",ask:"Tanya",deny:"Tolak"}},tab:{json:"Impor JSON",form:"Mode Form"},form:{key:"Kunci klien",keyPlaceholder:"my-mcp-server",keyRequired:"Kunci klien wajib diisi",name:"Nama tampilan",namePlaceholder:"My MCP Server",n
199ameRequired:"Nama tampilan wajib diisi",transport:"Transport",url:"URL server",urlRequired:"URL wajib diisi untuk server MCP jarak jauh",command:"Perintah",commandRequired:"Perintah wajib diisi untuk transport stdio",args:"Argumen (dipisahkan spasi atau baris baru)",description:"Deskripsi",descriptionPlaceholder:"Deskripsi opsional",env:"Variabel lingkungan",envPlaceholder:"KEY=VALUE (satu per baris)"},oauth:{enableOAuth:"Gunakan Otorisasi OAuth",manage:"OAuth",authorized:"Telah Diotorisasi",notAuthorized:"Belum Diotorisasi",expired:"Token Kedaluwarsa",failed:"Otorisasi Gagal",waiting:"Menunggu otorisasi...",authorize:"Otorisasi",reauthorize:"Otorisasi Ulang",revoke:"Cabut Akses",startFailed:"Gagal memulai alur OAuth",authFailed:"Otorisasi OAuth gagal",popupBlocked:"Popup diblokir oleh browser. Izinkan popup dan coba lagi.",windowClosed:"Jendela otorisasi ditutup. Silakan coba lagi.",noUrl:"Masukkan URL server terlebih dahulu",noClientKey:"Buat klien terlebih dahulu",showAdvanced:"Opsi lanjutan",hideAdvanced:"Sembunyikan opsi lanjutan",clientId:"Client ID (opsional)",clientIdPlaceholder:"Kosongkan untuk menggunakan Dynamic Client Registration",scope:"Scope (opsional)",scopePlaceholder:"openid profile email",authEndpoint:"Authorization Endpoint (timpa)",tokenEndpoint:"Token Endpoint (timpa)",endpointHint:"Kosongkan untuk deteksi otomatis dari server MCP."}},kL={error:{SENSITIVE_FILE_BLOCKED:"File diblokir oleh File Guard (perlindungan file sensitif).",OUTSIDE_WORKSPACE:'File berada di luar cakupan workspace. Aktifkan "Izinkan Pratinjau Konsol di Luar Worksp
199ace" di Pengaturan → Keamanan → File Guard.',FORBIDDEN:"Akses ditolak: izin tidak cukup untuk melihat pratinjau file ini.",NOT_FOUND:"File tidak ditemukan, mungkin telah dipindahkan atau dihapus. Jika menggunakan jalur relatif, coba gunakan jalur absolut.",LOAD_FAILED:"Gagal memuat pratinjau file.",LOAD_FAILED_DETAIL:"Gagal memuat pratinjau file: {{detail}}"}},yL={title:"Manajer Plugin",description:"Instal, kelola, dan hapus plugin tanpa me-restart layanan.",installed:"Plugin Terinstal",noPlugins:"Belum ada plugin yang terinstal",installBtn:"Instal Plugin",installTitle:"Instal Plugin",dropPrimary:"Letakkan folder atau ZIP di sini",dropSecondary:"atau klik untuk memilih file ZIP",orFromUrl:"atau dari URL",installFromUrl:"Instal dari URL",urlPlaceholder:"https://example.com/plugin.zip",zipOnly:"Hanya file ZIP yang dapat dijatuhkan sebagai file — seret folder untuk instalasi direktori",dropFailed:"Gagal membaca folder yang dijatuhkan",restartHint:"Beberapa plugin (mis. hook, monkey-patch) mungkin memerlukan restart aplikasi agar sepenuhnya aktif atau dihapus.",installing:"Menginstal...",installSuccess:"Plugin berhasil diinstal",installFailed:"Instalasi plugin gagal",uninstall:"Copot",uninstallConfirm:'Copot plugin "{{name}}"? Tindakan ini tidak dapat dibatalkan. Beberapa plugin mungkin memerlukan restart aplikasi agar sepenuhnya dihapus.',uninstalling:"Mencopot...",uninstallSuccess:"Plugin berhasil dicopot",uninstallFailed:"Pencopotan plugin gagal",statusLoaded:"Berjalan",statusUnloaded:"Tidak dimuat",type:"Tipe",version:"Versi",author:"Penulis",unknown:"Tidak diketahui",noMatchingPlugins:"Tidak ada plugin yang cocok dengan filter saat ini",loadFailed:"Gagal memuat daftar plugin",confirmTitle:"Konfirmasi Pencopotan",officialTitle:"Plugin Resmi",officialDesc:"Instal plugin yang dipublikasikan dari CDN unduhan.",catalogRefresh:"Segarkan",catalogEmpty:"Tidak ada plugin resmi tersedia (katalog CDN mungkin kosong)",catalogLoadFailed:"Gagal memuat katalog plugin resmi",catalogInstall:"Instal",catalogRe
199install:"Instal ulang",catalogUpgrade:"Pembaruan tersedia",catalogUpgradeBtn:"Perbarui",catalogInstalled:"Terinstal",catalogSha256:"SHA256",kindBundle:"Bundel",kindTool:"Alat",filterByName:"Filter berdasarkan nama",filterByKind:"Filter berdasarkan jenis",marketTitle:"Pasar Plugin",marketEmpty:"No plugins found in market",marketLoadFailed:"Failed to load plugin market",marketUnavailable:"Plugin Market is currently under maintenance, please try again later",marketAll:"All",marketSearch:"Search plugins...",marketCategory:"Filter by category",marketSearchResult:'Found {{count}} plugins matching "{{keyword}}"',marketDetails:"Details",marketDownloads:"Downloads",marketDeveloper:"Developer",marketSortLabel:"Sort plugins",marketSortDownloads:"Most downloaded",marketSortUpdated:"Recently updated",marketSortFavorites:"Most favorited"},vL={title:"Debug",desc:"Lihat file log daemon backend untuk membantu diagnosis masalah.",level:{all:"Semua"},backend:{title:"Log backend",autoRefresh:"Segarkan otomatis",newestFirst:"Terbaru dulu",updatedAt:"Diperbarui pada",path:"File log",notFound:"File log backend belum ditemukan.",placeholder:"Output log backend akan muncul di sini.",loadFailed:"Gagal memuat log backend",searchPlaceholder:"Cari log backend..."},actions:{refreshBackend:"Segarkan log backend",refreshSuccess:"Log disegarkan",copyBackend:"Salin log backend"}},TL={title:"Mode Coding",experimental:"Fitur Eksperimental",experimentalDesc:"Mode Coding mengubah QwenPaw menjadi Web IDE ringan dengan editor kode, pohon file, integrasi Git, dan bantuan coding bertenaga AI.",experimentalNote:"Fitur ini masih eksperimental dan dalam pengembangan aktif. Beberapa fungsi mungkin terbatas atau berubah pada pembaruan mendatang.",confirmBtn:"Aktifkan Mode Coding",enterTooltip:"Masuk ke Mode Coding",exitTooltip:"Keluar dari Mode Coding",btnCode:"Kode",btnChat:"Obrolan",selectProject:"Pilih Direktori Proyek",selectProjectDesc:"Pilih proyek untuk dikerjakan, atau gunakan workspace default",tabWorkspace:"Workspace Default",tabClone:"Clone Repositori",tabLocal:"Impor Proyek Lokal",tabNew:"Proyek Baru",workspaceDesc:"Gunakan direktori workspace agen saat ini",cloneUrl:"URL Repositori Git",cloneUrlPlaceholder:"https://github.com/user/repo.git",cloneName:"Nama Proyek (opsional)",cloneNamePlaceholder:"Kosongkan untuk mengambil dari URL",cloneBtn:"Mulai Clone",cloning:"Mengkloning...",localPath:"Path Direktori Lokal",localPathPlaceholder:"/Users/nama-anda/my-project",localPathHint:"Masukkan path absolut ke proyek lokal Anda",openBtn:"Impor",newName:"Nama Proyek",newNamePlaceholder:"my-project",createBtn:"Buat Proyek",switchProject:"Ganti Proyek",currentProject:"Proyek Saat Ini",resetToWorkspace:"Reset ke Workspace Default",dropPrimary:"Seret folder ke sini, atau klik untuk menjelajah",dropSecondary:"Seret dari Finder atau tempel path di bawah",pathHint:"Masukkan path absolut lengkap (dimulai dengan / atau ~)",importing:"Mengimpor...",dropFailed:"Gagal membaca folder",workingDir:"Direktori kerja",importCopyNote:"Folder akan disalin ke pustaka proyek terkelola QwenPaw. File asli tidak akan diubah.",importCopyDesc:'Impor akan membuat salinan folder. Agent bekerja pada salinan, file asli tidak diubah. Untuk bekerja langsung pada aslinya, gunakan "Buka Direktori".',tabOpenDir:"Buka Direktori",openDirDesc:"Buka direktori lokal yang sudah ada — tidak ada file yang disalin",openDirBtn:"Buka Direktori Ini",openDirLoading:"Memuat...",openDirEmpty:"Tidak ada subdirektori",openDirHome:"Beranda",openDirRefresh:"Segarkan",openDirHiddenFolders:"Folder Tersembunyi"},SL={searchPlaceholder:"Cari skill di berbagai platform",categoryAll:"Semua",categoryPlaceholder:"Cari kategori",searchResult:'Ditemukan {{count}} skill yang cocok dengan "{{keyword}}"',providerUnavailable:"Sumber tidak tersedia",noResults:"Tidak ada hasil",startTyping:"Ketik kata kunci di atas untuk mencari di marketplace",browseHint:"Pilih kategori atau masukkan kata kunci untuk menjelajahi skill di {{providers}}",noDescription:"Tidak ada deskripsi",browseMarket:"Jelajahi Market",installQueue:"Antrean instalasi",clearCompleted:"Bersihkan",retry:"Coba lagi",status:{queued:"Mengantre",installing:"Memasang",completed:"Selesai",failed:"Gagal",cancelled:"Dibatalkan"},loadMore:"Muat lebih banyak",noMoreResults:"Tidak ada hasil lainnya",detail
199:{title:"Detail skill",version:"Versi",author:"Penulis",sourceUrl:"URL instalasi",slug:"ID",missing:"—"},stats:{downloads:"Unduhan",stars:"Bintang",installs:"Instalasi",likes:"Suka",views:"Tampilan",category:"Kategori",updatedAt:"Diperbarui"},queueMsg:{timedOut:"Instalasi habis waktu",failedPrefix:"Gagal: {{msg}}"}},CL={starting:"Memulai backend...",checking:"Menghubungkan ke backend...",error:"Backend gagal dimulai.",errorHint:"Proses backend tidak dapat dijalankan. Periksa log aplikasi untuk detail.",errorDetails:"Tampilkan detail error",timeout:"Backend gagal dimulai dalam {{seconds}} detik.",timeoutHint:"Backend gagal dimulai. Coba lagi, atau periksa log aplikasi untuk detail.",retry:"Coba lagi"},wL={title:"Kotak Masuk",tabApprovals:"Persetujuan",tabPushMessages:"Pesan Push",tabHarvests:"Panen AI",summaryApprovals:"Persetujuan",summaryPushUnread:"Push Belum Dibaca",summaryHarvests:"Panen",from:"Dari:",requestedBy:"Oleh",markRead:"Tandai Dibaca",markAllRead:"Tandai Semua Dibaca",markAllReadNoUnread:"Tidak ada pesan yang belum dibaca",markAllReadSuccess:"{{count}} pesan ditandai dibaca",selectAllCurrentPage:"Pilih halaman ini",selectedItems:"{{count}} dipilih",batchDeleteButton:"Hapus Massal",batchOperation:"Massal",exitBatch:"Keluar dari Mode Massal",batchDeleteConfirm:"Hapus {{count}} pesan push yang dipilih?",batchDeleteSuccess:"{{count}} pesan push dihapus",pushCronHeader:"Cron Job: {{name}}",viewDetails:"Lihat Detail",deleteMessageConfirm:"Hapus pesan push ini?",viewAll:"Lihat Semua",read:"Dibaca",approve:"Setujui",reject:"Tolak",ready:"Siap",harvestNow:"Panen Sekarang",createHarvest:"Buat Panen",createFirstHarvest:"Buat Panen Pertama Anda",createSuccess:"Panen berhasil dibuat",emptyApprovals:"Tidak ada persetujuan yang tertunda",emptyPush:"Tidak ada pesan push",wobbleEnable:"Aktifkan notifikasi getar persetujuan",wobbleDisable:"Nonaktifkan notifikasi getar persetujuan",emptyHarvests:"Belum ada panen",statusReadyToHarvest:"Siap Dipanen",statusGrowing:"Sedang Tumbuh",harvestedTimes:"Dipanen {{count}} kali",harvestSuccessRate:"Tingkat Keberhasilan {{rate}}%",messageDetailComingSoon:"Tampilan detail pesan - Segera hadir!",harvestSettingsComingSoon:"Pengaturan panen - Segera hadir!",messageDetailTitle:"Detail Eksekusi",detailCronTitle:"Cron Job: {{name}}",detailHeartbeatTitle:"Heartbeat",messageNotFound:"Pesan tidak ditemukan",detailTaskName:"Nama Tugas",detailTaskId:"ID Tugas",detailStatus:"Status",detailSeverity:"Tingkat Keparahan",detailAgent:"Agen",detailSource:"Sumber",detailSourceCronJob:"Cron Job",detailSourceHeartbeat:"Heartbeat",detailTrigger:"Pemicu",detailDuration:"Durasi",detailExecutedAt:"Dieksekusi Pada",detailReceivedAt:"Diterima Pada",detailRunId:"ID Jalankan",detailContent:"Output",detailPayload:"Payload",detailExecutionTrace:"Jejak Eksekusi",detailTraceEmpty:"Tidak ada jejak eksekusi",mailDetailSender:"Pengirim",mailDetailSubject:"Subjek",mailDetailDate:"Waktu email",mailDetailBody:"Pratinjau isi",mailDetailProcess:"Proses penanganan",filterByAgent:"Filter berdasarkan agen",filterBySourceType:"Filter berdasarkan sumber",sourceTypeCron:"Cron",sourceTypeHeartbeat:"Heartbeat",sourceTypeMemory:"Memory",sourceTypeMail:"Mail",mailAccessControl:"Kontrol Akses Email",pendingSenders:"Pengirim Menunggu Persetujuan",senderLists:"Daftar Pengirim",addSender:"Tambah Pengirim",domainWildcardHint:"Mendukung wildcard domain, mis. *@example.com",invalidAddress:"Alamat email tidak valid. Gunakan format seperti [email protected] atau *@domain.com",whitelist:"Daftar Putih",blacklist:"Daftar Hitam",approveSender:"Setujui",deny:"Blokir",dismiss:"Abaikan",batchApprove:"Setujui Massal",batchDeny:"Blokir Massal",batchDismiss:"Abaikan Massal",batchRemove:"Hapus Massal",confirmApprove:"Setujui pengirim yang dipilih?",confirmDeny:"Blokir pengirim yang dipilih?",confirmDismiss:"Abaikan pengirim yang dipilih?",confirmRemove:"Konfirmasi penghapusan?",removeSuccess:"Berhasil dihapus",addedToAllAgents:"Ditambahkan dan disinkronkan ke semua agen",senderAddress:"Alamat Pengirim",displayName:"Nama Pengirim",emailSubject:"Subjek",bodyPreview:"Pratinjau Isi",selectAgent:"Pilih Agen",allAgents:"Semua Agen",time:"Waktu",remark:"Catatan",actions:"Aksi",optional:" (opsional)",required:" (wajib)"},PL={title:"ACP",loading:"Memuat konfigurasi ACP...",builtin:"Bawaan",custom:"Kustom",create:"Tambah Agen Kustom",createTitle:"Buat Agen ACP",createSuccess:"Agen ACP berhasil dibuat",editTitle:"Edit Konfigurasi ACP",agentKey:"Kunci Agen",agentKeyRequired:"Harap masukkan kunci agen",agentKeyInvalid:"Kunci agen hanya boleh berisi huruf, ang
199ka, garis bawah, dan tanda hubung",agentKeyExists:"Kunci agen ini sudah ada",enabled:"Aktif",command:"Perintah",commandRequired:"Harap masukkan perintah",args:"Argumen",argsHelp:"Satu argumen per baris",env:"Variabel Lingkungan",envHelp:"Gunakan format KEY=VALUE pada setiap baris",envInvalidLine:"Format variabel lingkungan tidak valid: {{line}}",trusted:"Tepercaya",toolParseMode:"Mode Parse Alat",toolParseModeRequired:"Harap pilih mode parse alat",stdioBufferLimit:"Batas Buffer Stdio",stdioBufferLimitHelp:"Ukuran buffer baris stdio maksimum dalam byte untuk subproses ACP.",stdioBufferLimitRequired:"Harap masukkan batas buffer stdio",stdioBufferLimitMin:"Batas buffer stdio minimal 1 byte",docs:"Dokumen Setup",docsHelp:'Buka dokumen integrasi ACP dan langsung ke bagian "Cara mengkonfigurasi runner eksternal"',notSet:"Belum diatur",configSaved:"Konfigurasi ACP tersimpan",configFailed:"Gagal menyimpan konfigurasi ACP",deleteTitle:"Hapus {{name}}",deleteConfirm:"Hapus agen ACP ini? Tindakan ini tidak dapat dibatalkan.",deleteSuccess:"Agen ACP berhasil dihapus",deleteFailed:"Gagal menghapus agen ACP",nodeSettings:"Pengaturan Node",nodePath:"Path Node",chooseOtherNode:"Pilih Node lain...",selectNodePath:"Pilih path Node",nodePathPrompt:"Masukkan path file executable node",nodeSaved:"Pengaturan Node tersimpan",nodeLoadFailed:"Gagal memuat pengaturan Node",nodeSaveFailed:"Path Node tidak tersedia",nodeRuntime:{bundled:"Node bawaan",system:"Node sistem",custom:"Node kustom"},nodeRuntimeReason:{systemNodeMissing:"Node sistem tidak terdeteksi",nodeMissing:"Path Node tidak ada",npxMissing:"npx tidak ditemukan",versionCheckFailed:"Pemeriksaan versi gagal",unavailable:"Tidak tersedia"}},AL={title:"Sesi",description:"Lihat dan kelola sesi chat yang aktif",loading:"Memuat sesi...",confirmDelete:"Konfirmasi Hapus",deleteConfirm:"Apakah Anda yakin ingin menghapus sesi ini?",batchDeleteConfirm:"Apakah Anda yakin ingin menghapus {{count}} sesi yang dipilih?",deleteSuccess:"Sesi berhasil dihapus",deleteFailed:"Gagal menghapus sesi",batchDeleteSuccess:"Berhasil menghapus {{count}} sesi",batchDeleteFailed:"Gagal menghapus sesi secara massal",saveSuccess:"Sesi berhasil disimpan",saveFailed:"Gagal menyimpan sesi",batchDeleteButton:"Hapus Massal",filterTitle:"Filter berdasarkan Judul",filterUserId:"Filter berdasarkan ID Pengguna",filterChannel:"Filter berdasarkan Saluran",allChannels:"Semua Saluran",totalItems:"Total {{count}} item",selectedItems:"{{count}} item dipilih",editSession:"Edit Sesi",pleaseInputName:"Harap masukkan nama sesi",sessionNamePlaceholder:"Nama sesi",activeTab:"Aktif",archivedTab:"Diarsipkan",archivedAtColumn:"Waktu Arsip",archive:{action:"Arsipkan",unaction:"Batalkan Arsip",batchAction:"Arsipkan Massal",batchUnaction:"Batalkan Arsip Massal",success:"Obrolan diarsipkan",successHint:"Obrolan diarsipkan. Lihat di Kontrol > Sesi > Diarsipkan.",failed:"Gagal mengarsipkan",unarchiveSuccess:"Arsip dibatalkan",unarchiveFailed:"Gagal membatalkan arsip",batchSuccess:"{{count}} obrolan diarsipkan",batchFailed:"Gagal mengarsipkan massal",batchUnarchiveSuccess:"{{count}} obrolan dibatalkan arsipnya",batchUnarchiveFailed:"Gagal membatalkan arsip massal",groupLabel:"Diarsipkan ({{count}})",modalTitle:"Obrolan yang Diarsipkan",unarchiveAll:"Batalkan Semua Arsip",noArchived:"Tidak ada obrolan yang diarsipkan"}},ML={parent:"Pengaturan",environments:"Variabel Lingkungan",title:"Variabel Lingkungan",description:"Konfigurasi variabel lingkungan key-value untuk agen dan skill.",key:"Kunci",value:"Nilai",variableNamePlaceholder:"NAMA_VARIABEL",valuePlaceholder:"nilai",insertRowBelow:"Sisipkan baris di bawah",deleteRow:"Hapus baris",deleteVariable:"Hapus Variabel",deleteConfirm:'Hapus "{{name}}"?',deleteSelected:"Hapus yang Dipilih",deleteSelectedConfirm:"Hapus {{label}}?",keyRequired:"Kunci wajib diisi",invalidKeyFormat:"Format kunci tidak valid",duplicateKey:"Kunci duplikat",saveSuccess:"Variabel lingkungan tersimpan",saveFailed:"Gagal menyimpan",deleteSuccess:'"{{name}}" dihapus',deleteFailed:"Gagal menghapus",noVariables:"Belum ada variabel lingkungan yang dikonfigurasi.",addVariable:"Tambah Variabel",loading:"Memuat…",retry:"Coba Lagi",of:"dari",selected:"dipilih",variable:"variabel",variables:"variabel",showValue:"Tampilkan nilai",hideValue:"Sembunyikan nilai",searchPlaceholder:"Cari variabel",liveSettings:"Pengaturan waktu nyata",noLive
199Variables:"Tidak ada pengaturan waktu nyata yang cocok dengan filter.",customSettings:"Variabel kustom",noCustomVariables:"Belum ada variabel khusus.",editVariable:"Edit variabel",applyNow:"Terapkan sekarang",applyHint:"Proses QwenPaw saat ini langsung diperbarui. Proses MCP yang berjalan perlu dimuat ulang.",applied:"Variabel lingkungan diterapkan",appliedWithFailures:"Tersimpan, tetapi {{count}} proses MCP gagal dimuat ulang",resetVariable:"Atur ulang variabel",resetSuccess:"Nilai sistem atau nilai bawaan dipulihkan",readonlySettings:"Pengaturan hanya-baca",noReadonlyVariables:"Tidak ada pengaturan hanya-baca yang cocok dengan filter.",impactTitle:"Dampak proses",explicitConsumers:"{{count}} proses MCP menggunakan variabel ini secara eksplisit",implicitConsumers:"{{count}} proses stdio MCP mungkin mewarisinya secara implisit",restartMode:"Proses MCP yang berjalan",restartAffected:"Muat ulang MCP terdampak",restartNone:"Jangan muat ulang",restartAllStdio:"Muat ulang semua MCP stdio",readonlyReason:{startup:"Ditentukan saat QwenPaw dimulai",agent_owned:"Dikelola oleh konfigurasi setiap Agent",initial_default:"Hanya nilai awal konfigurasi Agent"},mutabilityDescription:{hot_runtime:"Dibaca dari proses QwenPaw saat ini pada awal setiap operasi.",hot_process:"Tersedia melalui os.getenv() dan diwarisi oleh subproses berikutnya.",startup_only:"Hanya untuk referensi; tidak dapat diubah saat QwenPaw berjalan.",internal:"Dikelola secara internal oleh QwenPaw."},variableDescriptions:{QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT:"Waktu tunggu maksimum untuk konten stream pertama; nol menonaktifkan pemantauan.",QWENPAW_LLM_STREAM_IDLE_TIMEOUT:"Waktu tunggu maksimum antarbagian stream; nol menonaktifkan pemantauan."},source:{user:"QwenPaw",system:"Sistem",default:"Bawaan"}},DL={title:"Penggunaan Token",totalTokens:"Total Token",totalCalls:"Panggilan LLM",toolCalls:"Panggilan Alat",llmAndToolTrend:"Tren Panggilan LLM & Alat",llmAndToolTrendTooltip:"Giliran asisten dengan metadata pemakaian plus intent alat di semua agen. Bukan Total Calls (jumlah API mentah); sesi lama mungkin 0 giliran tercatat.",llmAndToolTrendLoadFailed:"Gagal memuat tren panggilan LLM & alat",recordedTurnsAllAgents:"Panggilan LLM",byAgent:"Berdasarkan Agen",agent:"Agen",unattributed:"Tidak teratribusi",promptTokens:"Token Prompt",completionTokens:"Token Completion",cacheRead:"Token Hit Cache",cacheHitRate:"Tingkat Hit Cache",byModel:"Berdasarkan Model",byDate:"Berdasarkan Tanggal",model:"Model",date:"Tanggal",loadFailed:"Gagal memuat penggunaan token",noData:"Tidak ada data penggunaan token pada periode yang dipilih",modelTrend:"Tren Penggunaan Model",tokenTypeChart:"Tren Jenis Token",selectAll:"Pilih Semua",allSelected:"Semua",itemsSelected:"{{count}} dipilih",selectModels:"Pilih model",selectTokenTypes:"Pilih jenis token"},xL={title:"Statistik Agen",totalSessions:"Total Sesi",totalMessages:"Total Pesan",userMessages:"Pesan Pengguna",assistantMessages:"Pesan Asisten",promptTokens:"Token Prompt",totalInputTokens:"Total Token Prompt",completionTokens:"Token Completion",toolCalls:"Panggilan Alat",newSessions:"Sesi Baru",activeSessions:"Sesi Aktif",messageTrend:"Tren Pesan",sessionTrend:"Tren Sesi",tokenTrend:"Tren Token",llmAndToolTrend:"Tren Panggilan LLM & Alat",sessionsByChannel:"Sesi per Saluran",messagesByChannel:"Pesan per Saluran",totalSessionsTooltip:"Total sesi chat yang dibuat, setiap sesi adalah konteks percakapan yang independen",totalMessagesTooltip:"Total pesan di semua sesi, termasuk pesan pengguna dan asisten",toolCallsTooltip:"Jumlah kali agen memutuskan untuk menjalankan alat; satu panggilan LLM dapat menghasilkan beberapa intent penggunaan alat",messageTrendTooltip:"Tren perbandingan pesan pengguna vs pesan asisten",sessionTrendTooltip:"Tren perbandingan sesi baru vs sesi aktif; batang oranye adalah sesi yang dibuat hari itu, batang biru adalah sesi dengan pesan pada hari itu",llmAndToolTrendTooltip:"Tren giliran LLM agen saat ini vs intent penggunaan alat",sessionsByChannelTooltip:"Distribusi sesi berdasarkan saluran pesan; sesi tanpa saluran dikelompokkan di bawah Konsol",messagesByChannelTooltip:"Distribusi total pesan berdasarkan saluran pesan",currentAgentLlmCalls:"Giliran Tercatat",currentAgentTokenTrendTooltip:"Tren token prompt, completion, dan hit cache dari metadata per giliran agen saat ini; token hit cache merupakan bagian dari token prompt",currentAgentPromptTokensTooltip:"Token prompt agen saat ini di seluruh sesinya pada periode yang dipilih (memerlukan metadata penggunaan per giliran; sesi lama mungkin menampilkan 0)",currentAgentCacheHitRateTooltip:"Tingkat hit cache berbobot token untu
199k panggilan cache agen saat ini yang teramati pada periode terpilih (token hit cache / token input yang memenuhi syarat; — jika tidak tersedia)",currentAgentCompletionTokensTooltip:"Token completion agen saat ini di seluruh sesinya pada periode yang dipilih (memerlukan metadata penggunaan per giliran; sesi lama mungkin menampilkan 0)",currentAgentLlmCallsTooltip:"Jumlah giliran asisten dengan metadata penggunaan tercatat untuk agen saat ini (bukan jumlah panggilan API mentah; sesi lama mungkin menampilkan 0)",loadFailed:"Gagal memuat statistik",noData:"Tidak ada data statistik pada periode yang dipilih",retry:"Coba Lagi"},RL={title:"Persetujuan Keamanan Diperlukan",ownerAgent:"Agen Pemilik",executingAgent:"Agen yang Mengeksekusi",tool:"Alat",severity:"Tingkat Keparahan",findings:"Temuan",parameters:"Parameter",approve:"Setujui",deny:"Tolak",source:"Sumber",builtinSource:"Bawaan",subSession:"Sub-Agen",approved:"Panggilan alat disetujui",denied:"Panggilan alat ditolak",approveFailed:"Gagal menyetujui",denyFailed:"Gagal menolak",timeoutAutoDenied:"Waktu habis, otomatis ditolak",acknowledge:"Mengerti",approvePattern:"Selalu Izinkan",strictModeHint:"Selalu izinkan tidak tersedia dalam mode ketat",approveExact:"Hanya Sekali Ini",approvalScope:"Lingkup Persetujuan",details:"Detail"},IL={title:"Akun",currentPassword:"Kata Sandi Saat Ini",currentPasswordRequired:"Harap masukkan kata sandi Anda saat ini",newUsername:"Nama Pengguna Baru",newUsernamePlaceholder:"Biarkan kosong untuk tetap menggunakan yang sekarang",newPassword:"Kata Sandi Baru",newPasswordPlaceholder:"Biarkan kosong untuk tetap menggunakan yang sekarang",confirmPassword:"Konfirmasi Kata Sandi Baru",confirmPasswordPlaceholder:"Masukkan kembali kata sandi baru",passwordMismatch:"Kata sandi tidak cocok",save:"Simpan Perubahan",updateSuccess:"Akun berhasil diperbarui",updateFailed:"Gagal memperbarui akun",wrongPassword:"Kata sandi saat ini salah",nothingToUpdate:"Harap masukkan nama pengguna atau kata sandi baru",passwordEmpty:"Kata sandi tidak boleh kosong",usernameEmpty:"Nama pengguna tidak boleh kosong",username:"Nama pengguna",passwordRequired:"Masukkan kata sandi baru",hubPasswordPlaceholder:"Masukkan minimal delapan karakter",runtimeTitle:"Runtime pribadi",runtimeDescription:"Mulai ulang runtime jika ruang kerja tidak tersedia. Tugas yang berjalan akan dihentikan, tetapi data tersimpan tetap dipertahankan.",runtimeRestartConfirmTitle:"Mulai ulang runtime?",runtimeRestartConfirmDescription:"Tugas yang berjalan akan dihentikan selama runtime dimulai ulang.",runtimeRestart:"Mulai ulang runtime",runtimeRestartSuccess:"Runtime berhasil dimulai ulang",runtimeRestartFailed:"Gagal memulai ulang runtime"},_L={title:"Transkripsi Suara",description:"Konfigurasi cara pesan audio dan suara yang masuk ditangani.",saveSuccess:"Mode audio tersimpan",saveFailed:"Gagal menyimpan mode audio",audioModeLabel:"Mode Audio",audioModeDescription:"Pilih cara pesan suara dari saluran (Discord, Telegram, dll.) diproses sebelum dikirim ke model.",modeAuto:"Otomatis (Direkomendasikan)",modeAutoDesc:"Transkripsi audio ke teks menggunakan penyedia transkripsi yang dipilih, lalu kirim teks ke model. Jika transkripsi tidak tersedia atau dinonaktifkan, placeholder unggahan file ditampilkan. Audio tidak pernah dikirim langsung ke model dalam mode ini. Berfungsi dengan semua model.",modeNative:"Audio Native",modeNativeDesc:"Kirim file audio langsung ke model tanpa transkripsi. Ini adalah satu-satunya mode yang mengirim audio ke model. Hanya berfungsi dengan model yang mendukung audio (misalnya gpt-4o-audio). Sebagian besar model tidak mendukung ini dan akan menolak pesan.",ffmpegReady:"ffmpeg terinstal. Konversi audio tersedia untuk mode native.",ffmpegMissing:"ffmpeg tidak terinstal.",ffmpegMissingDesc:"Mode audio native memerlukan ffmpeg untuk mengonversi format audio (misalnya .ogg ke .wav). Instal ffmpeg sebagai paket sistem untuk mengaktifkan mode ini.",providerTypeLabel:"Penyedia Transkripsi",providerTypeDescription:"Pilih backend transkripsi. Pilih Dinonaktifkan jika Anda tidak memerlukan transkripsi suara.",providerTypeDisabled:"Dinonaktifkan",providerTypeDisabledDesc:"Tidak ada transkripsi. Pesan suara akan menampilkan placeholder unggahan file.",providerTypeWhisperApi:"Whisper API",providerTypeWhisperApiDesc:"Gunakan endpoint Whisper API yang kompatibel dengan OpenAI dari penyedia yang dikonfigurasi (misalnya OpenAI, Ollama).",providerTypeLocalWhisper:"Whisper Lokal",providerTypeLocalWhisperDesc:"Jalankan transkripsi secara lokal menggunakan pustaka Python openai-whisper. Memerlukan ffmpeg dan openai-whisper yang terinstal.",localWhisperReady:"Whisper Lokal siap. ffmpeg dan openai-whisper terinstal.",localWhisperMissing:"Whisper Lokal tidak siap. Dependensi yang hilang harus diinstal.",localWhisperMissingDesc:"ffmpeg: {{ffmpeg}} | openai-whisper: {{whisper}}. Instal dependensi yang hilang: ffmpeg (paket sistem) dan openai-whisper (uv pip install openai-whisper, atau instal QwenPaw dengan ekstra [whisper]).",providerLabel:"Penyedia Whisper API",providerDescription:"Pilih penyedia mana yang akan digunakan untuk transkripsi audio melalui Whisper API. Hanya penyedia dengan endpoint yang kompatibel dengan Whisper yang ditampilkan.",providerPlaceholder:"Pilih penyedia...",noProvidersWarning:"Tidak ada penyedia yang mendukung transkripsi. Konfigurasi penyedia OpenAI untuk mengaktifkan transkripsi suara.",transcriptionInfoTitle:"Cara transkripsi bekerja",transcriptionInfoDesc:"Transkripsi Whisper API menggunakan endpoint /v1/audio/transcriptions yang kompatibel dengan OpenAI. Ini memerlukan penyedia yang dikonfigurasi dengan endpoint yang kompatibel dengan Whisper — misalnya, penyedia OpenAI. Pilih penyedia tertentu di atas untuk mengaktifkan transkripsi.",transcriptionInfoDescLocal:"Transkripsi Whisper Lokal menjalankan pustaka openai-whisper langsung di mesin Anda. Ini memerlukan ffmpeg (untuk decoding audio) dan paket Python openai-whisper yang terinstal. Tidak diperlukan API key atau koneksi jaringan. Instal dengan: uv pip install 'qwenpaw[whisper]'."},LL={readFile:"Baca {{file}}",readFileDefault:"Baca file",writeFile:"Buat {{file}}",writeFileDefault:"Buat file",editFile:"Edit {{file}}",editFileDefault:"Edit file",appendFile:"Tambahkan ke {{file}}",appendFileDefault:"Tambahkan ke file",grepSearch:"Grep {{pattern}}",grepSearchDefault:"Pencarian grep",globSearch:"Glob {{pattern}}",globSearchDefault:"Pencarian glob",viewImage:"Lihat gambar {{file}}",viewImageDefault:"Lihat gambar",viewVideo:"Lihat video {{file}}
199",viewVideoDefault:"Lihat video",desktopScreenshot:"Tangkapan layar desktop",sendFile:"Kirim {{file}}",sendFileDefault:"Kirim file",browserUse:"Jelajahi {{detail}}",browserNavigate:"Buka {{url}}",browserNavigateDefault:"Buka halaman",browserClick:"Klik",browserType:"Ketik",browserSnapshot:"Ambil snapshot",browserScroll:"Gulir",getCurrentTime:"Dapatkan waktu saat ini",setTimezone:"Atur {{timezone}}",getTokenUsage:"Kueri penggunaan token",memorySearch:"Cari memori {{query}}",memorySearchDefault:"Cari memori",listAgents:"Daftar agen",chatWithAgent:"Chat dengan {{agent}}",chatWithAgentDefault:"Chat dengan agen",submitToAgent:"Kirim ke {{agent}}{{task}}",submitToAgentDefault:"Kirim tugas",checkAgentTask:"Periksa {{agent}} #{{taskId}}",checkAgentTaskAgent:"Periksa {{agent}}",checkAgentTaskDefault:"Periksa tugas",delegateExternalAgent:"Delegasikan {{runner}}",delegateExternalAgentDefault:"Delegasikan ke agen eksternal",shell:"Jalankan {{command}}",shellDefault:"Jalankan perintah",formatTable:{file:"File",lineNumber:"Baris",score:"Skor",summary:"Ringkasan",name:"Nama",id:"ID",description:"Deskripsi",status:"Status"},loading:"Memuat...",rawInputPreview:"Input mentah langsung (4.096 karakter terakhir)",largeOutputOmitted:"{{count}} baris dihilangkan — salin keluaran yang tersedia atau ikuti petunjuk pemulihannya",largeOutputTruncated:"Keluaran dipangkas untuk tampilan — salin keluaran yang tersedia atau ikuti petunjuk pemulihannya",browserAction:{startHeaded:"Mulai browser (dengan tampilan)",start:"Mulai browser",stop:"Hentikan browser",open:"Buka {{url}}",openDefault:"Buka halaman",navigate:"Navigasi ke {{url}}",navigateDefault:"Navigasi",navigateBack:"Kembali",click:"Klik {{selector}}",clickDefault:"Klik elemen",type:"Ketik {{text}}",typeDefault:"Ketik teks",snapshot:"Ambil snapshot",screenshot:"Tangkapan layar {{path}}",screenshotDefault:"Tangkapan layar",eval:"Evaluasi {{code}}",evalDefault:"Evaluasi kode",runCode:"Jalankan {{code}}",runCodeDefault:"Jalankan kode",closePage:"Tutup halaman",tabs:"Tab {{action}}",tabsDefault:"Kelola tab",fillForm:"Isi formulir",fileUpload:"Unggah {{filename}}",fileUploadDefault:"Unggah file",fileDownload:"Unduh {{target}}",fileDownloadDefault:"Unduh file",pressKey:"Tekan {{key}}",pressKeyDefault:"Tekan tombol",hover:"Arahkan ke {{selector}}",hoverDefault:"Arahkan ke elemen",drag:"Seret",selectOption:"Pilih opsi",waitFor:"Tunggu {{target}}",waitForDefault:"Tunggu elemen",resize:"Ubah ukuran {{w}}x{{h}}",resizeDefault:"Ubah ukuran jendela",pdf:"Ekspor PDF {{path}}",pdfDefault:"Ekspor PDF",install:"Instal",batch:"Batch"},lineBadge:{lines:"{{count}} baris",addLines:"+{{count}} baris",delLines:"-{{count}} baris",matches:"{{count}} cocok",files:"{{count}} file"},inlineResult:{taskId:"Tugas #{{id}}",submitted:"Dikirim"},execute:"Jalankan {{tool}}",executeDefault:"Jalankan alat"},EL=JSON.parse('{"discoveryOriginApi":"Terdeteksi via API","discoveryOriginCatalog":"Katalog resmi","discoveryOriginBoth":"API + katalog","availabilityAvailable":"Tersedia","availabilityPermissionDenied":"Tidak ada izin","availabilityNotFound":"Tidak ditemukan","availabilityIncompatible":"Tidak kompatibel dengan chat","availabilityRateLimited":"Dibatasi laju","availabilityTransientError":"Sementara tidak tersedia","availabilityUnverified":"Belum diverifikasi","modelAlreadyConfigured":"Sudah dikonfigurasi","llmConfiguration":"Konfigurasi LLM","providersTitle":"Penyedia","providersDescription":"Konfigurasi API key dan endpoint untuk setiap penyedia.","llmTitle":"Model","defaultLlm":"LLM Default","notConfiguredYet":"Belum dikonfigurasi","llmDescription":"Atur model LLM default global dari penyedia yang diotorisasi. Anda dapat memilih model tertentu untuk setiap Agen di halaman Chat.","configureProvider":"Konfigurasi {{name}}","baseURL":"URL Dasar","apiKey":"API Key","advancedConfig":"Konfigurasi Lanjutan","authMode":"Mode Autentikasi","authModeApiKey":"API Key (x-api-key)","authModeAuthToken":"Auth Token (Authorization: Bearer)","customHeaders":"Header Kustom","customHeadersHint":"Ditambahkan ke setiap permintaan API, mis. x-app: cli","customHeaderKey":"Nama Header","customHeaderValue":"Nilai Header","addHeader":"+ Tambah Header","generateConfig":"Parameter Generasi","generateConfigHint":"Parameter generasi dalam bentuk objek JSON. Akan diperluas dan diteruskan ke permintaan generasi.","generateConfigInvalidJson":"Harap masukkan JSON yang valid","generateConfigMustBeObject":"Parameter generasi harus berupa objek JSON","modelAdvancedConfig":"Konfigurasi Lanjutan Model","modelGenerateConfig":"Parameter Generasi Model","modelGenerateConfigHint":"Parameter generasi dalam bentuk objek JSON untuk model ini. Menimpa konfigurasi tingkat pe
199nyedia.","modelConfigSaved":"Konfigurasi tersimpan untuk model {{name}}","modelConfigSaveFailed":"Gagal menyimpan konfigurasi model","modelConfigLabel":"Konfigurasi Model","maxTokensLabel":"Token Maksimum","maxTokensHint":"Token output maksimum per respons","maxInputLengthLabel":"Panjang Konteks Maksimum","maxInputLengthHint":"Ukuran jendela konteks model, mengontrol ambang kompaksi konteks (≥1000)","relayReasoningLabel":"Teruskan Penalaran","relayReasoningHint":"Teruskan konten penalaran ke giliran percakapan berikutnya","thinkingModeLabel":"Aktifkan Pemikiran","thinkingModeHint":"Nyalakan untuk mengaktifkan pemikiran/penalaran. Matikan untuk menonaktifkan pemikiran.","thinkingBudgetLabel":"Anggaran Pemikiran","thinkingBudgetHint":"Menggunakan anggaran pemikiran default model","switchToManual":"Manual","switchToAuto":"Otomatis","reasoningEffortLabel":"Kedalaman Penalaran","reasoningEffortHint":"Mengontrol kedalaman penalaran (keluarga OpenAI)","protocol":"Protokol","protocolHint":"Pilih protokol API penyedia untuk konfigurasi ini.","selectProtocol":"Harap pilih protokol","protocolOpenAI":"Kompatibel OpenAI (Chat Completions)","protocolOpenAIResponse":"Kompatibel OpenAI (Response API)","protocolAnthropic":"Anthropic (Messages API)","currentKey":"Saat ini: {{key}}","startsWith":"Dimulai dengan \\"{{prefix}}\\"","optionalSelfHosted":"Opsional untuk layanan yang di-host sendiri","leaveBlankKeep":"Biarkan kosong untuk tetap menggunakan kunci saat ini","enterApiKey":"Masukkan API key ({{prefix}}...)","enterApiKeyOptional":"Masukkan API key (opsional)","openAIEndpoint":"Endpoint OpenAI, mis. https://api.openai.com/v1","openAICompatibleEndpoint":"Endpoint kompatibel OpenAI, mis. https://api.example.com","azureEndpointHint":"Endpoint Azure OpenAI, mis. https://<resource>.openai.azure.com/openai/v1","anthropicEndpointHint":"Endpoint Anthropic, mis. https://api.anthropic.com","ollamaEndpointHint":"Endpoint Ollama, mis. http://localhost:11434","lmstudioEndpointHint":"Endpoint LM Studio, mis. http://localhost:1234/v1","apiEndpointHint":"Endpoint API, mis. https://api.example.com","pleaseEnterBaseURL":"Harap masukkan URL dasar API","selectBaseURL":"Pilih URL dasar","selectBaseURLHint":"Pilih endpoint regional untuk penyedia ini","pleaseEnterValidURL":"Harap masukkan URL yang valid","apiKeyShouldStart":"API Key harus dimulai dengan \\"{{prefix}}\\"","configurationSaved":"Konfigurasi {{name}} tersimpan","failedToSaveConfig":"Gagal menyimpan konfigurasi","revokeAuthorization":"Cabut Otorisasi","revokeConfirmContent":"Apakah Anda yakin ingin menghapus API key untuk {{name}}? Konfigurasi model LLM saat ini juga akan dihapus.","revokeConfirmSimple":"Apakah Anda yakin ingin menghapus API key untuk {{name}}?","authorizationRevoked":"Otorisasi {{name}} dicabut, model LLM dihapus","authorizationRevokedSimple":"Otorisasi {{name}} dicabut","failedToRevoke":"Gagal mencabut otorisasi","active":"Aktif: {{provider}} / {{model}}","provider":"Penyedia","model":"Model","selectProvider":"Pilih penyedia (harus diotorisasi)","selectModel":"Pilih model","llmModelUpdated":"Model LLM diperbarui","failedToSave":"Gagal menyimpan","freeModelWarningTitle":"Pemberitahuan Model Gratis","freeModelWarningMessage":"Model gratis mungkin memiliki ketersediaan terbatas. Silakan merujuk ke ketentuan layanan penyedia:","freeModelWarningDontShowAgain":"Jangan tampilkan lagi","saved":"Tersimpan","save":"Simpan","cancel":"Batal","loading":"Memuat...","retry":"Coba Lagi","notSet":"Belum diatur","notRequired":"Tidak diperlukan","available":"Tersedia","unavailable":"Tidak Tersedia","providerAvailable":"Siap (dengan model)","providerNoModels":"Belum Siap (tidak ada model)","providerNotConfigured":"Belum Siap (belum dikonfigurasi)","settings":"Pengaturan","actions":"Tindakan","search":"Cari","searchPlaceholder":"Cari penyedia...","searchModelPlaceholder":"Cari model...","custom":"Kustom","builtin":"Bawaan","freeTierGroup":"Tingkat Gratis","paidGroup":"Berbayar","localCustomGroup":"Lokal & Kustom","cloudGroup":"Penyedia Cloud","configuredGroup":"Dikonfigurasi","configuredOnline":"penyedia online","noConfigured":"Belum ada penyedia yang dikonfigurasi. Pilih salah satu di bawah untuk memulai.","goConfigureBtn":"Konfigurasi Penyedia","availableGroup":"Penyedia Tersedia","clickToConfigure":"Klik untuk mengkonfigurasi","configureAction":"Konfigurasi →","endpointCount":"{{count}} endpoint","connect":"OAuth","saveApiKey":"Simpan","addProvider":"Tambah Penyedia","addProviderTitle":"Tambah Penyedia Kustom","providerIdLabel":"ID Penyedia","providerIdPlaceholder":"mis. openai, google, anthropic","providerIdHint":"Huruf kecil, digit, tanda hubung, garis bawah. Tidak dapat diubah nanti.","providerNameLabel":"Nama Tampilan","providerNamePlaceholder":"mis. OpenAI, Google Gemini","defaultBaseUrlLabel":"URL Dasar Default","defaultBaseUrlPlaceholder":"mis. https://api.example.com","apiKeyPrefixLabel":"Awalan API Key (opsional)","apiKeyPrefixPlaceholder":"mis. sk-","providerCreated":"Penyedia \\"{{name}}\\" dibuat","providerCreateFailed":"Gagal membuat penyedia","deleteProvider":"Hapus Penyedia","deleteProviderConfirm":"Hapus penyedia kustom \\"{{name}}\\" dan semua modelnya? Ini tidak dapat dibatalkan.","providerDeleted":"Penyedia \\"{{name}}\\" dihapus","providerDeleteFailed":"Gagal menghapus penyedia","disableProvider":"Nonaktifkan Penyedia","disableProviderConfirm":"Hapus API key untu
199k \\"{{name}}\\"? Penyedia akan menjadi tidak dikonfigurasi.","disableBtn":"Nonaktifkan","changeApiKey":"Ubah","selectVariant":"Pilih Varian {{name}}","providerDisabled":"Penyedia \\"{{name}}\\" dinonaktifkan","manageModels":"Model","models":"Model","manageModelsTitle":"{{provider}} — Manajemen Model","userAdded":"Ditambahkan pengguna","addModel":"Tambah Model","addModels":"Tambah Model","autoDiscoverModels":"Temukan Model Otomatis","addModelTitle":"Tambah Model ke {{provider}}","modelIdLabel":"ID Model","modelIdPlaceholder":"mis. gpt-4o, gemini-2.0-flash","modelDiscoveryUnavailableHint":"Tidak ada model yang tersedia. Penyedia ini mungkin tidak mendukung penemuan daftar model, harap masukkan ID model secara manual.","modelNameLabel":"Nama Model","modelNameRequired":"Harap masukkan nama model","modelNamePlaceholder":"mis. GPT-4o, Gemini 2.0 Flash","modelAdded":"Model \\"{{name}}\\" ditambahkan","modelAddFailed":"Gagal menambahkan model","modelAlreadyExists":"ID model \\"{{id}}\\" sudah ada","autoDiscoverModelsSuccess":"Penemuan otomatis selesai. Menambahkan {{count}} model","autoDiscoverModelsNoNew":"Penemuan otomatis selesai. Tidak ada model baru yang ditambahkan","autoDiscoverModelsFailed":"Gagal menemukan model secara otomatis","removeModel":"Hapus","removeModelConfirm":"Hapus model \\"{{name}}\\" dari {{provider}}?","modelRemoved":"Model \\"{{name}}\\" dihapus","modelRemoveFailed":"Gagal menghapus model","loadMore":"Muat lebih banyak ({{count}})","modelsCount":"{{count}} model","noModels":"Tidak ada model","addModelFirst":"Harap tambahkan model terlebih dahulu","modelList":"Daftar Model","clearAll":"Hapus Semua","filteredModelsLoaded":"Model yang difilter dimuat: {{count}}","filterFailed":"Gagal memfilter model","clearAllModels":"Hapus Semua Model","clearAllModelsConfirm":"Hapus semua {{count}} model tambahan? Ini tidak dapat dibatalkan.","allModelsCleared":"{{count}} model dihapus","filterModels":"Filter Model","filterByProvider":"Penyedia:","searchProviderPlaceholder":"Cari nama penyedia","selectAllProviders":"Pilih Semua","clearProviderSelection":"Batalkan Semua","noMatchingProviders":"Tidak ada penyedia yang cocok","filterByModality":"Modalitas Input:","filterFreeOnly":"Model Gratis Saja:","getModels":"Dapatkan Model","discovered":"Model Tersedia:","add":"Tambah","local":"Lokal","localType":"Tipe","localEmbedded":"Tertanam (dalam proses)","localDownloadFirst":"Layanan model belum dimulai","localDownloadModel":"Unduh Model","localModelsTitle":"{{provider}} — Model Lokal","localNoModels":"Belum ada model yang diunduh","localRepoId":"ID Repositori Model","localRepoIdRequired":"Harap masukkan ID repositori model","localRepoIdPlaceholder":"mis. Qwen/Qwen3-0.6B-GGUF","localFilename":"Nama File (opsional)","localFilenamePlaceholder":"mis. mistral-7b.Q4_K_M.gguf","localFilenameHint":"Biarkan kosong untuk memilih kuantisasi terbaik secara otomatis","localSource":"Sumber","localDownloadSuccess":"Model berhasil diunduh","localDownloadFailed":"Gagal mengunduh model","localDeleteModel":"Hapus Model","localDeleteConfirm":"Hapus model lokal \\"{{name}}\\"? File model akan dihapus dari disk.","localModelDeleted":"Model \\"{{name}}\\" dihapus","localDeleteFailed":"Gagal menghapus model","localDownloadPending":"Mempersiapkan unduhan...","localDownloading":"Mengunduh {{repo}}... Ini mungkin memakan beberapa menit.","localDownloadNavigateHint":"Anda dapat menavigasi halaman lain — unduhan akan terus berjalan di latar belakang.","localDownloadInProgress":"Unduhan sedang berlangsung","localDownloaded":"Diunduh","localNotDownloaded":"Belum diunduh","localNoRecommendedModels":"Perangkat ini tidak cukup kuat untuk menjalankan model lokal","localCancelDownloadTitle":"Batalkan unduhan","localCancelDownloadAction":"Batalkan unduhan","localCancelDownloadConfirm":"Batalkan unduhan \\"{{repo}}\\"?","localDownloadCancelled":"Unduhan dibatalkan","localCancelDownloadFailed":"Gagal membatalkan unduhan","localLlamacppName":"Mesin inferensi","localLlamacppInstallHint":"Instal runtime lokal sebelum mengunduh atau memulai model.","localInstallLlamacpp":"Instal llama.cpp","localLlamacppInstallStarted":"Unduhan llama.cpp dimulai","localLlamacppInstallSuccess":"llama.cpp berhasil diinstal","localLlamacppInstallFailed":"Gagal menginstal llama.cpp","localRuntimeSectionTitle":"Mesin Inferensi","localRuntimeSectionDescription":"Didukung oleh Llama.cpp","localRuntimeComputeHint":"CPU digunakan secara default. Untuk akselerasi GPU, gunakan Ollama atau LM Studio.","localRuntimeInstalled":"Terinstal","localRuntimeUpdateAvailable":"Pembaruan tersedia","localRuntimeUpdateAction":"Klik untuk mengunduh ver
199si terbaru","localRuntimeUpdateConfirmTitle":"Konfirmasi pembaruan llama.cpp","localRuntimeUpdateConfirmContent":"Pembaruan akan menimpa versi llama.cpp yang terinstal. Konfirmasi untuk mulai mengunduh dan menginstal versi terbaru.","localRuntimeUpdateConfirmContentWithServer":"Pembaruan akan menimpa versi llama.cpp yang terinstal dan menghentikan layanan model yang sedang berjalan ({{model}}). Konfirmasi untuk mulai mengunduh dan menginstal versi terbaru.","localRuntimeUnsupported":"Tidak didukung","localRuntimeMissing":"Tidak ada","localServerRunningTitle":"Server lokal saat ini","localServerOnline":"Berjalan","localServerIdle":"Mati","localServerUnavailable":"Masalah","localNoActiveModel":"Tidak ada model aktif","localNoDownloadedModelsHint":"Unduh model yang sesuai sebelum memulai layanan inferensi lokal.","localDownloadModelFirst":"Unduh model terlebih dahulu","localEngineInstallStateLabel":"Instal","localEngineRunStateLabel":"Status","localEngineCurrentModelLabel":"Model yang sedang dijalankan","localEngineNextStepLabel":"Langkah selanjutnya","localEngineHealthLabel":"Kesehatan mesin","localEngineStatusHint":"Harap unduh dan mulai model yang sesuai dari daftar di bawah","localStartServer":"Mulai","localStopServer":"Hentikan","localServerStartFailed":"Gagal memulai server lokal","localServerStopFailed":"Gagal menghentikan server lokal","localServerSwitchTitle":"Ganti model yang berjalan","localServerSwitchConfirm":"Server saat ini menjalankan {{current}}. Ganti ke {{next}}?","localSwitchModel":"Ganti","localModelPathMissing":"Model yang diunduh ini tidak memiliki jalur lokal.","localModelsSectionTitle":"Model Lokal","localModelsSectionDescription":"Model yang diunduh dapat langsung dimulai. Hanya satu unduhan model dan satu instance server lokal yang dapat berjalan sekaligus.","localModelsLockedHint":"Harap instal llama.cpp terlebih dahulu","localAlternativeRuntimeHint":"Coba Ollama atau LM Studio","localModelsCount":"Diunduh {{downloaded}} / {{total}}","localCurrentDownloadTitle":"Unduhan saat ini","localAdvancedConfigTitle":"Pengaturan Lokal Lanjutan","localAdvancedConfigDescription":"Pengaturan ini berlaku untuk runtime inferensi lokal yang tertanam. Perubahan panjang konteks maksimum berlaku saat server lokal dimulai berikutnya.","localAdvancedConfigSaved":"Pengaturan lokal lanjutan tersimpan","localAdvancedConfigSaveFailed":"Gagal menyimpan pengaturan lokal lanjutan","localMaxContextLengthLabel":"Panjang Konteks Maksimum","localMaxContextLengthHint":"Jumlah token maksimum untuk jendela konteks model. Perubahan berlaku saat server lokal dimulai berikutnya.","localMaxContextLengthRequired":"Harap masukkan panjang konteks maksimum","localMaxContextLengthMin":"Panjang konteks maksimum minimal {{min}}","localMaxContextLengthPlaceholder":"Masukkan panjang konteks maksimum","localServerPortLabel":"Port Server","localServerPortHint":"Biarkan kosong agar llama.cpp secara otomatis memilih port. Masukkan port untuk menggunakan port tetap. Perubahan berlaku saat server lokal dimulai berikutnya.","localServerPortRange":"Port server harus antara {{min}} dan {{max}}","localServerPortPlaceholder":"Biarkan kosong untuk memilih port secara otomatis","localGenerateConfigHint":"Konfigurasi parameter generasi model lokal sebagai objek JSON.","localCustomModelTitle":"Unduhan model kustom","localCustomModelHint":"Masukkan ID repositori model. Hanya format GGUF.","localSourceHuggingFace":"Hugging Face","localSourceModelScope":"ModelScope","ollamaModelNamePlaceholder":"mis. mistral:7b, qwen3:8b","testConnection":"Uji Koneksi","testConnectionSuccess":"Uji koneksi berhasil","testConnectionFailed":"Uji koneksi gagal","testConnectionFailedWithMessage":"Uji koneksi gagal: {{message}}","testConnectionError":"Terjadi kesalahan saat menguji koneksi","discoverModels":"Temukan Model","discoverModelsFailed":"Gagal menemukan model","ollamaFetchModelsFailed":"Gagal mengambil model Ollama. Harap periksa detail kesalahan.","modelTestFailed":"Validasi model gagal, harap periksa apakah ID model benar","modelTestFailedConfirm":"Uji koneksi model gagal: {{message}}. Apakah Anda tetap ingin menambahkan model ini?","autoDiscoveredAndAdded":"Menemukan {{count}} model secara otomatis dan menambahkan {{added}} model baru","autoDiscoveredNoNew":"Menemukan {{count}} model secara otomatis; daftar model sudah terkini","autoDiscoverFailed":"Penemuan model otomatis gagal; Anda dapat menambahkan model secara manual","tagImage":"Gambar","tagVideo":"Video","tagTextOnly":"Teks Saja","tagMultimodal":"Multimodal","tagVision":"Visi","tagText":"Teks","free":"Gratis","probeMultimodal":"Uji Multimodal","probeImage":"Gambar","probeVideo":"Video","probeSupported":"Didukung: {{types}}","probeNotSupported":"Model ini tidak mendukung input multimodal","probeFailed":"Probe gagal","tagNotProbed":"Belum Diuji","modalityVision":"Gambar","modalityAudio":"Audio","modalityVideo":"Video","modalityFile":"File","modalityText":"Teks saja","perMillionIn":"/1 juta masuk","perMillionOut":"/1 juta keluar"}'),FL={title:"File",navigator:"Navigator file",source:"Sumber",workspace:"Workspace",profile:"Profil",memory:"Memori Jangka Panjang",daily:"Jurnal",digest:"Basis Pengetahuan",memoryGraph:"Graf Memori",memoryGraphShort:"Graf",memoryGraphLoading:"Memuat graf memori…",memoryGraphLoadFailed:"Gagal memuat graf memori.",memoryGraphCounts:"{{nodes}} node · {{edges}} tautan",memoryGraphEmpty:"Belum ada tautan memori yang diindeks.",memoryGraphZoomOut:"Perkecil",memoryGraphZoomIn:"Perbesar",memoryGraphFit:"Sesuaikan graf",memoryGraphRoot:"Node akar",memoryGraphRootDirect:"File langsung",memoryGraphOtherFile:"File lain",memoryGraphIndexed:"File terindeks",memoryGraphUnresolved:"Tautan belum terselesaikan",memoryGraphDirection:"Arah Wiki link",memoryGraphOpenFile:"Buka Markdown",memoryGraphOutbound:"Keluar · {{count}}
199",memoryGraphInbound:"Masuk · {{count}}",projectDirectory:"Direktori proyek",workspaceDirectory:"Direktori konfigurasi",switchRoot:"Ganti direktori",manageDirs:"Kelola direktori…",primaryRoot:"Utama",rootMissing:"Hilang",rootsPending:"{{count}} lainnya tersedia setelah pesan pertama",sourceEmpty:"Belum ada file di sumber ini.",loadMore:"Muat 200 berikutnya",upload:"Unggah file",conflictPolicy:"Kebijakan konflik unggahan",conflictRename:"Simpan keduanya",conflictRenameDescription:"Tambahkan nomor pada nama file baru dan pertahankan file lama.",conflictSkip:"Pertahankan yang lama",conflictSkipDescription:"Lewati file baru yang bentrok dan lanjutkan unggahan lainnya.",conflictOverwrite:"Gunakan file baru",conflictOverwriteDescription:"Ganti file lama dengan file baru.",uploadConflictTitle:"File dengan nama sama ditemukan",uploadConflictDescription:"File berikut sudah ada: {{files}}. Pilih cara melanjutkan.",promptToggle:"Atur apakah {{name}} disertakan dalam prompt sistem",addSystemPrompt:"Tambahkan dari ruang kerja",addSystemPromptTitle:"Tambahkan file prompt sistem",addSystemPromptDescription:"Pilih file Markdown ruang kerja untuk disertakan dalam prompt sistem.",searchSystemPromptFiles:"Cari file Markdown ruang kerja",noSystemPromptCandidates:"Tidak ada file yang cocok.",sourceControl:"Kontrol sumber",preview:"Preview",edit:"Edit",selectFile:"Pilih file untuk dibuka",closeTab:"Tutup tab",closeOtherTabs:"Tutup tab lainnya",closeAllTabs:"Tutup semua tab",openFiles:"File terbuka, {{count}}",openFilesLabel:"File terbuka",openFileCount:"{{count}} terbuka",searchOpenFiles:"Cari berdasarkan file atau jalur",noOpenFilesFound:"Tidak ada file terbuka yang cocok",scrollTabsLeft:"Gulir tab ke kiri",scrollTabsRight:"Gulir tab ke kanan",agentChangedFile:"Agen mengubah file ini",keep:"Simpan",keepAll:"Simpan semua",undo:"Urungkan",undoAll:"Urungkan semua",copySelectionToChat:"Salin pilihan ke Chat",copyFileToChat:"Salin file ke Chat",previewSize:"Preview · {{size}} byte",backToPreview:"Kembali ke Preview",download:"Unduh",downloadFailed:"Unduhan file gagal",resize:"Ubah ukuran panel file",loadFailed:"Gagal memuat file. Pastikan file masih berada di direktori kerja utama pada ruang kerja agen saat ini.",previewUnavailable:"Preview tidak tersedia. Metadata dan unduhan tetap tersedia.",mentionInChat:"Sebutkan di Chat",expandWorkspace:"Perluas workspace",openWorkspace:"Buka workspace",closeWorkspace:"Tutup workspace"},OL={agentTitle:"Direktori proyek Agen",sessionTitle:"Direktori proyek Sesi",pathPlaceholder:"Masukkan path direktori absolut",recentProjects:"Proyek terbaru",browseDirectory:"Telusuri direktori",noRecentProjects:"Belum ada proyek terbaru",clearSelection:"Hapus pilihan proyek",homeDirectory:"Direktori utama",parentDirectory:"Direktori induk",refreshDirectory:"Segarkan direktori",restoreDefault:"Pulihkan bawaan",createDirectory:"Buat folder baru",directoryNamePlaceholder:"Masukkan nama folder",createDirectoryFailed:"Gagal membuat folder",useWorkspace:"Gunakan direktori konfigurasi",createSessionHint:"Kirim pesan pertama untuk menetapkan direktori khusus Sesi.",sessionSource:"Sesi",agentSource:"Default Agen",makePrimary:"Jadikan utama",remove:"Hapus",add:"Tambah",boundDirs:"Direktori proyek yang ditambahkan",primaryHint:"Panggilan alat dan perintah berjalan di direktori utama secara bawaan.",primaryTag:"Utama",unbound:"Belum ada direktori terikat",unavailable:"Hilang",alreadyBound:"Sudah terikat",tooMany:"Maksimal {{max}} direktori dapat diikat.",countTitle:"Jumlah direktori yang diikat"},BL=JSON.parse('{"title":"Konfigurasi","projectDirectoryTitle":"Direktori proyek default","projectDirectoryDescription":"Direktori default untuk file dan perintah.","projectDirectoryDefault":"Default Agen","changeProjectDirectory":"Ubah direktori","projectDirectoryWorkspaceFallback":"Menggunakan workspace agen","enhancedCodeCapability":"Kemampuan kode lanjutan","enhancedCodeCapabilityTooltip":"Menambahkan alat kode tanpa mengubah direktori proyek.","enhancedCodeCapabilityDescription":"Aktifkan AST, LSP, prompt kode, konteks Git, dan kontrol sumber.","description":"Konfigurasi parameter runtime agen","reactAgentTitle":"Agen ReAct","llmRetryTitle":"Coba Ulang LLM Otomatis","llmRetryEnabled":"Aktifkan Coba Ulang Otomatis","llmRetryEnabledTooltip":"Secara otomatis mencoba ulang kegagalan API LLM sementara seperti batas kecepatan, timeout, atau kesalahan koneksi.","llmMaxRetries":"Coba Ulang Maksimum","llmMaxRetriesTooltip":"Jumlah maksimum percobaan ulang untuk permintaan LLM yang dapat dicoba ulang.","llmMaxRetriesPlaceholder":"Masukkan coba ulang maksimum","llmMaxRetriesRequired":"Coba ulang maksimum wajib diisi","llmMaxRetriesMin":"Coba ulang maksimum minimal 1","llmBackoffBase":"Penundaan Dasar Backoff (dtk)","llmBackoffBaseTooltip":"Penundaan dasar sebelum percobaan ulang pertama. Percobaan ulang berikutnya menggunakan backoff eksponensial dari nilai ini.","llmBackoffBasePlaceholder":"Masukkan penundaan dasar","llmBackoffBaseRequired":"Penundaan dasar backoff wajib diisi","llmBackoffBaseMin":"Penundaan dasar backoff minimal 0,1 detik","llmBackoffCap":"Penundaan Maksimum Backoff (dtk)","llmBackoffCapTooltip":"Batas maksimum untuk penundaan backoff percobaan ulang eksponensial.","llmBackoffCapPlaceholder":"Masukkan penundaan maksimum","llmBackoffCapRequired":"Penundaan maksimum backoff wajib diisi","llmBackoffCapMin":"Penundaan maksimum backoff minimal 0,5 detik","llmBackoffCapGteBase":"Penundaan maksimum backoff harus lebih besar dari atau sama dengan penundaan dasar","llmRateLimiterTitle":"Pembatas Kecepatan LLM","llmMaxConcurrent":"Panggilan Bersamaan Maksimum","llmMaxConcurrentTooltip":"Jumlah maksimum panggilan LLM yang diizinkan berjalan bersamaan. Dibagi di semua agen.","llmMaxConcurrentPlaceholder":"Masukkan panggilan bersamaan maksimum","llmMaxConcurrentRequired":"Panggilan bersamaan maksimum wajib diisi","llmMaxConcurrentRange":"Panggilan bersamaan maksimum minimal 1","llmMaxQpm":"QPM Maksimum (Kuer
199i Per Menit)","llmMaxQpmTooltip":"Permintaan maksimum dalam jendela geser 60 detik. 0 = dinonaktifkan.","llmMaxQpmPlaceholder":"Masukkan QPM maksimum (0 = tidak terbatas)","llmMaxQpmRequired":"QPM maksimum wajib diisi","llmMaxQpmRange":"QPM maksimum minimal 0","llmRateLimitPause":"Jeda Batas Kecepatan (dtk)","llmRateLimitPauseTooltip":"Durasi jeda default (detik) yang diterapkan secara global saat respons batas kecepatan 429 diterima.","llmRateLimitPausePlaceholder":"Masukkan durasi jeda","llmRateLimitPauseRequired":"Jeda batas kecepatan wajib diisi","llmRateLimitPauseMin":"Jeda batas kecepatan minimal 1 detik","llmRateLimitJitter":"Jitter Batas Kecepatan (dtk)","llmRateLimitJitterTooltip":"Rentang jitter acak (detik) yang ditambahkan pada jeda agar pembangun bersamaan tidak serentak.","llmRateLimitJitterPlaceholder":"Masukkan rentang jitter","llmRateLimitJitterRequired":"Jitter batas kecepatan wajib diisi","llmRateLimitJitterMin":"Jitter batas kecepatan minimal 0 detik","llmAcquireTimeout":"Timeout Perolehan Slot (dtk)","llmAcquireTimeoutTooltip":"Waktu maksimum (detik) pemanggil akan menunggu untuk mendapatkan slot pembatas kecepatan sebelum menyerah.","llmAcquireTimeoutPlaceholder":"Masukkan timeout perolehan","llmAcquireTimeoutRequired":"Timeout perolehan slot wajib diisi","llmAcquireTimeoutMin":"Timeout perolehan slot minimal 10 detik","llmAcquireTimeoutGtPauseJitter":"Timeout perolehan slot harus lebih besar dari jeda batas kecepatan + jitter","contextManagementTitle":"Manajemen Konteks","memoryManagerBackend":"Backend Manajemen Memori Jangka Panjang","memoryManagerBackendTooltip":"Backend untuk manajer memori. Pilih remelight (file lokal), adbpg (database cloud), PowerContext (layanan memori jarak jauh), atau none (nonaktifkan memori).","memoryManagerBackendRestartWarning":"Mengalihkan backend manajemen memori jangka panjang tidak mendukung hot reload. Simpan dan restart QwenPaw agar perubahan berlaku.","maxIters":"Iterasi Maksimum","maxItersTooltip":"Jumlah maksimum iterasi penalaran-tindakan untuk agen ReAct","maxItersPlaceholder":"Masukkan iterasi maksimum","maxItersRequired":"Iterasi maksimum wajib diisi","maxItersMin":"Iterasi maksimum minimal 1","agentLoopTitle":"Pengaturan Loop Agen","loopMode":{"builtIn":"Bawaan","builtInNote":"Pipeline terkunci · Nilai dapat diedit","templateSectionTitle":"Templat Loop","templateSectionDescription":"Pilih templat bawaan atau tambahkan milik Anda.","defaultTab":"Default","goalTab":"Tujuan","missionTab":"Misi","defaultDescription":"Loop ReAct terjaga standar di luar mode eksplisit.","goalDescription":"Loop persisten berbatas untuk tujuan yang dapat diverifikasi.","missionDescription":"Pipeline persisten untuk misi panjang dan bertahap.","gatePipeline":"Pipeline Gate","repetitionTitle":"Perlindungan pengulangan","repetitionDescription":"Mendeteksi panggilan alat berulang dan melakukan intervensi.","iterationTitle":"Batas iterasi","iterationDescription":"Membatasi jumlah iterasi ReAct.","retryTitle":"Pemeriksaan penyelesaian kualitatif","retryDescription":"Hanya dipicu saat agen memberi respons teks tanpa panggilan alat.","goalTurnTitle":"Batas giliran tujuan","goalTurnDescription":"Membatasi giliran dalam satu tujuan aktif.","maxGoalTurns":"Maksimum giliran tujuan","goalBudgetTitle":"Anggaran token tujuan","goalBudgetDescription":"Berhenti saat tujuan mencapai anggarannya.","maxGoalTokens":"Maksimum token tujuan","goalCompletionTitle":"Pemeriksaan penyelesaian tujuan","goalCompletionDescription":"Membaca status tujuan eksplisit sebelum berhenti.","goalCompletionReadOnly":"Penyelesaian dikendalikan protokol status tujuan bawaan.","missionProgressTitle":"Pemeriksaan progres misi","missionProgressDescription":"Berlanjut sampai semua cerita lulus atau batas tercapai.","missionProgressReadOnly":"Penyelesaian dikendalikan status Mission Story bawaan.","missionIterationTitle":"Batas iterasi Mission","missionIterationDescription":"Tetapkan batas eksekusi default untuk Mission baru.","workerAttemptsTitle":"Percobaan Worker","workerAttemptsDescription":"Batasi percobaan ulang Worker setelah verifikasi Story gagal.","missionVerificationTitle":"Kebijakan verifikasi Mission","missionVerificationDescription":"Tentukan panduan verifikasi dan perintah pengujian default.","defaultMaxMissionIterations":"Maksimum ronde eksekusi default","defaultMaxMissionIterationsTooltip":"Digunakan saat /mission tidak menentukan --max-iterations.","maxRetriesPerStory":"Maksimum percobaan ulang per Story","maxRetriesPerStoryTooltip":"Percobaan ulang Worker setelah hasil FAIL atau PARTIAL dari Verifier.","defaultVerificationInstructions":"Panduan verifikasi (opsional)","defaultVerificationInstructionsHelp":"Panduan bahasa alami yang diterapkan ke setiap Mission Verifier.","defaultVerificationInstructionsPlaceholder":"Contoh: periksa penanganan path Windows dan UI yang dirender.","defaultVerifyCommand":"Perintah pengujian default (opsional)","defaultVerifyCommandHelp":"Verifier mencoba menjalankannya dengan alat dan 
199izin normal. /mission --verify menggantikannya.","defaultVerifyCommandPlaceholder":"Contoh: pytest -q","enableRepetitionProtection":"Aktifkan perlindungan pengulangan","removeRule":"Hapus aturan","custom":"Kustom","customDescription":"Bangun pipeline tersimpan dari Gate bawaan QwenPaw.","duplicate":"Duplikat","delete":"Hapus","displayName":"Nama tampilan","duplicateModeName":"Mode Loop dengan nama ini sudah ada.","slashCommand":"Perintah slash","description":"Deskripsi","availableToAgent":"Tersedia untuk agen ini","runsTopToBottom":"Berjalan dari atas ke bawah","addGate":"Tambah Gate","emptyPipeline":"Tambahkan setidaknya satu Gate agar mode ini tersedia.","iterationGateTitle":"Batas iterasi","iterationGateDescription":"Berhenti setelah jumlah iterasi Loop tertentu.","doomGateTitle":"Perlindungan pengulangan","doomGateDescription":"Mendeteksi panggilan berulang dan mengubah strategi.","tokenGateTitle":"Anggaran token","tokenGateDescription":"Membatasi penggunaan token prompt dan penyelesaian.","timeoutGateTitle":"Batas waktu Loop","timeoutGateDescription":"Berhenti pada batas Loop berikutnya setelah waktu habis tanpa memutus pekerjaan yang berjalan.","toolBudgetGateTitle":"Anggaran panggilan alat","toolBudgetGateDescription":"Membatasi semua panggilan dan alat terpilih.","retryGateTitle":"Coba ulang penghentian awal","retryGateDescription":"Meminta agen memverifikasi sebelum berakhir.","rubricGateTitle":"Rubrik penyelesaian","rubricGateDescription":"Menilai kriteria eksplisit dan merevisi bila perlu.","qualitativeRubricTitle":"Pemeriksaan penyelesaian kualitatif","qualitativeRubricDescription":"Memeriksa respons teks tanpa panggilan alat dengan kriteria bahasa alami.","qualitativeRubric":"Kriteria penyelesaian bahasa alami","qualitativeRubricHelp":"Hanya dipicu untuk respons teks tanpa panggilan alat; agen melanjutkan jika masih ada pekerjaan.","completionRubricTitle":"Pemeriksaan sinyal penyelesaian","completionRubricDescription":"Memeriksa sinyal penyelesaian pada respons teks tanpa panggilan alat.","completionRubricHelp":"Dipicu setelah respons teks tanpa panggilan alat. Agen mengeluarkan sinyal penyelesaian saat selesai; jika belum, agen terus bekerja hingga batas putaran evaluasi tercapai.","completionPrompt":"Prompt pemeriksaan penyelesaian","completionPromptHelp":"Jelaskan kapan hasil dianggap selesai. QwenPaw secara otomatis menyisipkan instruksi keluaran sinyal penyelesaian.","completionSignal":"Sinyal penyelesaian","completionSignalHelp":"QwenPaw menyisipkan sinyal ini dan instruksi untuk hanya mengeluarkan sinyal tersebut ke prompt pemeriksaan. Loop hanya selesai pada kecocokan penuh setelah spasi dibuang dan huruf besar-kecil diabaikan.","removeCriterion":"Hapus kriteria {{number}}","totalTokensHelp":"Batas gabungan token input dan output yang digunakan dalam giliran ini.","promptTokensHelp":"Mencakup instruksi sistem, konteks percakapan, skema alat, dan hasil alat.","completionTokensHelp":"Batas token yang dihasilkan model dalam giliran ini.","maxIterations":"Maksimum iterasi","historyWindow":"Jendela riwayat","similarityThreshold":"Ambang kemiripan","totalTokens":"Token total maksimum","promptTokens":"Token input maksimum","completionTokens":"Token output maksimum","maxSeconds":"Maksimum detik","maxSecondsHelp":"Waktu diperiksa setelah respons model atau panggilan alat saat ini selesai. Pekerjaan yang berjalan tidak diputus.","allToolCalls":"Semua panggilan alat","perToolLimits":"Batas per alat","toolName":"Nama alat","callLimitAria":"Batas panggilan {{name}}","removeToolLimitAria":"Hapus batas {{name}}","addToolLimit":"Tambah batas per alat","maxRetries":"Maksimum percobaan ulang","retryInstruction":"Instruksi coba ulang","passThreshold":"Ambang kelulusan","maxEvaluations":"Maksimum putaran evaluasi","graderError":"Kesalahan penilai","stopSafely":"Berhenti dengan aman","verifyOnceMore":"Verifikasi sekali lagi","completionCriteria":"Kriteria penyelesaian","criterionPlaceholder":"Jelaskan penyelesaian yang dapat diamati","required":"Wajib","weight":"Bobot","addCriterion":"Tambah kriteria","moveGateAria":"Pindahkan {{title}}","removeGate":"Hapus Gate","newModeName":"Mode Loop Baru","defaultCustomDescription":"Pipeline Gate kustom.","copyName":"Salinan {{name}}","createModeAria":"Buat mode Loop kustom","createModeTitle":"Buat mode Loop kustom","startingTemplate":"Templat awal","startingPipeline":"Pipeline awal","blankPipelineHint":"Mulai kosong dan tambahkan gate nanti","safeTemplate":"Jalankan aman","researchTemplate":"Riset beranggaran","qualityTemplate":"Utamakan kualitas","blankTemplate":"Pipeline kosong"},"doomLoopEnabled":"Perlindungan Perilaku Berulang","doomLoopEnabledTooltip":"Intervensi otomatis saat agen terjebak mengulangi tindakan yang sama","doomLoopAfter":"Setelah","doomLoopRepetitions":"tindakan identik","doomLoopStopAction":"Jeda & Minta Bantuan","doomLoopWarnAction":"Kirim Pengingat","doomLoopSimpleMode":"Sederhana","doomLoopAdvancedMode":"Lanjutan","doomLoopWindowSize":"Rentang Deteksi","doomLoopWindowSizeTooltip":"Berapa banyak tindakan terbaru yang diperiksa untuk pengulangan","doomLoopSimilarity":"Sensitivitas Kecocokan","doomLoopSimilarityTooltip":"Seberapa mirip tindakan harus dianggap pengulangan (semakin rendah = semakin ketat)","doomLoopStages":"Aturan Intervensi","doomLoopAction":"Tindakan","doomLoopPrompt":"Pesan","doomLoopPromptPlaceholder":"Pesan pengingat atau alasan jeda...","doomLoopAddStage":"Tambah Aturan","iterationTitle":"Batas Iterasi","iterationEnabled":"Aktifkan Batas Iterasi","iterationEnabledTooltip":"Hentikan agen setelah jumlah putaran loop tetap","iterationMaxIterations":"Iterasi Maksimum","iterationMaxIterationsTooltip":"Jumlah putaran loop maksimum sebelum berhenti","rubricTitle":"Pemeriksaan Penyelesaian Kualitatif","rubricEnabled":"Aktifkan Pemeriksaan Penyelesaian Kualitatif","rubricEnabledTooltip":"Hanya dipicu saat agen memberi respons teks tanpa panggilan alat.","rubricPrompt":"Kriteria Penyelesaian Bahasa Alami","rubricPromptTooltip":"Prompt yang disuntikkan untuk meminta agen mengevaluasi penyelesaian tugas","rubricDesc":"Terapkan kriteria penyelesaian bahasa alami pada respons teks tanpa panggilan alat dan minta agen melanjutkan jika masih ada pekerjaan.","rubricPromptPlaceholder":"Anda tidak memanggil alat apa pun. Jika tugas 
199selesai, konfirmasi. Jika tidak, lanjutkan dengan panggilan alat.","rubricMaxInterventions":"Maksimum Putaran Evaluasi","rubricMaxInterventionsTooltip":"Jumlah maksimum pemeriksaan penyelesaian untuk respons teks tanpa panggilan alat dalam satu giliran.","inLoopModes":"Aktifkan dalam mode /goal & /mission","inLoopModesTooltip":"Juga berlaku saat mode /goal atau /mission aktif","comingSoonEditable":"Konfigurasi kustom akan tersedia di rilis mendatang.","simpleMode":"Sederhana","advancedMode":"Lanjutan","comingSoon":"Segera Hadir","reactModeTab":"Template Loop - Default","goalModeTab":"Template Loop - Goal","missionModeTab":"Template Loop - Mission","goalModeInfoTitle":"Mode Goal vs Default","goalModeInfo":"Mode default berhenti setelah menghasilkan respons. Mode Goal membuat agen terus berulang menuju tujuan, menggunakan evaluasi Rubric untuk menentukan penyelesaian. Semua operasi berjalan dalam konteks agen saat ini.","missionModeInfoTitle":"Mode Mission vs Goal","missionModeInfo":"Mode Mission otomatis memecah tugas kompleks menjadi sub-tugas, dieksekusi oleh sub-agen Worker independen dan diverifikasi oleh sub-agen Verifier. Setiap sub-tugas berjalan dalam konteksnya sendiri, mencegah polusi sesi utama.","goalIterationGate":"Gate Iterasi Tujuan","goalIterationGateDesc":"Membatasi jumlah giliran agen dalam sesi tujuan, melacak iterasi dan penggunaan token.","goalBudgetGate":"Gate Anggaran Token","goalBudgetGateDesc":"Menetapkan batas pengeluaran token untuk sesi tujuan. Menghentikan agen saat anggaran terlampaui.","goalRubricGate":"Rubrik Penyelesaian Tujuan","goalRubricGateDesc":"Mengevaluasi apakah tujuan telah tercapai dengan memeriksa status sesi.","goalDoomGate":"Perlindungan Pengulangan","goalDoomGateDesc":"Mendeteksi pola berulang selama eksekusi tujuan dan memicu intervensi.","missionProgressGate":"Gate Kemajuan Misi","missionProgressGateDesc":"Melacak penyelesaian user story PRD. Melanjutkan hingga semua lolos atau iterasi maksimum tercapai.","missionIterBypass":"Bypass Iterasi","missionIterBypassDesc":"Sementara menghapus batas iterasi ReAct selama eksekusi misi untuk memungkinkan fase panjang.","customLoopTitle":"Mode Loop Kustom","customLoopDesc":"Buat mode loop Anda sendiri dengan kombinasi gate kustom. Segera hadir.","autoContinueOnTextOnly":"Lanjutkan otomatis pada langkah teks saja","autoContinueOnTextOnlyTooltip":"Jika model mengakhiri langkah penalaran hanya dengan teks (tanpa panggilan alat), suntikkan petunjuk dan jalankan satu penalaran ekstra.","autoGenerateSessionTitle":"Buat judul sesi secara otomatis","autoGenerateSessionTitleTooltip":"Setelah pesan pengguna pertama dalam chat baru, jalankan panggilan LLM singkat di latar belakang untuk mengganti placeholder yang terpotong dengan judul yang ringkas.","shellCommandTimeout":"Timeout Perintah Shell (dtk)","shellCommandTimeoutTooltip":"Timeout default dalam detik untuk alat execute_shell_command.","shellCommandTimeoutPlaceholder":"Masukkan timeout","shellCommandTimeoutRequired":"Timeout perintah shell wajib diisi","shellCommandTimeoutMin":"Timeout perintah shell minimal 1 detik","shellCommandExecutable":"Shell yang Dapat Dieksekusi","shellCommandExecutableTooltip":"Jalur ke shell yang digunakan oleh execute_shell_command.","shellCommandExecutablePlaceholder":"mis. /bin/bash atau powershell.exe (kosong = deteksi otomatis)","maxInputLength":"Panjang Input Maksimum","maxInputLengthTooltip":"Panjang input maksimum (token) untuk jendela konteks model","maxInputLengthPlaceholder":"Masukkan panjang input maksimum","maxInputLengthRequired":"Panjang input maksimum wajib diisi","maxInputLengthMin":"Panjang input maksimum minimal 1000","contextCompactRatio":"Rasio Ambang Kompaksi","contextCompactRatioTooltip":"Kompaksi dipicu ketika panjang konteks mencapai fraksi ini dari panjang konteks maksimum","contextCompactRatioRequired":"Rasio kompak konteks wajib diisi","contextCompactThreshold":"Ambang Kompaksi (token)","contextCompactThresholdTooltip":"Dihitung otomatis dari panjang konteks maksimum × rasio kompaksi.","contextCompactThresholdPlaceholder":"Dihitung otomatis","contextCompactReserveRatio":"Rasio Ambang Ca
199dangan","contextCompactReserveRatioTooltip":"Untuk menjaga kesinambungan konteks, fraksi konteks terbaru yang paling baru disimpan utuh setelah kompaksi","contextCompactReserveRatioRequired":"Rasio cadangan konteks wajib diisi","contextCompactReserveThreshold":"Ambang Cadangan (token)","contextCompactReserveThresholdTooltip":"Dihitung otomatis dari panjang konteks maksimum × rasio cadangan.","contextCompactReserveThresholdPlaceholder":"Dihitung otomatis","toolResultCompactRecentN":"Rentang Hasil Alat Terbaru","toolResultCompactRecentNTooltip":"Membagi daftar pesan menjadi dua segmen: N pesan terbaru dan pesan lama","toolResultCompactRecentNRequired":"Rentang hasil alat terbaru wajib diisi","toolResultCompactOldThreshold":"Ambang Pesan Lama (byte)","toolResultCompactOldThresholdTooltip":"Hasil alat dalam pesan lama dikompaksi ketika melebihi batas byte ini.","toolResultCompactOldThresholdPlaceholder":"Masukkan ambang karakter","toolResultCompactOldThresholdRequired":"Karakter maksimum untuk hasil alat di luar recent_n wajib diisi","toolResultCompactRecentThreshold":"Ambang Pesan Terbaru (byte)","toolResultCompactRecentThresholdTooltip":"Hasil alat dalam N pesan terbaru dikompaksi ketika melebihi batas byte ini.","toolResultCompactRecentThresholdPlaceholder":"Masukkan ambang karakter","toolResultCompactRecentThresholdRequired":"Karakter maksimum untuk hasil alat dalam recent_n wajib diisi","toolResultCompactRetentionDays":"Hari Retensi File Hasil Alat","toolResultCompactRetentionDaysTooltip":"Jumlah hari untuk menyimpan file hasil alat yang dikompaksi","toolResultCompactRetentionDaysRequired":"Hari retensi file hasil alat wajib diisi","historyRetentionDays":"Hari Retensi Riwayat","historyRetentionDaysTooltip":"Jumlah hari untuk menyimpan riwayat obrolan permanen. Baris yang lebih lama akan dihapus otomatis saat startup dan saat agent dimatikan.","historyRetentionDaysRequired":"Hari retensi riwayat wajib diisi","historyRetentionDaysForeverWarning":"Menyetel 0 menyimpan riwayat selamanya — penyimpanan akan tumbuh tanpa batas.","historyRetentionDaysLargeWarning":"Periode retensi yang besar dapat menghabiskan banyak penyimpanan.","exemptFileExtensions":"Ekstensi File yang Dikecualikan","exemptFileExtensionsTooltip":"Hasil alat read_file untuk ekstensi file ini akan menggunakan ambang pesan terbaru","exemptFileExtensionsPlaceholder":".md, .txt, .json","exemptToolNames":"Nama Alat yang Dikecualikan","exemptToolNamesTooltip":"Hasil alat dari alat ini akan menggunakan ambang pesan terbaru","exemptToolNamesPlaceholder":"chat_with_agent, list_agents","language":"Bahasa Agen","languageTooltip":"Bahasa untuk file persona agen (SOUL.md, AGENTS.md, dll.).","languageConfirmTitle":"Ubah Bahasa Agen","languageConfirmContent":"Mengubah bahasa akan menimpa file berikut dengan versi bahasa baru:\\n\\n  SOUL.md, AGENTS.md, PROFILE.md, MEMORY.md, BOOTSTRAP.md, HEARTBEAT.md\\n\\nJika Anda telah menyesuaikan file-file ini, harap buat cadangannya terlebih dahulu.","languageConfirmOk":"Ubah Bahasa","languageSaveSuccess":"Bahasa berhasil diperbarui","languageSaveSuccessWithFiles":"Bahasa diperbarui, {{count}} file MD disalin","languageSaveFailed":"Gagal memperbarui bahasa","saveSuccess":"Konfigurasi berhasil disimpan","saveFailed":"Gagal menyimpan konfigurasi","timezone":"Zona Waktu Pengguna","timezoneTooltip":"Digunakan untuk tugas terjadwal, tampilan waktu, dan konteks agen.","timezoneRequired":"Harap pilih zona waktu","selectTimezone":"Pilih zona waktu","timezoneSaveSuccess":"Zona waktu berhasil diperbarui","timezoneSaveFailed":"Gagal memperbarui zona waktu","loadFailed":"Gagal memuat konfigurasi","historyMaxLength":"Panjang Riwayat Maksimum","historyMaxLengthTooltip":"Panjang output maksimum (karakter) untuk perintah /history","historyMaxLengthRequired":"Panjang riwayat maksimum wajib diisi","historyMaxLengthMin":"Panjang riwayat maksimum minimal 1000","historyMaxLengthPlaceholder":"Masukkan panjang maksimum","contextCompactTitle":"Konfigurasi Kompak Konteks","contextCompactEnabled":"Aktifkan Kompaksi Konteks","contextCompactEnabledTooltip":"Secara otomatis kompaksi konteks untuk mencegah overflow jendela konteks","tokenCountModel":"Model Penghitung Token","tokenCountModelTooltip":"Nama model yang digunakan untuk penghitungan token yang tepat; atur ke \\"default\\" untuk menggunakan estimasi bawaan","tokenCountModelPlaceholder":"Nama model atau default","tokenCountUseMirror":"Gunakan Mirror HuggingFace","tokenCountUseMirrorTooltip":"Gunakan situs mirror HuggingFace saat mengunduh tokenizer","tokenCountEstimateDivisor":"Pembagi Estimasi byte/Token","tokenCountEstimateDivisorTooltip":"Pembagi untuk estimasi token berbasis byte (token ≈ panjang_byte / pembagi). Nilai yang direkomendasikan: 3,75 ~ 4.","tokenCountEstimateDivisorRequired":"Pembagi estimasi wajib diisi","tokenCountEstimateDivisorMin":"Pembagi estimasi harus antara 2 dan 5","compactWithThinkingBlock":"Sertakan Blok Pemikiran","compactWithThinkingBlockTooltip":"Apakah akan menyertakan blok pemikiran model saat mengompaksi konteks","toolResultCompactTitle":"Konfigurasi Kompak Hasil Alat","toolResultCompactEnabled":"Aktifkan Kompaksi Hasil Alat","toolResultCompactEnabledTooltip":"Kompaksi hasil panggilan alat yang terlalu besar untuk menghemat ruang konteks","memorySummaryTitle":"Konfigurasi Memori Jangka Panjang","memorySummaryEnabled":"Aktifkan Ringkasan Memori","memorySummaryEnabledTooltip":"Secara otomatis menghasilkan dan menyimpan ringkasan memori selama kompaksi konteks","dreamCronEnabled":"Aktifkan Mimpi","dreamCronEnabledTooltip":"Aktifkan tugas terjadwal untuk mengoptimalkan memori berbasis mimpi","dreamCron":"Jadwal Mimpi","dreamCronTooltip":"Ekspresi cron untuk mengoptimalkan memori jangka panjang melalui status mimpi; gunakan sakelar di atas untuk mengaktifkan atau menonaktifkan","dreamCronPlaceholder":"0 23 * * *","dreamCronRequired":"Masukkan ekspresi cron saat Mimpi diaktifkan","dreamCronInvalid":"Masukkan ekspresi cron 5 kolom yang valid","autoMemorySearch":"Pencarian Memori Otomatis (Beta)","autoMemorySearchTooltip":"Pencarian memori otomatis untuk dijalankan pada setiap giliran percakapan.","autoMaxResults":"Hasil Maksimum Pencarian Otomatis","autoMaxResultsTooltip":"Jumlah hasil maksimum yang dikembalikan saat pe
199ncarian memori otomatis diaktifkan","autoMaxResultsRequired":"Hasil maksimum wajib diisi","autoMaxResultsMin":"Hasil maksimum minimal 1","embeddingConfigTitle":"Konfigurasi Model Embedding","embeddingModelTitle":"Model Embedding","embeddingBackend":"Tipe SDK Embedding","embeddingBackendTooltip":"Tipe SDK yang digunakan untuk memanggil model embedding","embeddingBackendPlaceholder":"Pilih tipe SDK","embeddingApiKey":"API Key","embeddingApiKeyTooltip":"API key untuk penyedia embedding; biarkan kosong jika tidak diperlukan autentikasi","embeddingApiKeyPlaceholder":"Biarkan kosong jika tidak diperlukan","embeddingBaseUrl":"URL Dasar","embeddingBaseUrlTooltip":"URL dasar API embedding. Untuk backend kompatibel OpenAI, endpoint kustom ini opsional; API Key dan Nama Model wajib.","embeddingBaseUrlPlaceholder":"https://dashscope.aliyuncs.com/compatible-mode/v1","embeddingHost":"Host","embeddingHostTooltip":"URL layanan Ollama. Biarkan kosong untuk menggunakan host default Ollama.","embeddingHostPlaceholder":"http://localhost:11434","embeddingModelName":"Nama Model","embeddingModelNameTooltip":"Nama model embedding. Wajib untuk semua backend embedding.","embeddingModelNamePlaceholder":"text-embedding-v4","embeddingEnableCache":"Aktifkan Cache Embedding","embeddingEnableCacheTooltip":"Cache hasil embedding untuk mengurangi komputasi berulang","embeddingMaxCacheSize":"Ukuran Cache Maksimum","embeddingMaxCacheSizeTooltip":"Jumlah entri maksimum dalam cache embedding","embeddingMaxCacheSizeRequired":"Ukuran cache maksimum wajib diisi","embeddingUseDimensions":"Kirim Dimensi dalam Permintaan","embeddingUseDimensionsTooltip":"Kirim parameter dimensions dalam permintaan API Embedding yang kompatibel dengan OpenAI; beberapa layanan tidak mendukung parameter ini","embeddingDimensions":"Dimensi Embedding","embeddingDimensionsTooltip":"Dimensi vektor yang diharapkan untuk validasi respons, indeks, dan cache; saat pengiriman dimensi dinonaktifkan, masukkan dimensi keluaran aktual model","embeddingDimensionsRequired":"Dimensi embedding wajib diisi","embeddingDimensionsMin":"Dimensi minimal 1","embeddingMaxInputLength":"Anggaran Karakter per Input","embeddingMaxInputLengthTooltip":"Perkiraan anggaran karakter untuk setiap input Embedding. Teks dipotong sebelum permintaan, dengan estimasi yang lebih konservatif untuk CJK dan karakter lebar penuh lainnya; ini bukan batas token yang tepat","embeddingMaxInputLengthRequired":"Anggaran karakter per input wajib diisi","embeddingMaxBatchSize":"Ukuran Batch Maksimum","embeddingHealthCheckTimeout":"Batas Waktu Inisialisasi","embeddingHealthCheckTimeoutTooltip":"Batas waktu per percobaan untuk tes koneksi dan pemeriksaan embedding saat ReMe dimulai","embeddingHealthCheckTimeoutRequired":"Batas waktu inisialisasi wajib diisi","embeddingMaxBatchSizeTooltip":"Jumlah item maksimum dalam satu permintaan embedding batch","embeddingMaxBatchSizeRequired":"Ukuran batch maksimum wajib diisi","toolExecutionLevelTitle":"Mode Persetujuan Alat","toolExecutionLevelTooltip":"Mode Persetujuan","toolExecutionLevel":{"title":"Mode Persetujuan Alat","alertMessage":"Atur persetujuan sebelum panggilan alat. Aturan File Guard berlaku secara terpisah.","strict":"Mode Ketat","strictDesc":"Setiap panggilan alat dan akses file eksternal memerlukan persetujuan terlebih dahulu","smart":"Mode Cerdas","smartDesc":"Panggilan alat berisiko rendah dan akses file eksternal berjalan otomatis; operasi berisiko sedang dan tinggi memerlukan persetujuan","auto":"Mode Otomatis","autoDesc":"Hanya operasi yang cocok dengan aturan persetujuan alat dan file yang memerlukan persetujuan (default)","off":"Mode Mati","offDesc":"Persetujuan alat dan file dinonaktifkan"},"saveLevelSuccess":"Mode persetujuan alat tersimpan","saveLevelFailed":"Gagal menyimpan mode persetujuan alat","maxContextLength":"Panjang Konteks Maksimum","maxContextLengthTooltip":"Jumlah token maksimum untuk jendela konteks model","maxContextLengthRequired":"Panjang konteks maksimum wajib diisi","maxContextLengthMin":"Panjang konteks maksimum minimal 1000","maxContextLengthPlaceholder":"Masukkan panjang konteks maksimum","embeddingActivationNote":"Embedding diaktifkan ketika field wajib untuk backend yang dipilih sudah diisi.","embeddingEnableHint":"Embedding diaktifkan ketika field wajib backend terisi: Nama Model dan API Key untu
199k backend kompatibel OpenAI atau Gemini; Nama Model untuk Ollama.","rebuildMemoryIndex":"Bangun Ulang Indeks Memori","rebuildMemoryIndexWarning":"Operasi ini menghapus dan membangun ulang indeks pencarian memori serta dapat menggunakan banyak CPU dan memori. Gunakan hanya untuk memperbaiki indeks yang rusak atau hasil pencarian yang tidak normal.","rebuildMemoryIndexConfirmTitle":"Bangun ulang indeks memori?","rebuildMemoryIndexConfirm":"Penggunaan CPU dan memori dapat meningkat secara signifikan selama proses ini. Tindakan ini tidak disarankan kecuali indeks rusak atau perlu diperbaiki.","rebuildMemoryIndexSuccess":"Indeks memori berhasil dibangun ulang","rebuildMemoryIndexFailed":"Gagal membangun ulang indeks memori: {{error}}","rebuildMemoryIndexRequired":"Konfigurasi Embedding telah berubah. Pencarian vektor dinonaktifkan dan pencarian memori menggunakan BM25 hingga indeks Embedding dibangun ulang.","embeddingIndexReady":"Indeks Embedding sesuai dengan konfigurasi saat ini.","embeddingIndexStatus":"Indeks Embedding","embeddingIndexAvailable":"Sudah terbaru","embeddingSearchModeHybrid":"Pencarian saat ini: Vektor + BM25","embeddingSearchModeBm25":"Pencarian saat ini: Hanya BM25","embeddingSearchModeBm25Pending":"Pencarian saat ini: Hanya BM25 · menunggu pembangunan ulang","embeddingIndexNeedsRebuild":"Perlu dibangun ulang","embeddingIndexRebuilding":"Sedang membangun ulang","embeddingIndexRebuildingHint":"Sedang membuat vektor memori","embeddingIndexSaveFirst":"Simpan konfigurasi terlebih dahulu","embeddingIndexUnsavedHint":"Simpan perubahan sebelum membangun ulang indeks","embeddingIndexMatchesConfig":"Sesuai dengan konfigurasi saat ini","embeddingIndexBm25Fallback":"Pencarian vektor nonaktif · menggunakan BM25","rebuildEmbeddingIndex":"Bangun ulang indeks Embedding","rebuildEmbeddingIndexConfirmTitle":"Bangun ulang indeks Embedding?","rebuildEmbeddingIndexConfirm":"Embedding untuk semua potongan memori akan dibuat ulang menggunakan konfigurasi saat ini. Pencarian vektor tetap dinonaktifkan hingga proses ini berhasil diselesaikan.","rebuildEmbeddingIndexSuccess":"Indeks Embedding berhasil dibangun ulang","rebuildEmbeddingIndexFailed":"Gagal membangun ulang indeks Embedding: {{error}}","undoEmbeddingChange":"Urungkan perubahan","undoEmbeddingChangeConfirmTitle":"Pulihkan konfigurasi Embedding yang digunakan oleh indeks?","undoEmbeddingChangeConfirm":"Konfigurasi terakhir yang sesuai dengan indeks vektor saat ini akan dipulihkan.","undoEmbeddingChangeSuccess":"Konfigurasi Embedding yang digunakan oleh indeks telah dipulihkan","undoEmbeddingChangeFailed":"Gagal memulihkan konfigurasi Embedding: {{error}}","rebuildBm25Index":"Bangun ulang indeks BM25","rebuildBm25IndexDescription":"Buat ulang indeks pencarian kata kunci dari potongan memori saat ini.","rebuildBm25IndexConfirmTitle":"Bangun ulang indeks BM25?","rebuildBm25IndexConfirm":"Indeks pencarian kata kunci akan dibuat ulang dari potongan memori saat ini.","rebuildBm25IndexSuccess":"Indeks BM25 berhasil dibangun ulang","goToLongTermMemory":"Buka memori jangka panjang","toolResultCompactRecentGtOld":"Ambang pesan terbaru harus lebih besar dari atau sama dengan ambang pesan lama","lightContextTitle":"Manajemen Konteks","visualCompactCollapseLabel":"Pemadatan Visual","visualCompactDescription":"Padatkan konteks lama dan panjang menjadi halaman visual untuk mengurangi token input. Percakapan terbaru tetap berupa teks.","visualCompactEnabled":"Aktifkan Visual Compact","visualCompactEffort":"Intensitas kompresi","visualCompactLow":"Rendah","visualCompactMedium":"Sedang","visualCompactHigh":"Tinggi","visualCompactLowDescription":"Kompres lebih sedikit konten dan prioritaskan keterbacaan.","visualCompactMediumDescription":"Seimbangkan penghematan token dengan keterbacaan visual.","visualCompactHighDescription":"Kompres lebih banyak konteks yang memenuhi syarat dan prioritaskan penghematan token.","visualCompactQualityNote":"Kompresi yang lebih tinggi tidak selalu meningkatkan kualitas jawaban.","visualCompactCapabilityNote":"Hanya berlaku pada model yang mendukung input gambar.","remeLightMemoryTitle":"Memori Jangka Panjang","dialogPath":"Jalur Penyimpanan Dialog","dialogPathTooltip":"Jalur relatif untuk penyimpanan persistensi dialog (relatif terhadap working_dir)","dialogPathPlaceholder":"dialog","contextCompactCollapseLabel":"Kompaksi Konteks","toolResultPruningCollapseLabel":"Pemangkasan Hasil Alat","autoMemorySearchCollapseLabel":"Pencarian Memori Otomatis","embeddingConfigCollapseLabel":"Konfigurasi Model Embedding","summarizeWhenCompact":"Memori saat Kompaksi","summarizeWhenCompactTooltip":"Secara otomatis menghasilkan dan menyimpan memori selama kompaksi konteks","inboxPushEnabled":"Notifikasi Kotak Masuk Hasil Memori","inboxPushEnabledTooltip":"Kirim hasil memori otomatis, mimpi otomatis, dan Daily Paper ke kotak masuk. Menonaktifkannya tidak menghentikan tugas memori.","autoMemoryInterval":"Interval Memori Otomatis","autoMemoryIntervalTooltip":"Picu memori otomatis setiap N kueri pengguna. 0 menonaktifkan memori otomatis berkala. 1 berarti memori otomatis setelah setiap kueri. Disarankan: 2-5; pengaturan 1 perlu memperhatikan konsumsi token yang tinggi.","autoMemoryIntervalPlaceholder":"Masukkan 0 untuk menonaktifkan memori otomatis berkala","autoMemoryIntervalRequired":"Interval memori otomatis 
199wajib diisi","autoMemoryIntervalMin":"Interval memori otomatis harus minimal 0","recursiveFileWatcher":"Pemantau File Rekursif","recursiveFileWatcherTooltip":"Pantau direktori memori secara rekursif untuk menyertakan file di subdirektori.","contextManagerBackend":"Backend Manajer Konteks","contextManagerBackendTooltip":"Jenis backend untuk manajer konteks. Saat ini hanya Light yang didukung.","contextStrategy":"Strategi Konteks","contextStrategyTooltip":"Cara agen mengelola konteks panjang. Scroll (disarankan) menyimpan giliran yang dievakuasi ke penyimpanan riwayat permanen dan memanggilnya kembali sesuai kebutuhan; Native menggunakan kompresi di tempat. Mulai ulang QwenPaw agar perubahan diterapkan.","contextStrategyScroll":"Scroll","contextStrategyNative":"Native","backendRestartWarning":"Mengalihkan backend tidak mendukung hot reload. Simpan dan restart QwenPaw agar perubahan berlaku.","adbpgMemoryTitle":"Memori Jangka Panjang ADBPG","powercontextMemoryTitle":"Memori PowerContext","powercontextConfig":{"title":"Konfigurasi Memori PowerContext","baseUrl":"URL Server","token":"Token Bearer","scopeId":"Ruang Lingkup Memori","scopeIdPlaceholder":"Kosongkan untuk menggunakan ruang lingkup agen unik untuk instalasi ini","scopeIdInvalid":"Ruang lingkup memori tidak boleh hanya berisi spasi.","timeout":"Batas Waktu Permintaan","maxContextBytes":"Konteks maksimum yang disisipkan (byte)","maxContextBytesTooltip":"Membatasi total hasil pencarian PowerContext yang ditambahkan ke satu giliran model."},"adbpgConfig":{"title":"Konfigurasi Memori ADBPG","apiMode":"Mode API","host":"Host","port":"Port","user":"Nama Pengguna","password":"Kata Sandi","dbname":"Database","llmModel":"Model LLM","llmApiKey":"API Key LLM","llmBaseUrl":"URL Dasar LLM","embeddingModel":"Model Embedding","embeddingApiKey":"API Key Embedding","embeddingBaseUrl":"URL Dasar Embedding","embeddingDims":"Dimensi Embedding","restBaseUrl":"URL Dasar REST","restApiKey":"API Key REST","memoryIsolation":"Isolasi Memori (per-agen)","searchTimeout":"Timeout Pencarian"}}'),NL={gotoSettings:"Pengaturan Loop Agen",selectorTitle:"Mode Loop",selectorHint:"Pilih cara agen melanjutkan pekerjaan",selectorAria:"Pilih mode Loop",builtInModes:"Bawaan",customModes:"Kustom dan plugin",starting:"Memulai",running:"Sedang berjalan",awaiting_user:"Menunggu balasan Anda",activePersistentDescription:"Mode ini tetap aktif dalam percakapan hingga selesai atau percakapan diatur ulang.",activeCustomDescription:"Mode kustom ini tetap aktif hingga Anda menggunakan /mode off, /clear, atau /new.",loadError:"Beberapa mode Loop tidak dapat dimuat.",retry:"Coba lagi",modes:{default:{name:"Default",description:"Loop agen terkontrol standar."},goal:{name:"Tujuan",description:"Bekerja secara berkelanjutan menuju tujuan yang konkret dan dapat diverifikasi."},mission:{name:"Misi",description:"Jalankan tugas multi-langkah yang terstruktur dan berkelanjutan."}}},HL={common:W_,harnesses:z_,desktop:K_,chunkError:$_,appCenter:Q_,nav:J_,os:Y_,header:X_,theme:Z_,sidebar:eL,hub:tL,login:aL,chat:nL,modelSelector:oL,agent:iL,skills:sL,skillPool:rL,channels:lL,tools:dL,modelConfig:cL,security:uL,checkpoints:pL,workspace:mL,cronJobs:hL,heartbeat:gL,backup:fL,mcp:bL,preview:kL,pluginManager:yL,debug:vL,codingMode:TL,market:SL,startup:CL,inbox:wL,acp:PL,sessions:AL,environments:ML,tokenUsage:DL,agentStats:xL,approval:RL,account:IL,voiceTranscription:_L,tool:LL,models:EL,files:FL,projectDirectory:OL,agentConfig:BL,loop:NL},UL={save:"Lưu",reset:"Đặt lại",cancel:"Hủy",confirm:"Xác nhận",apply:"Áp dụng",delete:"Xóa",edit:"Chỉnh sửa",create:"Tạo mới",upload:"Tải lên",download:"Tải xuống",refresh:"Làm mới",retry:"Thử lại",search:"Tìm kiếm",enable:"Bật",disable:"Tắt",enabled:"Đã bật",disabled:"Đã tắt",preview:"Xem trước",raw:"Mã nguồn",view:"Xem",content:"Nội dung",loading:"Đang tải...",saving:"Đang lưu...",copy:"Sao chép",copied:"Đã sao chép",copyFailed:"Sao chép thất bại",contentPlaceholder:"Nhập nội dung...",help:"Trợ giúp",close:"Đóng",actions:"Thao tác",total:"Tổng: {{count}}",clear:"Xóa trắng",paste:"Dán",yes:"Có",no:"Không"},qL={connected:"Đã kết nối",disconnected:"Đã ngắt kết nối",notConnected:"Chưa kết nối",comingSoon:"Sắp ra mắt",connect:"Kết nối với ChatGPT",disconnect:"Ngắt kết nối",apiKeyAuthenticated:"Đã xác thực bằng API key",chatGptAuthenticated:"Đã kết nối với ChatGPT",cliAuthenticated:"{{type}} CLI đã xác thực"},jL={closeWindow:{title:"Đóng cửa sổ",description:"Bạn muốn thực hiện thao tác nào khi đóng cửa sổ? Thoát ứng dụng sẽ dừng tất cả tác vụ đang chạy và tác vụ đã lên lịch.",remember:"Ghi nhớ lựa chọn của tôi",showWindow:"Hiển thị cửa sổ",minimizeToTray:"Thu nhỏ xuống khay hệ thống",quitApp:"Thoát ứng dụng",preference:"Đóng cửa sổ",askEveryTime:"Hỏi mỗi lần"}},GL={title:"Không thể tải trang",subTitle:"Có thể do lỗi mạng hoặc ứng dụng vừa được cập nhật.",genericTitle:"Đã xảy ra lỗi",genericSubTitle:"Có lỗi không mong muốn khi hiển thị trang này.",reload:"Tải lại"},VL={backToList:"Quay lại",subtitle:"Quản lý ứng dụng đã cài đặt hoặc mở rộng không gi
199an làm việc từ chợ ứng dụng.",myApps:"Ứng dụng của tôi",officialApps:"Ứng dụng chính thức",appMarket:"Chợ ứng dụng",browseOfficialApps:"Khám phá ứng dụng chính thức",browseMarket:"Khám phá chợ ứng dụng",officialAppsEmpty:"Chưa có ứng dụng chính thức",searchOfficial:"Tìm kiếm ứng dụng chính thức...",installedCount:"{{count}} ứng dụng",clearFilters:"Xóa bộ lọc",moreActions:"Thao tác khác",openApp:"Mở ứng dụng",noDescription:"Không có mô tả",search:"Tìm kiếm ứng dụng...",allCategories:"Tất cả",noApps:"Chưa cài đặt ứng dụng nào",noResults:"Không có ứng dụng phù hợp với tìm kiếm",loadFailed:"Không thể tải ứng dụng. Vui lòng thử lại.",appNotLoaded:"Ứng dụng này chưa được tải. Hãy mở ứng dụng một lần từ thanh bên rồi thử lại.",uninstall:"Gỡ cài đặt",uninstallConfirmTitle:"Gỡ cài đặt ứng dụng?",uninstallConfirmContent:'Thao tác này sẽ xóa thư mục của ứng dụng "{{name}}" và không thể hoàn tác.',uninstallSuccess:"Đã gỡ cài đặt ứng dụng",uninstallFailed:"Gỡ cài đặt thất bại",installing:"Đang cài đặt",installSuccess:"Đã cài đặt",installFailed:"Cài đặt thất bại",installedStatus:"Đã cài đặt",update:"Cập nhật",searchMarket:"Tìm kiếm trong chợ ứng dụng...",marketFilters:"Bộ lọc chợ ứng dụng",filterAll:"Tất cả",trending:"Thịnh hành",marketEmpty:"Không tìm thấy ứng dụng",loadMore:"Tải thêm",noMoreApps:"Không còn ứng dụng nào",install:"Cài đặt",details:"Chi tiết",featured:"Nổi bật",refreshApp:"Làm mới ứng dụng",appRefreshed:"Đã làm mới ứng dụng",aboutApp:"Giới thiệu ứng dụng",exitApp:"Thoát ứng dụng",moreOptions:"Tùy chọn khác",backToListHint:"Quay lại danh sách ứng dụng (ESC)",version:"Phiên bản",id:"ID",category:"Danh mục",description:"Mô tả"},WL={chat:"Trò chuyện",files:"Tệp",control:"Điều khiển",channels:"Kênh",sessions:"Phiên",inbox:"Hộp thư",cronJobs:"Tác vụ định kỳ",heartbeat:"Heartbeat",agent:"Quản lý Agent",workspace:"Không gian làm việc",skills:"Kỹ năng",skillPool:"Kho kỹ năng",marketplace:"Tiện ích mở rộng",market:"Chợ kỹ năng",tools:"Công cụ",mcp:"MCP",acp:"ACP",agentConfig:"Cấu hình",agents:"Agent",settings:"Cài đặt",models:"Mô hình",environments:"Biến môi trường",security:"Bảo mật",tokenUsage:"Lượng Token",agentStats:"Thống kê",voiceTranscription:"Phiên âm giọng nói",debug:"Gỡ lỗi",plugins:"Plugin",backups:"Sao lưu",pluginManager:"Quản lý Plugin"},zL={console:"Bảng điều khiển",appStore:"App Store",appStoreDesc:"Cài đặt hoặc gỡ bỏ ứng dụng máy tính",arrangeDesktop:"Sắp xếp màn hình nền",approvalActionFailed:"Thao tác thất bại, vui lòng thử lại",booting:"Đang khởi động…",changeWallpaper:"Đổi hình nền",clearAll:"Xóa tất cả",closeApp:"Đóng",currentSpace:"Không gian hiện tại",currentSpaceLabel:"Không gian hiện tại: {{name}}",currentAppLabel:"Ứng dụng hiện tại: {{name}}",desktopApps:"Ứng dụng máy tính",finder:"Màn hình chính",focusApp:"Tập trung",install:"Cài đặt",installed:"đã cài đặt",installedApp:"Đã cài đặt",installedApps:"Ứng dụng đã cài đặt",launchpad:"Launchpad",moveDockLeft:"Di chuyển sang trái",moveDockRight:"Di chuyển sang phải",missionControl:"Mission Control",noInstalledApps:"Chưa có ứng dụng nào được cài đặt",noNotifications:"Không có thông báo",noOpenWindows:"Không có cửa sổ nào đang mở trong không gian này",noSettings:"Không có cài đặt khả dụng",notInstalled:"chưa cài đặt",notifications:"Thông báo",notificationSummary:"Phê duyệt {{approvals}} · Hộp thư đến {{inbox}}",notifyApproval:"Phê duyệt",notifyInbox:"Hộp thư đến",openApp:"Mở",keepInDock:"Giữ trong Dock",removeFromDock:"Xóa khỏi Dock",refreshDesktop:"Làm mới màn hình nền",appMarket:"Chợ ứng dụng",appMarketRefresh:"Làm mới",appMarketSearch:"Tìm kiếm ứng dụng...",appMarketEmpty:"Không tìm thấy ứng dụng",appMarketUnavailable:"Chợ ứng dụng hiện không khả dụng. Vui lòng thử lại sau.",appMarketInstall:"Cài đặt",appMarketDetails:"Chi t
199iết",appMarketDeveloper:"Nhà phát triển",appMarketDownloads:"Lượt tải xuống",appInstalled:"Cài đặt ứng dụng thành công",appInstallFailed:"Cài đặt ứng dụng thất bại",appCompatibilityWarningTitle:"Cảnh báo tương thích ứng dụng",appCompatibilityWarningContent:"Ứng dụng này dành cho QwenPaw {{labels}}, trong khi phiên bản QwenPaw hiện tại là {{version}}. Việc cài đặt có thể gây lỗi. Bạn có muốn tiếp tục không?",appCompatibilityWarningConfirm:"Vẫn cài đặt",appCompatibilityUnverified:"Chưa xác minh khả năng tương thích với phiên bản QwenPaw hiện tại.",restoreAll:"Khôi phục tất cả",returnToConsole:"Quay lại bảng điều khiển",desktopMode:"Chế độ màn hình nền",qwenpawMenu:"Menu QwenPaw",restoredAll:"Đã khôi phục tất cả ứng dụng",sortBy:"Sắp xếp theo",sortFree:"Sắp xếp tự do",sortName:"Tên",sortType:"Loại",systemSettings:"Cài đặt hệ thống",uninstall:"Gỡ cài đặt",uninstallConfirmTitle:"Gỡ cài đặt ứng dụng?",uninstallFailed:"Gỡ cài đặt thất bại",uninstalledApp:"Đã gỡ cài đặt",update:"Cập nhật",wallpaper:"Hình nền",windows:"cửa sổ"},KL={changelog:"Nhật ký thay đổi",docs:"Tài liệu",tutorial:"Hướng dẫn",featureDemos:"Demo tính năng",faq:"FAQ",github:"GitHub",resources:"Tài liệu",updateAvailable:"Có bản cập nhật"},$L={newVersion:"Phiên bản mới: v{{version}}, nhấn để cập nhật",updateModal:{title:"Phiên bản mới: v{{version}}",viewReleases:"Xem ghi chú phát hành",close:"Đóng"},settings:{language:"Ngôn ngữ",theme:"Giao diện",mode:"Chế độ",desktopMode:"Chế độ Màn hình nền"},simpleMode:"Chế độ đơn giản",fullMode:"Chế độ đầy đủ",toggleAgentNavigation:"Mở rộng hoặc thu gọn điều hướng tác tử"},QL={dark:"Tối",light:"Sáng",system:"Theo hệ thống"},JL={starting:"Đang khởi động backend...",checking:"Đang kết nối backend...",error:"Backend khởi động thất bại.",errorHint:"Không thể khởi chạy tiến trình backend. Kiểm tra nhật ký ứng dụng để biết thêm.",errorDetails:"Xem chi tiết lỗi",timeout:"Backend không khởi động trong {{seconds}} giây.",timeoutHint:"Backend không phản hồi. Vui lòng thử lại hoặc kiểm tra nhật ký.",retry:"Thử lại"},YL=JSON.parse('{"brand":{"title":"Quản trị Hub","subtitle":"Không gian làm việc cục bộ","controlPlane":"Trung tâm điều khiển"},"navigation":{"workspace":"Không gian làm việc","overview":"Tổng quan","runtimes":"Môi trường chạy","users":"Người dùng","credentials":"Thông tin xác thực","audit":"Nhật ký kiểm tra","settings":"Cài đặt hệ thống"},"actions":{"backToQwenPaw":"Quay lại QwenPaw","useLightTheme":"Dùng giao diện sáng","useDarkTheme":"Sử dụng chủ đề tối","signOut":"Đăng xuất","start":"Khởi động","stop":"Dừng","disable":"Vô hiệu hóa","rebuild":"Tạo lại","enableAndStart":"Kích hoạt và khởi động"},"roles":{"admin":"Quản trị viên","user":"người dùng"},"userStates":{"active":"Hoạt động","disabled":"Đã tắt"},"runtimeStates":{"created":"Đã tạo","starting":"Đang khởi động","running":"Đang chạy","stopped":"Đã dừng","failed":"Lỗi"},"runtimePolicies":{"owner_allowed":"Chủ sở hữu có thể khởi động lại","admin_only":"Bị quản trị viên khóa"},"errors":{"actionFailed":"Hành động không thành công","createFailed":"Tạo không thành công","updateFailed":"Cập nhật không thành công","saveFailed":"Lưu không thành công","pullTimedOut":"Đã hết thời gian chờ kéo ảnh"},"messages":{"runtimeCreated":"Đã tạo môi trường chạy","accountCreated":"Đã tạo tài khoản","credentialStored":"Đã lưu trữ thông tin xác thực","settingsSaved":"Đã lưu cài đặt trung tâm","imagePulled":"Quá trình kéo hình ảnh Docker đã hoàn tất"},"validation":{"required":"Trường này là bắt buộc","runtimeIdInvali
199d":"Sá»­ dụng 1–64 chữ cái, số, dấu chấm, dấu gạch dưới hoặc dấu gạch ngang, bắt đầu bằng một chữ cái hoặc số","passwordMin":"Mật khẩu phải chứa ít nhất tám ký tá»±","credentialNameInvalid":"Sá»­ dụng tên biến môi trường viết hoa, chẳng hạn như OPENAI_API_KEY"},"runtimes":{"eyebrow":"Quản trị Hub","title":"Tổng quan môi trường chạy","description":"Mỗi người dùng có một môi trường chạy riêng; tệp và khóa được tách biệt với nhau.","newRuntime":"Tạo môi trường chạy","managed":"Môi trường được quản lý","localBoundaries":"Ranh giới tiến trình cục bộ","runningNow":"Đang chạy","needsAttention":"Thời gian chạy {{count}} cần được chú ý","healthy":"Tất cả môi trường đều hoạt động bình thường","isolationPolicy":"Chính sách cách ly","available":"Có sẵn","unavailable":"Không có sẵn","failClosed":"Chặn khi có lỗi","noFallback":"Không chạy khi thiếu sandbox","executionBlocked":"Môi trường chạy đã bị chặn","isolationTitle":"Cách ly cục bộ có chặn khi lỗi","isolationDescription":"Toàn bộ cây quy trình thời gian chạy được đóng hộp cát. Nếu đầu dò cách ly gốc không thành công, QwenPaw sẽ từ chối khởi động nó.","unavailableTitle":"Phụ trợ thời gian chạy an toàn không có sẵn","unavailableDescription":"{{provisioner}} không khả dụng: {{reason}} Kiểm tra cài đặt backend, trạng thái hoạt động và cấu hình hệ thống, sau đó khởi động lại QwenPaw Hub.","unavailableUserDescription":"Backend runtime tạm thời không khả dụng. Hãy liên hệ với quản trị viên.","preflightFailed":"Kiểm tra bảo mật không thành công.","localEndpoint":"Điểm cuối cục bộ · {{endpoint}}","provisioner":"Kiểu thá»±c thi","localExecution":"Cách ly cục bộ","dockerExecution":"Vùng chứa Docker","security":"Bảo vệ","tenant":"Đối tượng thuê","removeTitle":"Xóa {{id}}?","removeDescription":"Đăng ký bị xóa; dữ liệu thời gian chạy được giữ lại.","disableTitle":"Tắt {{id}}?","disableDescription":"Quá trình sẽ dừng và chá»§ sở hữu không thể khởi động lại cho đến khi quản trị viên kích hoạt nó.","rebuildTitle":"Xây dá»±ng lại {{id}} với hình ảnh hiện tại?","rebuildDescription":"Vùng chứa sẽ được thay thế bằng hình ảnh trong cài đặt hệ thống. Không gian làm việc, bí mật và bản sao lưu liên tục được giữ lại.","emptyTitle":"Chưa có thời gian chạy","emptyDescription":"Tạo thời gian chạy QwenPaw cục bộ bị cô lập đầu tiên."},"users":{"eyebrow":"Nhận dạng và truy cập","title":"Quyền truy cập cá»§a người dùng","description":"Tạo tài khoản cục bộ, chỉ định quyền truy cập quản trị và thu hồi phiên từ một nÆ¡i.","addAccount":"Thêm tài khoản","publicRegistration":"Đăng ký công khai","publicRegistrationDescription":"Khi bị tắt, chỉ quản trị viên mới có thể tạo tài khoản.","currentAccountProtected":"Tài khoản hiện tại được bảo vệ","empty":"Không có người dùng nào phù hợp với các bộ lọc này"},"credentials":{"eyebrow":"Kho thông tin xác thá»±c theo đối tượng thuê","title":"Thông tin xác thá»±c","description":"Lưu trữ khóa cá»§a nhà cung cấp bên trong phạm vi thời gian chạy hoặc đối tượng thuê rõ ràng. Các giá trị bí mật được mã hóa và không bao giờ được API trả về.","storeCredential":"Lưu trữ thông tin xác thá»±c","updated":"Đã cập nhật {{date}}","deleteTitle":"Xóa {{name}}?","deleteDescription":"Thời gian chạy sá»­ dụng thông tin xác thá»±c này có thể ngừng hoạt động.","emptyTitle":"Chưa có thông tin xác thá»±c","emptyDescription":"Lưu trữ khóa API trong phạm vi thời gian chạy hoặc đối tượng thuê.","encrypted":"Được mã hóa khi lưu; không thể đọc bản rõ"},"overview":{"eyebrow":"Buồng lái vận hành","title":"Tổng quan hoạt động cá»§a Hub","description":"Tìm hiểu tình trạng cá»§a Hub bằng cách sá»­ dụng trạng thái thời gian chạy thá»±c, tài nguyên máy chá»
199§ và sá»± kiện kiểm tra.","availability":"Tính khả dụng cá»§a thời gian chạy","availabilityDetail":"{{running}} cá»§a thời gian chạy {{total}} hiện đang trá»±c tuyến","totalRuntimes":"Tổng số môi trường","failedCount":"Thời gian chạy {{count}} cần được chú ý","totalUsers":"Người dùng trung tâm","managedLocally":"Quản lý quyền truy cập và nhận dạng cục bộ","hostResources":"Tài nguyên máy chá»§","liveSnapshot":"Ảnh chụp nhanh trá»±c tiếp hiện tại","memory":"Bộ nhớ","dataDisk":"Đĩa dữ liệu","recentActivity":"Hoạt động gần đây","auditBacked":"Được hỗ trợ bởi nhật ký kiểm tra liên tục","systemHealthy":"Tất cả các hệ thống hoạt động","systemDegraded":"Hệ thống xuống cấp","localIsolation":"Thá»±c thi cách ly cục bộ"},"table":{"searchRuntimes":"Tìm kiếm thời gian chạy, chá»§ sở hữu hoặc điểm cuối","searchUsers":"Tìm kiếm tên người dùng hoặc ID người dùng","searchCredentials":"Tìm kiếm tên hoặc phạm vi thông tin xác thá»±c","searchAudit":"Tìm kiếm diễn viên hoặc tài nguyên","allStates":"Tất cả trạng thái","allOwners":"Tất cả chá»§ sở hữu","allExecutions":"Tất cả các kiểu thá»±c thi","allRoles":"Tất cả vai trò","allUserStates":"Tất cả trạng thái người dùng","allScopes":"Tất cả phạm vi","allActions":"Mọi hành động","runtime":"Môi trường chạy","status":"Trạng thái","owner":"Người sở hữu","endpoint":"Điểm cuối","execution":"Cách chạy","updated":"Đã cập nhật","user":"Người dùng","role":"Vai trò","created":"Ngày tạo","credential":"Thông tin xác thá»±c","scope":"Phạm vi","event":"Sá»± kiện","actor":"Người thá»±c hiện","resource":"Tài nguyên","result":"Kết quả","time":"Thời gian","total":"{{total}} mục"},"audit":{"eyebrow":"An ninh và quản trị","title":"Nhật ký kiểm tra","description":"Xem xét ai đã thá»±c hiện từng hành động quản lý Hub, mục tiêu, kết quả và thời gian thá»±c hiện. Các giá trị nhạy cảm không bao giờ được kiểm tra.","empty":"Chưa có sá»± kiện quản lý nào"},"settings":{"eyebrow":"Cấu hình nền tảng","title":"Cài đặt hệ thống","description":"Quản lý cấu hình Hub hoàn chỉnh từ một nguồn thông tin chính xác đã được kiểm tra. Các thay đổi có hiệu lá»±c ngay lập tức và tồn tại trong suốt quá trình khởi động lại.","save":"Lưu cài đặt","meta":"Bản sá»­a đổi {{revision}} · Đã cập nhật {{date}}","tabs":{"access":"Bảo mật truy cập","runtime":"Thời gian chạy"},"access":{"title":"Truy cập và đăng ký","description":"Định cấu hình chính sách tài khoản công cộng và địa chỉ Hub có thể truy cập được bằng trình duyệt.","publicBaseUrl":"URL cÆ¡ sở công khai","publicBaseUrlHint":"Được sá»­ dụng cho các lệnh gọi lại OAuth. Chỉ để trống đối với các triển khai chỉ lặp lại.","registration":"Đăng ký công khai","registrationHint":"Khi bị tắt, chỉ quản trị viên mới có thể tạo tài khoản.","defaultRole":"Vai trò đăng ký mặc định","defaultRoleHint":"Tài khoản tá»± đăng ký luôn là người dùng thông thường để bảo mật."},"security":{"title":"Bảo vệ xác thá»±c","description":"Hạn chế lạm dụng đăng nhập và đăng ký cÅ©ng như chặn địa chỉ hoặc mạng.","ipBlacklist":"danh sách đen IP","ipBlacklistHint":"Hỗ trợ IPv4, IPv6 và CIDR; nhấn Enter sau mỗi giá trị.","trustedProxyIps":"Proxy đảo ngược đáng tin cậy","trustedProxyIpsHint":"X-Forwarded-For chỉ được tin cậy khi được gá»­i bởi các địa chỉ này.","loginRateLimit":"Giới hạn tá»· lệ đăng nhập không thành công","loginRateLimitHint":"Tạm thời chặn các lần đăng nhập không thành công lặp lại từ một địa chỉ.","registrationRateLimit":"Giới hạn tá»· lệ đăng ký","registrationRateLimitHint":"Hạn chế các đợt tạo tài khoản mới từ một địa chỉ.","maxAttempts":"Số lần thá»­ tối đa","windowSeconds":"Cá»­a sổ (giây)","blockSeconds":"Thời lượng chặn (giây)"},"runtime":{"title":"Chính sách thời gian chạy","description":"Chọn chương trình phụ trợ thời gian chạy. Thời gian chạy hiện tại sẽ bật lần khởi động lại tiếp theo.","provisioner":"Phần phụ trợ thời gian chạy","localBackend":"Quy trình cục bộ","localBackendHint":"Chạy các tiến trình riêng biệt trá»±c tiếp trên máy chá»
199§ này.","dockerBackend":"thùng chứa Docker","dockerBackendHint":"Chạy từng tài khoản trong vùng chứa được quản lý.","backendUnavailable":"Không có sẵn trên máy chá»§ này","localIsolationHint":"Chế độ cục bộ sá»­ dụng các quy trình máy chá»§ và không sá»­ dụng bất kỳ cài đặt hình ảnh Docker nào.","dockerIsolationHint":"Chế độ Docker áp dụng chính sách hình ảnh và tài nguyên bên dưới cho mọi tài khoản."},"docker":{"title":"Chính sách Docker","description":"Quản lý tập trung hình ảnh, hành vi kéo và giới hạn tài nguyên trên mỗi vùng chứa. Người dùng không thể ghi đè các cài đặt này.","unavailable":"Công cụ Docker không khả dụng","source":"Nguồn hình ảnh","dockerHub":"Docker Hub chính thức","aliyunAcr":"CÆ¡ quan đăng ký đám mây chính thức cá»§a Alibaba","custom":"Hình ảnh tùy chỉnh","customHint":"Nhập bất kỳ tham chiếu hình ảnh nào được chính sách cho phép.","customRegistry":"Đăng ký tùy chỉnh hoặc tham chiếu hình ảnh","localHost":"Hình ảnh cục bộ","localHostHint":"Sá»­ dụng thẻ hình ảnh đã có trên máy chá»
199§ này.","noLocalImages":"Không tìm thấy hình ảnh địa phương được gắn thẻ","image":"Hình ảnh và thẻ","selectLocalImage":"Chọn thẻ hình ảnh cục bộ","selectedImage":"Hình ảnh hiệu quả","repository":"Kho lưu trữ","localStatus":"Trạng thái cục bộ","downloaded":"Đã tải xuống","notDownloaded":"Chưa tải xuống","pullPolicy":"Chính sách kéo tá»± động","ifNotPresent":"Kéo khi thiếu cục bộ","always":"Kéo trước lần sáng tạo đầu tiên","never":"Chỉ sá»­ dụng hình ảnh địa phương","pullImage":"Kéo hình ảnh ngay bây giờ","localImages":"Tham chiếu hình ảnh cục bộ {{count}}","resources":"Giới hạn tài nguyên vùng chứa","cpuLimit":"lõi CPU","memoryLimit":"Bộ nhớ (MB)","pidsLimit":"Quy trình tối đa","shmSize":"Bộ nhớ dùng chung (MB)"},"quotas":{"title":"Dung lượng thời gian chạy toàn cầu","description":"Mỗi người thuê sở hữu chính xác một thời gian chạy; điều này giới hạn thời gian chạy đồng thời trên Hub.","maxRunningRuntimes":"Thời gian chạy tối đa","unlimitedHint":"Trống có nghÄ©a là không giới hạn."}},"auditActions":{"runtime":{"create":"Thời gian chạy đã tạo","start":"Đã bắt đầu thời gian chạy","stop":"Đã dừng thời gian chạy","disable":"Thời gian chạy bị vô hiệu hóa","rebuild":"Thời gian chạy được xây dá»±ng lại","delete":"Đã xóa thời gian chạy"},"image":{"pull":"Đã kéo hình ảnh Docker"},"user":{"create":"Người dùng đã tạo","update":"Người dùng đã cập nhật"},"credential":{"store":"Thông tin xác thá»±c được lưu trữ","delete":"Thông tin xác thá»±c đã bị xóa"},"settings":{"update":"Đã cập nhật cài đặt Hub"},"auth":{"register":"Người dùng Hub đã đăng ký"}},"auditOutcomes":{"success":"Thành công","failure":"Sá»± thất bại"},"runtimeForm":{"title":"Tạo thời gian chạy","hint":"Thời gian chạy bắt đầu bên trong hộp cát cục bộ gốc. Các tệp, bí mật và cây quy trình cá»§a nó tách biệt với những người dùng khác.","runtimeId":"ID thời gian chạy","startImmediately":"Bắt đầu ngay lập tức","submit":"Tạo thời gian chạy"},"userForm":{"title":"Thêm tài khoản","hint":"Sá»­ dụng mật khẩu tạm thời có ít nhất tám ký tá»±. Người dùng chỉ có thể truy cập thời gian chạy do người thuê cá nhân cá»§a họ sở hữu.","username":"Tên người dùng","temporaryPassword":"Mật khẩu tạm thời","role":"Vai trò","submit":"Tạo tài khoản"},"credentialForm":{"title":"Lưu trữ thông tin xác thá»±c","hint":"Phạm vi đối tượng thuê áp dụng cho tất cả thời gian chạy cá»§a bạn. Phạm vi thời gian chạy là ghi đè riêng tư cho một quy trình đã chọn.","scope":"Phạm vi","allRuntimes":"Tất cả thời gian chạy cá»§a tôi","environmentName":"Tên môi trường","secretValue":"Giá trị bí mật","submit":"Mã hóa và lưu trữ"}}'),XL={title:"Đăng nhập",description:"Nhập mật khẩu để truy cập QwenPaw Console.",passwordLabel:"Mật khẩu",passwordPlaceholder:"Nhập mật khẩu",submit:"Đăng nhập",error:"Mật khẩu không đúng",sessionExpired:"Phiên đã hết hạn, vui lòng đăng nhập lại",logoutSuccess:"Đã đăng xuất",loggingIn:"Đang đăng nhập...",logout:"Đăng xuất",logoutConfirm:"Bạn có chắc muốn đăng xuất không?",authDisabled:"Xác thá»±c đang tắt",authDisabledDesc:"Bật AUTH_SECRET trong file .env để bảo vệ console.",changePassword:"Đổi mật khẩu",currentPassword:"Mật khẩu hiện tại",newPassword:"Mật khẩu mới",confirmPassword:"Xác nhận mật khẩu mới",changePasswordSuccess:"Đổi mật khẩu thành công",changePasswordFailed:"Đổi mật khẩu thất bại"},ZL={title:"Tài khoản",changePassword:"Đổi mật khẩu",currentPassword:"Mật khẩu hiện tại",newPassword:"Mật khẩu mới",confirmNewPassword:"Xác nhận mật khẩu mới",passwordMismatch:"Mật khẩu xác nhận không khớp",changeSuccess:"Đổi mật khẩu thành công",changeFailed:"Đổi mật khẩu thất bại",currentPasswordRequired:"Vui lòng nhập mật khẩu hiện tại",newPasswordRequired:"Vui lòng nhập mật khẩu mới",newPasswordMinLength:"Mật khẩu mới phải có ít nhất 8 ký tá»±",confirmPasswordRequired:"Vui lòng xác nhận mật khẩu mới",saving:"Đang lưu...",save:"Lưu thay đổi",authDisabled:"Xác thá»±c đang tắt — đổi mật khẩu không khả dụng",wrongCurrentPassword:"Mật khẩu hiện tại không đúng",username:"Tên người dùng",passwordRequired:"Vui lòng nhập mật khẩu mới",hubPasswordPlaceholder:"Nhập ít nhất tám ký tá»±",runtimeTitle:"Môi trường cá nhân",runtimeDescription:"Khởi động lại môi trường nếu không gi
199an làm việc không khả dụng. Tác vụ đang chạy sẽ bị gián đoạn nhưng dữ liệu đã lưu vẫn được giữ lại.",runtimeRestartConfirmTitle:"Khởi động lại môi trường?",runtimeRestartConfirmDescription:"Tác vụ đang chạy sẽ bị gián đoạn trong khi khởi động lại.",runtimeRestart:"Khởi động lại môi trường",runtimeRestartSuccess:"Đã khởi động lại môi trường",runtimeRestartFailed:"Không thể khởi động lại môi trường"},eE={groups:{cronShort:"Định kỳ",subagentShort:"Tác tử con"},fileReference:{codeSnippet:"Đoạn mã · {{count}} dòng"},modelSelectTooltip:"Chọn mô hình",newChatTooltip:"Cuộc trò chuyện mới",searchTooltip:"Tìm kiếm tất cả cuộc trò chuyện",chatHistoryTooltip:"Lịch sử trò chuyện",messageDisplay:{stepsRunning:"Đang chạy… · {{count}} bước",stepsCanceled:"Đã hủy · {{count}} bước",stepsFailed:"Thất bại · {{count}} bước",stepsCompleted:"Đã hoàn thành {{count}} bước"},allChats:"Tất cả cuộc trò chuyện",createNewChat:"Tạo cuộc trò chuyện mới",pinDrawer:"Ghim",unpinDrawer:"Bỏ ghim",statusIdle:"Rảnh",statusInProgress:"Đang xử lý",disclaimer:"Làm việc cho bạn, lớn lên cùng bạn",greeting:"Xin chào, tôi có thể giúp gì cho bạn?",description:"Tôi là trợ lý AI sẵn sàng hỗ trợ bạn.",prompt1:"Hãy bắt đầu hành trình mới!",prompt2:"Bạn có thể cho tôi biết những kỹ năng của mình không?",inputPlaceholder:'"↑↓" điều hướng tin nhắn · "/" lệnh nhanh',longTextUploadPrompt:"Vui lòng đọc tệp prompt đã tải lên và trả lời dựa trên nội dung đó.",emptyOutputError:"Trợ lý đã trả về phản hồi trống.",commands:{clear:{description:"Xóa ngữ cảnh cuộc trò chuyện"},compact:{description:"Nén ngữ cảnh trò chuyện; hỗ trợ lệnh tùy chọn"},approve:{description:"Phê duyệt yêu cầu công cụ đang chờ"},deny:{description:"Từ chối yêu cầu công cụ đang chờ"},history:{description:"Hiển thị lịch sử cuộc trò chuyện"},mission:{description:"Chế độ Mission — Phân tách nhiệm vụ cho sub-agent với ngữ cảnh tách biệt"},goal:{description:"Loop Goal — Agent theo đuổi mục tiêu liên tục, tự đánh giá qua Rubric"},skills:{description:"Liệt kê kỹ năng có sẵn trong cuộc trò chuyện"},agents:{description:"Liệt kê tác nhân có sẵn trong runtime hiện tại"},review:{description:"Dùng Codex để đánh giá các thay đổi chưa commit trong không gian làm việc"},status:{description:"Hiển thị tài khoản tác nhân, mô hình và không gian làm việc hiện tại"}},turnUsagePopover:{ariaLabel:"Xem token lượt và mức dùng ngữ cảnh",turn:"Lượt này",turnEstimated:"Lượt này ~",tok:"tok",inOut:"in {{inTok}} · out {{outTok}}",contextLabel:"Cửa sổ ngữ cảnh:",outerRing:"Outer ring",cacheLabel:"Cache hit rate",centerValue:"Center",cacheTokens:"trúng {{readTok}} / đầu vào {{inputTok}}",manageContext:"Quản lý ngữ cảnh",compact:"Nén",new:"Cuộc trò chuyện mới"},contextMenu:{open:"Mở",rename:"Đổi tên",pin:"Ghim",unpin:"Bỏ ghim",delete:"Xóa"},queue:{title:"Hàng đợi tin nhắn",paused:"Đã tạm dừng",sendFailed:"Gửi thất bại",resume:"Tiếp tục hàng đợi",pause:"Tạm dừng hàng đợi",clear:"Xóa hàng đợi",dragSort:"Kéo để sắp xếp lại",edit:"Chỉnh sửa",retry:"Thử lại",skip:"Bỏ qua",interruptAndSend:"Ngắt và gửi",delete:"Xóa",file:"Tệp",noChatWarning:"Vui lòng gửi một tin nhắn đầu tiên để tạo cuộc trò chuyện trước khi sử dụng hàng đợi",queueFull:"Hàng đợi đầy (tối đa {{max}} mục), vui lòng gửi hoặc xóa một số tin nhắn trước",otherTabOwner:"This tab queues only; sending is handled by another tab"},group:{pinned:"Đã ghim",today:"Hôm nay",week:"7 ngày qua",month:"30 ngày qua",older:"Cũ hơn"},sessionPanel:{searchConversations:"Tìm kiếm…",noResults:"Không có kết quả",noConversations:"Không có hội thoại",loadingConversations:"Đang tải…"},conversationHistory:"Lịch sử hội thoại",history:{empty:"Không có lịch sử trò chuyện"},sessionGroup:{today:"Hôm nay",recent:"7 ngày qua",earlier:"Trước đó"}},tE={title:"Gỡ lỗi",desc:"Xem nhật ký backend để chẩn đoán sự cố. Nhật ký tự động làm mới khi trang mở.",level:{all:"Tất cả"},backend:{title:"Nhật ký backend",autoRefresh:"Tự động làm mới",newestFirst:"Mới nhất trước",updatedAt:"Cập nhật lúc",path:"File nhật ký",notFound:"Chưa tìm thấy file nhật ký.",placeholder:"Nội dung nhật ký sẽ hiển thị ở đây.",loadFailed:"Không thể tải nhật ký",searchPlaceholder:"Tìm trong nhật ký..."},actions:{refreshBackend:"Làm mới nhật ký",refreshSuccess:"Đã làm mới nhật ký",copyBackend:"Sao chép nhật ký"}},aE={title:"Hộp thư",tabApprovals:"Phê duyệt",tabPushMessages:"Tin nhắn đẩy",tabHarvests:"Thu hoạch AI",summaryApprovals:"Phê duyệt",summaryPushUnread:"Tin nhắn chưa đọc",summaryHarvests:"Thu hoạch",from:"Từ:",requestedBy:"Bởi",markRead:"Đánh dấu đã đọc",markAllRead:"Đánh dấu tất cả đã đọc",markAllReadNoUnread:"Không có tin nhắn chưa đọc",markAllReadSuccess:"Đã đánh dấu {{count}} tin nhắn đã đọc",selectAllCurrentPage:"Chọn trang hiện tại",selectedItems:"Đã chọn {{count}}",batchDeleteButton:"Xóa hàng loạt",batchOperation:"Thao tác hàng loạt",exitBatch:"Thoát chế độ hàng loạt",batchDeleteConfirm:"Xóa {{count}} tin nhắn đã chọn?",batchDeleteSuccess:"Đã xóa {{count}}
199 tin nhắn",pushCronHeader:"Tác vụ định kỳ: {{name}}",viewDetails:"Xem chi tiết",deleteMessageConfirm:"Xóa tin nhắn này?",viewAll:"Xem tất cả",read:"Đã đọc",approve:"Phê duyệt",reject:"Từ chối",ready:"Sẵn sàng",harvestNow:"Thu hoạch ngay",createHarvest:"Tạo thu hoạch",createFirstHarvest:"Tạo thu hoạch đầu tiên",createSuccess:"Tạo thu hoạch thành công",emptyApprovals:"Không có phê duyệt nào đang chờ",emptyPush:"Không có tin nhắn đẩy",wobbleEnable:"Bật thông báo rung phê duyệt",wobbleDisable:"Tắt thông báo rung phê duyệt",emptyHarvests:"Chưa có thu hoạch nào",statusReadyToHarvest:"Sẵn sàng thu hoạch",statusGrowing:"Đang phát triển",harvestedTimes:"Đã thu hoạch {{count}} lần",harvestSuccessRate:"Tá»· lệ thành công {{rate}}%",messageDetailComingSoon:"Chi tiết tin nhắn — Sắp ra mắt!",harvestSettingsComingSoon:"Cài đặt thu hoạch — Sắp ra mắt!",messageDetailTitle:"Chi tiết thá»±c thi",detailCronTitle:"Tác vụ định kỳ: {{name}}",detailHeartbeatTitle:"Heartbeat",messageNotFound:"Không tìm thấy tin nhắn",detailTaskName:"Tên tác vụ",detailTaskId:"ID tác vụ",detailStatus:"Trạng thái",detailSeverity:"Mức độ",detailAgent:"Agent",detailSource:"Nguồn",detailSourceCronJob:"Tác vụ định kỳ",detailSourceHeartbeat:"Heartbeat",detailTrigger:"Kích hoạt",detailDuration:"Thời lượng",detailExecutedAt:"Thá»±c thi lúc",detailReceivedAt:"Nhận lúc",detailRunId:"ID lần chạy",detailContent:"Đầu ra",detailPayload:"Payload",detailExecutionTrace:"Trace thá»±c thi",detailTraceEmpty:"Không có trace",mailDetailSender:"Người gá»­i",mailDetailSubject:"Chá»§ đề",mailDetailDate:"Thời gian thư",mailDetailBody:"Xem trước nội dung",mailDetailProcess:"Quá trình xá»­ lý",filterByAgent:"Lọc theo agent",filterBySourceType:"Lọc theo nguồn",sourceTypeCron:"Cron",sourceTypeHeartbeat:"Heartbeat",sourceTypeMemory:"Memory",sourceTypeMail:"Mail",mailAccessControl:"Kiểm soát truy cập email",pendingSenders:"Người gá»­i chờ duyệt",senderLists:"Danh sách người gá»­i",addSender:"Thêm người gá»­i",domainWildcardHint:"Hỗ trợ ký tá»± đại diện cho tên miền, ví dụ *@example.com",invalidAddress:"Địa chỉ email không hợp lệ. Hãy dùng định dạng như [email protected] hoặc *@domain.com",whitelist:"Danh sách trắng",blacklist:"Danh sách đen",approveSender:"Duyệt",deny:"Chặn",dismiss:"Bỏ qua",batchApprove:"Duyệt hàng loạt",batchDeny:"Chặn hàng loạt",batchDismiss:"Bỏ qua hàng loạt",batchRemove:"Xóa hàng loạt",confirmApprove:"Duyệt những người gá»­i đã chọn?",confirmDeny:"Từ chối những người gá»­i đã chọn?",confirmDismiss:"Bỏ qua những người gá»­i đã chọn?",confirmRemove:"Xác nhận xóa?",removeSuccess:"Đã xóa thành công",addedToAllAgents:"Đã thêm và đồng bộ với tất cả agent",senderAddress:"Địa chỉ người gá»­i",displayName:"Tên người gá»­i",emailSubject:"Tiêu đề",bodyPreview:"Xem trước nội dung",selectAgent:"Chọn agent",allAgents:"Tất cả agent",time:"Thời gian",remark:"Ghi chú",actions:"Thao tác",optional:" (tùy chọn)",required:" (bắt buộc)"},nE={title:"ACP",loading:"Đang tải cấu hình ACP...",builtin:"Tích hợp sẵn",custom:"Tùy chỉnh",create:"Thêm agent tùy chỉnh",createTitle:"Tạo agent ACP",createSuccess:"Tạo agent ACP thành công",editTitle:"Chỉnh sá»­a cấu hình ACP",agentKey:"Khóa agent",agentKeyRequired:"Vui lòng nhập khóa agent",agentKeyInvalid:"Khóa agent chỉ được chứa chữ cái, số, gạch dưới và gạch ngang",agentKeyExists:"Khóa agent này đã tồn tại",enabled:"Đã bật",command:"Lệnh",commandRequired:"Vui lòng nhập lệnh",args:"Tham số",argsHelp:"Mỗi dòng một tham số",env:"Biến môi trường",envHelp:"Dùng định dạng KEY=VALUE, mỗi dòng một biến",envInvalid:"Định dạng không hợp lệ, dùng KEY=VALUE",nodeSettings:"Cài đặt Node",nodePath:"Đường dẫn Node",chooseOtherNode:"Chọn Node khác...",selectNodePath:"Chọn đường dẫn Node",nodePathPrompt:"Nhập đường dẫn file thá»±c thi node",nodeSaved:"Đã lưu cài đặt Node",nodeLoadFailed:"Không tải được cài đặt Node",nodeSaveFailed:"Đường dẫn Node không khả dụng",n
199odeRuntime:{bundled:"Node tích hợp",system:"Node hệ thống",custom:"Node tuỳ chỉnh"},nodeRuntimeReason:{systemNodeMissing:"Không phát hiện Node hệ thống",nodeMissing:"Đường dẫn Node không tồn tại",npxMissing:"Không tìm thấy npx",versionCheckFailed:"Kiểm tra phiên bản thất bại",unavailable:"Không khả dụng"}},oE={title:"Phiên âm giọng nói",description:"Cấu hình cách xử lý tin nhắn âm thanh đến.",saveSuccess:"Đã lưu chế độ âm thanh",saveFailed:"Lưu chế độ âm thanh thất bại",audioModeLabel:"Chế độ âm thanh",audioModeDescription:"Chọn cách xử lý tin nhắn giọng nói từ các kênh trước khi gửi đến mô hình.",modeAuto:"Tự động (Khuyến nghị)",modeAutoDesc:"Phiên âm giọng nói thành văn bản rồi gửi đến mô hình. Tương thích với mọi mô hình.",modeNative:"Âm thanh gốc",modeNativeDesc:"Gửi file âm thanh trực tiếp đến mô hình. Chỉ hoạt động với mô hình hỗ trợ âm thanh (ví dụ: gpt-4o-audio)."},iE={title:"Heartbeat",description:"Chạy HEARTBEAT.md theo chu kỳ để tự kiểm tra. Mặc định chạy âm thầm, hoặc gửi phản hồi đến kênh trò chuyện cuối.",enabled:"Bật Heartbeat",every:"Chu kỳ",everyRequired:"Bắt buộc",everyMin:"Phải ít nhất 1",timeoutSeconds:"Thời gian chờ thực thi (giây)",timeoutRequired:"Bắt buộc",timeoutMin:"Phải ít nhất 1",timeoutMax:"Tối đa 3600",unitMinutes:"Phút",unitHours:"Giờ",target:"Nơi gửi phản hồi",targetMain:"Chế độ im lặng (mặc định)",targetLast:"Gửi đến kênh trò chuyện cuối",targetInbox:"Gửi vào Hộp thư",activeHours:"Giờ hoạt động (tùy chọn)",activeStart:"Giờ bắt đầu",activeEnd:"Giờ kết thúc",loadFailed:"Tải cấu hình thất bại",saveSuccess:"Đã lưu; Heartbeat đã được tải lại",saveFailed:"Lưu cấu hình thất bại",runNow:"Chạy ngay",runNowSuccess:"Đã kích hoạt Heartbeat. Kiểm tra Hộp thư hoặc kênh đích.",runNowFailed:"Kích hoạt Heartbeat thất bại"},sE={nav:"Điểm kiểm tra",title:"Điểm kiểm tra trạng thái",auto:"Tự động",autoEnabled:"Đã bật điểm kiểm tra tự động",autoDisabled:"Đã tắt điểm kiểm tra tự động",refresh:"Làm mới",snapshot:"Ảnh chụp",snapshotCreated:"Đã tạo ảnh chụp",graph:"Đồ thị",checkpoint:"Điểm kiểm tra",type:"Loại",commit:"Commit",createdAt:"Thời gian tạo",session:"Phiên",channel:"Kênh",parent:"Nút cha",details:"Chi tiết",search:"Tìm truy vấn, tên, phiên hoặc SHA",allTypes:"Tất cả loại",allSessions:"Tất cả phiên",showingLatest:"Hiển thị {{count}} mục mới nhất",loadFailed:"Không thể tải điểm kiểm tra",retry:"Thử lại",more:"Thao tác khác",noMatches:"Không có điểm kiểm tra phù hợp.",empty:"Chưa có điểm kiểm tra trạng thái. Lịch sử phiên bản sẽ xuất hiện ở đây.",kind:{auto:"Tự động",snapshot:"Ảnh chụp",safety:"An toàn",commit:"Commit"},summary:{total:"điểm"},snapshotDialog:{title:"Tạo ảnh chụp",session:"Phiên",name:"Tên",placeholder:"Tên ảnh chụp không bắt buộc"},gc:{settingsAction:"Cài đặt dọn dẹp tự động",settingsTitle:"Cài đặt dọn dẹp tự động",keepCount:"Số điểm kiểm tra tự động được giữ",keepDays:"Thời gian giữ điểm tự động (ngày)",preRestoreDays:"Thời gian giữ ảnh trước khôi phục (ngày)",settingsSaved:"Đã lưu cài đặt dọn dẹp tự động",thoroughAction:"Nén triệt để các điểm kiểm tra",thoroughTitle:"Nén triệt để các điểm kiểm tra?",thoroughDescription:"Xóa {{count}} điểm kiểm tra, bỏ qua chính sách lưu giữ điểm tự động. HEAD của mỗi phiên được giữ lại.",thoroughConfirm:"Nén triệt để",thoroughSuccess:"Đã xóa {{count}} điểm kiểm tra khi nén triệt để",action:"Dọn dẹp điểm kiểm tra",title:"Dọn dẹp điểm kiểm tra theo chính sách lưu giữ?",description:"Xóa {{count}} điểm kiểm tra đã hết hạn theo chính sách lưu giữ hiện tại. HEAD của mỗi phiên được giữ lại.",confirm:"Dọn dẹp",success:"Đã xóa {{count}} điểm"},reset:{action:"Đặt lại dữ liệu",title:"Đặt lại toàn bộ dữ liệu?",description:"Thao tác này xóa vĩnh viễn mọi điểm và tắt chế độ tự động.",confirm:"Đặt lại",success:"Đã đặt lại dữ liệu"},restore:{action:"Khôi phục",title:"Khôi phục điểm kiểm tra",preview:"Xem trước",confirm:"Khôi phục",conversation:"Hội thoại",memory:"Bộ nhớ",files:"Tệp workspace",refreshWarning:"Hội thoại sẽ thay đổi. Hãy làm mới sau khi khôi phục.",selectedCount:"Đã chọn {{count}} tệp",selectAll:"Chọn tất cả tệp thay đổi",delete:"Xóa",restore:"Khôi phục",noFileChanges:"Không cần thay đổi tệp nào.",success:"Đã khôi phục. Hãy làm mới hội thoại để tải trạng thái."}}
199,rE={title:"Tệp tin",workspacePath:"Workspace:",noFiles:"Không có tệp tin",coreFiles:"Tệp cốt lõi",coreFilesDesc:"Định nghĩa nhân cách, danh tính và hướng dẫn công cụ.",uploadTooltip:"Chỉ file ZIP",uploadTooltipWithLimit:"Chỉ file ZIP, tối đa {{limit}}MB",selectFile:"Chọn tệp để chỉnh sửa",fileContent:"Nội dung tệp...",uploadSuccess:"Tải lên thành công",uploadFailed:"Tải lên thất bại",downloadPreparing:"Đang chuẩn bị tải xuống workspace...",downloadSuccess:"Tải workspace thành công",downloadFailed:"Tải workspace thất bại",zipOnly:"Chỉ hỗ trợ file .zip khi tải lên",fileSizeExceeded:"File vượt giới hạn {{limit}}MB. Kích thước hiện tại: {{size}}MB",systemPromptToggleTooltip:"Bật/tắt file này trong system prompt",memoryFileWarning:"MEMORY.md thường được agent truy vấn theo yêu cầu. Đưa vào system prompt có thể làm ngữ cảnh quá dài."},lE={parent:"Cài đặt",agents:"Agent",management:"Quản lý Agent",pageDescription:"Tạo, cấu hình và quản lý nhiều agent AI với workspace và danh tính riêng.",name:"Tên",id:"ID",description:"Mô tả",workspace:"Đường dẫn Workspace",backend:{column:"Backend",eyebrow:"Kiến trúc tác nhân",typeTitle:"Chọn cách tác nhân này hoạt động",typeDescription:"Loại tác nhân chi phối mọi cuộc trò chuyện trong Chat, Coding và Channel.",nativeTitle:"Tác nhân QwenPaw gốc",nativeBadge:"Gốc",nativeDescription:"Sử dụng LLM, Skills, công cụ, bộ nhớ và runtime QwenPaw đã cấu hình.",thirdPartyTitle:"Tác nhân bên thứ ba",thirdPartyBadge:"Bên thứ ba",thirdPartyDescription:"Sử dụng runtime tác nhân bên ngoài đã được cấp quyền thay cho mô hình QwenPaw.",providerTitle:"Chọn tác nhân bên thứ ba",providerDescription:"Thông tin xác thực được dùng chung trên thiết bị này; dự án và cuộc trò chuyện vẫn được tách riêng theo từng tác nhân.",codexHint:"ChatGPT OAuth · Không gian làm việc của tác nhân",qoderHint:"Tài khoản Qoder hoặc PAT · Không gian làm việc của tác nhân",account:"Tài khoản Codex",qoderAccount:"Tài khoản Qoder",binary:"Tệp thực thi Codex",binaryHelp:"Để trống để ưu tiên Codex CLI đi kèm Python SDK và phát hiện bản cài đặt độc lập. Nếu nhập thủ công, hãy nhập đường dẫn đầy đủ tới codex trên macOS/Linux hoặc codex.exe trên Windows. Không hỗ trợ tệp thực thi tích hợp trong ứng dụng ChatGPT hoặc tiện ích mở rộng trình soạn thảo. QwenPaw cũng đọc CODEX_BINARY và PATH của backend.",binaryPlaceholder:"Tự động phát hiện hoặc dán đường dẫn tệp thực thi Codex",qoderBinary:"Tệp thực thi Qoder",qoderBinaryHelp:"Để trống để dùng qodercli đi kèm SDK Python hoặc phát hiện bản cài đặt hiện có. Nếu nhập thủ công, hãy nhập đường dẫn đầy đủ tới qodercli trên macOS/Linux hoặc qodercli.exe trên Windows. QwenPaw cũng đọc QODERCLI_PATH và PATH của backend.",qoderBinaryPlaceholder:"Tự động phát hiện hoặc dán đường dẫn qodercli",detect:"Phát hiện",detectedBinary:"Đã phát hiện Codex",qoderDetectedBinary:"Đã phát hiện Qoder",apiKeyLoginHint:"Bạn cũng có thể xác thực trong terminal bằng: codex login --with-api-key",qoderAuthHint:"Kết nối sẽ mở đăng nhập Qoder trong trình duyệt. Bạn cũng có thể chạy qodercli login hoặc đặt QODER_PERSONAL_ACCESS_TOKEN trước khi khởi động backend.",qoderConnect:"Kết nối với Qoder",model:"Mô hình tác nhân",modelDefault:"Dùng mặc định của tác nhân",defaultBadge:"Mặc định",reasoningEffort:"Mức suy luận",reasoningDefault:"Dùng mặc định của mô hình",codexNotFound:"Không tìm thấy runtime Codex. Hãy cài đặt qwenpaw[codex] hoặc cung cấp Codex CLI độc lập.",qoderNotFound:"Không tìm thấy runtime Qoder. Hãy cài đặt qwenpaw[qoder] hoặc cung cấp qodercli.",chatSettingsHint:"Chọn mô hình, mức suy luận và quyền thực thi trên thanh công cụ Chat.",capabilityTitle:"Khả năng QwenPaw",inheritedSkills:"Kỹ năng",inheritedMcp:"Máy chủ MCP",runtimeInherited:"Kế thừa khi chạy · phiên mới",notSupported:"Nhà cung cấp không hỗ trợ",policyCompatibility:"Chính sách MCP",toolAllowlistSupported:"Hỗ trợ danh sách công cụ cho phép",policyLimited:"Áp dụng giới hạn của nhà cung cấp",chatModelHint:"Cài đặt theo tác nhân · áp dụng từ lượt tiếp theo",appliesNextTurn:"Áp dụng từ lượt tiếp theo",approvalMode:"Quyền thực thi",approvalPresets:{ask:{name:"Hỏi trước khi thay đổi",description:"Cho phép thay đổi không gi
199an làm việc và hỏi trước các thao tác nâng quyền."},"read-only":{name:"Chỉ đọc",description:"Kiểm tra tệp mà không thay đổi."},workspace:{name:"Truy cập không gian làm việc",description:"Cho phép thay đổi không gian làm việc mà không cần xác nhận."},"accept-edits":{name:"Chấp nhận chỉnh sửa",description:"Cho phép sửa tệp nhưng vẫn giữ các biện pháp bảo vệ khác."},plan:{name:"Chỉ lập kế hoạch",description:"Phân tích và lập kế hoạch mà không thay đổi tệp."},auto:{name:"Tự động",description:"Để Qoder quyết định hành động an toàn nào có thể chạy."},"full-access":{name:"Toàn quyền",description:"Cho phép thực thi cục bộ không giới hạn mà không cần xác nhận."}}},create:"Tạo Agent",createTitle:"Tạo Agent mới",createSuccess:"Tạo agent thành công",createFailed:"Tạo agent thất bại",edit:"Chỉnh sửa",editTitle:"Chỉnh sửa Agent — {{name}}",updateSuccess:"Cập nhật agent thành công",updateFailed:"Cập nhật agent thất bại",delete:"Xóa",deleteConfirm:"Xác nhận xóa Agent",deleteConfirmDesc:"Agent sẽ không khả dụng sau khi xóa, nhưng tệp workspace vẫn được giữ lại",deleteSuccess:"Xóa agent thành công",deleteFailed:"Xóa agent thất bại",selectAgent:"Chọn Agent",defaultDisplayName:"Agent mặc định",currentWorkspace:"Agent hiện tại",switchSuccess:"Đã chuyển agent thành công",switchFailed:"Chuyển agent thất bại",enableSuccess:"Đã bật agent",disableSuccess:"Đã tắt agent",toggleFailed:"Thay đổi trạng thái agent thất bại",enableAgent:"Bật {{name}}",disableAgent:"Tắt {{name}}",disabledAgents:"Đã tắt ({{count}})",pinnedAgents:"Đã ghim",otherAgents:"Trợ lý khác",pinned:"Đã ghim",defaultPinned:"Trợ lý mặc định luôn được ghim",longPressToPin:"Nhấn giữ để ghim",longPressToUnpin:"Nhấn giữ để bỏ ghim",pinAgent:"Ghim trợ lý",unpinAgent:"Bỏ ghim trợ lý",pinSuccess:"Đã ghim trợ lý",unpinSuccess:"Đã bỏ ghim trợ lý",pinFailed:"Không thể cập nhật trạng thái ghim",status:{disabled:"Đã tắt",pending:"Đang chờ khởi động",starting:"Đang khởi động",running:"Đang chạy",failed:"Khởi động thất bại",waitUntilStarted:"Có thể thao tác sau khi khởi động xong"},copyTooltip:"Sao chép cấu hình agent",copyDefaultTooltip:"Sao chép dùng agent mặc định làm mẫu",copyTitle:"Sao chép cấu hình Agent",copyNameLabel:"Tên agent mới",copyOptionsLabel:"Nội dung sao chép",copyOptionAgentJson:"agent.json (bắt buộc)",copyOptionAgentJsonHint:"Luôn sao chép cấu hình nguồn đã phân tích và đặt lại ID, tên, workspace cùng channels. Đây không phải bản sao từng byte của agent.json trên đĩa.",copyOptionMdFiles:"AGENTS / SOUL / PROFILE / HEARTBEAT / BOOTSTRAP.md",copyOptionSkills:"skills/ + manifest",copyOptionJobs:"jobs.json",copyOptionJobsHint:"Chỉ sao chép định nghĩa công việc, không gồm lịch sử. Agent mới sẽ chạy theo lịch ngay sau khi tạo.",copySuccess:"Sao chép cấu hình agent thành công",copyFailed:"Sao chép cấu hình agent thất bại",mailManagement:"Quản lý email",mailModeNone:"Không cần quản lý email",mailModePersonal:"Quản lý hộp thư cá nhân của bạn",mailModeDedicated:"Cấp hộp thư riêng cho agent",mailName:"Tên hộp thư",mailNameOptional:"Tên hộp thư (tùy chọn)",mailDomain:"Tên miền email",mailPassword:"Mật khẩu",mailPhone:"Số điện thoại",mailAuthCode:"Mã ủy quyền 16 ký tự",mailNameRequired:"Vui lòng nhập tên hộp thư",mailPasswordRequired:"Vui lòng nhập mật khẩu",mailPhoneRequired:"Vui lòng nhập số điện thoại",mailAuthCodeRequired:"Vui lòng nhập mã ủy quyền",mailAuthCodeLength:"Mã ủy quyền phải có 16 ký tự",mailDomainRequired:"Vui lòng chọn tên miền email",mailDomainInvalid:"Vui lòng nhập tên miền email hợp lệ, ví dụ mycompany.com",mailDomainPlaceholder:"Chọn hoặc nhập tên miền email",mailProvider:"Nhà cung cấp email",mailProviderRequired:"Vui lòng chọn nhà cung cấp email",mailProviderPlaceholder:"Chọn nhà cung cấp lưu trữ tên miền này",mailProviderTencentExmail:"Tencent Exmail",mailProviderAliyunQiye
199:"Alibaba Enterprise Mail",mailProviderNeteaseQiye:"Netease Enterprise Mail",mailCredentialLabel:"Thông tin xác thực",mailCredentialRequired:"Vui lòng nhập thông tin xác thực",mailCredentialHintAuthCode:"Nhập mã ủy quyền 16 ký tự được tạo trong cài đặt hộp thư",mailCredentialHintGmail:"Nhập mật khẩu ứng dụng Gmail (cần bật xác minh 2 bước)",mailCredentialHintAliyun:"Nhập mật khẩu đăng nhập hộp thư",mailCredentialHintEnterprise:"Nhập mật khẩu dành riêng cho ứng dụng hoặc mật khẩu đăng nhập hộp thư",mailPushTitle:"Tự động phản hồi email mới",mailAccessControl:"Kiểm soát truy cập email",mailAccessControlTip:"Khi bật, email từ người gửi không xác định cần được duyệt trước khi xử lý",mailPushModeOff:"Tắt",mailPushModeRulesOnly:"Chỉ quy tắc",mailPushModeRulesThenAgent:"Quy tắc + đánh thức khi cần",mailPushModeAgentAll:"Đánh thức cho mỗi email",mailPushModeOffDesc:"Không tự động xử lý email mới",mailPushModeRulesOnlyDesc:"Chỉ xử lý email mới theo các quy tắc bên dưới, không đánh thức agent",mailPushModeRulesThenAgentDesc:"Áp dụng quy tắc trước; chỉ đánh thức agent khi khớp hành động đánh thức",mailPushModeAgentAllDesc:"Đánh thức agent cho mỗi email mới và để agent tự quyết định cách xử lý",mailPushModeLegacySuffix:" (phiên bản cũ)",mailPushFieldFrom:"Người gửi",mailPushFieldSubject:"Tiêu đề",mailPushFieldContent:"Nội dung",mailPushFieldKeyword:"Từ khóa",mailPushActionMarkRead:"Đánh dấu đã đọc",mailPushActionMove:"Chuyển vào thư mục",mailPushActionNotify:"Chỉ thông báo",mailPushActionWakeAgent:"Đánh thức agent",mailPushContainsPlaceholder:"Chứa văn bản",mailPushParamMovePlaceholder:"Thư mục đích",mailPushParamWakePlaceholder:"Chỉ dẫn bổ sung (tùy chọn)",mailPushParamRequired:"Vui lòng nhập thư mục đích",mailPushAddRule:"Thêm quy tắc",mailPushWakeOptionInvoice:"Tải và lưu trữ tệp đính kèm của email hóa đơn",mailPushWakeOptionReply:"Trả lời lịch sự email hỏi đáp",mailPushWakeOptionOtp:"Trích xuất mã xác minh và thông báo cho tôi",mailPushWakeOptionSummary:"Tóm tắt nội dung email vào hộp thư đến"},dE={parent:"Cài đặt",environments:"Biến môi trường",title:"Biến môi trường",description:"Cấu hình các biến môi trường key-value cho agent và kỹ năng.",key:"Khóa",value:"Giá trị",variableNamePlaceholder:"TEN_BIEN",valuePlaceholder:"giá trị",insertRowBelow:"Thêm dòng bên dưới",deleteRow:"Xóa dòng",deleteVariable:"Xóa biến",deleteConfirm:'Xóa "{{name}}"?',deleteSelected:"Xóa đã chọn",deleteSelectedConfirm:"Xóa {{label}}?",keyRequired:"Khóa là bắt buộc",invalidKeyFormat:"Định dạng khóa không hợp lệ",duplicateKey:"Khóa trùng lặp",saveSuccess:"Đã lưu biến môi trường",saveFailed:"Lưu thất bại",deleteSuccess:'Đã xóa "{{name}}"',deleteFailed:"Xóa thất bại",noVariables:"Chưa có biến môi trường nào.",addVariable:"Thêm biến",loading:"Đang tải…",retry:"Thử lại",of:"trong",selected:"đã chọn",variable:"biến",variables:"biến",showValue:"Hiện giá trị",hideValue:"Ẩn giá trị",searchPlaceholder:"Tìm biến",liveSettings:"Cài đặt thời gian thực",noLiveVariables:"Không có cài đặt cập nhật tức thời phù hợp với bộ lọc.",customSettings:"Biến tùy chỉnh",noCustomVariables:"Chưa có biến tùy chỉnh.",editVariable:"Sửa biến",applyNow:"Áp dụng ngay",applyHint:"Tiến trình QwenPaw hiện tại được cập nhật ngay. MCP đang chạy cần được tải lại.",applied:"Đã áp dụng biến môi trường",appliedWithFailures:"Đã lưu nhưng {{count}} tiến trình MCP không thể tải lại",resetVariable:"Đặt lại biến",resetSuccess:"Đã khôi phục giá trị hệ thống hoặc mặc định",readonlySettings:"Cài đặt chỉ đọc",noReadonlyVariables:"Không có cài đặt chỉ đọc phù hợp với bộ lọc.",impactTitle:"Ảnh hưởng tới tiến trình",explicitConsumers:"{{count}} tiến trình MCP sử dụng biến này trực tiếp",implicitConsumers:"{{count}} tiến trình stdio MCP có thể kế thừa biến này",restartMode:"MCP đang chạy",restartAffected:"Tải lại MCP bị ảnh hưởng",restartNone:"Không tải lại",restartAllStdio:"Tải lại toàn bộ MCP stdio",readonlyReason:{startup:"Được xác định khi QwenPaw khởi động",agent_owned:"Do cấu hình của từng Agent quản lý",initial_default:"Chỉ là giá trị khởi tạo cấu hình Agent"},mutabilityDescription:{hot_runtime:"Được đọc từ tiến trình QwenPaw hiện tại khi bắt đầu mỗi thao tác.",hot_process:"Có thể đọc bằng os.getenv() và được các tiến trình con mới kế thừa.",startup_only:"Chỉ để tham khảo; không thể sửa khi QwenPaw đang chạy.",internal:"Do QwenPaw quản lý nội bộ."},variableDescriptions:{QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT:"Thời gian chờ tối đa cho nội dung stream đầu tiên; đặt 0 để tắt giám sát.",QWENPAW_LLM_STREAM_IDLE_TIMEOUT:"Thời gian chờ tối đa giữa các phần stream; đặt 0 để tắt giám sát."},source:{user:"QwenPaw",system:"Hệ thống",default:"Mặc định"}},cE={title:"Công cụ tích hợp",description:"Quản lý các công cụ tích hợp và trạng thái bật/tắt. Công cụ bị tắt sẽ không khả dụng với agent.",emptyState:"Chưa có công cụ nào",loadError:"Tải công cụ thất bại",enableSuccess:"Bật công cụ thành công",disableSuccess:"Tắt công cụ thành công",toggleError:"Thay đổi trạng thái thất bại",enableAll:"Bật tất cả",disableAll:"Tắt tất cả",enableAllSuccess:"Đã bật tất cả công cụ",disableAllSuccess:"Đã tắt tất cả công cụ",allEnabled:"Tất cả công cụ đã bật",allDisabled:"Tất cả công cụ đã tắt",asyncExecution:"Thực thi bất đồng bộ",asyncExecutionEnabled:"Đã bật thực thi bất đồng bộ",asyncExecutionDisabled:"Đã tắt thực thi bất đồng bộ",browserUnifiedMode:"Trình duyệt hợp nhất (Beta)",browserLegacyMode:"Chế độ tương thích cũ",browserUnifiedModeButton:"Mới (Beta)",browserLegacyModeButton:"Cũ (Tương thích)",browserUnifiedDescription:"Sử dụng các khả năng mới của trình duyệt hợp nhất.",browserLegacyDescription:"Sử dụng bản triển khai trình duyệt gốc cho hành vi cũ.",browserRestartPending:"Dịch vụ sẽ chuyển sang {{mode}} sau khi khởi động lại.",configure:"Cấu hình",configured:"Đã cấu hình",requiresConfig:"Cần cấu hình",configSaved:"Đã lưu cấu hình",configSaveError:"Lưu cấu hình thất bại",webSearchProviderLabel:"Nhà cung cấp",webSearchApiKeyLabel:"Khóa API (tùy chọn)",
199webSearchQuotaHintBefore:"Miễn phí 100 lần gọi/ngày. Đăng ký tại ",webSearchQuotaHintAfter:" để nhận 1.000 lần/ngày.",active:"đang hoạt động",available:"Có sẵn",noEnabled:"Không có công cụ nào được bật",goEnableBtn:"Bật ngay",configureAction:"Cấu hình →",enableAction:"Bật →"},uE={title:"MCP Client",qwenpawManaged:"Do QwenPaw quản lý",qwenpawManagedHint:"Cấu hình dùng chung được đưa vào các Agent bên thứ ba được hỗ trợ khi chạy.",providerManaged:"MCP cục bộ của {{provider}}",providerManagedHint:"Được phát hiện từ cấu hình riêng của tác nhân bên thứ ba; chỉ đọc và chỉ dùng cho tác nhân đó.",providerOnly:"Chỉ tác nhân bên thứ ba",readOnly:"Chỉ đọc",create:"Tạo client",formatSupport:"Định dạng hỗ trợ",standardFormat:"Chuẩn (mcpServers wrapper)",directFormat:"Trực tiếp (key → config object)",singleFormat:"Client đơn (các trường phẳng)",emptyState:"Chưa có MCP client nào",loadError:"Tải MCP client thất bại",createSuccess:"Tạo MCP client thành công",createError:"Tạo MCP client thất bại",updateSuccess:"Cập nhật MCP client thành công",updateError:"Cập nhật MCP client thất bại",enableSuccess:"Bật MCP client thành công",disableSuccess:"Tắt MCP client thành công",toggleError:"Thay đổi trạng thái thất bại",deleteConfirm:"Bạn có chắc muốn xóa MCP client này không?",deleteSuccess:"Xóa MCP client thành công",deleteError:"Xóa MCP client thất bại",maskedFieldHint:"Các trường nhạy cảm được ẩn bằng ***. Chỉnh sửa trực tiếp không được hỗ trợ — thay thế bằng giá trị mới.",tools:"Công cụ & Quyền",noTools:"Không có công cụ nào từ máy chủ MCP này",toolsLoadError:"Tải danh sách công cụ từ máy chủ MCP thất bại",toolsConnecting:"Máy chủ MCP đang kết nối, vui lòng thử lại sau",toolSchema:"Mô tả & Tham số"},pE={searchPlaceholder:"Tìm kiếm kỹ năng trên các nền tảng",categoryAll:"Tất cả",providerUnavailable:"Nhà cung cấp không khả dụng",noResults:"Không có kết quả",startTyping:"Nhập từ khóa để tìm kiếm",noDescription:"Chưa có mô tả",browseMarket:"Duyệt chợ kỹ năng",installQueue:"Hàng đợi cài đặt",clearCompleted:"Xóa hoàn thành",retry:"Thử lại",status:{queued:"Đang chờ",installing:"Đang cài đặt",completed:"Hoàn thành",failed:"Thất bại",cancelled:"Đã hủy"},loadMore:"Tải thêm",noMoreResults:"Không còn kết quả",detail:{title:"Chi tiết kỹ năng",version:"Phiên bản",author:"Tác giả",sourceUrl:"URL cài đặt",slug:"Slug",missing:"—"},stats:{downloads:"Lượt tải",stars:"Sao",installs:"Lượt cài đặt",likes:"Lượt thích",views:"Lượt xem",category:"Danh mục",updatedAt:"Cập nhật"},categoryPlaceholder:"Tìm danh mục"},mE={title:"Thống kê Agent",totalSessions:"Tổng phiên",totalMessages:"Tổng tin nhắn",userMessages:"Tin nhắn người dùng",assistantMessages:"Tin nhắn trợ lý",promptTokens:"Token đầu vào",totalInputTokens:"Tổng token đầu vào",completionTokens:"Token đầu ra",toolCalls:"Lời gọi công cụ",newSessions:"Phiên mới",activeSessions:"Phiên đang hoạt động",messageTrend:"Xu hướng tin nhắn",sessionTrend:"Xu hướng phiên",tokenTrend:"Xu hướng token",llmAndToolTrend:"Xu hướng LLM & công cụ",llmAndToolTrendTooltip:"Xu hướng lượt LLM của agent hiện tại so với ý định dùng công cụ",sessionsByChannel:"Phiên theo kênh",messagesByChannel:"Tin nhắn theo kênh",currentAgentLlmCalls:"Lượt đã ghi nhận",currentAgentTokenTrendTooltip:"Xu hướng token đầu vào, đầu ra và trúng cache từ metadata theo lượt của agent hiện tại; token trúng cache là một phần của token đầu vào",currentAgentPromptTokensTooltip:"Tổng token đầu vào của agent hiện tại trên các phiên trong khoảng thời gian đã chọn (cần metadata sử dụng theo lượt; phiên cũ có thể hiển thị 0)",currentAgentCacheHitRateTooltip:"Tỷ lệ trúng cache có trọng số theo token cho các lượt cache quan sát được của agent hiện tại trong khoảng thời gian đã chọn (token trúng cache / token đầu vào đủ điều kiện; — khi không có dữ liệu)",currentAgentCompletionTokensTooltip:"Tổng token đầu ra của agent hiện tại trên các phiên trong khoảng thời gian đã chọn (cần metadata sử dụng theo lượt; phiên cũ có thể hiển thị 0)",currentAgentLlmCallsTooltip:"Số lượt trợ lý có metadata sử dụng đã ghi nhận của agent hiện tại (không phải số lời gọi API thô; phiên cũ có thể hiển thị 0)"},hE={placeholder:"Chọn mô hình",searchPlaceholder:"Tìm kiếm mô hình...",noModels:"Không có mô hình nào",loading:"Đang tải mô hình...",error:"Tải mô hình thất bại",default:"Mặc định",custom:"Tùy chỉnh",refresh:"Làm mới danh sách mô hình"},gE={title:"Cấu hình mô hình",temperature:"Nhiệt độ",maxTokens:"Token tối đa",topP:"Top P",reset:"Đặt lại mặc định",save:"Lưu cấu hình",saveSuccess:"Đã lưu cấu hình mô hình",saveFailed:"Lưu cấu hình thất bại"},fE={title:"Lượng Token",description:"Theo dõi lượng token đã sử dụng theo thời gian.",promptTokens:"Token đầu vào",completionTokens:"Token đầu ra",totalTokens:"Tổng token",totalCalls:"Lượt gọi LLM",toolCalls:"Lời gọi công cụ",llmAndToolTrend:"Xu hướng LLM & công cụ",llmAndToolTrendTooltip:"Lượt trợ lý có metadata sử dụng cộng ý định gọi công cụ trên mọi agent. Không phải Total Calls (API thô); phiên cũ có thể 0 lượt ghi nhận.",llmAndToolTrendLoadFailed:"Không tải được xu hướng LLM & công cụ",recordedTurnsAllAgents:"Lượt gọi LLM",byAgent:"Theo Agent",agent:"Agent",unattributed:"Chưa gán",cacheRead:"Token trúng bộ nhớ đệm",cacheHitRate:"Tỷ lệ trúng bộ nhớ đệm",noData:"Chưa có dữ liệu",period:"Khoảng thời gian"},bE={title:"Yêu cầu phê duyệt bảo mật",description:"Agent đang yêu 
199cầu phê duyệt để thực thi hành động sau:",approve:"Phê duyệt",deny:"Từ chối",approveSuccess:"Đã phê duyệt",denySuccess:"Đã từ chối",expired:"Yêu cầu đã hết hạn",tool:"Công cụ",arguments:"Tham số",approvePattern:"Luôn Cho Phép",strictModeHint:"Luôn cho phép không khả dụng trong chế độ nghiêm ngặt",approveExact:"Chỉ Lần Này",approvalScope:"Phạm vi phê duyệt",details:"Chi tiết",ownerAgent:"Agent Chủ Sở Hữu",executingAgent:"Agent Đang Thực Thi",severity:"Mức Độ Nghiêm Trọng",findings:"Phát Hiện",parameters:"Tham Số",source:"Nguồn",builtinSource:"Tích Hợp",subSession:"Sub-Agent",approved:"Đã phê duyệt lệnh gọi công cụ",denied:"Đã từ chối lệnh gọi công cụ",approveFailed:"Không thể phê duyệt",denyFailed:"Không thể từ chối",timeoutAutoDenied:"Hết thời gian, tự động từ chối",acknowledge:"Đã Hiểu"},kE={error:{SENSITIVE_FILE_BLOCKED:"File bị chặn bởi File Guard (bảo vệ file nhạy cảm).",OUTSIDE_WORKSPACE:'File nằm ngoài phạm vi workspace. Bật "Cho phép xem trước ngoài Workspace" trong Cài đặt → Bảo mật → File Guard.',FORBIDDEN:"Truy cập bị từ chối: không đủ quyền để xem trước file này.",NOT_FOUND:"Không tìm thấy file, có thể đã bị di chuyển hoặc xóa. Nếu đang dùng đường dẫn tương đối, hãy thử dùng đường dẫn tuyệt đối.",LOAD_FAILED:"Không thể tải xem trước file.",LOAD_FAILED_DETAIL:"Không thể tải xem trước file: {{detail}}",UNKNOWN:"Không thể xem trước file này."}},yE={title:"Quản lý Plugin",description:"Cài đặt, quản lý và gỡ cài plugin mà không cần khởi động lại dịch vụ.",installed:"Plugin đã cài đặt",marketTitle:"Thị trường Plugin",noPlugins:"Chưa có plugin nào được cài đặt",installBtn:"Cài đặt Plugin",publishBtn:"Xuất bản Plugin",installTitle:"Cài đặt Plugin",dropPrimary:"Thả thư mục hoặc file ZIP vào đây",dropSecondary:"hoặc nhấn để chọn file ZIP",orFromUrl:"hoặc từ URL",installFromUrl:"Cài đặt từ URL",urlPlaceholder:"https://example.com/plugin.zip",zipOnly:"Chỉ file ZIP có thể kéo thả — kéo thư mục để cài đặt theo thư mục",dropFailed:"Đọc thư mục thất bại",restartHint:"Một số plugin (hooks, monkey-patches) có thể yêu cầu khởi động lại ứng dụng để có hiệu lực.",installing:"Đang cài đặt...",installSuccess:"Cài đặt plugin thành công",installFailed:"Cài đặt plugin thất bại",uninstall:"Gỡ cài đặt",uninstallConfirm:'Gỡ cài đặt plugin "{{name}}"?',uninstallSuccess:"Gỡ cài đặt thành công",uninstallFailed:"Gỡ cài đặt thất bại",enabled:"Đã bật",disabled:"Đã tắt",version:"Phiên bản",author:"Tác giả",noMatchingPlugins:"Không có plugin nào khớp với bộ lọc hiện tại",loadError:"Tải plugin thất bại"},vE={title:"Chế độ Lập trình",experimental:"Tính năng thử nghiệm",experimentalDesc:"Chế độ Lập trình biến QwenPaw thành một Web IDE nhẹ với trình soạn thảo code, cây thư mục, tích hợp Git và hỗ trợ lập trình bằng AI.",experimentalNote:"Tính năng này đang thử nghiệm và có thể thay đổi trong các bản cập nhật sau.",confirmBtn:"Xác nhận",enterTooltip:"Vào Chế độ Lập trình",exitTooltip:"Thoát Chế độ Lập trình",btnCode:"Code",btnChat:"Trò chuyện",selectProject:"Chọn thư mục dự án",selectProjectDesc:"Chọn dự án để làm việc, hoặc dùng workspace mặc định",tabWorkspace:"Workspace mặc định",tabClone:"Clone repository",tabLocal:"Import dự án cục bộ",tabNew:"Dự án mới",workspaceDesc:"Dùng thư mục workspace của agent hiện tại",cloneUrl:"URL Git Repository",cloneUrlPlaceholder:"https://github.com/user/repo.git",cloneName:"Tên dự án (tùy chọn)",openDirDesc:"Mở thư mục cục bộ hiện có — không sao chép tệp",openDirBtn:"Mở Thư Mục Này",openDirLoading:"Đang tải...",openDirEmpty:"Không có thư mục con",openDirHome:"Trang chủ",openDirRefresh:"Làm mới",openDirHiddenFolders:"Thư mục ẩn"},TE={title:"Tệp",navigator:"Trình duyệt tệp",source:"Nguồn",workspace:"Workspace",profile:"Hồ sơ",memory:"Bộ nhớ dài hạn",daily:"Nhật ký",digest:"Cơ sở kiến thức",memoryGraph:"Đồ thị bộ nhớ",memoryGraphShort:"Đồ thị",memoryGraphLoading:"Đang tải đồ thị bộ nhớ…",memoryGraphLoadFailed:"Không thể tải đồ thị bộ nhớ.",memoryGraphCounts:"{{nodes}} nút · {{edges}}
199 liên kết",memoryGraphEmpty:"Chưa có liên kết bộ nhớ nào được lập chỉ mục.",memoryGraphZoomOut:"Thu nhỏ",memoryGraphZoomIn:"Phóng to",memoryGraphFit:"Vừa đồ thị",memoryGraphRoot:"Nút gốc",memoryGraphRootDirect:"Tệp trực tiếp",memoryGraphOtherFile:"Tệp khác",memoryGraphIndexed:"Tệp đã lập chỉ mục",memoryGraphUnresolved:"Liên kết chưa phân giải",memoryGraphDirection:"Hướng liên kết Wiki",memoryGraphOpenFile:"Mở Markdown",memoryGraphOutbound:"Liên kết ra · {{count}}",memoryGraphInbound:"Liên kết vào · {{count}}",projectDirectory:"Thư mục dự án",workspaceDirectory:"Thư mục cấu hình",switchRoot:"Chuyển thư mục",manageDirs:"Quản lý thư mục…",primaryRoot:"Chính",rootMissing:"Thiếu",rootsPending:"{{count}} thư mục khác sẽ khả dụng sau tin nhắn đầu tiên",sourceEmpty:"Nguồn này chưa có tệp.",loadMore:"Tải 200 mục tiếp theo",upload:"Tải tệp lên",conflictPolicy:"Chính sách xung đột tải lên",conflictRename:"Giữ cả hai",conflictRenameDescription:"Thêm số vào tên file mới và giữ nguyên file hiện có.",conflictSkip:"Giữ file hiện có",conflictSkipDescription:"Bỏ qua file mới bị trùng và tiếp tục tải các file còn lại.",conflictOverwrite:"Dùng file mới",conflictOverwriteDescription:"Thay file hiện có bằng file mới.",uploadConflictTitle:"Phát hiện file trùng tên",uploadConflictDescription:"Các file sau đã tồn tại: {{files}}. Hãy chọn cách xử lý.",promptToggle:"Bật hoặc tắt {{name}} trong prompt hệ thống",addSystemPrompt:"Thêm từ workspace",addSystemPromptTitle:"Thêm tệp prompt hệ thống",addSystemPromptDescription:"Chọn một tệp Markdown trong workspace để đưa vào prompt hệ thống.",searchSystemPromptFiles:"Tìm tệp Markdown trong workspace",noSystemPromptCandidates:"Không có tệp phù hợp.",sourceControl:"Quản lý mã nguồn",preview:"Preview",edit:"Chỉnh sửa",selectFile:"Chọn tệp để mở",closeTab:"Đóng tab",closeOtherTabs:"Đóng các tab khác",closeAllTabs:"Đóng tất cả tab",openFiles:"Tệp đang mở, {{count}}",openFilesLabel:"Tệp đang mở",openFileCount:"Đang mở {{count}}",searchOpenFiles:"Tìm theo tệp hoặc đường dẫn",noOpenFilesFound:"Không có tệp đang mở phù hợp",scrollTabsLeft:"Cuộn tab sang trái",scrollTabsRight:"Cuộn tab sang phải",agentChangedFile:"Agent đã thay đổi tệp này",keep:"Giữ",keepAll:"Giữ tất cả",undo:"Hoàn tác",undoAll:"Hoàn tác tất cả",copySelectionToChat:"Sao chép vùng chọn vào Chat",copyFileToChat:"Sao chép tệp vào Chat",previewSize:"Preview · {{size}} byte",backToPreview:"Quay lại Preview",download:"Tải xuống",downloadFailed:"Không thể tải tệp xuống",resize:"Đổi kích thước ngăn tệp",loadFailed:"Không thể tải tệp. Hãy kiểm tra tệp vẫn nằm trong thư mục làm việc chính của không gian làm việc tác nhân hiện tại.",previewUnavailable:"Không thể Preview. Siêu dữ liệu và tải xuống vẫn khả dụng.",mentionInChat:"Đề cập trong Chat",expandWorkspace:"Mở rộng workspace",openWorkspace:"Mở workspace",closeWorkspace:"Đóng workspace"},SE={agentTitle:"Thư mục dự án của tác nhân",sessionTitle:"Thư mục dự án của phiên",pathPlaceholder:"Nhập đường dẫn thư mục tuyệt đối",recentProjects:"Dự án gần đây",browseDirectory:"Duyệt thư mục",noRecentProjects:"Chưa có dự án gần đây",clearSelection:"Xóa dự án đã chọn",homeDirectory:"Thư mục chính",parentDirectory:"Thư mục cha",refreshDirectory:"Làm mới thư mục",restoreDefault:"Khôi phục mặc định",createDirectory:"Tạo thư mục mới",directoryNamePlaceholder:"Nhập tên thư mục",createDirectoryFailed:"Không thể tạo thư mục",useWorkspace:"Sử dụng thư mục cấu hình",createSessionHint:"Gửi tin nhắn đầu tiên để đặt thư mục riêng cho phiên.",sessionSource:"Phiên",agentSource:"Tác nhân",makePrimary:"Đặt làm chính",remove:"Xóa",add:"Thêm",boundDirs:"Thư mục dự án đã thêm",primaryHint:"Các lệnh và lời gọi công cụ chạy trong thư mục chính theo mặc định.",primaryTag:"Chính",unbound:"Chưa liên kết thư mục",unavailable:"Không tồn tại",alreadyBound:"Đã liên kết",tooMany:"Chỉ có thể liên kết tối đa {{max}} thư mục.",countTitle:"Số thư mục đã buộc"},CE=JSON.parse('{"title":"Cấu hình","projectDirectoryTitle":"Thư mục dự án mặc định","projectDirectoryDescription":"Thư mục mặc định dùng cho tệp và lện
199h.","projectDirectoryDefault":"Mặc định của tác nhân","changeProjectDirectory":"Đổi thư mục","projectDirectoryWorkspaceFallback":"Đang dùng workspace của tác nhân","enhancedCodeCapability":"Tăng cường khả năng lập trình","enhancedCodeCapabilityTooltip":"Thêm công cụ mã mà không đổi thư mục dự án.","enhancedCodeCapabilityDescription":"Bật AST, LSP, prompt mã, ngữ cảnh Git và quản lý mã nguồn.","description":"Cấu hình các tham số runtime của agent","visualCompactCollapseLabel":"Nén trực quan","visualCompactDescription":"Nén ngữ cảnh cũ và dài thành các trang trực quan để giảm token đầu vào. Hội thoại gần đây vẫn ở dạng văn bản.","visualCompactEnabled":"Bật Visual Compact","visualCompactEffort":"Mức độ nén","visualCompactLow":"Thấp","visualCompactMedium":"Trung bình","visualCompactHigh":"Cao","visualCompactLowDescription":"Nén ít nội dung hơn và ưu tiên khả năng đọc.","visualCompactMediumDescription":"Cân bằng mức tiết kiệm token với khả năng đọc hình ảnh.","visualCompactHighDescription":"Nén nhiều ngữ cảnh phù hợp hơn và ưu tiên tiết kiệm token.","visualCompactQualityNote":"Mức nén cao hơn không nhất thiết cải thiện chất lượng câu trả lời.","visualCompactCapabilityNote":"Chỉ có hiệu lực với các mô hình hỗ trợ đầu vào hình ảnh.","reactAgentTitle":"ReAct Agent","llmRetryTitle":"Tự động thử lại LLM","llmRetryEnabled":"Bật tự động thử lại","llmRetryEnabledTooltip":"Tự động thử lại khi LLM gặp lỗi tạm thời như giới hạn tốc độ, timeout hoặc lỗi kết nối.","llmMaxRetries":"Số lần thử lại tối đa","llmMaxRetriesPlaceholder":"Nhập số lần thử lại","llmMaxRetriesRequired":"Bắt buộc 
199nhập số lần thá»­ lại","llmMaxRetriesMin":"Phải ít nhất 1 lần","llmBackoffBase":"Độ trễ cÆ¡ sở (giây)","llmBackoffBaseTooltip":"Độ trễ trước lần thá»­ lại đầu tiên. Các lần sau tăng theo cấp số nhân.","llmBackoffBasePlaceholder":"Nhập độ trễ cÆ¡ sở","llmBackoffBaseRequired":"Bắt buộc","llmBackoffBaseMin":"Phải ít nhất 0.1 giây","llmBackoffCap":"Độ trễ tối đa (giây)","llmBackoffCapTooltip":"Giới hạn tối đa cho độ trễ thá»­ lại theo cấp số nhân.","llmBackoffCapPlaceholder":"Nhập độ trễ tối đa","llmBackoffCapRequired":"Bắt buộc","llmBackoffCapMin":"Phải ít nhất 0.5 giây","llmBackoffCapGteBase":"Độ trễ tối đa phải lớn hÆ¡n hoặc bằng độ trễ cÆ¡ sở","llmRateLimiterTitle":"Giới hạn tốc độ LLM","llmMaxConcurrent":"Số lời gọi đồng thời tối đa","llmMaxConcurrentTooltip":"Số lời gọi LLM được phép chạy đồng thời. Dùng chung cho tất cả agent.","llmMaxConcurrentPlaceholder":"Nhập số lời gọi đồng thời","llmMaxConcurrentRequired":"Bắt buộc","llmMaxConcurrentRange":"Phải ít nhất 1","llmMaxQpm":"QPM tối đa (Yêu cầu/phút)","llmMaxQpmTooltip":"Số yêu cầu tối đa trong 60 giây. Yêu cầu vượt quá sẽ chờ. 0 = không giới hạn.","llmMaxQpmPlaceholder":"Nhập QPM tối đa (0 = không giới hạn)","llmMaxQpmRequired":"Bắt buộc","llmMaxQpmRange":"Phải ít nhất 0","llmRateLimitPause":"Thời gian tạm dừng khi bị giới hạn (giây)","llmRateLimitPauseTooltip":"Thời gian tạm dừng khi nhận lỗi 429. Bị ghi đè bởi header Retry-After cá»§a API nếu có.","llmRateLimitPausePlaceholder":"Nhập thời gian tạm dừng","llmRateLimitPauseRequired":"Bắt buộc","llmRateLimitPauseMin":"Phải ít nhất 1 giây","llmRateLimitJitter":"Jitter (giây)","llmRateLimitJitterTooltip":"Thêm độ trễ ngẫu nhiên để tránh nhiều yêu cầu đồng loạt sau khi tạm dừng.","llmRateLimitJitterPlaceholder":"Nhập khoảng jitter","llmRateLimitJitterRequired":"Bắt buộc","llmRateLimitJitterMin":"Phải ít nhất 0 giây","llmAcquireTimeout":"Timeout chờ slot (giây)","llmAcquireTimeoutTooltip":"Thời gian tối đa chờ để lấy slot từ rate limiter trước khi báo lỗi.","llmAcquireTimeoutPlaceholder":"Nhập timeout","llmAcquireTimeoutRequired":"Bắt buộc","llmAcquireTimeoutMin":"Phải ít nhất 10 giây","llmAcquireTimeoutGtPauseJitter":"Timeout phải lớn hÆ¡n tổng thời gian tạm dừng và jitter","contextManagementTitle":"Quản lý ngữ cảnh","memoryManagerBackend":"Backend quản lý bộ nhớ dài hạn","memoryManagerBackendTooltip":"Chọn remelight (tệp cục bộ), adbpg (cÆ¡ sở dữ liệu đám mây), PowerContext (dịch vụ bộ nhớ từ xa), hoặc none (tắt bộ nhớ).","memoryManagerBackendRestartWarning":"Đổi backend quản lý bộ nhớ dài hạn yêu cầu khởi động lại QwenPaw.","powercontextMemoryTitle":"Bộ nhớ PowerContext","powercontextConfig":{"title":"Cấu hình bộ nhớ PowerContext","baseUrl":"URL máy chá»
199§","token":"Bearer Token","scopeId":"Phạm vi bộ nhớ","scopeIdPlaceholder":"Để trống để sá»­ dụng phạm vi tác nhân riêng cá»§a bản cài đặt này","scopeIdInvalid":"Phạm vi bộ nhớ không được chỉ chứa khoảng trắng.","timeout":"Thời gian chờ yêu cầu","maxContextBytes":"Ngữ cảnh được chèn tối đa (byte)","maxContextBytesTooltip":"Giới hạn tổng lượng kết quả tìm kiếm PowerContext được thêm vào một lượt mô hình."},"maxIters":"Số vòng lặp tối đa","maxItersTooltip":"Số vòng lặp suy luận-hành động tối đa cá»§a ReAct agent","maxItersPlaceholder":"Nhập số vòng lặp","maxItersRequired":"Bắt buộc","maxItersMin":"Phải ít nhất 1","agentLoopTitle":"Cài đặt Loop Agent","loopMode":{"builtIn":"Tích hợp","builtInNote":"Pipeline đã khóa · Có thể sá»­a giá trị","templateSectionTitle":"Mẫu Loop","templateSectionDescription":"Chọn mẫu tích hợp hoặc thêm mẫu cá»§a riêng bạn.","defaultTab":"Mặc định","goalTab":"Mục tiêu","missionTab":"Nhiệm vụ","defaultDescription":"Loop ReAct được bảo vệ tiêu chuẩn ngoài chế độ cụ thể.","goalDescription":"Loop liên tục có giới hạn cho mục tiêu có thể xác minh.","missionDescription":"Pipeline liên tục cho nhiệm vụ dài và nhiều bước.","gatePipeline":"Pipeline Gate","repetitionTitle":"Bảo vệ khỏi lặp lại","repetitionDescription":"Phát hiện lệnh gọi công cụ lặp lại và can thiệp.","iterationTitle":"Giới hạn vòng lặp","iterationDescription":"Giới hạn số vòng lặp ReAct.","retryTitle":"Kiểm tra hoàn thành định tính","retryDescription":"Chỉ kích hoạt khi agent trả lời bằng văn bản mà không gọi công cụ.","goalTurnTitle":"Giới hạn lượt mục tiêu","goalTurnDescription":"Giới hạn lượt trong một mục tiêu đang hoạt động.","maxGoalTurns":"Số lượt mục tiêu tối đa","goalBudgetTitle":"Ngân sách token mục tiêu","goalBudgetDescription":"Dừng khi toàn bộ mục tiêu đạt ngân sách.","maxGoalTokens":"Số token mục tiêu tối đa","goalCompletionTitle":"Kiểm tra hoàn thành mục tiêu","goalCompletionDescription":"Đọc trạng thái mục tiêu rõ ràng trước khi dừng.","goalCompletionReadOnly":"Việc hoàn thành do giao thức trạng thái mục tiêu tích hợp kiểm soát.","missionProgressTitle":"Kiểm tra tiến độ nhiệm vụ","missionProgressDescription":"Tiếp tục đến khi mọi câu chuyện đạt hoặc chạm giới hạn.","missionProgressReadOnly":"Việc hoàn thành do trạng thái Mission Story tích hợp kiểm soát.","missionIterationTitle":"Giới hạn vòng lặp Mission","missionIterationDescription":"Đặt giới hạn thá»±c thi mặc định cho Mission mới.","workerAttemptsTitle":"Số lần Worker thá»­","workerAttemptsDescription":"Giới hạn số lần Worker thá»­ lại sau khi Story không đạt xác minh.","missionVerificationTitle":"Chính sách xác minh Mission","missionVerificationDescription":"Đặt hướng dẫn xác minh và lệnh kiểm thá»­ mặc định.","defaultMaxMissionIterations":"Số vòng thá»±c thi tối đa mặc định","defaultMaxMissionIterationsTooltip":"Dùng khi /mission không chỉ định --max-iterations.","maxRetriesPerStory":"Số lần thá»­ lại tối đa cho mỗi Story","maxRetriesPerStoryTooltip":"Số lần Worker thá»­ lại sau kết quả FAIL hoặc PARTIAL từ Verifier.","defaultVerificationInstructions":"Hướng dẫn xác minh (tùy chọn)","defaultVerificationInstructionsHelp":"Hướng dẫn bằng ngôn ngữ tá»± nhiên áp dụng cho mọi Mission Verifier.","defaultVerificationInstructionsPlaceholder":"Ví dụ: kiểm tra xá»­ lý đường dẫn Windows và giao diện đã kết xuất.","defaultVerifyCommand":"Lệnh kiểm thá»­ mặc định (tùy chọn)","defaultVerifyCommandHelp":"Verifier thá»­ chạy bằng công cụ và quyền thông thường. /mission --verify sẽ ghi đè.","defaultVerifyCommandPlaceholder":"Ví dụ: pytest -q","enableRepetitionProtection":"Bật bảo vệ khỏi lặp lại","removeRule":"Xóa quy tắc","custom"
199:"Tùy chỉnh","customDescription":"Tạo pipeline đã lưu từ các Gate tích hợp của QwenPaw.","duplicate":"Nhân bản","delete":"Xóa","displayName":"Tên hiển thị","duplicateModeName":"Đã tồn tại chế độ Loop có tên này.","slashCommand":"Lệnh slash","description":"Mô tả","availableToAgent":"Khả dụng cho agent này","runsTopToBottom":"Chạy từ trên xuống dưới","addGate":"Thêm Gate","emptyPipeline":"Thêm ít nhất một Gate để chế độ này khả dụng.","iterationGateTitle":"Giới hạn vòng lặp","iterationGateDescription":"Dừng sau một số vòng Loop cố định.","doomGateTitle":"Bảo vệ khỏi lặp lại","doomGateDescription":"Phát hiện lệnh gọi lặp lại và đổi chiến lược.","tokenGateTitle":"Ngân sách token","tokenGateDescription":"Giới hạn token đầu vào và đầu ra.","timeoutGateTitle":"Giới hạn thời gian Loop","timeoutGateDescription":"Dừng ở ranh giới Loop tiếp theo sau khi hết thời gian, không ngắt công việc đang chạy.","toolBudgetGateTitle":"Ngân sách gọi công cụ","toolBudgetGateDescription":"Giới hạn tất cả lệnh gọi và công cụ đã chọn.","retryGateTitle":"Thử lại khi dừng sớm","retryGateDescription":"Nhắc agent xác minh trước khi kết thúc.","rubricGateTitle":"Tiêu chí hoàn thành","rubricGateDescription":"Đánh giá tiêu chí rõ ràng và sửa khi cần.","qualitativeRubricTitle":"Kiểm tra hoàn thành định tính","qualitativeRubricDescription":"Kiểm tra phản hồi văn bản không có lệnh gọi công cụ bằng tiêu chí ngôn ngữ tự nhiên.","qualitativeRubric":"Tiêu chí hoàn thành bằng ngôn ngữ tự nhiên","qualitativeRubricHelp":"Chỉ kích hoạt với phản hồi văn bản không có lệnh gọi công cụ; agent tiếp tục nếu còn việc.","completionRubricTitle":"Kiểm tra tín hiệu hoàn thành","completionRubricDescription":"Kiểm tra tín hiệu hoàn thành trong phản hồi văn bản không có lệnh gọi công cụ.","completionRubricHelp":"Được kích hoạt sau phản hồi văn bản không có lệnh gọi công cụ. Agent xuất tín hiệu hoàn thành khi xong; nếu chưa, agent tiếp tục làm việc cho đến khi đạt số vòng đánh giá tối đa.","completionPrompt":"Prompt kiểm tra hoàn thành","completionPromptHelp":"Mô tả khi nào kết quả được xem là hoàn thành. QwenPaw tự động chèn hướng dẫn xuất tín hiệu hoàn thành.","completionSignal":"Tín hiệu hoàn thành","completionSignalHelp":"QwenPaw chèn tín hiệu này và yêu cầu chỉ xuất tín hiệu đó vào prompt kiểm tra. Loop chỉ kết thúc khi khớp toàn bộ sau khi bỏ khoảng trắng và không phân biệt hoa thường.","removeCriterion":"Xóa tiêu chí {{number}}","totalTokensHelp":"Giới hạn tổng token đầu vào và đầu ra dùng trong lượt này.","promptTokensHelp":"Bao gồm chỉ dẫn hệ thống, ngữ cảnh hội thoại, schema công cụ và kết quả công cụ.","completionTokensHelp":"Giới hạn token do mô hình tạo trong lượt này.","maxIterations":"Số vòng lặp tối đa","historyWindow":"Cửa sổ lịch sử","similarityThreshold":"Ngưỡng tương đồng","totalTokens":"Tổng token tối đa","promptTokens":"Token đầu vào tối đa","completionTokens":"Token đầu ra tối đa","maxSeconds":"Số giây tối đa","maxSecondsHelp":"Thời gian được kiểm tra sau khi phản hồi mô hình hoặc lệnh gọi công cụ hiện tại hoàn tất. Công việc đang chạy không bị ngắt.","allToolCalls":"Tất cả lệnh gọi công cụ","perToolLimits":"Giới hạn theo công cụ","toolName":"Tên công cụ","callLimitAria":"Giới hạn lệnh gọi {{name}}","removeToolLimitAria":"Xóa giới hạn {{name}}","addToolLimit":"Thêm giới hạn theo công cụ","maxRetries":"Số lần thử lại tối đa","retryInstruction":"Chỉ dẫn thử lại","passThreshold":"Ngưỡng đạt","maxEvaluations":"Số vòng đánh giá tối đa","graderError":"Lỗi bộ đánh giá","stopSafely":"Dừng an toàn","verifyOnceMore":"Xác minh thêm một lần","completionCriteria":"Tiêu chí hoàn thành","criterionPlaceholder":"Mô tả kết quả hoàn thành có thể quan sát","required":"Bắt buộc","weight":"Trọng số","addCriterion":"Thêm tiêu chí","moveGateAria":"Di chuyển {{title}}","removeGate":"Xóa Gate","newModeName":"Chế độ Loop mới","defaultCustomDescription":"Pipeline Gate tùy chỉnh.","copyName":"Bản sao {{name}}","createModeAria":"Tạo chế độ Loop tùy chỉnh","createModeTitle":"Tạo chế độ Loop tùy chỉnh","startingTemplate":"Mẫu khởi đầu","startingPipeline":"Pipeline khởi đầu","blankPipelineHint":"Bắt đầu trống và thêm gate sau","safeTemplate":"Chạy an toàn","researchTemplate":"Nghiên cứu có ngân sách","qualityTemplate":"Ưu tiên chất lượng","blankTemplate":"Pipeline trống"},"doomLoopEnabled":"Bảo vệ hành vi lặp lại","doomLoopEnabledTooltip":"Tự động can thiệp khi agent bị kẹt lặp lại cùng một hành động","doomLoopAfter":"Sau","doomLoopRepetitions":"hành động giống nhau","doomLoopStopAction":"Tạm dừng & Hỏi ý kiến","doomLoopWarnAction":"Gửi nhắc nhở","doomLoopSimpleMode":"Đơn giản","doomLoopAdvancedMode":"Nâng cao","doomLoopWindowSize":"Phạm vi phát hiện","doomLoopWindowSizeTooltip":"Kiểm tra bao nhiêu hành động gần đây để phát hiện lặp lại","doomLoopSimilarity":"Độ nhạy khớp","doomLoopSimilarityTooltip":"Hành động phải giống nhau đến mức nào để tính là lặp lại (thấp hơn = nghiêm ngặt hơn)","doomLoopStages":"Quy tắc can thiệp","doomLoopAction":"Hành động","doomLoopPrompt":"Tin nhắn","doomLoopPromptPlaceholder":"Nội dung nhắc nhở hoặc lý do tạm dừng...","doomLoopAddStage":"Thêm quy tắc","iterationTitle":"Giới hạn lặp lại","iterationEnabled":"Bật giới hạn lặp lại","iterationEnabledTooltip":"Dừng agent sau một số lượt lặp cố định","iterationMaxIterations":"Số lần lặp tối đa","iterationMaxIterationsTooltip":"Số lượt lặp tối đa trước khi dừng","rubricTitle":"Kiểm tra hoàn thành định tính","rubricEnabled":"Bật kiểm tra hoàn thành định tính","rubricEnabledTooltip":"Chỉ kích hoạt khi agent trả lời bằng văn bản mà không gọi công cụ.","rubricPrompt":"Tiêu chí hoàn thành bằng ngôn ngữ tự nhiên","rubricPromptTooltip":"Prompt được chèn để yêu cầu agent đánh giá hoàn thành nhiệm vụ","rubricDesc":"Áp dụng tiêu chí hoàn thành bằng ngôn ngữ tự nhiên cho phản hồi văn bản không có lệnh gọi công cụ và yêu 
199cầu agent tiếp tục nếu còn việc.","rubricPromptPlaceholder":"Bạn không gọi công cụ nào. Nếu nhiệm vụ hoàn thành, hãy xác nhận. Nếu không, tiếp tục với các lệnh gọi công cụ.","rubricMaxInterventions":"Số vòng đánh giá tối đa","rubricMaxInterventionsTooltip":"Số lần kiểm tra hoàn thành tối đa cho phản hồi văn bản không có lệnh gọi công cụ trong một lượt.","inLoopModes":"Bật trong chế độ /goal & /mission","inLoopModesTooltip":"Cũng áp dụng khi chế độ /goal hoặc /mission đang hoạt động","comingSoonEditable":"Cấu hình tùy chỉnh sẽ có trong phiên bản tương lai.","simpleMode":"Đơn giản","advancedMode":"Nâng cao","comingSoon":"Sắp ra mắt","reactModeTab":"Mẫu Loop - Mặc định","goalModeTab":"Mẫu Loop - Goal","missionModeTab":"Mẫu Loop - Mission","goalModeInfoTitle":"Chế độ Goal vs Mặc định","goalModeInfo":"Chế độ mặc định dừng sau khi tạo phản hồi. Chế độ Goal giữ agent lặp hướng tới mục tiêu, sử dụng đánh giá Rubric để xác định hoàn thành. Tất cả hoạt động chạy trong ngữ cảnh agent hiện tại.","missionModeInfoTitle":"Chế độ Mission vs Goal","missionModeInfo":"Chế độ Mission tự động phân tách nhiệm vụ phức tạp, được thực thi bởi các Worker sub-agent độc lập và xác minh bởi Verifier sub-agent. Mỗi nhiệm vụ con chạy trong ngữ cảnh riêng, ngăn ô nhiễm phiên chính.","goalIterationGate":"Cổng Lặp Mục tiêu","goalIterationGateDesc":"Giới hạn số lượt của agent trong phiên mục tiêu, theo dõi số lần lặp và sử dụng token.","goalBudgetGate":"Cổng Ngân sách Token","goalBudgetGateDesc":"Đặt giới hạn chi tiêu token cho phiên mục tiêu. Dừng agent khi vượt ngân sách.","goalRubricGate":"Rubric Hoàn thành Mục tiêu","goalRubricGateDesc":"Đánh giá mục tiêu đã đạt được hay chưa bằng cách kiểm tra trạng thái phiên.","goalDoomGate":"Bảo vệ Lặp lại","goalDoomGateDesc":"Phát hiện mẫu lặp lại trong quá trình thực hiện mục tiêu và kích hoạt can thiệp.","missionProgressGate":"Cổng Tiến độ Nhiệm vụ","missionProgressGateDesc":"Theo dõi hoàn thành user story PRD. Tiếp tục cho đến khi tất cả đạt hoặc đạt tối đa lần lặp.","missionIterBypass":"Bỏ qua Lặp","missionIterBypassDesc":"Tạm thời gỡ bỏ giới hạn lặp ReAct trong quá trình thực hiện nhiệm vụ để cho phép các giai đoạn dài.","customLoopTitle":"Chế độ Vòng lặp Tùy chỉnh","customLoopDesc":"Tạo chế độ vòng lặp riêng với tổ hợp cổng tùy chỉnh. Sắp ra mắt.","autoContinueOnTextOnly":"Tự tiếp tục khi bước chỉ có văn bản","autoContinueOnTextOnlyTooltip":"Khi mô hình kết thúc bước suy luận chỉ bằng văn bản, tự động chèn gợi ý và chạy thêm một lần.","autoGenerateSessionTitle":"Tự tạo tiêu đề phiên","autoGenerateSessionTitleTooltip":"Sau tin nhắn đầu tiên, gọi LLM ngắn để tạo tiêu đề súc tích.","inboxPushEnabled":"Thông báo hộp thư kết quả bộ nhớ","inboxPushEnabledTooltip":"Gửi kết quả tự động ghi nhớ, giấc mơ và Daily Paper vào hộp thư. Việc tắt thông báo không dừng các tác vụ bộ nhớ.","autoMemoryInterval":"Khoảng tự động ghi nhớ","autoMemoryIntervalTooltip":"Kích hoạt tự động ghi nhớ sau mỗi N truy vấn của người dùng. 0 tắt tự động ghi nhớ định kỳ. 1 nghĩa là tự động ghi nhớ sau mỗi truy vấn. Khuyến nghị đặt 2-5; đặt 1 cần chú ý mức tiêu thụ token cao.","autoMemoryIntervalPlaceholder":"Nhập 0 để tắt tự động ghi nhớ định kỳ","autoMemoryIntervalRequired":"Bắt buộc 
199nhập khoảng tự động ghi nhớ","autoMemoryIntervalMin":"Khoảng tự động ghi nhớ phải lớn hơn hoặc bằng 0","autoMemorySearch":"Tìm kiếm bộ nhớ tự động (Beta)","autoMemorySearchTooltip":"Tự động chạy tìm kiếm bộ nhớ ở mỗi lượt hội thoại. Mỗi truy vấn sẽ tự động gọi khả năng tìm kiếm bộ nhớ, giúp QwenPaw hiểu bạn hơn, nhưng sẽ làm tăng mức tiêu thụ token.","autoMaxResults":"Số kết quả tối đa khi tự động tìm kiếm","autoMaxResultsTooltip":"Số kết quả tối đa trả về khi bật tìm kiếm bộ nhớ tự động","autoMaxResultsRequired":"Bắt buộc nhập số kết quả tối đa","autoMaxResultsMin":"Số kết quả tối đa phải ít nhất là 1","embeddingConfigTitle":"Cấu hình mô hình embedding","embeddingModelTitle":"Mô hình embedding","embeddingBackend":"Loại SDK Embedding","embeddingBackendTooltip":"Loại SDK dùng để gọi mô hình embedding","embeddingBackendPlaceholder":"Chọn loại SDK","embeddingApiKey":"API Key","embeddingApiKeyTooltip":"API key cho nhà cung cấp embedding; để trống nếu không cần xác thực","embeddingApiKeyPlaceholder":"Để trống nếu không cần","embeddingBaseUrl":"Base URL","embeddingBaseUrlTooltip":"Base URL của API embedding. Với backend tương thích OpenAI, endpoint tùy chỉnh này là tùy chọn; API Key và Tên mô hình là bắt buộc.","embeddingBaseUrlPlaceholder":"https://dashscope.aliyuncs.com/compatible-mode/v1","embeddingHost":"Host","embeddingHostTooltip":"URL dịch vụ Ollama. Để trống để dùng host mặc định của Ollama.","embeddingHostPlaceholder":"http://localhost:11434","embeddingModelName":"Tên mô hình","embeddingModelNameTooltip":"Tên mô hình embedding. Bắt buộc cho mọi backend embedding.","embeddingModelNamePlaceholder":"text-embedding-v4","embeddingEnableCache":"Bật cache embedding","embeddingEnableCacheTooltip":"Cache kết quả embedding để giảm tính toán lặp lại","embeddingMaxCacheSize":"Kích thước cache tối đa","embeddingMaxCacheSizeTooltip":"Số mục tối đa trong cache embedding","embeddingMaxCacheSizeRequired":"Bắt buộc 
199nhập kích thước cache tối đa","embeddingUseDimensions":"Gửi số chiều trong yêu cầu","embeddingUseDimensionsTooltip":"Gửi tham số dimensions trong yêu cầu tới API Embedding tương thích OpenAI; một số dịch vụ không hỗ trợ tham số này","embeddingDimensions":"Số chiều embedding","embeddingDimensionsTooltip":"Số chiều vector dự kiến, dùng để kiểm tra phản hồi, chỉ mục và bộ nhớ đệm; khi tắt gửi số chiều, hãy nhập số chiều đầu ra thực tế của mô hình","embeddingDimensionsRequired":"Bắt buộc nhập số chiều embedding","embeddingDimensionsMin":"Số chiều phải ít nhất là 1","embeddingMaxInputLength":"Ngân sách ký tự mỗi đầu vào","embeddingMaxInputLengthTooltip":"Ngân sách ký tự gần đúng cho từng đầu vào Embedding. Văn bản được cắt trước khi gửi yêu cầu, với cách ước tính thận trọng hơn cho CJK và các ký tự toàn chiều rộng; đây không phải giới hạn token chính xác","embeddingMaxInputLengthRequired":"Bắt buộc 
199nhập ngân sách ký tự mỗi đầu vào","embeddingMaxBatchSize":"Kích thước batch tối đa","embeddingHealthCheckTimeout":"Thời gian chờ khởi tạo","embeddingHealthCheckTimeoutTooltip":"Thời gian chờ cho mỗi lần kiểm tra kết nối và kiểm tra embedding khi ReMe khởi động","embeddingHealthCheckTimeoutRequired":"Cần nhập thời gian chờ khởi tạo","embeddingMaxBatchSizeTooltip":"Số mục tối đa trong một yêu cầu embedding theo batch","embeddingMaxBatchSizeRequired":"Bắt buộc nhập kích thước batch tối đa","embeddingActivationNote":"Embedding được bật khi các trường bắt buộc của backend đã chọn được điền đầy đủ.","embeddingEnableHint":"Embedding được bật khi các trường bắt buộc được điền: Tên mô hình và API Key cho backend tương thích OpenAI hoặc Gemini; Tên mô hình cho Ollama.","rebuildMemoryIndex":"Xây dựng lại chỉ mục bộ nhớ","rebuildMemoryIndexWarning":"Thao tác này sẽ xóa và xây dựng lại chỉ mục tìm kiếm bộ nhớ, đồng thời có thể sử dụng nhiều CPU và bộ nhớ. Chỉ nên dùng để sửa chỉ mục bị hỏng hoặc kết quả tìm kiếm bất thường.","rebuildMemoryIndexConfirmTitle":"Xây dựng lại chỉ mục bộ nhớ?","rebuildMemoryIndexConfirm":"Mức sử dụng CPU và bộ nhớ có thể tăng đáng kể trong quá trình xây dựng lại. Không nên thực hiện trừ khi chỉ mục bị hỏng hoặc cần sửa chữa.","rebuildMemoryIndexSuccess":"Đã xây dựng lại chỉ mục bộ nhớ","rebuildMemoryIndexFailed":"Không thể xây dựng lại chỉ mục bộ nhớ: {{error}}","rebuildMemoryIndexRequired":"Cấu hình Embedding đã thay đổi. Tìm kiếm vector bị tắt và tìm kiếm bộ nhớ sẽ sử dụng BM25 cho đến khi chỉ mục Embedding được xây dựng lại.","embeddingIndexReady":"Chỉ mục Embedding khớp với cấu hình hiện tại.","embeddingIndexStatus":"Chỉ mục Embedding","embeddingIndexAvailable":"Đã cập nhật","embeddingSearchModeHybrid":"Tìm kiếm hiện tại: Vector + BM25","embeddingSearchModeBm25":"Tìm kiếm hiện tại: Chỉ BM25","embeddingSearchModeBm25Pending":"Tìm kiếm hiện tại: Chỉ BM25 · đang chờ xây dựng lại","embeddingIndexNeedsRebuild":"Cần xây dựng lại","embeddingIndexRebuilding":"Đang xây dựng lại","embeddingIndexRebuildingHint":"Đang tạo các vector bộ nhớ","embeddingIndexSaveFirst":"Hãy lưu cấu hình trước","embeddingIndexUnsavedHint":"Lưu các thay đổi trước khi xây dựng lại chỉ mục","embeddingIndexMatchesConfig":"Khớp với cấu hình hiện tại","embeddingIndexBm25Fallback":"Tìm kiếm vector đã tắt · đang dùng BM25","rebuildEmbeddingIndex":"Xây dựng lại chỉ mục Embedding","rebuildEmbeddingIndexConfirmTitle":"Xây dựng lại chỉ mục Embedding?","rebuildEmbeddingIndexConfirm":"Embedding của tất cả phân đoạn bộ nhớ sẽ được tạo lại bằng cấu hình hiện tại. Tìm kiếm vector vẫn bị tắt cho đến khi quá trình hoàn tất thành công.","rebuildEmbeddingIndexSuccess":"Đã xây dựng lại chỉ mục Embedding","rebuildEmbeddingIndexFailed":"Không thể xây dựng lại chỉ mục Embedding: {{error}}","undoEmbeddingChange":"Hoàn tác thay đổi","undoEmbeddingChangeConfirmTitle":"Khôi phục cấu hình Embedding được chỉ mục sử dụng?","undoEmbeddingChangeConfirm":"Cấu hình gần nhất khớp với chỉ mục vector hiện có sẽ được khôi phục.","undoEmbeddingChangeSuccess":"Đã khôi phục cấu hình Embedding được chỉ mục sử dụng","undoEmbeddingChangeFailed":"Không thể khôi phục cấu hình Embedding: {{error}}","rebuildBm25Index":"Xây dựng lại chỉ mục BM25","rebuildBm25IndexDescription":"Tạo lại chỉ mục tìm kiếm từ khóa từ các phân đoạn bộ nhớ hiện tại.","rebuildBm25IndexConfirmTitle":"Xây dựng lại chỉ mục BM25?","rebuildBm25IndexConfirm":"Chỉ mục tìm kiếm từ khóa sẽ được tạo lại từ các phân đoạn bộ nhớ hiện tại.","rebuildBm25IndexSuccess":"Đã xây dựng lại chỉ mục BM25","goToLongTermMemory":"Đi đến bộ nhớ dài hạn","shellCommandTimeout":"Timeout lệnh shell (giây)","shellCommandTimeoutTooltip":"Timeout mặc định cho công cụ execute_shell_command.","shell
199CommandTimeoutPlaceholder":"Nhập timeout","shellCommandTimeoutRequired":"Bắt buộc","shellCommandTimeoutMin":"Phải ít nhất 1 giây","shellCommandExecutable":"Shell thực thi","shellCommandExecutableTooltip":"Đường dẫn shell dùng cho execute_shell_command. Để trống để tự phát hiện.","shellCommandExecutablePlaceholder":"Ví dụ: /bin/bash hoặc powershell.exe (để trống = tự phát hiện)","maxInputLength":"Độ dài đầu vào tối đa","maxInputLengthTooltip":"Độ dài tối đa (token) cho cửa sổ ngữ cảnh mô hình","maxInputLengthPlaceholder":"Nhập độ dài tối đa","maxInputLengthRequired":"Bắt buộc","maxInputLengthMin":"Phải ít nhất 1000","contextCompactTitle":"Cấu hình nén ngữ cảnh","contextCompactEnabled":"Bật nén ngữ cảnh","contextCompactEnabledTooltip":"Tự động nén ngữ cảnh để tránh tràn cửa sổ ngữ cảnh","contextCompactRatio":"Ngưỡng nén (tỉ lệ)","contextCompactRatioTooltip":"Kích hoạt nén khi độ dài ngữ cảnh đạt tỉ lệ này so với tối đa","contextCompactRatioRequired":"Bắt buộc","contextCompactThreshold":"Ngưỡng nén (token)","contextCompactThresholdTooltip":"Tự tính từ: độ dài tối đa × tỉ lệ nén.","contextCompactThresholdPlaceholder":"Tự tính","contextCompactReserveRatio":"Tỉ lệ dự trữ","contextCompactReserveRatioTooltip":"Phần ngữ cảnh gần nhất được giữ nguyên sau khi nén","contextCompactReserveRatioRequired":"Bắt buộc","contextCompactReserveThreshold":"Ngưỡng dự trữ (token)","contextCompactReserveThresholdTooltip":"Tự tính từ: độ dài tối đa × tỉ lệ dự trữ.","contextCompactReserveThresholdPlaceholder":"Tự tính","toolResultCompactRecentN":"Phạm vi kết quả gần đây","toolResultCompactRecentNTooltip":"Chia danh sách tin nhắn thành 2 phân đoạn: N tin nhắn gần nhất và tin nhắn cũ hơn.","toolResultCompactRecentNRequired":"Bắt buộc","toolResultCompactOldThreshold":"Ngưỡng tin nhắn cũ (byte)","toolResultCompactOldThresholdTooltip":"Kết quả công cụ trong tin nhắn cũ được nén khi vượt giới hạn byte này.","toolResultCompactOldThresholdPlaceholder":"Nhập ngưỡng ký tự","toolResultCompactOldThresholdRequired":"Bắt buộc","toolResultCompactRecentThreshold":"Ngưỡng tin nhắn gần đây (byte)","toolResultCompactRecentThresholdTooltip":"Kết quả công cụ trong N tin nhắn gần nhất được nén khi vượt giới hạn byte này.","toolResultCompactRecentThresholdPlaceholder":"Nhập ngưỡng ký tự","toolResultCompactRecentThresholdRequired":"Bắt buộc","toolResultCompactRetentionDays":"Số ngày lưu file kết quả","toolResultCompactRetentionDaysTooltip":"Số ngày giữ lại file kết quả công cụ đã nén, file hết hạn sẽ tự động dọn dẹp","toolResultCompactRetentionDaysRequired":"Bắt buộc","historyRetentionDays":"Số ngày lưu lịch sử","historyRetentionDaysTooltip":"Số ngày lưu lịch sử trò chuyện lâu dài. Các bản ghi cũ hơn sẽ tự động bị xóa khi khởi động và khi tắt agent.","historyRetentionDaysRequired":"Bắt buộc","historyRetentionDaysForeverWarning":"Đặt 0 sẽ lưu lịch sử vĩnh viễn — dung lượng lưu trữ sẽ tăng không giới hạn.","historyRetentionDaysLargeWarning":"Khoảng thời gian lưu lớn có thể chiếm nhiều dung lượng lưu trữ.","exemptFileExtensions":"Phần mở rộng file miễn trừ","exemptFileExtensionsTooltip":"Kết quả read_file cho các phần mở rộng này dùng ngưỡng tin nhắn gần đây","exemptFileExtensionsPlaceholder":".md, .txt, .json","exemptToolNames":"Tên công cụ miễn trừ","exemptToolNamesTooltip":"Kết quả từ các công cụ này dùng ngưỡng tin nhắn gần đây","exemptToolNamesPlaceholder":"chat_with_agent, list_agents","language":"Ngôn ngữ agent","languageTooltip":"Ngôn ngữ cho các file nhân cách (SOUL.md, AGENTS.md,...). Thay đổi sẽ sao chép lại các file MD theo ngôn ngữ mới.","languageConfirmTitle":"Đổi ngôn ngữ agent","languageConfirmContent":"Đổi ngôn ngữ sẽ ghi đè các file sau:\\n\\
199n  SOUL.md, AGENTS.md, PROFILE.md, MEMORY.md, BOOTSTRAP.md, HEARTBEAT.md\\n\\nNếu bạn đã tùy chỉnh các file này, hãy sao lưu trước.","languageConfirmOk":"Đổi ngôn ngữ","languageSaveSuccess":"Đã cập nhật ngôn ngữ","languageSaveSuccessWithFiles":"Đã cập nhật ngôn ngữ, đã sao chép {{count}} file MD","languageSaveFailed":"Cập nhật ngôn ngữ thất bại","saveSuccess":"Đã lưu cấu hình","saveFailed":"Lưu cấu hình thất bại","timezone":"Múi giờ người dùng","timezoneTooltip":"Dùng cho tác vụ định kỳ, hiển thị giờ và ngữ cảnh agent. Mặc định theo múi giờ hệ thống.","timezoneRequired":"Vui lòng chọn múi giờ","selectTimezone":"Chọn múi giờ","timezoneSaveSuccess":"Đã cập nhật múi giờ","timezoneSaveFailed":"Cập nhật múi giờ thất bại","loadFailed":"Tải cấu hình thất bại","historyMaxLength":"Độ dài lịch sử tối đa","historyMaxLengthTooltip":"Độ dài đầu ra tối đa (ký tự) cho lệnh /history","historyMaxLengthRequired":"Bắt buộc","historyMaxLengthMin":"Phải ít nhất 1000","historyMaxLengthPlaceholder":"Nhập độ dài tối đa","tokenCountModel":"Mô hình đếm token","tokenCountModelTooltip":"Tên mô hình dùng để đếm token chính xác; đặt là \\"default\\" để dùng ước tính tích hợp","tokenCountModelPlaceholder":"Tên mô hình hoặc default","tokenCountUseMirror":"Dùng mirror HuggingFace","tokenCountUseMirrorTooltip":"Dùng mirror HuggingFace khi tải tokenizer"}'),wE={llmConfiguration:"Cấu hình LLM",providersTitle:"Nhà cung cấp",providersDescription:"Cấu hình API key và endpoint cho từng nhà cung cấp.",llmTitle:"Mô hình",defaultLlm:"LLM mặc định",llmDescription:"Đặt mô hình LLM mặc định toàn cục. Bạn có thể chọn mô hình riêng cho từng Agent ở trang Trò chuyện.",configureProvider:"Cấu hình {{name}}",baseURL:"Base URL",apiKey:"API Key",advancedConfig:"Cấu hình nâng cao",authMode:"Chế độ xác thực",authModeApiKey:"API Key (x-api-key)",authModeAuthToken:"Auth Token (Authorization: Bearer)",customHeaders:"Header tùy chỉnh",customHeadersHint:"Thêm vào mỗi yêu cầu API, ví dụ: x-app: cli",customHeaderKey:"Tên header",customHeaderValue:"Giá trị header",addHeader:"+ Thêm header",generateConfig:"Tham số tạo văn bản",generateConfigHint:"Tham số dạng JSON object, sẽ được mở rộng vào mỗi yêu cầu.",relayReasoningLabel:"Chuyển tiếp suy luận",relayReasoningHint:"Chuyển tiếp nội dung suy luận sang các lượt hội thoại tiếp theo",thinkingModeLabel:"Bật suy nghĩ",thinkingModeHint:"Bật để kích hoạt suy nghĩ/lập luận. Tắt để vô hiệu hóa suy nghĩ.",thinkingBudgetLabel:"Ngân sách suy nghĩ",thinkingBudgetHint:"Sử dụng ngân sách suy nghĩ mặc định của mô hình",switchToManual:"Thủ công",switchToAuto:"Tự động",reasoningEffortLabel:"Độ sâu lập luận",reasoningEffortHint:"Kiểm soát độ sâu lập luận (dòng OpenAI)",saveSuccess:"Đã lưu cấu hình nhà cung cấp",saveFailed:"Lưu cấu hình thất bại",loadFailed:"Tải cấu hình thất bại",testConnection:"Kiểm tra kết nối",testSuccess:"Kết nối thành công",testFailed:"Kết nối thất bại",noProviders:"Chưa có nhà cung cấp nào",addProvider:"Thêm nhà cung cấp",getModels:"Lấy danh sách mô hình",discovered:"Mô hình khả dụng:",add:"Thêm",local:"Cục bộ",localType:"Loại",localEmbedded:"Nhúng (in-process)",localDownloadFirst:"Dịch vụ mô hình chưa khởi động",localDownloadModel:"Tải mô hình",localModelsTitle:"{{provider}} — Mô hình cục bộ",localNoModels:"Chưa có mô hình nào được tải xuống",localRepoId:"ID Repository mô hình",localRepoIdRequired:"Vui lòng nhập ID repository mô hình",localRepoIdPlaceholder:"Ví dụ: Qwen/Qwen3-0.6B-GGUF",localFilename:"Tên file (tùy chọn)",localFilenamePlaceholder:"Ví dụ: mistral-7b.Q4_K_M.gguf",localFilenameHint:"Để trống để tự chọn lượng tử hóa tốt nhất",localSource:"Nguồn",localDownloadSuccess:"Tải mô hình thành công",filterByModality:"Phương thức đầu vào:",filterFreeOnly:"Chỉ mô hình miễn phí:",selectAllProviders:"Chọn tất cả",clearProviderSelection:"Bỏ chọn tất cả",noMatchingProviders:"Không có nhà cung cấp phù hợp"},PE={parent:"Cài đặt",security:"Bảo mật",title:"Bảo mật",description:"Quản lý các tính năng bảo mật cho công cụ và kỹ năng.",toolGuardTitle:"Tool Guard",toolGuardDescription:"Cấu hình quét bảo mật cho lời gọi công cụ. Các thao tác nguy hiểm sẽ yêu cầu phê duyệt trước khi thực thi.",enabled:"Bật Tool Guard",enabledTooltip:"Khi bật, lời gọi công cụ sẽ được quét các mẫu nguy hiểm trước khi thực thi",guardedTools:"Công cụ được giám sát",guardedToolsTooltip:"
199Công cụ yêu cầu phê duyệt khi phát hiện mẫu nguy hiểm. Để trống để dùng bộ mặc định tích hợp.",guardedToolsPlaceholder:"Chọn công cụ hoặc nhập tên tùy chỉnh",deniedTools:"Công cụ bị chặn",deniedToolsTooltip:"Công cụ luôn bị từ chối mà không cần hỏi phê duyệt",deniedToolsPlaceholder:"Chọn công cụ luôn từ chối",saveSuccess:"Đã lưu cài đặt Tool Guard",saveFailed:"Lưu cài đặt thất bại",loadFailed:"Tải cài đặt thất bại",fileGuard:{title:"File Guard",description:"Bảo vệ các file và thư mục nhạy cảm khỏi bị truy cập bởi công cụ agent.",enableLabel:"Bật File Guard",path:"Đường dẫn",actions:"Thao tác",add:"Thêm",inputPlaceholder:"Nhập đường dẫn file hoặc thư mục (ví dụ: ~/.ssh/ hoặc /etc/passwd)",empty:"Chưa có đường dẫn nhạy cảm tùy chỉnh nào",removeConfirm:"Xóa đường dẫn này?",saveSuccess:"Đã lưu cài đặt File Guard",saveFailed:"Lưu cài đặt File Guard thất bại",loadFailed:"Tải cài đặt File Guard thất bại"},allowNoAuthHosts:{title:"Máy chủ không cần xác thực",description:"Các địa chỉ IP được phép truy cập mà không cần xác thực.",add:"Thêm IP",inputPlaceholder:"Nhập địa chỉ IP (ví dụ: 192.168.1.100 hoặc ::1)",empty:"Chưa có địa chỉ IP nào",default:"Mặc định",removeConfirm:"Xóa địa chỉ IP này khỏi danh sách trắng?",duplicate:"Địa chỉ IP này đã có trong danh sách",invalidIP:"Định dạng địa chỉ IP không hợp lệ",saveSuccess:"Đã lưu cài đặt",saveFailed:"Lưu cài đặt thất bại",loadFailed:"Tải cài đặt thất bại"},skillScanner:{title:"Skill Scanner",description:"Tự động quét kỹ năng để phát hiện mối đe dọa bảo mật trước khi bật hoặc cài đặt.",mode:"Chế độ quét",modeTooltip:"Kiểm soát cách xử lý kỹ năng không an toàn: chặn, chỉ cảnh báo, hoặc tắt",modeBlock:"Chặn",modeWarn:"Chỉ cảnh báo",modeOff:"Tắt",timeout:"Timeout quét (giây)",timeoutTooltip:"Thời gian tối đa chờ quét hoàn thành",saveSuccess:"Đã lưu cài đặt Skill Scanner",saveFailed:"Lưu thất bại",loadFailed:"Tải thất bại"}},AE={title:"Kênh",description:"Quản lý và cấu hình các kênh nhắn tin",loading:"Đang tải kênh...",configSaved:"Đã lưu cấu hình",configFailed:"Lưu cấu hình thất bại",botConflictTitle:"Bot đang được sử dụng",botConflictDescription:"Bot này đang được {{agents}} sử dụng trên cùng một kênh. Việc vẫn lưu có thể gây xung đột tin nhắn.",botConflictConfirm:"Vẫn lưu",channelType:"Loại kênh",status:"Trạng thái",totalItems:"Tổng {{count}} mục",botPrefix:"Tiền tố bot",showToolCalls:"Hiển thị thông tin gọi công cụ",showToolCallsTooltip:"Hiển thị thông tin gọi công cụ cho người dùng (tắt để ẩn)",showToolResults:"Hiển thị thông tin kết quả công cụ",showToolResultsTooltip:"Hiển thị thông tin kết quả công cụ cho người dùng (tắt để ẩn)",toolCallMaxLength:"Độ dài hiển thị tối đa của lệnh gọi công cụ",toolResultMaxLength:"Độ dài hiển thị tối đa của kết quả công cụ",toolMaxLengthTooltip:"Đặt là 0 để không giới hạn độ dài",onebotMediaBase64:"Gửi phương tiện cục bộ dưới dạng Base64",onebotMediaBase64Tooltip:"Chọn cách gửi tệp phương tiện. Khi tắt, đường dẫn tệp được gửi; khi bật, tệp được mã hóa thành Base64. URL từ xa vẫn giữ nguyên.",onebotMediaBase64MaxMb:"Giới hạn kích thước tệp Base64",onebotMediaBase64MaxMbTooltip:"Tệp phương tiện vượt quá giới hạn này được gửi bằng đường dẫn tệp gốc.",onebotMediaBase64MaxMbRequired:"Vui lòng nhập giới hạn kích thước tệp Base64",onebotMediaBase64MaxMbMin:"Giới hạn kích thước tệp Base64 phải ít nhất là 1 MB",onebotMediaDir:"Thư mục media",onebotMediaDirTooltip:"Thư mục lưu media đã tải xuống. Mặc định dùng thư mục media trong không gi
199an làm việc của agent.",onebotMediaDownloadMaxMb:"Giới hạn kích thước phương tiện đầu vào",onebotMediaDownloadMaxMbTooltip:"Kích thước tối đa của từng ảnh, âm thanh, video hoặc tệp tải xuống từ OneBot.",onebotMediaDownloadMaxMbRequired:"Vui lòng nhập giới hạn kích thước phương tiện đầu vào",onebotMediaDownloadMaxMbMin:"Giới hạn kích thước phương tiện đầu vào phải ít nhất là 1 MB",onebotWsHostTooltip:"Địa chỉ lắng nghe của máy chủ WebSocket đảo ngược. Giữ 127.0.0.1 để chỉ các client OneBot trên máy này có thể kết nối. Bất kỳ địa chỉ khác sẽ mở cổng ra mạng và yêu cầu access token.",onebotAccessTokenTooltip:"Token dùng chung mà client OneBot gửi trong header Authorization. Bắt buộc khi địa chỉ lắng nghe không phải là địa chỉ loopback.",onebotAccessTokenRequired:"Cần có access token khi WebSocket host không phải là địa chỉ loopback",showThinking:"Hiển thị suy luận",showThinkingTooltip:"Hiển thị nội dung suy luận của mô hình (tắt để ẩn)",noTextDebounce:"Debounce không văn bản",noTextDebounceTooltip:"Khi bật, các tin nhắn chỉ chứa phương tiện (ảnh/video/tệp) sẽ được lưu tạm, đợi tin nhắn văn bản tiếp theo đến rồi gộp xử lý. Tắt để xử lý ngay tất cả tin nhắn. Tin nhắn thoại luôn được xử lý ngay.",streamingEnabled:"Xuất streaming",shareSessionInGroup:"Chia sẻ ngữ cảnh trong nhóm",shareSessionInGroupTooltip:"Khi bật, tất cả thành viên trong nhóm dùng chung một ngữ cảnh hội thoại. Khi tắt, mỗi thành viên có ngữ cảnh độc lập.",cardAutoLayout:"Thẻ màn hình rộng (Bố cục tự động)",cardAutoLayoutTooltip:"Khi bật, DingTalk hiển thị thẻ AI ở chế độ màn hình rộng trên máy tính. Chỉ áp dụng khi loại tin nhắn là card. Mẫu thẻ phải được xuất bản.",ackMessage:"Tin nhắn xác nhận",ackMessageTooltip:"Gửi phản hồi tức thì khi nhận được tin nhắn, trước khi xử lý",wechatSetupGuide:"Bot tài khoản WeChat cá nhân (giao thức iLink). Lần đầu khởi động sẽ in URL mã QR; quét để ủy quyền.",wechatBotToken:"Bot Token",wechatBotTokenTooltip:"Bearer token sau khi đăng nhập bằng mã QR. Để trống để kích hoạt đăng nhập bằng mã QR.",wechatBotTokenPlaceholder:"Tự điền sau khi quét QR, hoặc dán thủ công",wechatBotTokenFile:"Đường dẫn file token",wechatMediaDir:"Thư mục media",enabledSection:"Đã kích hoạt",enabledCount:"{{count}}",availableSection:"Chưa kích hoạt",enableAction:"Kích hoạt",noEnabledChannels:"Không có kênh nào được kích hoạt",goEnableChannels:"Kích hoạt kênh",slackBotToken:"Bot Token",slackBotTokenTooltip:"Slack Bot User OAuth Token, bắt đầu bằng xoxb-",slackAppToken:"App Token",slackAppTokenTooltip:"Slack App-Level Token cho Socket Mode, bắt đầu bằng xapp-",slackProxyTooltip:"URL proxy HTTP để kết nối đến Slack API"},ME={title:"Tác vụ định kỳ",description:"Tạo và quản lý các tác vụ tự động thực thi theo lịch định sẵn.",createJob:"Tạo tác vụ",createFromTemplate:"Tạo từ mẫu",editJob:"Chỉnh sửa tác vụ",templateModalTitle:"Chọn mẫu tác vụ",templateModalDescription:"Chọn mẫu tích hợp và điều chỉnh các tham số chính trước khi lưu.",useTemplate:"Dùng mẫu này",templateTagPersonal:"Cá nhân",templateTagTeam:"Nhóm",templateTagReminder:"Nhắc nhở",templateTagCalendar:"Lịch",templateTagCalendarRecommended:"Lịch (Khuyến nghị)",confirmDelete:"Xác nhận xóa",deleteConfirm:"Bạn có chắc muốn xóa tác vụ định kỳ này không?",okText:"OK",cancelText:"Hủy",deleteText:"Xóa",id:"ID tác vụ",name:"Tên tác vụ",enabled:"Trạng thái",saveResultToInbox:"Lưu kết quả vào Hộp thư",saveResultToInboxTooltip:"Khi bật, các lần thực thi thành công sẽ được lưu vào Hộp thư",silentDelivery:"Gửi im lặng",silentDeliveryTooltip:"
199Chạy tác vụ agent và giữ lại phiên cùng dấu vết, nhưng không gửi kết quả tới kênh."},DE={title:"Sao lưu",description:"Sao lưu và khôi phục workspace và cấu hình agent.",create:"Tạo bản sao lưu",import:"Nhập",export:"Xuất",restore:"Khôi phục",delete:"Xóa",batchDelete:"Xóa đã chọn",batchDeleteConfirm:"Bạn có chắc muốn xóa {{count}} bản sao lưu? Không thể hoàn tác.",deleteConfirm:"Bạn có chắc muốn xóa bản sao lưu này? Không thể hoàn tác.",name:"Tên",createdAt:"Ngày tạo",scopeSummary:"Phạm vi",descriptionLabel:"Mô tả",noBackups:"Chưa có bản sao lưu nào.",loadFailed:"Tải danh sách sao lưu thất bại",createTitle:"Tạo bản sao lưu",backupMode:"Chế độ sao lưu",fullBackup:"Sao lưu toàn bộ",fullBackupDesc:"Sao lưu tất cả bao gồm workspace của mọi agent, cài đặt toàn cục, kho kỹ năng và bí mật",customBackup:"Sao lưu tùy chỉnh",partialBackup:"Sao lưu một phần",exportConfirm:"Xác nhận xuất",importTitle:"Nhập bản sao lưu",importSuccess:"Nhập sao lưu thành công",importFailed:"Nhập sao lưu thất bại",importConflictTitle:"Bản sao lưu đã tồn tại",importConflictDesc:"Đã có bản sao lưu với ID này. Bạn có muốn ghi đè không?",importReplace:"Ghi đè",agents:"{{count}} Agent",allAgents:"Tất cả Agent",globalConfig:"Cài đặt toàn cục",skillPool:"Kho kỹ năng",secrets:"Bí mật",selected:"Đã chọn {{count}}",fileCount:"{{count}} tệp",totalSize:"{{size}}",progressStarting:"Đang bắt đầu sao lưu...",progressAgent:"Đang sao lưu agent {{index}} / {{total}}...",progressSaving:"Đang lưu file sao lưu...",progressDone:"Sao lưu hoàn tất",localModelsNotice:"File sao lưu không bao gồm file mô hình cục bộ. Khi di chuyển sang thiết bị khác, bạn cần tải lại các mô hình đó."},xE={title:"Kỹ năng",description:"Quản lý kỹ năng và khả năng của agent.",preload:"Tải trước",preloadHint:"Khi bật, agent sẽ tải trước kỹ năng này và không cần tìm rồi tải lại trong cuộc trò chuyện.",qwenpawManaged:"Do QwenPaw quản lý",qwenpawManagedHint:"Có thể chỉnh sửa và được truyền vào agent bên thứ ba được hỗ trợ khi chạy.",providerManaged:"Kỹ năng của tác nhân bên thứ ba",providerManagedHint:"Được phát hiện từ tác nhân bên thứ ba hiện tại và chỉ hiển thị để đọc.",providerOnly:"Chỉ tác nhân bên thứ ba hiện tại",readOnly:"Chỉ đọc",noDescription:"Không có mô tả.",providerSkillDetails:"Chi tiết Skill của tác nhân bên thứ ba",providerManagedDetailHint:"Skill này do tác nhân bên thứ ba quản lý. QwenPaw có thể hiển thị và sử dụng nhưng không thể chỉnh sửa.",provider:"Tác nhân bên thứ ba",scope:"Phạm vi",statusLabel:"Trạng thái",descriptionLabel:"Mô tả",importHub:"Tải lên qua URL",supportedSources:"Nguồn được hỗ trợ:",importSkills:"Nhập kỹ năng",enterSkillUrl:"Nhập URL kỹ năng",supportedSkillUrlSources:"Chợ kỹ năng được hỗ trợ:",urlExamples:"Ví dụ URL:",urlValid:"URL hợp lệ từ {{source}}",invalidUrl:"URL không hợp lệ",clickToFill:"Nhấn để điền URL",invalidSkillUrlSource:"Vui lòng xác minh URL kỹ năng từ chợ được hỗ trợ",type:"Loại",installedFrom:"Được cài từ",source:"Nguồn",path:"Đường dẫn",tags:"Nhãn",builtin:"Tích hợp sẵn",custom:"Tùy chỉnh",addSkill:"Thêm kỹ năng",createSkill:"Tạo kỹ năng",uploadZip:"Tải lên qua Zip",downloadFromPool:"Tải từ kho kỹ năng",viewSkill:"Xem kỹ năng",editSkill:"Chỉnh sửa kỹ năng",skillName:"Tên kỹ năng",skillNameRequired:"Vui lòng nhập tên kỹ năng",deleteConfirm:"Xóa kỹ năng này?",deleteSuccess:"Đã xóa kỹ năng",deleteFailed:"Xóa kỹ năng thất bại",loadFailed:"Tải kỹ năng thất bại",saveSuccess:"Đã lưu kỹ năng",saveFailed:"Lưu kỹ năng thất bại",emptyState:"Chưa có kỹ năng nào",enabledSkills:"Kỹ năng đã kích hoạt",disabledSkills:"Kỹ năng chưa kích hoạt",active:"kích hoạt"},RE={description:"Kho kỹ năng cục bộ dùng chung cho kỹ năng tích hợp và tải lên từ workspace.",broadcast:"Phân phối cho Agent",broadcastHint:"Phân phối kỹ năng đến các agent được chọn",refreshHint:"Làm mới kho kỹ năng từ đĩa",deleteExternalConfirm:"Thao tác này sẽ xóa file kỹ năng ngoài tại {{path}} khỏi đĩa.",deleteExternalBatchWarning:"Các kỹ năng ngoài đã chọn sẽ bị xóa vĩnh viễn khỏi đĩa.",broadcastTitle:"Phân phối {{name}}",automation:"Tự động hóa",builtinAutoUpdate:"Tự động cập nhật",builtinAutoUpdateFlow:"Gói tích hợp → Kho kỹ năng",autoSyncFlow:"Kho kỹ năng → Workspace của agent",automationBoth:"Tự động cập nhật + đồng bộ",automationMixedHint:"Mở chi tiết để chọn tự động cập nhật hoặc tự động đồ
199ng bộ.",automationEnableHint:"Bật tự động cập nhật và tự động đồng bộ.",automationDisableHint:"Tắt tự động cập nhật và tự động đồng bộ.",automationEnabled:"Đã bật tự động cập nhật và tự động đồng bộ cho {{name}}",automationDisabled:"Đã tắt tự động cập nhật và tự động đồng bộ cho {{name}}",automationFailed:"Không thể cập nhật cài đặt tự động hóa",automationNeedsAttention:"Đã lưu. Có {{count}} mục cần xử lý; xem Hộp thư đến.",autoSync:"Tự động đồng bộ",autoSyncEnableHint:"Bật tự động đồng bộ.",autoSyncDisableHint:"Tắt tự động đồng bộ.",autoSyncEnabled:"Đã bật tự động đồng bộ cho {{name}}",autoSyncDisabled:"Đã tắt tự động đồng bộ cho {{name}}",autoSyncAgentsPlaceholder:"Tất cả agent có kỹ năng này",autoSyncAgentsHint:"Để trống để đồng bộ các bản sao hiện có, hoặc chọn agent cụ thể.",importBuiltin:"Cập nhật kỹ năng tích hợp",importBuiltinHint:"Cập nhật kỹ năng tích hợp lên phiên bản mới nhất",importBuiltinAlertHint:"{{count}} thay đổi tích hợp cần xem xét",importBuiltinSuccess:"Đã nhập kỹ năng tích hợp: {{names}}",importBuiltinConflicts:"Bỏ qua do trùng tên: {{names}}",importBuiltinNoChanges:"Không có thay đổi tích hợp nào để nhập",emptyState:"Kho kỹ năng trống",loadFailed:"Tải kho kỹ năng thất bại"},IE={readFile:"Đọc {{file}}",readFileDefault:"Đọc file",writeFile:"Tạo {{file}}",writeFileDefault:"Tạo file",editFile:"Chỉnh sửa {{file}}",editFileDefault:"Chỉnh sửa file",appendFile:"Thêm vào {{file}}",appendFileDefault:"Thêm vào file",grepSearch:"Tìm {{pattern}}",grepSearchDefault:"Tìm kiếm grep",globSearch:"Glob {{pattern}}",globSearchDefault:"Tìm kiếm glob",viewImage:"Xem ảnh {{file}}",viewImageDefault:"Xem ảnh",viewVideo:"Xem video {{file}}",viewVideoDefault:"Xem video",desktopScreenshot:"Chụp màn hình",sendFile:"Gửi {{file}}",sendFileDefault:"Gửi file",browserUse:"Duyệt web {{detail}}",browserNavigate:"Mở {{url}}",browserNavigateDefault:"Mở trang web",browserClick:"Nhấn vào trang web",browserType:"Nhập vào trang web",browserSnapshot:"Chụp trang web",browserScroll:"Cuộn trang web",getCurrentTime:"Lấy thời gian hiện tại",setTimer:"Đặt hẹn giờ",executeShell:"Chạy lệnh shell",listFiles:"Liệt kê tệp tin",searchWeb:"Tìm kiếm web",sendMessage:"Gửi tin nhắn",createMemory:"Tạo bộ nhớ",searchMemory:"Tìm bộ nhớ",memorySearch:"Tìm bộ nhớ {{query}}",memorySearchDefault:"Tìm bộ nhớ",updateMemory:"Cập nhật bộ nhớ",deleteMemory:"Xóa bộ nhớ",rawInputPreview:"Đầu vào thô trực tiếp (4.096 ký tự cuối)",largeOutputOmitted:"Đã lược bỏ {{count}} dòng — sao chép đầu ra hiện có hoặc làm theo hướng dẫn khôi phục",largeOutputTruncated:"Đầu ra được rút gọn khi hiển thị — sao chép đầu ra hiện có hoặc làm theo hướng dẫn khôi phục"},_E={title:"Phiên làm việc",description:"Xem và quản lý các phiên chat đang hoạt động",loading:"Đang tải phiên...",confirmDelete:"Xác nhận xóa",deleteConfirm:"Bạn có chắc muốn xóa phiên này không?",batchDeleteConfirm:"Bạn có chắc muốn xóa {{count}} phiên đã chọn không?",deleteSuccess:"Xóa phiên thành công",deleteFailed:"Xóa phiên thất bại",batchDeleteSuccess:"Đã xóa thành công {{count}} phiên",batchDeleteFailed:"Xóa hàng loạt thất bại",saveSuccess:"Lưu phiên thành công",saveFailed:"Lưu phiên thất bại",batchDeleteButton:"Xóa hàng loạt",filterTitle:"Lọc theo tiêu đề",filterUserId:"Lọc theo ID người dùng",filterChannel:"Lọc theo kênh",allChannels:"Tất cả kênh",totalItems:"Tổng {{count}} mục",selectedItems:"Đã chọn {{count}} mục",editSession:"Chỉnh sửa phiên",pleaseInputName:"Vui lòng nhập tên phiên",sessionNamePlaceholder:"Tên phiên",activeTab:"Đang hoạt động",archivedTab:"Đã lưu trữ",archivedAtColumn:"Thời gian lưu trữ",archive:{action:"Lưu trữ",unaction:"Bỏ lưu trữ",batchAction:"Lưu trữ hàng loạt",batchUnaction:"Bỏ lưu trữ hàng loạt",success:"Đã lưu trữ cuộc trò chuyện",successHint:"Đã lưu trữ. Xem tại Bảng điều khiển > Phiên > Đã lưu trữ.",failed:"Lưu trữ thất bại",unarchiveSuccess:"Đã bỏ lưu trữ",unarchiveFailed:"Bỏ lưu trữ thất bại",batchSuccess:"Đã lưu trữ {{count}} cuộc trò chuyện",batchFailed:"Lưu trữ hàng loạt thất bại",batchUnarchiveSuccess:"Đã bỏ lưu trữ {{count}} cuộc trò chuyện",batchUnarchiveFailed:"Bỏ lưu trữ hàng loạt thất bại",groupLabel:"Đã lưu trữ ({{count}})",modalTitle:"Cuộc trò chuyện đã lưu trữ",unarchiveAll:"Bỏ lưu trữ tất cả",noArchived:"Không có cuộc trò chuyện đã lưu trữ"}},LE={gotoSettings:"Cài đặt Loop Agent",selectorTitle:"Chế độ Loop",selectorHint:"Chọn cách agent tiếp tục công việc",selectorAria:"Chọn chế độ Loop",builtInModes:"Tích hợp",customModes:"Tùy chỉnh và plugin",starting:"Đang bắt đầu",running:"Đang chạy",awaiting_user:"Đang chờ bạn trả lời",activePersistentDescription:"Chế độ này duy trì trong cuộc trò chuyện cho đến khi hoàn tất hoặc cuộc trò chuyện được đặt lại.",activeCustomDescription:"Chế độ tùy chỉnh này duy trì cho đến khi dùng /mode off, /clear hoặc /new.",loadError:"Không thể tải một số chế độ Loop.",retry:"Thử lại",modes:{default:{name:"Mặc định",description:"Loop agent được kiểm soát tiêu chuẩn."},goal:{name:"Mục tiêu",description:"Liên tục hướng tới một mục tiêu cụ thể và có thể kiểm chứng."},mission:{name:"Nhiệm vụ",description:"Chạy tác vụ nhiều bước có cấu trúc và liên tục."}}},EE={common:UL,harnesses:qL,desktop:jL,chunkError:GL,appCenter:VL,nav:WL,os:zL,header:KL,sidebar:$L,theme:QL,startup:JL,hub:YL,login:XL,account:ZL,chat:eE,debug:tE,inbox:aE,acp:nE,voiceTranscription:oE,heartbeat:iE,checkpoints:sE,workspace:rE,agent:lE,environments:dE,tools:cE,mcp:uE,market:pE,agentStats:mE,modelSelector:hE,modelConfig:gE,tokenUsage:fE,approval:bE,preview:kE,pluginManager:yE,codingMode:vE,files:TE,projectDirectory:SE,agentConfig:CE,models:wE,security:PE,channels:AE,cronJobs:ME,backup:DE,skills:xE,skillPool:RE,tool:IE,sessions:_E,loop:LE},gd={en:{translation:cx},ru:{translation:iR},zh:{translation:eI},ja:{translation:QI},"pt-BR":{translation:V_},id:{translation:HL},vi:{translation:EE}};Ht.use(Eh).init({resources:gd,lng:localStorage.getItem("language")||navigator.language||"en",fallbackLng:"en",supportedLngs:Object.keys(gd),nonExplicitSupportedLngs:!0,interpolation:{escapeValue:!1}});function fd(e){if(!(e instanceof Error))return!1;const t=e.message.toLowerCase();return t.includes("loading chunk")||t.includes("loading css chunk")||t.includes("dynamically imported module")||t.includes("failed to fetch")||e.name==="ChunkLoadError"}class FE extends h.Component{constructor(){super(...arguments);V(this,"state",{hasError:!1,isChunkError:!1,restarting:!1,restartError:""});V(this,"restartRuntime",async()=>{this.setState({restarting:!0,restartError:""});try{await pa.restartOwnRuntime(),window.location.reload()}catch(a){this.setState({restarting:!1,restartError:a instanceof Error?a.message:Ht.t("account.runtimeRestartFailed")})}})}static getDerivedStateFromError(a){return{hasError:!0,isChunkError:fd(a),restarting:!1,restartError:""}}
199componentDidUpdate(a){this.state.hasError&&a.resetKey!==this.props.resetKey&&this.setState({hasError:!1,isChunkError:!1,restarting:!1,restartError:""})}componentDidCatch(a,n){const o=fd(a)?"Chunk load error":"Render error";console.error(`${o}:`,a,n)}render(){if(this.state.hasError){const a=this.state.isChunkError?"chunkError.title":"chunkError.genericTitle",n=this.state.isChunkError?"chunkError.subTitle":"chunkError.genericSubTitle";return c.jsx(eh,{status:"error",title:Ht.t(a),subTitle:this.state.restartError||Ht.t(n),extra:c.jsxs(oa,{wrap:!0,children:[c.jsx(Se,{type:"primary",onClick:()=>window.location.reload(),children:Ht.t("chunkError.reload")}),this.props.canRestartRuntime&&c.jsx(Se,{icon:c.jsx(Bd,{size:16}),loading:this.state.restarting,onClick:this.restartRuntime,children:Ht.t("account.runtimeRestart")})]}),style:{marginTop:"10vh"}})}return this.props.children}}const ja=ft(e=>({codingModeByAgent:{},codingModeRevisionByAgent:{},setCodingMode:(t,a)=>e(n=>({codingModeByAgent:{...n.codingModeByAgent,[t]:a},codingModeRevisionByAgent:{...n.codingModeRevisionByAgent,[t]:(n.codingModeRevisionByAgent[t]??0)+1}}))}));function rB(){const{selectedAgent:e}=We(),{codingModeByAgent:t,setCodingMode:a}=ja();return{codingMode:t[e]??!1,initialized:e in t,setCodingMode:n=>a(e,n)}}const Ki=ft(e=>({projectDirByAgent:{},setProjectDir:(t,a)=>e(n=>({projectDirByAgent:{...n.projectDirByAgent,[t]:a}}))}));function lB(){const e=We(n=>n.selectedAgent),t=Ki(n=>n.projectDirByAgent[e]),a=Ki(n=>n.setProjectDir);return{projectDir:t,setProjectDir:n=>a(e,n)}}const OE={get:()=>v("/coding-mode"),toggle:e=>v("/coding-mode",{method:"POST",body:JSON.stringify({enabled:e})})},BE={get:()=>v("/workspace/project-directory"),set:e=>v("/workspace/project-directory",{method:"PUT",body:JSON.stringify({path:e})}),create:e=>v("/workspace/project-directory/create",{method:"POST",body:JSON.stringify({name:e})}),list:()=>v("/workspace/project-directory/list"),importLocal:(e,t)=>v("/workspace/project-directory/import-local",{method:"POST",body:JSON.stringify({path:e,name:t||void 0})}),uploadZip:async(e,t)=>{const a=new FormData;a.append("file",e);const n=await fetch(ee(`/workspace/project-directory/upload-zip?name=${encodeURIComponent(t)}`),{method:"POST",headers:xe(),body:a});if(!n.ok){const o=await n.text().catch(()=>"");throw new Error(o||`Upload failed: ${n.status}`)}return n.json()},browseDirs:(e,t)=>v(`/workspace/project-directory/browse-dirs?path=${encodeURIComponent(e||"~")}${t?"&show_hidden=true":""}`),createDirectory:(e,t)=>v("/workspace/project-directory/browse-dirs/create",{method:"POST",body:JSON.stringify({parent:e,name:t})}),cloneStream:(e,t)=>fetch(ee("/workspace/project-directory/clone"),{method:"POST",headers:{...xe(),"Content-Type":"application/json"},body:JSON.stringify({url:e,name:t||void 0})})};function NE(){const{selectedAgent:e}=We(),t=ja(n=>n.setCodingMode),a=Ki(n=>n.setProjectDir);h.useEffect(()=>{if(!e)return;let n=!1;const o=ja.getState().codingModeRevisionByAgent[e]??0;return Promise.all([OE.get(),BE.get()]).then(([i,s])=>{if(n)return;(ja.getState().codingModeRevisionByAgent[e]??0)===o&&t(e,i.enabled),a(e,s.is_workspace_default?null:s.path)}).catch(i=>{if(n)return;console.warn("Failed to sync coding mode state:",i),(ja.getState().codingModeRevisionByAgent[e]??0)===o&&t(e,!1),a(e,null)}),()=>{n=!0}},[e,t,a])}const{Content:HE}=Ja;function UE(e,t){for(const a of t)if(am({path:a.path,end:a.path==="/"},e))return a.id;return"core.chat"}function qE({hubMode:e=!1}){const{t}=ve(),n=Ji().pathname,o=Rp();NE();const i=h.useMemo(()=>UE(n,o),[n,o]),s=h.useMemo(()=>o.filter(r=>!/^\/apps\/(?!:)/.test(r.path)),[o]);return c.jsxs(Ja,{className:F.mainLayout,children:[c.jsx(eD,{}),c.jsxs(Ja,{children:[c.jsx(xM,{selectedKey:i,hubMode:e}),c.jsxs(HE,{className:"page-container",children:[c.jsx(pD,{}),c.jsx(gD,{}),c.jsx($t,{name:"content.statusBar",kind:"fill"}),c.jsx("div",{className:"page-content",children:c.jsx(FE,{resetKey:n,canRestartRuntime:e,children:c.jsx(h.Suspense,{fallback:c.jsx(nn,{tip:t("common.loading"),style:{display:"block",margin:"20vh auto"}}),children:c.jsx(wd,{children:s.map(r=>c.jsx(Ln,{path:r.path,element:c.jsx(r.Component,{})},r.id))})})})})]})]}),c.jsx($t,{name:"overlay.global",kind:"fill"})]})}function Up(...e){return{dispose(){for(const t of e)try{t.dispose()}catch(a){console.warn("[QwenPaw] Disposable threw on dispose:",a)}}}}function dB(e,t){if(e!==void 0)return typeof e=="function"?e(t):e}function qp(e){return Array.isArray(e)?e:[e]}function jE(){return{add:(e,t)=>{const n=qp(t).map(o=>je.add(e,o));return Up(...n)},replace:(e,t,a)=>je.replace(e,t,a),remove:e=>je.remove(e),snapshot:e=>je.snapshot(e)}}function GE(){return{add:(e,t)=>{const n=qp(t).map(o=>ot.add(e,o));return Up(...n)},replace:(e,t,a)=>
199ot.replace(e,t,a),wrap:(e,t,a)=>ot.wrap(e,t,a),remove:e=>ot.remove(e)}}function VE(){return{fill:(e,t,a,n)=>$a.fill(e,t,a,n),replace:(e,t,a,n)=>$a.replace(e,t,a,n),snapshot:()=>$a.snapshotAll()}}function WE(){return{overrides:()=>ke.overrides()}}async function an(e,t){const a={...xe(),...(t==null?void 0:t.headers)??{}};return fetch(ee(e),{...t,headers:a})}const zE=/^[a-z0-9][a-z0-9-]*$/;function Mo(e){const t=e.trim();if(!zE.test(t))throw new Error(`Invalid PawApp id: ${e}`);return t}function KE(e){let t=e;for(let a=0;a<8;a+=1){let n;try{n=decodeURIComponent(t)}catch{throw new Error(`Invalid PawApp path encoding: ${e}`)}if(n===t)return t;t=n}throw new Error(`PawApp path has excessive encoding depth: ${e}`)}function $E(e){return Array.from(e).some(t=>{const a=t.charCodeAt(0);return a<=31||a===127})}function js(e){if(/^[a-z][a-z\d+.-]*:/i.test(e))throw new Error("PawApp paths must be relative, not absolute URLs");const t=e.startsWith("/")?e:`/${e}`,a=KE(t);if(t.startsWith("//")||a.startsWith("//")||a.includes("\\")||a.includes("?")||a.includes("#")||$E(a))throw new Error(`Invalid PawApp scoped path: ${e}`);if(a.split("/").some(n=>n==="."||n===".."))throw new Error(`PawApp path cannot contain dot segments: ${e}`);return t}function jp(e,t,a,n=!1){const o=new Map;let i="",s=new AbortController,r,l;const d=new Promise((m,k)=>{r=m,l=k});function u(m,k){const g=o.get(m);if(g)for(const b of g)try{b(k)}catch(y){console.error(`[PawTask] Error in ${m} handler:`,y)}}(async()=>{try{const m=n?Mo(e):e,k=n?js(t):t.startsWith("/")?t:`/${t}`,g=await an(`/${m}${k}`,{method:"POST",headers:{"Content-Type":"application/json"},body:a!=null?JSON.stringify(a):void 0,signal:s==null?void 0:s.signal});if(!g.ok)throw new Error(`Task creation failed: ${g.status} ${g.statusText}`);const b=await g.json();if(i=b.task_id??b.taskId??"",!i)throw new Error("No task_id returned from backend");const y=await an(`/${m}/task/${encodeURIComponent(i)}/stream`,{headers:{Accept:"text/event-stream"},signal:s==null?void 0:s.signal});if(!y.ok||!y.body)throw new Error(`SSE connection failed: ${y.status}`);const T=y.body.getReader(),S=new TextDecoder;let P="";for(;;){const{done:w,value:C}=await T.read();if(w)break;P+=S.decode(C,{stream:!0});const x=P.split(`
200`);P=x.pop()??"";for(const I of x)if(I.startsWith("data: "))try{const R=JSON.parse(I.slice(6)),_=R.type??R.event??"message";if(_==="done"){u("done",R.data??R),r(R.data??R.result??null);return}else if(_==="error"){const A=new Error(R.message??"Task failed");u("error",R),l(A);return}else u(_,R.data??R)}catch{u("message",I.slice(6))}}r(null)}catch(m){m.name==="AbortError"?l(new Error("Task cancelled")):l(m)}})();const p={on(m,k){return o.has(m)||o.set(m,new Set),o.get(m).add(k),p},off(m,k){var g;return(g=o.get(m))==null||g.delete(k),p},cancel(){s==null||s.abort(),s=null},get result(){return d},get taskId(){return i}};return p}function QE(e,t,a){return jp(e,t,a,!1)}function JE(e,t,a){return jp(e,t,a,!0)}class YE extends Error{constructor(a,n,o={}){super(`PawApp API error ${a}: ${n}`);V(this,"status");V(this,"code");V(this,"detail");this.name="PawApiError",this.status=a,this.code=o.code,this.detail=o.detail}}function Gs(e,t,a,n=!0){const o=n?js(e):e.startsWith("/")?e:`/${e}`,i=`/${n?Mo(t):t}${o}`;if(!a)return i;const s=new URLSearchParams;for(const[l,d]of Object.entries(a))d!=null&&s.set(l,String(d));const r=s.toString();return r?`${i}${i.includes("?")?"&":"?"}${r}`:i}async function Vs(e){if(!e.ok){const a=await e.text().catch(()=>"");let n=a,o,i=a;try{const s=JSON.parse(a),r=s.detail??s.message??s;if(i=r,typeof r=="object"&&r!==null){const l=r;typeof l.code=="string"&&(o=l.code),typeof l.message=="string"?n=l.message:n=JSON.stringify(r)||a}else typeof s.code=="string"&&(o=s.code),n=typeof r=="string"?r:JSON.stringify(r)||a}catch{}throw new YE(e.status,n||e.statusText,{code:o,detail:i})}return e.status===204?void 0:(e.headers.get("content-type")??"").includes("application/json")?e.json():await e.text()}function XE(e,t){return async function(n,o={}){const i=o.method??"GET",s=o.body!==void 0&&o.body!==null,r=o.rawBody!==void 0&&o.rawBody!==null;if(s&&r)throw new Error("PawApp request cannot set both body and rawBody");const l=await an(Gs(n,e(),o.query,t),{method:i,headers:{...s?{"Content-Type":"application/json"}:{},...o.headers},body:r?o.rawBody:s?JSON.stringify(o.body):void 0,signal:o.signal});return Vs(l)}}function ZE(e,t){const a=XE(e,t);return{request:a,get:(n,o)=>a(n,{...o,method:"GET"}),post:(n,o,i)=>a(n,{...i,method:"POST",body:o}),put:(n,o,i)=>a(n,{...i,method:"PUT",body:o}),patch:(n,o,i)=>a(n,{...i,method:"PATCH",body:o}),delete:(n,o)=>a(n,{...o,method:"DELETE"}),async download(n,o){const i=await an(Gs(n,e(),o==null?void 0:o.query,t),{method:"GET",headers:o==null?void 0:o.headers,signal:o==null?void 0:o.signal});return i.ok||await Vs(i),i.blob()},stream:(n,o,i)=>eF(e,n,o,i,t),events:(n,o)=>Gp(e,n,o,t),task:(n,o)=>t?JE(e(),n,o):QE(e(),n,o)}}function $i(e){return ZE(e,!0)}async function*eF(e,t,a,n,o=!0){const i={...n,method:"POST",body:a};for await(const s of Gp(e,t,i,o))yield s.data}async function*Gp(e,t,a={},n=!0){var T;const o=a.method??"POST",i=a.body!==void 0&&a.body!==null,s=a.rawBody!==void 0&&a.rawBody!==null;if(i&&s)throw new Error("PawApp SSE request cannot set both body and rawBody");if(o==="GET"&&(i||s))throw new Error("PawApp GET SSE request cannot include a body");const r=await an(Gs(t,e(),a==null?void 0:a.query,n),{method:o,headers:{...i?{"Content-Type":"application/json"}:{},Accept:"text/event-stream",...a==null?void 0:a.headers},body:s?a.rawBody:i?JSON.stringify(a.body):void 0,signal:a==null?void 0:a.signal});r.ok||await Vs(r);const l=(T=r.body)==null?void 0:T.getReader();if(!l)throw new Error("No response body for stream");const d=new TextDecoder;let u="",p="message",m=[],k,g;function b(){if(m.length===0){p="message",k=void 0,g=void 0;return}const S={event:p,data:m.join(`
201`),...k!==void 0?{id:k}:{},...g!==void 0?{retry:g}:{}};return p="message",m=[],k=void 0,g=void 0,S}function y(S){const P=S.endsWith("\r")?S.slice(0,-1):S;if(P==="")return b();if(P.startsWith(":"))return;const w=P.indexOf(":"),C=w===-1?P:P.slice(0,w);let x=w===-1?"":P.slice(w+1);x.startsWith(" ")&&(x=x.slice(1)),C==="event"?p=x||"message":C==="data"?m.push(x):C==="id"&&!x.includes("\0")?k=x:C==="retry"&&/^\d+$/.test(x)&&(g=Number(x))}try{for(;;){const{done:P,value:w}=await l.read();if(P)break;u+=d.decode(w,{stream:!0});const C=u.split(`
202`);u=C.pop()??"";for(const x of C){const I=y(x);I&&(yield I)}}if(u+=d.decode(),u){const P=y(u);P&&(yield P)}const S=b();S&&(yield S)}finally{await l.cancel().catch(()=>{})}}
202class tF extends Error{constructor(a,n){super(a);V(this,"code");V(this,"detail");V(this,"event");this.name="PawChatStreamError",this.code=n.code,this.detail=n.detail,this.event=n.event}}function aF(e){if(!(typeof e!="object"||e===null||Array.isArray(e)))return e}function nF(e){const t=String(e.status||"").toLowerCase(),a=e.type==="error",n=e.object==="response"&&t==="failed";if(!a&&!n)return;const o=e.error??e,i=aF(o),s=(i&&typeof i.message=="string"?i.message:typeof o=="string"?o:"Chat failed")||"Chat failed",r=(i&&typeof i.code=="string"?i.code:"CHAT_STREAM_ERROR")||"CHAT_STREAM_ERROR";return new tF(s,{code:r,detail:o,event:e})}function Ws(e){var n,o,i,s;const t=e.agentId??((o=(n=window.QwenPaw.host)==null?void 0:n.getSelectedAgentId)==null?void 0:o.call(n))??"default",a=e.sessionId===void 0?((s=(i=window.QwenPaw.host)==null?void 0:i.getCurrentSessionId)==null?void 0:s.call(i))??void 0:e.sessionId??void 0;return{agentId:t,sessionId:a}}async function*oF(e,t,a={}){const{agentId:n,sessionId:o}=Ws(a);for await(const i of e.events("/chat/stream",{method:"POST",body:{message:t,session_id:o,skill:a.skill},query:{agent_id:n}})){let s;try{s=JSON.parse(i.data)}catch(l){const d=new Error("PawApp chat stream returned invalid JSON");throw d.cause=l,d}const r=nF(s);if(r)throw r;yield s}}async function iF(e,t={}){const{agentId:a,sessionId:n}=Ws(t),o=await e.get("/chat/history",{query:{agent_id:a,session_id:n}});return{sessionId:o.session_id||n||"",messages:Array.isArray(o.messages)?o.messages:[]}}function sF(e={}){var t,a;return e.agentId??((a=(t=window.QwenPaw.host)==null?void 0:t.getSelectedAgentId)==null?void 0:a.call(t))??"default"}function Oa(e){return{id:e.id||"",sessionId:e.session_id||"",name:e.name||"New analysis",createdAt:e.created_at||"",updatedAt:e.updated_at||"",archived:e.archived===!0,pinned:e.pinned===!0}}function rF(e){const t=(a={})=>({agent_id:sF(a)});return{async list(a={}){return((await e.get("/chat/sessions",{query:t(a)})).sessions||[]).map(Oa)},async create(a={}){const n=await e.post("/chat/sessions",{name:a.name||"New analysis"},{query:t(a)});return Oa(n)},async rename(a,n,o={}){const i=await e.patch(`/chat/sessions/${encodeURIComponent(a)}`,{name:n},{query:t(o)});return Oa(i)},async archive(a,n={}){const o=await e.post(`/chat/sessions/${encodeURIComponent(a)}/archive`,void 0,{query:t(n)});return Oa(o)},async pin(a,n,o={}){const i=await e.post(`/chat/sessions/${encodeURIComponent(a)}/pin`,{pinned:n},{query:t(o)});return Oa(i)},async delete(a,n={}){await e.delete(`/chat/sessions/${encodeURIComponent(a)}`,{query:t(n)})}}}function lF(e){const t=$i(e),a={get:async(n,o)=>{try{return(await t.get(`/storage/${encodeURIComponent(n)}`)).value??o}catch{return o}},set:async(n,o)=>{await t.put(`/storage/${encodeURIComponent(n)}`,{value:o})},delete:async n=>{await t.delete(`/storage/${encodeURIComponent(n)}`)},keys:async()=>(await t.get("/storage")).keys??[]};return{async chat(n,o={}){const{agentId:i,sessionId:s}=Ws(o),r=await t.post("/chat",{message:n,session_id:s,skill:o.skill},{query:{agent_id:i}});return r.text??r.reply??""},chatStream(n,o={}){return oF(t,n,o)},getChatHistory(n={}){return iF(t,n)},chatSessions:rF(t),storage:a,getSelectedAgentId:()=>{var n,o;return((o=(n=window.QwenPaw.host)==null?void 0:n.getSelectedAgentId)==null?void 0:o.call(n))??"default"},getCurrentSessionId:()=>{var n,o;return((o=(n=window.QwenPaw.host)==null?void 0:n.getCurrentSessionId)==null?void 0:o.call(n))??null},async toast(n,o="info"){const i=window.QwenPaw.host;if(i!=null&&i.toast){i.toast(n,o);return}await t.post("/toast",{message:n,kind:o})},async notify(n,o){await t.post("/notify",{title:n,body:o})}}}function dF(e){return function(){const a=h.useRef(null);return h.useEffect(()=>{if(!a.current)return;const n=e(a.current);return()=>{typeof n=="function"?n():n==null||n.dispose()}},[]),c.jsx("div",{ref:a,style:{width:"100%",height:"100%"}})}}function me(){if(!window.QwenPaw.chat)throw new Error("PawApp chat UI capabilities are unavailable");return window.QwenPaw.chat}function ce(e){return typeof e=="function"?e():e}function cF(e){return{theme:{set:t=>me().theme.set(ce(e),t)},welcome:{set:t=>me().welcome.set(ce(e),t),render:t=>me().welcome.render(ce(e),t)},leftHeader:{set:t=>me().leftHeader.set(ce(e),t),render:t=>me().leftHeader.render(ce(e),t)},rightHeader:{add:(t,a)=>me().rightHeader.add(ce(e),t,a)},sender:{set:t=>me().sender.set(ce(e),t),addPrefix:(t,a)=>me().sender.addPrefix(ce(e),t,a),addSuggestion:t=>me().sender.addSuggestion(ce(e),t)},actions:{add:t=>me().actions.add(ce(e),t)},requestActions:{add:t=>me().requestActions.add(ce(e),t)},requestPayload:{add:(t,a)=>me().requestPayload.add(ce(e),t,a)},request:{render:t=>me().request.render(ce(e),t),prepend:(t,a)=>
202me().request.prepend(ce(e),t,a),append:(t,a)=>me().request.append(ce(e),t,a)},response:{set:t=>me().response.set(ce(e),t),render:t=>me().response.render(ce(e),t),prepend:(t,a)=>me().response.prepend(ce(e),t,a),append:(t,a)=>me().response.append(ce(e),t,a)},toolRender:(t,a)=>me().toolRender(ce(e),t,a),approvalRender:(t,a)=>me().approval.render(ce(e),t,a),card:(t,a)=>me().card(ce(e),t,a),disposeAll:()=>me().disposeAll(ce(e))}}function uF(e){return{registerPage(t){const a=Mo(ce(e));if(!!t.component==!!t.mount)throw new Error("PawApp page registration requires exactly one of component or mount");const n=js(t.path??`/apps/${a}`);if(n!==`/apps/${a}`&&!n.startsWith(`/apps/${a}/`))throw new Error(`PawApp page path must stay under /apps/${a}`);const o=t.component??dF(t.mount);return ot.add(a,{id:`pawapp:${a}:${n}`,path:n,component:o})},chat:cF(e)}}function pF(e){const t=(a=!1)=>e.get("/dependencies",{query:a?{force:!0}:void 0});return{list:t,get:(a,n=!1)=>e.get(`/dependencies/${encodeURIComponent(a)}`,{query:n?{force:!0}:void 0}),check:a=>e.post(`/dependencies/${encodeURIComponent(a)}/actions/check`),action:(a,n,o)=>e.post(`/dependencies/${encodeURIComponent(a)}/actions/${encodeURIComponent(n)}`,void 0,o!=null&&o.idempotencyKey?{headers:{"Idempotency-Key":o.idempotencyKey}}:void 0),subscribe(a,n={}){let o=!1,i;const s=Math.max(1e3,n.intervalMs??1e4),r=async()=>{try{const l=await t(!!n.force);o||a(l)}catch{}finally{o||(i=setTimeout(r,s))}};return r(),{dispose(){o=!0,i&&clearTimeout(i)}}}}}const bd=new Map;function mF(e){const t=Mo(e),a=bd.get(t);if(a)return a;const n=()=>t,o=lF(n),i={appId:t,api:$i(n),host:o,ui:uF(t),dependencies:pF($i(n)),chat:o.chat,chatStream:o.chatStream,getChatHistory:o.getChatHistory,chatSessions:o.chatSessions,storage:o.storage,toast:o.toast,notify:o.notify};return bd.set(t,i),i}const hF={forApp:mF};class gF{constructor(){V(this,"records",new Map);V(this,"listeners",new Set)}addRoutes(t,a){this._record(t).routes.push(...a),this._notify()}addToolRenderers(t,a,n){const o=this._record(t);n!=null&&n.isBuiltin&&(o.isBuiltin=!0),Object.assign(o.toolRenderers,a),this._notify()}removePlugin(t){this.records.delete(t)&&this._notify()}getToolRenderConfig(){const t={},a={};for(const n of this.records.values()){const o=n.isBuiltin?t:a;Object.assign(o,n.toolRenderers)}return{...t,...a}}getRoutes(){const t=[];for(const a of this.records.values())t.push(...a.routes);return t.sort((a,n)=>(a.priority??0)-(n.priority??0))}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}_record(t){return this.records.has(t)||this.records.set(t,{pluginId:t,isBuiltin:!1,routes:[],toolRenderers:{}}),this.records.get(t)}_notify(){this.listeners.forEach(t=>t())}}const ma=new gF;function fF(){je.snapshot("primary.settings").some(t=>t.id==="plugins-group")||je.addBuiltin([{id:"plugins-group",location:"primary.settings",label:"Plugins",isGroup:!0,order:999}])}function bF(){window.QwenPaw||(window.QwenPaw={}),window.QwenPaw.host||(window.QwenPaw.host={React:Ne,ReactDOM:Qi,antd:ah,antdIcons:th,apiBaseUrl:"",getApiUrl:ee,getApiToken:Sa}),window.QwenPaw.menu||(window.QwenPaw.menu=jE()),window.QwenPaw.route||(window.QwenPaw.route=GE()),window.QwenPaw.slot||(window.QwenPaw.slot=VE()),window.QwenPaw.audit||(window.QwenPaw.audit=WE()),window.QwenPaw.paw||(window.QwenPaw.paw=hF),window.QwenPaw.registerRoutes||(window.QwenPaw.registerRoutes=(t,a)=>{for(const n of a){const o=`legacy:${t}:${n.path.replace(/^\//,"")}`;ot.add(t,{id:o,path:n.path,component:n.component}),!/^\/apps\//.test(n.path)&&(fF(),je.add(t,{id:o,location:"primary.settings",parentId:"plugins-group",label:n.label,icon:Ne.createElement("span",{style:{fontSize:16}},n.icon),route:o,order:n.priority??0}))}ma.addRoutes(t,a),console.info(`[plugin:${t}] registerRoutes → ${a.length} route(s) (translated to menu+route)`)}),window.QwenPaw.registerToolRender||(window.QwenPaw.registerToolRender=(t,a)=>{ma.addToolRenderers(t,a),console.info(`[plugin:${t}] registerToolRender → ${Object.keys(a).join(", ")}`)})}class kF{constructor(){V(this,"scalarStacks",new Map);V(this,"listMaps",{"header.rightHeader":[],"sender.prefix":[],"sender.suggestions":[],actions:[],requestActions:[],cards:[],customToolRender:[],"approval.renderers":[],"request.prepe
202nd":[],"request.append":[],"request.payloadTransforms":[],"response.prepend":[],"response.append":[]});V(this,"listeners",new Set);V(this,"scalarSnapshot",{});V(this,"listSnapshot",{...this.listMaps});V(this,"seq",0)}setScalar(t,a,n){const o=this.scalarStacks.get(a)??[],i=o[o.length-1],s={registrationId:this.nextId(),pluginId:t,field:a,value:n,registeredAt:Date.now()};o.push(s),this.scalarStacks.set(a,o),ke.record({kind:"chat.scalar.set",field:a,pluginId:t,supersededPluginId:i==null?void 0:i.pluginId,timestamp:s.registeredAt}),i&&i.pluginId!==t&&ke.record({kind:"chat.scalar.superseded",field:a,pluginId:i.pluginId,supersededPluginId:t,timestamp:s.registeredAt}),this.rebuildScalarSnapshot(),this.notify();let r=!1;return{dispose:()=>{if(r)return;r=!0;const l=this.scalarStacks.get(a)??[],d=l.findIndex(u=>u.registrationId===s.registrationId);d<0||(l.splice(d,1),this.scalarStacks.set(a,l),ke.record({kind:"chat.scalar.dispose",field:a,pluginId:t,timestamp:Date.now()}),this.rebuildScalarSnapshot(),this.notify())}}}addRightHeader(t,a){return this.addToList("header.rightHeader",t,a)}addSenderPrefix(t,a){return this.addToList("sender.prefix",t,a)}addSenderSuggestions(t,a){return this.addToList("sender.suggestions",t,a)}addAction(t,a){return this.addToList("actions",t,{id:a.id,pluginId:t,item:a})}addRequestAction(t,a){return this.addToList("requestActions",t,{id:a.id,pluginId:t,item:a})}addToolRender(t,a,n){return this.addToList("customToolRender",t,{id:`${t}:${a}`,toolName:a,render:n})}addCard(t,a,n){return this.addToList("cards",t,{id:`${t}:${a}`,cardName:a,render:n})}addApprovalRenderer(t,a,n){return this.addToList("approval.renderers",t,{id:`${t}:${a}`,sourceType:a,render:n})}addRequestPrepend(t,a){return this.addToList("request.prepend",t,a)}addRequestAppend(t,a){return this.addToList("request.append",t,a)}addRequestPayloadTransform(t,a){return this.addToList("request.payloadTransforms",t,a)}addResponsePrepend(t,a){return this.addToList("response.prepend",t,a)}addResponseAppend(t,a){return this.addToList("response.append",t,a)}addToList(t,a,n){const o=this.nextId(),i=Date.now(),s={registrationId:o,pluginId:a,item:n,registeredAt:i};this.listMaps[t].push(s),ke.record({kind:"chat.list.add",field:t,pluginId:a,detail:this.itemDescription(t,n),timestamp:i}),this.rebuildListSnapshot(t),this.notify();let r=!1;return{dispose:()=>{if(r)return;r=!0;const l=this.listMaps[t],d=l.findIndex(u=>u.registrationId===o);d<0||(l.splice(d,1),ke.record({kind:"chat.list.dispose",field:t,pluginId:a,timestamp:Date.now()}),this.rebuildListSnapshot(t),this.notify())}}}disposeAll(t){let a=!1;for(const[n,o]of this.scalarStacks){const i=o.filter(s=>s.pluginId!==t);i.length!==o.length&&(this.scalarStacks.set(n,i),a=!0)}for(const n of Object.keys(this.listMaps)){const o=this.listMaps[n],i=o.filter(s=>s.pluginId!==t);i.length!==o.length&&(this.listMaps[n]=i,a=!0)}if(a){this.rebuildScalarSnapshot();for(const n of Object.keys(this.listMaps))this.rebuildListSnapshot(n);this.notify()}}getScalarSnapshot(){return this.scalarSnapshot}getListSnapshot(){return this.listSnapshot}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}__resetForTests(){this.scalarStacks.clear();for(const t of Object.keys(this.listMaps))this.listMaps[t]=[];this.rebuildScalarSnapshot();for(const t of Object.keys(this.listMaps))this.rebuildListSnapshot(t);this.listeners.clear(),this.seq=0}nextId(){return this.seq+=1,`r${this.seq}`}rebuildScalarSnapshot(){const t={};for(const[a,n]of this.scalarStacks){const o=n[n.length-1];o&&(t[a]={pluginId:o.pluginId,value:o.value})}this.scalarSnapshot=t}rebuildListSnapshot(t){this.listSnapshot={"header.rightHeader":this.listMaps["header.rightHeader"].slice(),"sender.prefix":this.listMaps["sender.prefix"].slice(),"sender.suggestions":this.listMaps["sender.suggestions"].slice(),actions:this.listMaps.actions.slice(),requestActions:this.listMaps.requestActions.slice(),cards:this.listMaps.cards.slice(),customToolRender:this.listMaps.customToolRender.slice(),"approval.renderers":this.listMaps["approval.renderers"].slice(),"request.prepend":this.listMaps["request.prepe
202nd"].slice(),"request.append":this.listMaps["request.append"].slice(),"request.payloadTransforms":this.listMaps["request.payloadTransforms"].slice(),"response.prepend":this.listMaps["response.prepend"].slice(),"response.append":this.listMaps["response.append"].slice()}}notify(){for(const t of this.listeners)try{t()}catch(a){console.warn("[QwenPaw] chatExtensions listener threw:",a)}}itemDescription(t,a){if(t==="actions"||t==="requestActions"){const n=a;return(n==null?void 0:n.id)??"(no id)"}return t==="customToolRender"?a.toolName:t==="cards"?a.cardName:t==="approval.renderers"?a.sourceType:t==="sender.suggestions"?a.id:a.id??"(no id)"}}const yF=new kF;function vF(e){je.removeBySource(e),ot.removeBySource(e),$a.removeBySource(e),ma.removePlugin(e),yF.disposeAll(e)}const ti=new Map;function Vp(){const e=Sa();return e?{Authorization:`Bearer ${e}`}:{}}function Wp(e,t){return ee(`frontend_plugin/${e}/files/${t}`)}async function zp(){const e=await fetch(ee("/frontend_plugin"),{headers:Vp()});if(!e.ok)throw new Error(`Failed to list frontend plugins (${e.status})`);return e.json()}async function Kp(e){const t=await fetch(e,{headers:Vp()});if(!t.ok)throw new Error(`HTTP ${t.status} for ${e}`);const a=URL.createObjectURL(new Blob([await t.text()],{type:"application/javascript"}));try{await import(a)}finally{URL.revokeObjectURL(a)}}async function TF(){let e;try{e=await zp()}catch(o){return console.warn("[PluginLoader] failed to fetch plugin list:",o),{loaded:0,failed:[]}}const t=e.filter(o=>o.frontend_entry),n=(await Promise.allSettled(t.map(o=>Kp(Wp(o.id,o.frontend_entry))))).flatMap((o,i)=>o.status==="rejected"?[`${t[i].id}: ${o.reason}`]:[]);return{loaded:t.length-n.length,failed:n}}function cB(e,t){const a=()=>ot.snapshot().some(i=>i.source===e&&i.path.startsWith("/apps/")&&(!t||i.path===t));if(a())return Promise.resolve();const n=ti.get(e);if(n)return n;const o=(async()=>{const s=(await zp()).find(r=>r.id===e);if(!(s!=null&&s.frontend_entry)||s.plugin_type!=="app")throw new Error(`PawApp frontend plugin not found: ${e}`);try{if(await Kp(Wp(s.id,s.frontend_entry)),!a())throw new Error(`PawApp ${e} did not register its app route`)}catch(r){throw vF(e),r}})().finally(()=>{ti.delete(e)});return ti.set(e,o),o}function kd(){return ot.snapshot().filter(e=>e.source!=="core").map(e=>({path:e.path,component:e.Component,label:e.id,icon:""}))}const $p=h.createContext({toolRenderConfig:{},pluginRoutes:[],loading:!0,error:null});function SF({children:e}){const[t,a]=h.useState(ma.getToolRenderConfig()),[n,o]=h.useState(kd()),[i,s]=h.useState(!0),[r,l]=h.useState(null);return h.useEffect(()=>{let d=!1;const u=ma.subscribe(()=>{a(ma.getToolRenderConfig())}),p=cn(()=>{o(kd())}),m=async()=>{const[{installHostSdk:y},{registerBuiltinCards:T}]=await Promise.all([f(()=>import("./install-PK32tiu8.js"),__vite__mapDeps([0,1,2,3,4,5,6,7])),f(()=>import("./registerBuiltinCards-C46HIZ6m.js"),__vite__mapDeps([8,3,9,10,4,5,6,2,11,12,13,14,15,16,7]))]);return y(),T(),TF()},k=()=>{m().then(({failed:y})=>{!d&&y.length>0&&l(y.join("; "))}).catch(y=>{d||l(y instanceof Error?y.message:"Plugin initialization failed")}).finally(()=>{d||s(!1)})},g=window,b=g.requestIdleCallback?g.requestIdleCallback(k):window.setTimeout(k,1e3);return()=>{d=!0,u(),p(),g.cancelIdleCallback?g.cancelIdleCallback(b):window.clearTimeout(b)}},[]),c.jsx($p.Provider,{value:{toolRenderConfig:t,pluginRoutes:n,loading:i,error:r},children:e})}function uB(){return h.useContext($p)}const CF="index-module__takeover__bxcuk",wF="index-module__center__Tgtev",PF="index-module__title__nrCOa",AF="index-module__subtitle__426yU",MF="index-module__willRestart__oQiCe",DF="index-module__steps__v08BR",xF="index-module__progressLine__3KQKe",RF="index-module__errorMessage__EHHt-",IF="index-module__actions__69Qu1",qe={takeover:CF,center:wF,title:PF,subtitle:AF,willRestart:MF,steps:DF,progressLine:xF,errorMessage:RF,actions:IF};function _F({children:e}){const{phase:t,isBackground:a}=qs();return(t==="checking"||t==="downloading"||t==="installing"||t==="failed")&&!a?c.jsx(LF,{}):c.jsx(c.Fragment,{children:e})}const Qe="sidebar.updateModal";function ai(e){if(!Number.isFinite(e)||e<=0)return"0 B";const t=["B","KB","MB","GB"];let a=0,n=e;for(;n>=1024&&a<t.length-1;)n/=1024,a++;return`${n.toFixed(n>=100||a===0?0:1)} ${t[a]}`}function LF(){var l,d;const{t:e}=ve(),t=qs();if(t.phase==="failed"){const u=((l=t.error)==null?void 0:l.kind)??"other";return c.jsx("div",{className:qe.takeover,children:c.jsxs("div",{className:qe.center,children:[c.jsx(si,{type:"circle",percent:100,status:"exception",size:96}),c.jsx("h1",{className:qe.title,children:e(`${Qe}.failedTitle`)}),c.jsx("p",{className:qe.subtitle,children:e(`${Qe}.errors.${u}`)}),((d=t.error)==null?void 0:d.message)&&c.jsx("pre",{className:qe.errorMessage,children:t.error.message}),c.jsxs("div",{className:qe.actions,children:[c.jsx(ct,{onClick:t.dismissFailure,children:e(`${Qe}.back`)}),c.jsx(ct,{type:"primary",onClick:t.retry,children:e(`${Qe}.retry`)}
202)]})]})})}const a=t.phase==="downloading"?1:t.phase==="installing"?2:0,n=t.phase==="downloading",o=t.total??null,i=n&&o&&o>0?Math.min(100,Math.round(t.downloaded/o*100)):null,s=e(`${Qe}.${t.phase}`),r=t.phase==="checking"?e(`${Qe}.checkingHint`):e(`${Qe}.downloadingTo`,{version:t.version});return c.jsx("div",{className:qe.takeover,children:c.jsxs("div",{className:qe.center,children:[i!==null?c.jsx(si,{type:"circle",percent:i,size:96}):c.jsx(nn,{size:"large"}),c.jsx("h1",{className:qe.title,children:s}),c.jsx("p",{className:qe.subtitle,children:r}),c.jsx("p",{className:qe.willRestart,children:e(`${Qe}.willRestart`)}),c.jsx(nh,{size:"small",current:a,className:qe.steps,items:[{title:e(`${Qe}.stepPrepare`)},{title:e(`${Qe}.stepDownloading`)},{title:e(`${Qe}.stepInstalling`)}]}),n&&c.jsx("p",{className:qe.progressLine,children:e(`${Qe}.downloadProgress`,{done:ai(t.downloaded),total:o?ai(o):"-",rate:`${ai(t.throughputBps)}/s`})})]})})}class EF{constructor(){V(this,"modules",new Map)}register(t,a){const n={};try{for(const o of Object.keys(a))try{const i=Object.getOwnPropertyDescriptor(a,o);i&&i.enumerable&&(n[o]=a[o])}catch(i){console&&console.warn&&console.warn(`[moduleRegistry] Cannot copy property ${o} from ${t}:`,i)}this.modules.set(t,n)}catch(o){console&&console.error&&console.error(`[moduleRegistry] Failed to register module: ${t}`,o)}}get(t,a){const n=this.modules.get(t);if(!n){console.warn(`[moduleRegistry] Module not found: ${t}`);return}return n[a]}call(t,a,...n){const o=this.get(t,a);if(typeof o!="function"){console.error(`[moduleRegistry] Export "${a}" in "${t}" is not callable`);return}return o(...n)}keys(){return Array.from(this.modules.keys())}getModule(t){return this.modules.get(t)}getAllModules(){const t={};for(const[a,n]of this.modules)t[a]=n;return t}}const Qp=new EF;typeof window<"u"&&(window.QwenPaw||(window.QwenPaw={}),Object.defineProperty(window.QwenPaw,"modules",{get(){return Qp.getAllModules()},configurable:!0,enumerable:!0}));const FF=3,OF=1e3;function BF(e){const t=e.replace(/^.*\/pages\//,"").replace(/\.[^.]+$/,"");return t.includes("/")&&!/\/index$/.test(t)?`${t}/index`:t}function Jp(e,t){return e().catch(a=>{if(t<=0)throw a;return new Promise(n=>setTimeout(()=>n(Jp(e,t-1)),OF))})}const Ba=Object.assign({
202"../pages/Agent/ACP/components/ACPCard.tsx":()=>f(()=>import("./ACPCard-C4zOJgWk.js"),__vite__mapDeps([17,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Agent/ACP/components/ACPDrawer.tsx":()=>f(()=>import("./ACPDrawer-B9sxzYjX.js").then(e=>e.d),__vite__mapDeps([18,3,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/ACP/index.tsx":()=>f(()=>import("./index-BbHZtuPQ.js"),__vite__mapDeps([19,4,3,5,6,20,21,18,2,22,17,7,23])).then(e=>e.default),
202"../pages/Agent/Checkpoints/CheckpointGraph.tsx":()=>f(()=>import("./CheckpointGraph-BAUhTaXQ.js"),__vite__mapDeps([24,3,25,26,2,4,5,6,7])).then(e=>e.default),
202"../pages/Agent/Checkpoints/RestoreModal.tsx":()=>f(()=>import("./RestoreModal-BQdLWM-x.js").then(e=>e.a),__vite__mapDeps([27,3,25,26,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Checkpoints/graphLayout.ts":()=>f(()=>import("./graphLayout-DsTwB23q.js"),[]).then(e=>e.default),
202"../pages/Agent/Checkpoints/index.tsx":()=>f(()=>import("./index-W-1h6qhM.js"),__vite__mapDeps([28,3,20,21,27,25,26,2,4,5,6,29,24,7])).then(e=>e.default),
202"../pages/Agent/Config/components/ADBPGConfigCard.tsx":()=>f(()=>import("./ADBPGConfigCard-D1fyqxY7.js"),__vite__mapDeps([30,3,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Config/components/AgentLoopCard.tsx":()=>f(()=>import("./AgentLoopCard-B7kUN2Pi.js"),__vite__mapDeps([31,3,7,32,33,2,4,5,6,34])).then(e=>e.default),
202"../pages/Agent/Config/components/EmbeddingModelCard.tsx":()=>f(()=>import("./EmbeddingModelCard-MQvhvOg6.js"),__vite__mapDeps([35,3,36,32,33,37,38,4,5,6,2,7])).then(e=>e.default),
202"../pages/Agent/Config/components/LightContextCard.tsx":()=>f(()=>import("./LightContextCard-xZFovL48.js"),__vite__mapDeps([39,3,40,32,33,4,5,6,41,42,2])).then(e=>e.default),
202"../pages/Agent/Config/components/LlmRateLimiterCard.tsx":()=>f(()=>import("./LlmRateLimiterCard-BySMFRa7.js"),__vite__mapDeps([43,3,32,33,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Config/components/LlmRetryCard.tsx":()=>f(()=>import("./LlmRetryCard-Dl8ob0-U.js"),__vite__mapDeps([44,3,32,33,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Config/components/PowerContextConfigCard.tsx":()=>f(()=>import("./PowerContextConfigCard-D0yPt9T2.js"),__vite__mapDeps([45,3,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Config/components/ReMeLightMemoryCard.tsx":()=>f(()=>import("./ReMeLightMemoryCard-CyEqqCwm.js"),__vite__mapDeps([46,3,32,33,37,47,2,4,5,6,7])).then(e=>e.default),
202"../pages/Agent/Config/components/ReMeStatusModal.tsx":()=>f(()=>import("./ReMeStatusModal-tYHKCjZ5.js"),__vite__mapDeps([47,3,32,33,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Config/components/ReactAgentCard.tsx":()=>f(()=>import("./ReactAgentCard-Cma5GYB8.js"),__vite__mapDeps([48,3,4,5,6,2,49,50,39,40,32,33,41,42,46,37,47,7,30,45,51])).then(e=>e.default),
202"../pages/Agent/Config/components/SliderWithValue.tsx":()=>f(()=>import("./SliderWithValue-BmS3E491.js"),__vite__mapDeps([40,3,32,33,4,5,6])).then(e=>e.default),
202"../pages/Agent/Config/components/ToolExecutionLevelCard.tsx":()=>f(()=>import("./ToolExecutionLevelCard-DEQT8N7H.js"),__vite__mapDeps([52,3,32,33,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Config/components/VisualCompactSettings.tsx":()=>f(()=>import("./VisualCompactSettings-DPQgdbZX.js"),__vite__mapDeps([42,3,32,33,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Config/components/embeddingUtils.ts":()=>f(()=>import("./embeddingUtils-DgIXRuaC.js"),[]).then(e=>e.default),
202"../pages/Agent/Config/components/index.ts":()=>f(()=>import("./index-Dx53S_Nf.js"),__vite__mapDeps([53,40,3,32,33,4,5,6,48,2,49,50,39,41,42,46,37,47,7,30,45,51,31,34,44,43,35,36,38,52])).then(e=>e.default),
202"../pages/Agent/Config/components/toolResultSettings.ts":()=>f(()=>import("./toolResultSettings-CZtTKPre.js"),[]).then(e=>e.default),
202"../pages/Agent/Config/components/useEmbeddingVerification.ts":()=>f(()=>import("./useEmbeddingVerification-DpzZmoLo.js"),__vite__mapDeps([38,3,36,4,5,6,2,7])).then(e=>e.default),
202"../pages/Agent/Config/index.tsx":()=>f(()=>import("./index-D5gjzlxZ.js"),__vite__mapDeps([54,3,55,50,39,40,32,33,4,5,6,41,42,2,46,37,47,7,30,45,48,49,51,31,34,44,43,35,36,38,52,20,21,56])).then(e=>e.default),
202"../pages/Agent/Config/memoryMaintenanceContext.ts":()=>f(()=>import("./memoryMaintenanceContext-DxqV1BjJ.js"),__vite__mapDeps([37,3])).then(e=>e.default),
202"../pages/Agent/Config/useAgentConfig.tsx":()=>f(()=>import("./useAgentConfig-D4LWtFt2.js"),__vite__mapDeps([55,3,50,39,40,32,33,4,5,6,41,42,2,46,37,47,7,30,45])).then(e=>e.default),
202"../pages/Agent/Config/useReMeRuntimeStatus.ts":()=>f(()=>import("./useReMeRuntimeStatus-Dpz9ksxo.js"),__vite__mapDeps([56,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Agent/MCP/accessPolicy.ts":()=>f(()=>import("./accessPolicy-D5yKlKW-.js"),[]).then(e=>e.default),
202"../pages/Agent/MCP/components/MCPAccessClientPanel.tsx":()=>f(()=>import("./MCPAccessClientPanel-BbipD0DW.js"),__vite__mapDeps([57,3,58,59,60,61,4,5,6,62,2])).then(e=>e.default),
202"../pages/Agent/MCP/components/MCPAccessModal.tsx":()=>f(()=>import("./MCPAccessModal-Dtrt8tw5.js"),__vite__mapDeps([63,3,58,59,60,57,61,4,5,6,62,2,64,7])).then(e=>e.default),
202"../pages/Agent/MCP/components/MCPAccessPolicySegmented.tsx":()=>f(()=>import("./MCPAccessPolicySegmented-BJjO0LlT.js"),__vite__mapDeps([61,3,59,60,4,5,6])).then(e=>e.default),
202"../pages/Agent/MCP/components/MCPAccessRuleRows.tsx":()=>f(()=>import("./MCPAccessRuleRows-CMvVLGsw.js"),__vite__mapDeps([62,3,58,59,60,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/MCP/components/MCPAccessToolPanel.tsx":()=>f(()=>import("./MCPAccessToolPanel-BBSNAQFW.js"),__vite__mapDeps([64,3,58,59,60,61,4,5,6,62,2])).then(e=>e.default),
202"../pages/Agent/MCP/components/MCPClientCard.tsx":()=>f(()=>import("./index-SvwHl0E2.js").then(e=>e.a),__vite__mapDeps([65,3,63,58,59,60,57,61,4,5,6,62,2,64,7,66])).then(e=>e.default),
202"../pages/Agent/MCP/components/MCPOAuthSection.tsx":()=>f(()=>import("./MCPOAuthSection-BAobGauy.js"),__vite__mapDeps([66,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Agent/MCP/components/index.ts":()=>f(()=>import("./index-SvwHl0E2.js").then(e=>e.i),__vite__mapDeps([65,3,63,58,59,60,57,61,4,5,6,62,2,64,7,66])).then(e=>e.default),
202"../pages/Agent/MCP/index.tsx":()=>f(()=>import("./index-BmidOtem.js"),__vite__mapDeps([67,3,65,63,58,59,60,57,61,4,5,6,62,2,64,7,66,68,69,20,21])).then(e=>e.default),
202"../pages/Agent/MCP/useMCP.ts":()=>f(()=>import("./useMCP-Br23EKE8.js"),__vite__mapDeps([68,3,69,2,4,5,6,7])).then(e=>e.default),
202"../pages/Agent/Skills/components/AddSkillDropdown.tsx":()=>f(()=>import("./AddSkillDropdown-b8A3tmUb.js"),__vite__mapDeps([70,3,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Skills/components/HeaderActions.tsx":()=>f(()=>import("./HeaderActions-zK81qe0n.js"),__vite__mapDeps([71,3,70,2,4,5,6,72,73])).then(e=>e.default),
202"../pages/Agent/Skills/components/ImportHubModal.tsx":()=>f(()=>import("./ImportHubModal-BaYsg7hB.js").then(e=>e.a),__vite__mapDeps([74,3,75,4,5,6,72,73,2,76,77,78,79,12,80,81,82,83,84,85,86,87,71,70,88,89,7,90,91,92])).then(e=>e.default),
202"../pages/Agent/Skills/components/PoolTransferModal.tsx":()=>f(()=>import("./PoolTransferModal-Skd0LWHz.js"),__vite__mapDeps([84,3,81,85,86,87,2,72,73,4,5,6])).then(e=>e.default),
202"../pages/Agent/Skills/components/ProviderSkillDrawer.tsx":()=>f(()=>import("./ProviderSkillDrawer-hO4TzOYa.js"),__vite__mapDeps([90,3,2,4,5,6,91])).then(e=>e.default),
202"../pages/Agent/Skills/components/SkillCard.tsx":()=>f(()=>import("./SkillCard-D7d4Jpnf.js"),__vite__mapDeps([75,3,4,5,6,72,73,2])).then(e=>e.default),
202"../pages/Agent/Skills/components/SkillDrawer.tsx":()=>f(()=>import("./SkillDrawer-DI2-Qvlw.js").then(e=>e.c),__vite__mapDeps([76,3,77,78,79,4,5,6,2,12,80,81,82])).then(e=>e.default),
202"../pages/Agent/Skills/components/SkillFilterDropdown.tsx":()=>f(()=>import("./SkillFilterDropdown-BnkqN8Up.js"),__vite__mapDeps([87,3,86,2])).then(e=>e.default),
202"../pages/Agent/Skills/components/SkillListItem.tsx":()=>f(()=>import("./SkillListItem-D7o-Xxk6.js"),__vite__mapDeps([89,3,81,75,4,5,6,72,73,2,7])).then(e=>e.default),
202"../pages/Agent/Skills/components/SkillsToolbar.tsx":()=>f(()=>import("./SkillsToolbar-KBqTox-g.js"),__vite__mapDeps([88,3,87,86,2,72,73,4,5,6])).then(e=>e.default),
202"../pages/Agent/Skills/components/index.ts":()=>f(()=>import("./ImportHubModal-BaYsg7hB.js").then(e=>e.i),__vite__mapDeps([74,3,75,4,5,6,72,73,2,76,77,78,79,12,80,81,82,83,84,85,86,87,71,70,88,89,7,90,91,92])).then(e=>e.default),
202"../pages/Agent/Skills/components/skillMetadata.ts":()=>f(()=>import("./skillMetadata-TCIsEf6A.js").then(e=>e.s),[]).then(e=>e.default),
202"../pages/Agent/Skills/components/useConflictRenameModal.tsx":()=>f(()=>import("./useConflictRenameModal-9kvRZJRC.js"),__vite__mapDeps([83,3,2,4,5,6])).then(e=>e.default),
202"../pages/Agent/Skills/index.tsx":()=>f(()=>import("./index-DKnpJuil.js"),__vite__mapDeps([93,3,75,4,5,6,72,73,2,76,77,78,79,12,80,81,82,74,83,84,85,86,87,71,70,88,89,7,90,91,92,20,21,94,95,22,96,97,69,98])).then(e=>e.default),
202"../pages/Agent/Skills/useSkillFilter.ts":()=>f(()=>import("./useSkillFilter-V336M0s8.js"),__vite__mapDeps([85,3,86])).then(e=>e.default),
202"../pages/Agent/Skills/useSkills.ts":()=>f(()=>import("./useSkills-GDHB4qmu.js"),__vite__mapDeps([97,3,69,22,96,4,5,6,98,2,7])).then(e=>e.default),
202"../pages/Agent/Skills/useSkillsPage.tsx":()=>f(()=>import("./useSkillsPage-BPrT-_CL.js"),__vite__mapDeps([94,3,75,4,5,6,72,73,2,83,85,86,89,81,7,95,22,96,97,69,98])).then(e=>e.default),
202"../pages/Agent/Tools/WebSearchConfigModal.tsx":()=>f(()=>import("./WebSearchConfigModal-91UVSbuS.js"),__vite__mapDeps([99,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Agent/Tools/index.tsx":()=>f(()=>import("./index-DXLgk3RU.js"),__vite__mapDeps([100,3,101,2,4,5,6,7,20,21,99,102])).then(e=>e.default),
202"../pages/Agent/Tools/useTools.ts":()=>f(()=>import("./useTools-BgEYIo1s.js"),__vite__mapDeps([101,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/AppCenter/AppCard.tsx":()=>f(()=>import("./AppCard-CEOX4XpT.js"),__vite__mapDeps([103,3,104,105,2,4,5,6])).then(e=>e.default),
202"../pages/AppCenter/AppMarket.tsx":()=>f(()=>import("./AppMarket-C7wzVsK9.js"),__vite__mapDeps([106,3,107,108,109,104,105,2,4,5,6,7])).then(e=>e.default),
202"../pages/AppCenter/index.tsx":()=>f(()=>import("./index-TFPDXvqg.js"),__vite__mapDeps([110,4,3,5,6,111,20,21,2,112,113,114,115,103,104,105,7])).then(e=>e.default),
202"../pages/Chat/HostBubbles.tsx":()=>f(()=>import("./HostBubbles-B0QmsmHA.js").then(e=>e.c),__vite__mapDeps([116,3,4,5,6,78,79,2,12,80,1,10,11,117,16,118,119,120])).then(e=>e.default),
202"../pages/Chat/LazyAccordion.tsx":()=>f(()=>import("./LazyAccordion-BDYN5571.js"),__vite__mapDeps([119,3,4,5,6])).then(e=>e.default),
202"../pages/Chat/ModelSelector/AgentModelSettings.tsx":()=>f(()=>import("./AgentModelSettings-DiMAMvxB.js"),__vite__mapDeps([121,3,122,123,2,4,5,6,7])).then(e=>e.default),
202"../pages/Chat/ModelSelector/CandidateModelSection.tsx":()=>f(()=>import("./CandidateModelSection-D4hisvK-.js"),__vite__mapDeps([124,3,125,126,127,128,129,122,123,4,5,6])).then(e=>e.default),
202"../pages/Chat/ModelSelector/OAuthConfirmModal.tsx":()=>f(()=>import("./OAuthConfirmModal-BkdR5UvF.js"),__vite__mapDeps([130,3,122,123,2,4,5,6,7])).then(e=>e.default),
202"../pages/Chat/ModelSelector/index.tsx":()=>f(()=>import("./index-D7k2s-Bl.js"),__vite__mapDeps([131,3,132,4,5,6,125,126,127,128,130,122,123,2,7,121,124,129,133,134])).then(e=>e.default),
202"../pages/Chat/ModelSelector/modelSelectorApi.ts":()=>f(()=>import("./modelSelectorApi-BQMo_uy8.js"),__vite__mapDeps([133,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Chat/ModelSelector/modelSelectorModels.ts":()=>f(()=>import("./modelSelectorModels-DMgK-EX7.js"),[]).then(e=>e.default),
202"../pages/Chat/ModelSelector/useModelSelectorData.ts":()=>f(()=>import("./useModelSelectorData-Ba7nXSmG.js"),__vite__mapDeps([134,3,133,4,5,6,2,7])).then(e=>e.default),
202"../pages/Chat/OptionsPanel/defaultConfig.ts":()=>f(()=>import("./defaultConfig-DqDT_JBN.js"),[]).then(e=>e.default),
202"../pages/Chat/RichFileReferenceInput.tsx":()=>f(()=>import("./RichFileReferenceInput-BCcP_FXx.js"),__vite__mapDeps([135,3,136,137,4,5,6,2,7,138])).then(e=>e.default),
202"../pages/Chat/approvalPayload.ts":()=>f(()=>import("./approvalPayload-D8R4MEha.js"),[]).then(e=>e.default),
202"../pages/Chat/backgroundQueueRegistry.ts":()=>f(()=>import("./backgroundQueueRegistry-DcoIKQBo.js"),[]).then(e=>e.default),
202"../pages/Chat/chatInputDraft.ts":()=>f(()=>import("./chatInputDraft-DjTYFPOs.js"),[]).then(e=>e.default),
202"../pages/Chat/components/ApprovalLevelToggle.tsx":()=>f(()=>import("./ApprovalLevelToggle-CUDfNY0C.js"),__vite__mapDeps([139,3,140,141,142,4,5,6,143,144,2])).then(e=>e.default),
202"../pages/Chat/components/BackgroundTaskPanel.tsx":()=>f(()=>import("./BackgroundTaskPanel-B_R9A_iC.js"),__vite__mapDeps([145,3,13,14,4,5,6,2,7])).then(e=>e.default),
202"../pages/Chat/components/ChatActionGroup/index.tsx":()=>f(()=>import("./index-BQ7xgpEo.js"),__vite__mapDeps([146,3,147,4,5,6,2,7,140,148])).then(e=>e.default),
202"../pages/Chat/components/ChatHeaderTitle/index.tsx":()=>f(()=>import("./index-CH7P5TIH.js"),__vite__mapDeps([149,3,4,5,6,2,7,150])).then(e=>e.default),
202"../pages/Chat/components/ChatSearchPanel/index.tsx":()=>f(()=>import("./index-CoZdZ5rN.js"),__vite__mapDeps([151,3,2,4,5,6,7,152])).then(e=>e.default),
202"../pages/Chat/components/ChatSenderTabsPanel.tsx":()=>f(()=>import("./ChatSenderTabsPanel-B3W66Q-L.js"),__vite__mapDeps([153,3,13,14,4,5,6,2,145,7,154])).then(e=>e.default),
202"../pages/Chat/components/ChatSessionDrawer/index.tsx":()=>f(()=>import("./index-nyqj9R32.js"),__vite__mapDeps([155,3,140,147,4,5,6,2,7,156,157])).then(e=>e.default),
202"../pages/Chat/components/ChatSessionDrawer/sessionTime.ts":()=>f(()=>import("./sessionTime-M1-RaxUO.js"),[]).then(e=>e.default),
202"../pages/Chat/components/ChatSessionDrawer/useSessionListData.ts":()=>f(()=>Promise.resolve().then(()=>gw),void 0).then(e=>e.default),
202"../pages/Chat/components/ChatSessionInitializer/index.tsx":()=>f(()=>import("./index-Ck21JYev.js"),__vite__mapDeps([158,3,147,4,5,6,2,7])).then(e=>e.default),
202"../pages/Chat/components/ContextUsageIndicator/ContextUsageIndicator.tsx":()=>f(()=>import("./index-DS9PMsST.js").then(e=>e.a),__vite__mapDeps([159,3,160,161,2,4,5,6])).then(e=>e.default),
202"../pages/Chat/components/ContextUsageIndicator/index.ts":()=>f(()=>import("./index-DS9PMsST.js").then(e=>e.i),__vite__mapDeps([159,3,160,161,2,4,5,6])).then(e=>e.default),
202"../pages/Chat/components/HarnessApprovalToggle.tsx":()=>f(()=>import("./HarnessApprovalToggle-Cvatd3JO.js"),__vite__mapDeps([162,3,140,141,142,4,5,6,143,144,2,163])).then(e=>e.default),
202"../pages/Chat/components/HarnessModelSelector.tsx":()=>f(()=>import("./HarnessModelSelector-CTu69e5m.js"),__vite__mapDeps([164,3,69,2,4,5,6,7,165])).then(e=>e.default),
202"../pages/Chat/components/MessageQueuePanel.tsx":()=>f(()=>import("./MessageQueuePanel-DLrrXvXA.js"),__vite__mapDeps([154,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Chat/components/WhisperSpeechButton/index.tsx":()=>f(()=>import("./index-BO8NyFcY.js"),__vite__mapDeps([166,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Chat/fallbackNotice.ts":()=>f(()=>import("./fallbackNotice-BDnCml1J.js"),[]).then(e=>e.default),
202"../pages/Chat/fileReferenceFormatting.ts":()=>f(()=>import("./fileReferenceFormatting-DRtp_cZv.js"),[]).then(e=>e.default),
202"../pages/Chat/headlineFilter.ts":()=>f(()=>import("./headlineFilter-CYyh7i0b.js"),[]).then(e=>e.default),
202"../pages/Chat/hooks/useCreateNewSession.ts":()=>f(()=>import("./useCreateNewSession-DRMSAwOn.js"),__vite__mapDeps([147,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Chat/index.tsx":()=>f(()=>import("./index-DE2MiYaN.js"),__vite__mapDeps([167,3,140,168,169,170,131,132,4,5,6,125,126,127,128,130,122,123,2,7,121,124,129,133,134,171,141,142,146,147,148,155,156,157,159,160,161,172,149,150,173,158,174,175,176,116,78,79,12,80,1,10,11,117,16,118,119,120,9,13,14,15,177,178,179,77,180,181,182,183,135,136,137,138,184,185,166,153,145,154,139,143,144,162,163,164,69,165,186])).then(e=>e.default),
202"../pages/Chat/longChatPerformance.ts":()=>f(()=>import("./longChatPerformance-qL7rrUkY.js"),[]).then(e=>e.default),
202"../pages/Chat/loopSlashSuggestions.ts":()=>f(()=>import("./loopSlashSuggestions-BnC1fISh.js").then(e=>e.l),[]).then(e=>e.default),
202"../pages/Chat/messageDisplay.ts":()=>f(()=>import("./messageDisplay-BSbvVkKY.js"),__vite__mapDeps([118,4,3,5,6])).then(e=>e.default),
202"../pages/Chat/messageScroll.ts":()=>f(()=>import("./messageScroll-CvP4Dz0H.js"),[]).then(e=>e.default),
202"../pages/Chat/replayFastForward.ts":()=>f(()=>import("./replayFastForward-HOU_ABil.js"),[]).then(e=>e.default),
202"../pages/Chat/sessionApi/index.ts":()=>f(()=>Promise.resolve().then(()=>tw),void 0).then(e=>e.default),
202"../pages/Chat/slashKeyboardUtils.ts":()=>f(()=>import("./slashKeyboardUtils-CXmeqyaR.js"),[]).then(e=>e.default),
202"../pages/Chat/tests/convertMessagesHelper.ts":()=>f(()=>import("./convertMessagesHelper-CU2g0id2.js"),[]).then(e=>e.default),
202"../pages/Chat/turnUsage.ts":()=>f(()=>Promise.resolve().then(()=>WC),void 0).then(e=>e.default),
202"../pages/Chat/turnUsageStore.ts":()=>f(()=>Promise.resolve().then(()=>NC),void 0).then(e=>e.default),
202"../pages/Chat/utils.ts":()=>f(()=>Promise.resolve().then(()=>OC),void 0).then(e=>e.default),
202"../pages/Coding/FilePreview.tsx":()=>f(()=>import("./FilePreview-DpljDfWN.js"),__vite__mapDeps([179,3,79,4,5,6,2,12,80,77,7,180])).then(e=>e.default),
202"../pages/Coding/GitPanel.tsx":()=>f(()=>import("./GitPanel-C0AqP1_2.js"),__vite__mapDeps([187,3,4,5,6,2,7,188])).then(e=>e.default),
202"../pages/Coding/TabbedEditor.tsx":()=>f(()=>import("./TabbedEditor-CkqmFBSN.js"),__vite__mapDeps([189,3,190,4,5,6,191,179,79,2,12,80,77,7,180,136,183,192,193,194])).then(e=>e.default),
202"../pages/Coding/editorCopyFormatting.ts":()=>f(()=>import("./editorCopyFormatting-CEBvKJJN.js"),__vite__mapDeps([192,193])).then(e=>e.default),
202"../pages/Coding/getLanguage.ts":()=>f(()=>import("./getLanguage-DPW4aTiG.js"),[]).then(e=>e.default),
202"../pages/Coding/lastEditorCopy.ts":()=>f(()=>import("./lastEditorCopy-CUqkqeK4.js"),[]).then(e=>e.default),
202"../pages/Control/Channels/components/AccessControlDrawer.tsx":()=>f(()=>import("./AccessControlDrawer-Cn35PL5G.js"),__vite__mapDeps([195,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Control/Channels/components/ChannelAvailableItem.tsx":()=>f(()=>Promise.resolve().then(()=>AC),void 0).then(e=>e.default),
202"../pages/Control/Channels/components/ChannelCard.tsx":()=>f(()=>Promise.resolve().then(()=>IS),void 0).then(e=>e.default),
202"../pages/Control/Channels/components/ChannelDrawer.tsx":()=>f(()=>import("./ChannelDrawer-CWMsZZha.js"),__vite__mapDeps([196,3,197,198,4,5,6,2,7])).then(e=>e.default),
202"../pages/Control/Channels/components/ChannelIcon.tsx":()=>f(()=>Promise.resolve().then(()=>OT),void 0).then(e=>e.default),
202"../pages/Control/Channels/components/PendingApprovalsDrawer.tsx":()=>f(()=>Promise.resolve().then(()=>wC),void 0).then(e=>e.default),
202"../pages/Control/Channels/components/QrcodeAuthBlock.tsx":()=>f(()=>import("./QrcodeAuthBlock-p3Fedopp.js"),__vite__mapDeps([197,3,198,4,5,6,2,7])).then(e=>e.default),
202"../pages/Control/Channels/components/channelConfig.ts":()=>f(()=>import("./channelConfig-DvnzDYx1.js"),[]).then(e=>e.default),
202"../pages/Control/Channels/components/channelIcons.ts":()=>f(()=>Promise.resolve().then(()=>ET),void 0).then(e=>e.default),
202"../pages/Control/Channels/components/constants.ts":()=>f(()=>Promise.resolve().then(()=>jT),void 0).then(e=>e.default),
202"../pages/Control/Channels/components/index.ts":()=>f(()=>import("./index-E6z3IerU.js"),__vite__mapDeps([199,196,3,197,198,4,5,6,2,7,195,200])).then(e=>e.default),
202"../pages/Control/Channels/components/useChannelQrcode.ts":()=>f(()=>import("./useChannelQrcode-CBf0RJIs.js"),__vite__mapDeps([198,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Control/Channels/index.tsx":()=>f(()=>import("./index-C43OEexS.js"),__vite__mapDeps([201,3,196,197,198,4,5,6,2,7,195,200,20,21,202])).then(e=>e.default),
202"../pages/Control/Channels/useChannels.ts":()=>f(()=>import("./useChannels-BcJkW6zv.js"),__vite__mapDeps([200,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Control/CronJobs/calendar.ts":()=>f(()=>import("./calendar-C0fhfIib.js"),[]).then(e=>e.default),
202"../pages/Control/CronJobs/components/JobDrawer.tsx":()=>f(()=>import("./JobDrawer-CePOBq-b.js"),__vite__mapDeps([203,3,204,4,5,6,49,2,205,206])).then(e=>e.default),
202"../pages/Control/CronJobs/components/TemplatePickerModal.tsx":()=>f(()=>import("./TemplatePickerModal-C6Uu8E66.js"),__vite__mapDeps([207,3,208,4,5,6,205,206,2])).then(e=>e.default),
202"../pages/Control/CronJobs/components/columns.tsx":()=>f(()=>import("./columns-BAMZM8Cu.js"),__vite__mapDeps([209,3,4,5,6,210,205,206,2,7])).then(e=>e.default),
202"../pages/Control/CronJobs/components/constants.ts":()=>f(()=>import("./constants-D_bHuLWc.js"),__vite__mapDeps([204,4,3,5,6])).then(e=>e.default),
202"../pages/Control/CronJobs/components/index.ts":()=>f(()=>import("./index-D3FwRs2J.js"),__vite__mapDeps([211,209,3,4,5,6,210,205,206,2,7,203,204,49,207,208,212,22])).then(e=>e.default),
202"../pages/Control/CronJobs/components/parseCron.ts":()=>f(()=>import("./parseCron-x4KbODrB.js"),[]).then(e=>e.default),
202"../pages/Control/CronJobs/components/templates.ts":()=>f(()=>import("./templates-w_DtCC5j.js"),__vite__mapDeps([208,4,3,5,6])).then(e=>e.default),
202"../pages/Control/CronJobs/index.tsx":()=>f(()=>import("./index-BbCsebvC.js"),__vite__mapDeps([213,3,4,5,6,209,210,205,206,2,7,203,204,49,207,208,212,22,214,20,21])).then(e=>e.default),
202"../pages/Control/CronJobs/useCronJobs.ts":()=>f(()=>import("./useCronJobs-Bu_5LGfg.js"),__vite__mapDeps([212,3,22,2,4,5,6,7])).then(e=>e.default),
202"../pages/Control/Heartbeat/index.tsx":()=>f(()=>import("./index-Dnt2O03I.js"),__vite__mapDeps([215,3,4,5,6,216,20,21,2,7,217])).then(e=>e.default),
202"../pages/Control/Heartbeat/parseEvery.ts":()=>f(()=>import("./parseEvery-DLpkEJ2R.js"),[]).then(e=>e.default),
202"../pages/Control/Sessions/components/FilterBar.tsx":()=>f(()=>import("./FilterBar-DDBwrC0c.js"),__vite__mapDeps([218,3,219,220,2,4,5,6])).then(e=>e.default),
202"../pages/Control/Sessions/components/SessionDrawer.tsx":()=>f(()=>import("./SessionDrawer-BRgdgXyS.js"),__vite__mapDeps([221,3,219,220,2,4,5,6])).then(e=>e.default),
202"../pages/Control/Sessions/components/columns.tsx":()=>f(()=>import("./columns-7F6Oqr-E.js").then(e=>e.a),__vite__mapDeps([222,3,223,219,220,2,4,5,6])).then(e=>e.default),
202"../pages/Control/Sessions/components/constants.ts":()=>f(()=>import("./constants-hQbnZLJ2.js"),[]).then(e=>e.default),
202"../pages/Control/Sessions/components/index.ts":()=>f(()=>import("./index-dgW_LPtK.js"),__vite__mapDeps([224,222,3,223,219,220,2,4,5,6,218,221])).then(e=>e.default),
202"../pages/Control/Sessions/index.tsx":()=>f(()=>import("./index-CJdzQc6F.js"),__vite__mapDeps([225,3,222,223,219,220,2,4,5,6,218,221,226,7,20,21])).then(e=>e.default),
202"../pages/Control/Sessions/useSessions.ts":()=>f(()=>import("./useSessions-SuFxaNQi.js"),__vite__mapDeps([226,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Files/index.tsx":()=>f(()=>import("./index-DEVlwNas.js"),__vite__mapDeps([227,3,228,181,140,141,142,4,5,6,2,182,187,7,188,189,190,191,179,79,12,80,77,180,136,183,192,193,194,117,16,229,230])).then(e=>e.default),
202"../pages/Hub/index.tsx":()=>f(()=>import("./index-C_kk7iNE.js"),__vite__mapDeps([231,3,232,4,5,6,2,7,233])).then(e=>e.default),
202"../pages/Hub/pageUtils.ts":()=>f(()=>import("./pageUtils-Bjq7LafW.js"),[]).then(e=>e.default),
202"../pages/Inbox/components/ApprovalCard.tsx":()=>f(()=>import("./ApprovalCard-CYg5263g.js"),__vite__mapDeps([234,3,2,4,5,6,235])).then(e=>e.default),
202"../pages/Inbox/components/CreateHarvestModal.tsx":()=>f(()=>import("./CreateHarvestModal-BeFlOCvX.js"),__vite__mapDeps([236,3,4,5,6,237])).then(e=>e.default),
202"../pages/Inbox/components/HarvestCard.tsx":()=>f(()=>import("./HarvestCard-Bx_flfCZ.js"),__vite__mapDeps([238,3,239,2,4,5,6,240])).then(e=>e.default),
202"../pages/Inbox/components/MagazineStackViewer.tsx":()=>f(()=>import("./MagazineStackViewer-CE3Wwmo4.js"),__vite__mapDeps([241,3,242,4,5,6,243])).then(e=>e.default),
202"../pages/Inbox/components/MailAccessControlDrawer.tsx":()=>f(()=>import("./MailAccessControlDrawer-BnGaIHY-.js"),__vite__mapDeps([244,3,245,2,4,5,6,7])).then(e=>e.default),
202"../pages/Inbox/components/PushMessageCard.tsx":()=>f(()=>import("./PushMessageCard-T4HRfjc9.js"),__vite__mapDeps([246,3,2,4,5,6,247])).then(e=>e.default),
202"../pages/Inbox/components/index.ts":()=>f(()=>import("./index-BBODEF4T.js"),__vite__mapDeps([248,246,3,2,4,5,6,247,234,235,238,239,240,236,237,241,242,243])).then(e=>e.default),
202"../pages/Inbox/hooks/useHarvestCountdown.ts":()=>f(()=>import("./useHarvestCountdown-B6sY9m-2.js"),__vite__mapDeps([239,3])).then(e=>e.default),
202"../pages/Inbox/hooks/useInboxData.ts":()=>f(()=>import("./useInboxData-ClejyQP5.js"),__vite__mapDeps([249,3,250,2,4,5,6,7])).then(e=>e.default),
202"../pages/Inbox/hooks/useMailPendingCount.ts":()=>f(()=>import("./useMailPendingCount-BUgH-dsI.js"),__vite__mapDeps([251,3,245,4,5,6,2,7])).then(e=>e.default),
202"../pages/Inbox/hooks/useMockHarvestContent.ts":()=>f(()=>import("./useMockHarvestContent-u_jzVWfp.js"),[]).then(e=>e.default),
202"../pages/Inbox/hooks/useTraceViewer.ts":()=>f(()=>import("./useTraceViewer-BUjD7h2R.js"),__vite__mapDeps([252,3,253,2,4,5,6,7])).then(e=>e.default),
202"../pages/Inbox/index.tsx":()=>f(()=>import("./index-B8w7vB10.js"),__vite__mapDeps([254,3,244,245,2,4,5,6,7,251,20,21,174,175,176,246,247,249,250,252,253,255])).then(e=>e.default),
202"../pages/Inbox/types.ts":()=>f(()=>Promise.resolve().then(()=>UO),void 0).then(e=>e.default),
202"../pages/Inbox/utils/traceUtils.ts":()=>f(()=>import("./traceUtils-BDB8GBWN.js"),[]).then(e=>e.default),
202"../pages/Login/index.tsx":()=>f(()=>import("./index-5mbuJ9A7.js"),__vite__mapDeps([256,3,2,4,5,6,7,257])).then(e=>e.default),
202"../pages/Market/components/MarketplaceHeader/index.tsx":()=>f(()=>import("./index-BWoiKPyv.js"),__vite__mapDeps([111,3,20,21,2,4,5,6,112])).then(e=>e.default),
202"../pages/Market/index.tsx":()=>f(()=>import("./index-C1xdFnG7.js"),__vite__mapDeps([258,3,111,20,21,2,4,5,6,112,110,113,114,115,103,104,105,7,259,260,108,261,262,263,264,265,140,266,267,268,269,270,271,272,273,274,275,276,107,277,278,279,280,281,282,283,284,285,286,287,288,289,290,98,291])).then(e=>e.default),
202"../pages/Settings/AgentStats/SummaryCard.tsx":()=>f(()=>import("./SummaryCard-BYmi_in0.js").then(e=>e.a),__vite__mapDeps([292,3,160,4,5,6,293])).then(e=>e.default),
202"../pages/Settings/AgentStats/index.tsx":()=>f(()=>import("./index-CGS0W1aZ.js"),__vite__mapDeps([294,3,4,5,6,20,21,160,161,292,293,2,295,7])).then(e=>e.default),
202"../pages/Settings/Agents/components/AgentBackendFields.tsx":()=>f(()=>import("./AgentBackendFields-DCqayr1D.js"),__vite__mapDeps([296,3,69,2,4,5,6,7,297])).then(e=>e.default),
202"../pages/Settings/Agents/components/AgentModal.tsx":()=>f(()=>import("./AgentModal-BAbAa3ls.js"),__vite__mapDeps([298,3,126,121,122,123,2,4,5,6,7,299,300,296,69,297,301])).then(e=>e.default),
202"../pages/Settings/Agents/components/AgentTable.tsx":()=>f(()=>import("./AgentTable-C8_A5Ehc.js"),__vite__mapDeps([302,3,7,303,299,300,4,5,6,126,2])).then(e=>e.default),
202"../pages/Settings/Agents/components/CopyAgentModal.tsx":()=>f(()=>import("./CopyAgentModal-CAzuPSiI.js"),__vite__mapDeps([304,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Agents/components/SortableAgentRow.tsx":()=>f(()=>import("./SortableAgentRow-C90tOa9k.js"),__vite__mapDeps([303,3,7,299,300,4,5,6])).then(e=>e.default),
202"../pages/Settings/Agents/components/index.ts":()=>f(()=>import("./index-CHNKsSLs.js"),__vite__mapDeps([305,302,3,7,303,299,300,4,5,6,126,2,298,121,122,123,296,69,297,301,304])).then(e=>e.default),
202"../pages/Settings/Agents/components/mailDomains.ts":()=>f(()=>import("./mailDomains-DIDmgc71.js"),[]).then(e=>e.default),
202"../pages/Settings/Agents/index.tsx":()=>f(()=>import("./index-BJRDoBow.js"),__vite__mapDeps([306,3,307,114,4,5,6,2,7,302,303,299,300,126,298,121,122,123,296,69,297,301,304,20,21,308])).then(e=>e.default),
202"../pages/Settings/Agents/reorder.ts":()=>f(()=>import("./reorder-BF63alpm.js"),[]).then(e=>e.default),
202"../pages/Settings/Agents/useAgents.ts":()=>f(()=>import("./useAgents-CwIzu_KG.js"),__vite__mapDeps([307,3,114,4,5,6,2,7])).then(e=>e.default),
202"../pages/Settings/Backups/create/AgentMultiSelect.tsx":()=>f(()=>import("./AgentMultiSelect-rbe_Dfoq.js"),__vite__mapDeps([309,3,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Backups/create/BackupProgress.tsx":()=>f(()=>import("./BackupProgress-C8KEDIS5.js"),__vite__mapDeps([310,3,4,5,6,311])).then(e=>e.default),
202"../pages/Settings/Backups/create/BackupScopeForm.tsx":()=>f(()=>import("./BackupScopeForm-DKht73bZ.js"),__vite__mapDeps([312,3,309,2,4,5,6,313])).then(e=>e.default),
202"../pages/Settings/Backups/create/CreateBackupModal.tsx":()=>f(()=>import("./CreateBackupModal-Doieov_1.js"),__vite__mapDeps([314,3,4,5,6,315,316,2,7,317,318,310,311,312,309,313,319])).then(e=>e.default),
202"../pages/Settings/Backups/create/SilentBackupModal.tsx":()=>f(()=>import("./SilentBackupModal-BQ7VYvaF.js"),__vite__mapDeps([320,3,315,316,2,4,5,6,7,317,318,310,311])).then(e=>e.default),
202"../pages/Settings/Backups/import/ImportButton.tsx":()=>f(()=>import("./ImportButton-DoUvy1sC.js"),__vite__mapDeps([321,3,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Backups/import/ImportConflictModal.tsx":()=>f(()=>import("./ImportConflictModal-DbFkMTfV.js"),__vite__mapDeps([322,3,4,5,6,2])).then(e=>e.default),
202"../pages/Settings/Backups/import/useImportFlow.ts":()=>f(()=>import("./useImportFlow-rUwt8oF9.js"),__vite__mapDeps([323,3,324,22,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Backups/index.tsx":()=>f(()=>import("./index-_iaRDZCs.js"),__vite__mapDeps([325,3,20,21,326,4,5,6,327,2,328,7,329,330,331,321,322,323,324,22,332,314,315,316,317,318,310,311,312,309,313,319,320,333,334,335,336,337,338,339])).then(e=>e.default),
202"../pages/Settings/Backups/list/BackupTable.tsx":()=>f(()=>import("./BackupTable-C55hj7Ie.js"),__vite__mapDeps([326,3,4,5,6,327,2,328,7,329])).then(e=>e.default),
202"../pages/Settings/Backups/list/BackupToolbar.tsx":()=>f(()=>import("./BackupToolbar-CUYq6qDG.js"),__vite__mapDeps([330,3,2,4,5,6,331])).then(e=>e.default),
202"../pages/Settings/Backups/list/ScopeTags.tsx":()=>f(()=>import("./ScopeTags-BzXcQgZS.js"),__vite__mapDeps([327,3,2,4,5,6,328])).then(e=>e.default),
202"../pages/Settings/Backups/restore/PreRestoreConfirmModal.tsx":()=>f(()=>import("./PreRestoreConfirmModal-DDy_6jvi.js"),__vite__mapDeps([333,3,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Backups/restore/RestoreAgentTable.tsx":()=>f(()=>import("./RestoreAgentTable-T1XW8oqW.js"),__vite__mapDeps([335,3,2,4,5,6,336])).then(e=>e.default),
202"../pages/Settings/Backups/restore/RestoreBackupModal.tsx":()=>f(()=>import("./RestoreBackupModal-ORqF8TAH.js"),__vite__mapDeps([334,3,22,318,332,2,4,5,6,324,335,336,7,337])).then(e=>e.default),
202"../pages/Settings/Backups/restore/useRestoreFlow.ts":()=>f(()=>import("./useRestoreFlow-BLnpDcZi.js"),__vite__mapDeps([338,3])).then(e=>e.default),
202"../pages/Settings/Backups/shared/progress.ts":()=>f(()=>import("./progress-SVYNRtvp.js"),[]).then(e=>e.default),
202"../pages/Settings/Backups/shared/scope.ts":()=>f(()=>import("./scope-CEwDNAj7.js"),__vite__mapDeps([317,318])).then(e=>e.default),
202"../pages/Settings/Backups/shared/useBackupRunner.ts":()=>f(()=>import("./useBackupRunner-CEkr8O2K.js"),__vite__mapDeps([315,3,316,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Backups/trust/BackupTrustDialog.tsx":()=>f(()=>import("./BackupTrustDialog-BXCD7aTH.js"),__vite__mapDeps([332,3,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Backups/trust/trustErrors.ts":()=>f(()=>import("./trustErrors-Cnu7JLRc.js"),__vite__mapDeps([324,22])).then(e=>e.default),
202"../pages/Settings/Debug/components/LogViewer.tsx":()=>f(()=>import("./index-RB1aLeDl.js").then(e=>e.a),__vite__mapDeps([340,3,2,4,5,6,341])).then(e=>e.default),
202"../pages/Settings/Debug/components/index.ts":()=>f(()=>import("./index-RB1aLeDl.js").then(e=>e.i),__vite__mapDeps([340,3,2,4,5,6,341])).then(e=>e.default),
202"../pages/Settings/Debug/index.tsx":()=>f(()=>import("./index-Du8lfCnN.js"),__vite__mapDeps([342,3,4,5,6,20,21,343,2,7,340,341])).then(e=>e.default),
202"../pages/Settings/Debug/useDebugLogs.ts":()=>f(()=>import("./useDebugLogs-D1PB1HZB.js"),__vite__mapDeps([343,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Environments/components/AddButton.tsx":()=>f(()=>import("./AddButton-Bs1xq6-L.js"),__vite__mapDeps([344,3,345,346,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Environments/components/EmptyState.tsx":()=>f(()=>import("./EmptyState-CgEYv1_w.js"),__vite__mapDeps([347,3,345,346,2])).then(e=>e.default),
202"../pages/Settings/Environments/components/EnvRow.tsx":()=>f(()=>import("./EnvRow-C8pgSXfo.js"),__vite__mapDeps([348,3,345,346,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Environments/components/Toolbar.tsx":()=>f(()=>import("./Toolbar-C55cQMV5.js"),__vite__mapDeps([349,3,345,346,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Environments/components/index.ts":()=>f(()=>import("./index--9yHCggP.js"),__vite__mapDeps([350,347,3,345,346,2,344,4,5,6,349,348])).then(e=>e.default),
202"../pages/Settings/Environments/index.tsx":()=>f(()=>import("./index-BkOxdHzX.js"),__vite__mapDeps([351,3,20,21,352,4,5,6,2,7,345,346])).then(e=>e.default),
202"../pages/Settings/Environments/useEnvVars.ts":()=>f(()=>import("./useEnvVars-GHeG5Pm-.js"),__vite__mapDeps([352,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Settings/Market/MarketPanel.tsx":()=>f(()=>import("./MarketPanel-BrPhNizX.js"),__vite__mapDeps([277,3,278,2,4,5,6,7,279,280,281,282,283,284,285,286,287,288,289])).then(e=>e.default),
202"../pages/Settings/Market/components/DetailDrawer.tsx":()=>f(()=>import("./DetailDrawer-C5PYlzdN.js"),__vite__mapDeps([285,3,282,283,2,4,5,6,286])).then(e=>e.default),
202"../pages/Settings/Market/components/EmptyState.tsx":()=>f(()=>import("./EmptyState-BRZ1sRDw.js"),__vite__mapDeps([279,3,280])).then(e=>e.default),
202"../pages/Settings/Market/components/QueueItem.tsx":()=>f(()=>import("./QueueItem-DKXFaIdj.js"),__vite__mapDeps([287,3,282,283,2,4,5,6,288])).then(e=>e.default),
202"../pages/Settings/Market/components/ResultCard.tsx":()=>f(()=>import("./ResultCard-CKgKZ5g3.js"),__vite__mapDeps([281,3,282,283,2,4,5,6,284])).then(e=>e.default),
202"../pages/Settings/Market/components/SkillIcon.tsx":()=>f(()=>import("./SkillIcon-DNdbo6yj.js"),__vite__mapDeps([282,3,283])).then(e=>e.default),
202"../pages/Settings/Market/components/index.ts":()=>f(()=>import("./index-Cp4fV27k.js"),__vite__mapDeps([353,282,3,283,279,280,281,2,4,5,6,284,285,286,287,288])).then(e=>e.default),
202"../pages/Settings/Market/useMarketInstall.ts":()=>f(()=>import("./useMarketInstall-BvBPC-Yc.js"),__vite__mapDeps([290,3,98,4,5,6,2,7])).then(e=>e.default),
202"../pages/Settings/Market/useMarketSearch.ts":()=>f(()=>import("./useMarketSearch-DMfaUnpQ.js"),__vite__mapDeps([278,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Models/apiKeyValidation.ts":()=>f(()=>import("./apiKeyValidation-cDjnNy7b.js"),[]).then(e=>e.default),
202"../pages/Settings/Models/components/ProviderIconComponent.tsx":()=>f(()=>import("./ProviderIconComponent-BxmHkMKR.js"),__vite__mapDeps([125,3,126,127,128])).then(e=>e.default),
202"../pages/Settings/Models/components/cards/LocalProviderCard.tsx":()=>f(()=>import("./LocalProviderCard-Dh_I_Plx.js"),__vite__mapDeps([354,3,355,356,125,126,127,128,2])).then(e=>e.default),
202"../pages/Settings/Models/components/cards/ProviderCard.tsx":()=>f(()=>import("./ProviderCard-B_Wtdi0T.js"),__vite__mapDeps([357,3,354,355,356,125,126,127,128,2,358,359,130,122,123,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Models/components/cards/ProviderGroupCard.tsx":()=>f(()=>import("./ProviderGroupCard-AFuE1Xgs.js"),__vite__mapDeps([360,3,359,125,126,127,128,355,356,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Models/components/cards/RemoteProviderCard.tsx":()=>f(()=>import("./RemoteProviderCard-jNC8geCw.js"),__vite__mapDeps([358,3,359,355,356,125,126,127,128,130,122,123,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Models/components/cards/index.ts":()=>f(()=>import("./index-Ccr3OggZ.js"),__vite__mapDeps([361,357,3,354,355,356,125,126,127,128,2,358,359,130,122,123,4,5,6,7,360])).then(e=>e.default),
202"../pages/Settings/Models/components/index.ts":()=>f(()=>import("./index-CXsHQBx-.js"),__vite__mapDeps([362,363,3,355,356,2,4,5,6,364,132,7,357,354,125,126,127,128,358,359,130,122,123,360,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/CustomProviderModal.tsx":()=>f(()=>import("./CustomProviderModal-IoceEC_N.js"),__vite__mapDeps([365,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/JsonConfigEditor.tsx":()=>f(()=>import("./JsonConfigEditor-DR5bt9uJ.js"),__vite__mapDeps([371,3,355,356])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/LocalModelManageModal.tsx":()=>f(()=>import("./LocalModelManageModal--mWa9yEx.js"),__vite__mapDeps([370,3,355,356,371,372,373,2,4,5,6,374,375,7])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/ModelCapabilityTags.tsx":()=>f(()=>import("./ModelCapabilityTags-BlCwnT9k.js"),__vite__mapDeps([377,3,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/ModelConfigEditor.tsx":()=>f(()=>import("./ModelConfigEditor-g1TTWrm_.js"),__vite__mapDeps([378,3,371,355,356,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/ModelManageModal.tsx":()=>f(()=>import("./ModelManageModal-D5PNaLHd.js"),__vite__mapDeps([369,3,370,355,356,371,372,373,2,4,5,6,374,375,7,376,377,378,367,379,380])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/OpenRouterFilterSection.tsx":()=>f(()=>import("./OpenRouterFilterSection-Dfkq-T_6.js"),__vite__mapDeps([379,3,2,4,5,6,380])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/ProviderConfigModal.tsx":()=>f(()=>import("./ProviderConfigModal-BZ9ITqw9.js"),__vite__mapDeps([366,3,367,368,355,356,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/RemoteModelManageModal.tsx":()=>f(()=>import("./RemoteModelManageModal-VrSt_Jc3.js"),__vite__mapDeps([376,3,377,2,4,5,6,378,371,355,356,7,367,379,380])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/index.ts":()=>f(()=>import("./index-C1x5PzL1.js"),__vite__mapDeps([381,365,3,2,4,5,6,7,366,367,368,355,356,369,370,371,372,373,374,375,376,377,378,379,380])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/local-models/LocalModelRow.tsx":()=>f(()=>import("./LocalModelRow-D_CzZ0Hu.js"),__vite__mapDeps([372,3,355,356,373,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/local-models/LocalRuntimePanel.tsx":()=>f(()=>import("./LocalRuntimePanel-CjFmGqqr.js"),__vite__mapDeps([374,3,355,356,375,373,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/local-models/shared.ts":()=>f(()=>import("./shared-9V1PnZCE.js"),__vite__mapDeps([375,373])).then(e=>e.default),
202"../pages/Settings/Models/components/modals/testConnectionMessage.ts":()=>f(()=>import("./testConnectionMessage-_eg2MXHW.js"),[]).then(e=>e.default),
202"../pages/Settings/Models/components/providerIcon.ts":()=>f(()=>import("./providerIcon-C-5dBp3Z.js"),[]).then(e=>e.default),
202"../pages/Settings/Models/components/providerLetterIcon.tsx":()=>f(()=>import("./providerLetterIcon-B_5oy5OF.js"),[]).then(e=>e.default),
202"../pages/Settings/Models/components/sections/LoadingState.tsx":()=>f(()=>import("./LoadingState-D-lx13xQ.js"),__vite__mapDeps([363,3,355,356,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Models/components/sections/ModelsSection.tsx":()=>f(()=>import("./ModelsSection-tlZ8o75i.js"),__vite__mapDeps([364,3,132,4,5,6,355,356,2,7])).then(e=>e.default),
202"../pages/Settings/Models/components/sections/index.ts":()=>f(()=>import("./index-IJWa7fnx.js"),__vite__mapDeps([382,363,3,355,356,2,4,5,6,364,132,7])).then(e=>e.default),
202"../pages/Settings/Models/index.tsx":()=>f(()=>import("./index-DdhgX1-w.js"),__vite__mapDeps([383,3,384,4,5,6,2,7,363,355,356,364,132,357,354,125,126,127,128,358,359,130,122,123,360,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,20,21])).then(e=>e.default),
202"../pages/Settings/Models/useProviders.ts":()=>f(()=>import("./useProviders-C6vQL7RZ.js"),__vite__mapDeps([384,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Settings/Models/utils.ts":()=>f(()=>import("./utils-B_sR6IXl.js"),[]).then(e=>e.default),
202"../pages/Settings/OffloadPolicy/OffloadPolicyCard.tsx":()=>f(()=>import("./OffloadPolicyCard-CdpaSbJh.js"),__vite__mapDeps([385,3,14,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/OffloadPolicy/index.tsx":()=>f(()=>import("./index-_Hnm-qKi.js"),__vite__mapDeps([386,3,20,21,385,14,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/PawApps/index.tsx":()=>f(()=>import("./index-BiBTtAH2.js"),__vite__mapDeps([387,3,20,21,113,2,4,5,6,7,388])).then(e=>e.default),
202"../pages/Settings/PluginManager/components/InstallPluginModal.tsx":()=>f(()=>import("./InstallPluginModal-BBGtrTGX.js"),__vite__mapDeps([263,3,2,4,5,6,264])).then(e=>e.default),
202"../pages/Settings/PluginManager/components/InstalledPluginList.tsx":()=>f(()=>import("./InstalledPluginList-CCr29e4S.js").then(e=>e.a),__vite__mapDeps([265,3,140,266,267,4,5,6,2,268,269,270,271,272])).then(e=>e.default),
202"../pages/Settings/PluginManager/components/MarketPluginList.tsx":()=>f(()=>import("./MarketPluginList-DoUiRqXV.js"),__vite__mapDeps([275,3,140,276,107,108,2,4,5,6,7,268,269,270,271])).then(e=>e.default),
202"../pages/Settings/PluginManager/components/OfficialPluginList.tsx":()=>f(()=>import("./OfficialPluginList-7T3mW_po.js"),__vite__mapDeps([273,3,140,274,108,2,4,5,6,7,268,269,270,271])).then(e=>e.default),
202"../pages/Settings/PluginManager/components/PluginTypeTag.tsx":()=>f(()=>import("./PluginTypeTag-BBF8LoQC.js"),__vite__mapDeps([267,3,4,5,6])).then(e=>e.default),
202"../pages/Settings/PluginManager/components/PluginViewToggle.tsx":()=>f(()=>import("./PluginViewToggle-eem-N1PU.js"),__vite__mapDeps([268,3,2,4,5,6,269])).then(e=>e.default),
202"../pages/Settings/PluginManager/hooks/useInstallModal.ts":()=>f(()=>import("./useInstallModal-DIVLvUEI.js"),__vite__mapDeps([261,4,3,5,6,108,262,2,7])).then(e=>e.default),
202"../pages/Settings/PluginManager/hooks/useMarketPlugins.ts":()=>f(()=>import("./useMarketPlugins-DhRsQKm2.js"),__vite__mapDeps([276,3,107,108,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/PluginManager/hooks/useOfficialPlugins.ts":()=>f(()=>import("./useOfficialPlugins-CMyTx9wV.js"),__vite__mapDeps([274,3,108,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/PluginManager/hooks/usePluginColumns.tsx":()=>f(()=>import("./usePluginColumns-DVeq6euH.js"),__vite__mapDeps([266,3,267,4,5,6,2])).then(e=>e.default),
202"../pages/Settings/PluginManager/hooks/usePluginManager.ts":()=>f(()=>import("./usePluginManager-CVRjZoIm.js"),__vite__mapDeps([260,3,4,5,6,108,2,7])).then(e=>e.default),
202"../pages/Settings/PluginManager/index.tsx":()=>f(()=>import("./index-C7VD8sSj.js"),__vite__mapDeps([259,3,111,20,21,2,4,5,6,112,260,108,7,261,262,263,264,265,140,266,267,268,269,270,271,272,273,274,275,276,107])).then(e=>e.default),
202"../pages/Settings/PluginManager/utils.ts":()=>f(()=>import("./utils-Dd3MJpM-.js"),[]).then(e=>e.default),
202"../pages/Settings/Security/components/AllowNoAuthHostsTab.tsx":()=>f(()=>import("./AllowNoAuthHostsTab-DOfKmzVb.js"),__vite__mapDeps([389,3,390,391,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Security/components/FileGuardSection.tsx":()=>f(()=>import("./FileGuardSection-CIsCAA8V.js"),__vite__mapDeps([392,3,390,391,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Security/components/PreviewModal.tsx":()=>f(()=>import("./PreviewModal-DSwwUYls.js"),__vite__mapDeps([393,3,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Security/components/RuleModal.tsx":()=>f(()=>import("./RuleModal-CB3K58Pn.js"),__vite__mapDeps([394,3,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Security/components/RuleTable.tsx":()=>f(()=>import("./RuleTable-D4UQzEMr.js"),__vite__mapDeps([395,3,390,391,2,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/Security/components/ShellEvasionSection.tsx":()=>f(()=>import("./ShellEvasionSection-iYW3_lTM.js"),__vite__mapDeps([396,3,390,391,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/Security/components/SkillScannerSection.tsx":()=>f(()=>import("./SkillScannerSection-DXoW6cCc.js"),__vite__mapDeps([397,3,398,4,5,6,2,7,390,391])).then(e=>e.default),
202"../pages/Settings/Security/components/ToolGuardTab.tsx":()=>f(()=>import("./ToolGuardTab-LAbIX09C.js"),__vite__mapDeps([399,3,395,390,391,2,4,5,6,7,396])).then(e=>e.default),
202"../pages/Settings/Security/components/index.ts":()=>f(()=>import("./index-CG1mzu8c.js"),__vite__mapDeps([400,395,3,390,391,2,4,5,6,7,394,393,397,398,392,396,399,389])).then(e=>e.default),
202"../pages/Settings/Security/index.tsx":()=>f(()=>import("./index-YRdhft9t.js"),__vite__mapDeps([401,3,402,403,4,5,6,2,7,390,391,394,393,397,398,392,399,395,396,389,20,21])).then(e=>e.default),
202"../pages/Settings/Security/useSecurityPage.ts":()=>f(()=>import("./useSecurityPage-_cNgWly1.js"),__vite__mapDeps([402,3,403,4,5,6,2,7])).then(e=>e.default),
202"../pages/Settings/Security/useSkillScanner.ts":()=>f(()=>import("./useSkillScanner-IpycXNcJ.js"),__vite__mapDeps([398,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Settings/Security/useToolGuard.ts":()=>f(()=>import("./useToolGuard-DUiIYmfb.js"),__vite__mapDeps([403,3,4,5,6,2,7])).then(e=>e.default),
202"../pages/Settings/SkillPool/builtinNotice.ts":()=>f(()=>import("./builtinNotice-ah4GEsD1.js"),[]).then(e=>e.default),
202"../pages/Settings/SkillPool/components/BroadcastModal.tsx":()=>f(()=>import("./BroadcastModal-Du4rREE_.js"),__vite__mapDeps([404,3,85,86,87,2,72,73,4,5,6,7])).then(e=>e.default),
202"../pages/Settings/SkillPool/components/ImportBuiltinModal.tsx":()=>f(()=>import("./ImportBuiltinModal-BdeMaxFX.js"),__vite__mapDeps([405,3,72,73,406,407,408,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/SkillPool/components/PoolSkillCard.tsx":()=>f(()=>import("./PoolSkillCard-CO4zxpFW.js"),__vite__mapDeps([409,3,4,5,6,81,410,407,408,2])).then(e=>e.default),
202"../pages/Settings/SkillPool/components/PoolSkillDrawer.tsx":()=>f(()=>import("./PoolSkillDrawer-Cnhir3K1.js"),__vite__mapDeps([411,3,81,75,4,5,6,72,73,2,76,77,78,79,12,80,82,89,7,407,408])).then(e=>e.default),
202"../pages/Settings/SkillPool/components/PoolSkillListItem.tsx":()=>f(()=>import("./PoolSkillListItem-Dz7u2Rxq.js"),__vite__mapDeps([412,3,4,5,6,81,410,413,407,408,2,7])).then(e=>e.default),
202"../pages/Settings/SkillPool/components/SkillMeta.tsx":()=>f(()=>import("./SkillMeta-S_GzmCcz.js"),__vite__mapDeps([413,3,407,408])).then(e=>e.default),
202"../pages/Settings/SkillPool/components/index.ts":()=>f(()=>import("./index-BgcWHpJ1.js"),__vite__mapDeps([414,404,3,85,86,87,2,72,73,4,5,6,7,405,406,407,408,413,409,81,410,412,411,75,76,77,78,79,12,80,82,89])).then(e=>e.default),
202"../pages/Settings/SkillPool/index.tsx":()=>f(()=>import("./index-q__8LHRI.js"),__vite__mapDeps([415,3,74,75,4,5,6,72,73,2,76,77,78,79,12,80,81,82,83,84,85,86,87,71,70,88,89,7,90,91,92,404,405,406,407,408,409,410,412,413,411,416,22,96,95,20,21])).then(e=>e.default),
202"../pages/Settings/SkillPool/useSkillPool.tsx":()=>f(()=>import("./useSkillPool-Cx57ZCgp.js"),__vite__mapDeps([416,3,22,96,4,5,6,81,75,72,73,2,76,77,78,79,12,80,82,83,85,86,89,7])).then(e=>e.default),
202"../pages/Settings/TokenUsage/components/DataTables.tsx":()=>f(()=>import("./DataTables-DlyLvJ9q.js"),__vite__mapDeps([417,3,160,161,418,419,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/TokenUsage/components/EmptyState.tsx":()=>f(()=>import("./EmptyState-CC4TFPnF.js"),__vite__mapDeps([420,3,418,419])).then(e=>e.default),
202"../pages/Settings/TokenUsage/components/LoadingState.tsx":()=>f(()=>import("./LoadingState-BnFaU9HC.js"),__vite__mapDeps([421,3,418,419,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/TokenUsage/components/ModelTrendChart.tsx":()=>f(()=>import("./ModelTrendChart-B-VZf3G_.js"),__vite__mapDeps([422,3,418,419,2,4,5,6,295])).then(e=>e.default),
202"../pages/Settings/TokenUsage/components/SummaryCards.tsx":()=>f(()=>import("./SummaryCards-2bHf9hVX.js"),__vite__mapDeps([423,3,160,161,418,419,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/TokenUsage/components/TokenTypeChart.tsx":()=>f(()=>import("./TokenTypeChart-DDaVAR-J.js"),__vite__mapDeps([424,3,418,419,2,4,5,6,295])).then(e=>e.default),
202"../pages/Settings/TokenUsage/components/index.ts":()=>f(()=>import("./index-BA4JBs_R.js"),__vite__mapDeps([425,421,3,418,419,2,4,5,6,420,423,160,161,422,295,424,417])).then(e=>e.default),
202"../pages/Settings/TokenUsage/hooks/lineChartChrome.ts":()=>f(()=>import("./lineChartChrome-B0o4v2PL.js"),__vite__mapDeps([426,4,3,5,6,160])).then(e=>e.default),
202"../pages/Settings/TokenUsage/hooks/useDataAggregation.ts":()=>f(()=>import("./useDataAggregation-BrDVFzJK.js"),__vite__mapDeps([427,3])).then(e=>e.default),
202"../pages/Settings/TokenUsage/hooks/useModelTrendConfig.ts":()=>f(()=>import("./useModelTrendConfig-0r4ezO3L.js"),__vite__mapDeps([428,3,426,4,5,6,160])).then(e=>e.default),
202"../pages/Settings/TokenUsage/hooks/useTokenTypeConfig.ts":()=>f(()=>import("./useTokenTypeConfig-9ollBZEW.js"),__vite__mapDeps([429,3,426,4,5,6,160])).then(e=>e.default),
202"../pages/Settings/TokenUsage/index.tsx":()=>f(()=>import("./index-sXrDNJQX.js"),__vite__mapDeps([430,3,4,5,6,20,21,421,418,419,2,420,423,160,161,422,295,424,417,427,426,428,429,431,7])).then(e=>e.default),
202"../pages/Settings/TokenUsage/tokenUsageRows.ts":()=>f(()=>import("./tokenUsageRows-rhvieyre.js"),[]).then(e=>e.default),
202"../pages/Settings/VoiceTranscription/components/AudioModeCard.tsx":()=>f(()=>import("./AudioModeCard-CgISeoMg.js"),__vite__mapDeps([432,3,433,434,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/VoiceTranscription/components/ProviderSelectCard.tsx":()=>f(()=>import("./ProviderSelectCard-DmFrQYkq.js"),__vite__mapDeps([435,3,433,434,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/VoiceTranscription/components/ProviderTypeCard.tsx":()=>f(()=>import("./ProviderTypeCard-BRyEzJLI.js"),__vite__mapDeps([436,3,433,434,2,4,5,6])).then(e=>e.default),
202"../pages/Settings/VoiceTranscription/components/index.ts":()=>f(()=>import("./index-D_AwKCzM.js"),__vite__mapDeps([437,432,3,433,434,2,4,5,6,436,435])).then(e=>e.default),
202"../pages/Settings/VoiceTranscription/index.tsx":()=>f(()=>import("./index-DFglmXC1.js"),__vite__mapDeps([438,3,20,21,439,2,4,5,6,7,432,433,434,436,435])).then(e=>e.default),
202"../pages/Settings/VoiceTranscription/useVoiceTranscription.ts":()=>f(()=>import("./useVoiceTranscription-kmB_QBuF.js"),__vite__mapDeps([439,3,2,4,5,6,7]))
202.then(e=>e.default)});function NF(e){let t=e.replace(/^.*pages\//,"pages/");return t=t.replace(/\/index$/,""),`../${t}`}function ne(e){const t=NF(e),a=Ba[t]?t:Ba[`${t}/index.tsx`]?`${t}/index.tsx`:Ba[`${t}/index.ts`]?`${t}/index.ts`:t,n=Ba[a];if(!n)throw new Error(`[lazyImportWithRetry] No glob entry found for "${e}".
203Resolved key: "${a}". Available: ${Object.keys(Ba).join(", ")}`);const o=BF(e);return h.lazy(()=>Jp(()=>n().then(i=>({default:i})),FF).then(i=>{const s=Qp.get(o,"default");return s?{default:s}:i}))}const HF=ft(e=>({uploadMaxSizeMb:null,fetch:async()=>{try{const{upload_max_size_mb:t}=await Po.getUploadLimit();e({uploadMaxSizeMb:t})}catch{}}})),UF="qwenpaw-close-requested",qF="qwenpaw-shutdown-started";async function yd(e){await Fe(e==="quit"?"quit_app":"minimize_to_tray")}function jF(){const{t:e,i18n:t}=ve(),[a,n]=h.useState(!1),[o,i]=h.useState(!1),[s,r]=h.useState(null),[l,d]=h.useState(!1),u=h.useCallback(()=>{Fe("ack_close").catch(k=>{console.error("Failed to ack close request:",k)});const m=Dp();if(m){yd(m).catch(k=>{console.error("Failed to run remembered close action:",k)});return}i(!1),n(!0)},[]),p=h.useCallback(async m=>{r(m),m==="quit"&&d(!0);try{o&&xp(m),await yd(m),m==="minimize-to-tray"&&n(!1)}catch(k){d(!1),console.error("Failed to run close action:",k)}finally{r(null)}},[o]);return h.useEffect(()=>{if(!Vt())return;let m=!1,k;return zi(UF,()=>u()).then(g=>{if(m){g();return}k=g}).catch(g=>{console.error("Failed to listen for close requests:",g)}),()=>{m=!0,k==null||k()}},[u]),h.useEffect(()=>{if(!Vt())return;let m=!1,k;return zi(qF,()=>{d(!0),n(!0)}).then(g=>{if(m){g();return}k=g}).catch(g=>{console.error("Failed to listen for shutdown status:",g)}),()=>{m=!0,k==null||k()}},[]),h.useEffect(()=>{if(!Vt())return;const m=k=>{const g=t.getFixedT(k);Fe("set_tray_labels",{showWindow:g("desktop.closeWindow.showWindow","Show Window"),quit:g("desktop.closeWindow.quitApp","Quit App")}).catch(b=>{console.error("Failed to update tray labels:",b)})};return m(t.resolvedLanguage||t.language||"en"),t.on("languageChanged",m),()=>{t.off("languageChanged",m)}},[t]),Vt()?c.jsxs(Yi,{open:a,title:l?`${e("desktop.closeWindow.quitApp","Quit App")}...`:e("desktop.closeWindow.title","Close Window"),closable:!1,maskClosable:!1,keyboard:!1,footer:l?null:[c.jsx(Se,{loading:s==="minimize-to-tray",disabled:s==="quit",onClick:()=>void p("minimize-to-tray"),children:e("desktop.closeWindow.minimizeToTray","Minimize to Tray")},"minimize"),c.jsx(Se,{type:"primary",danger:!0,loading:s==="quit",disabled:s==="minimize-to-tray",onClick:()=>void p("quit"),children:e("desktop.closeWindow.quitApp","Quit App")},"quit")],children:[c.jsx(Ad.Paragraph,{type:"secondary",children:l?c.jsxs(c.Fragment,{children:[c.jsx(nn,{size:"small"})," ",e("desktop.closeWindow.quitApp","Quit App"),"..."]}):e("desktop.closeWindow.description","What would you like to do when closing the window? Quitting the app stops all running tasks and scheduled jobs.")}),!l&&c.jsx(oh,{checked:o,onChange:m=>i(m.target.checked),children:e("desktop.closeWindow.remember","Remember my choice")})]}):null}const GF="BackendLoadingPage-module__page__BjKgJ",VF="BackendLoadingPage-module__card__lHkIx",WF="BackendLoadingPage-module__logo__nnH4w",zF="BackendLoadingPage-module__progressLabel__IAdFu",KF="BackendLoadingPage-module__statusText__mNgcl",$F="BackendLoadingPage-module__failedText__y-HTb",QF="BackendLoadingPage-module__hint__xxz0-",JF="BackendLoadingPage-module__details__Kx0mS",YF="BackendLoadingPage-module__summary__NekSy",XF="BackendLoadingPage-module__errorDetails__Znhjv",ZF="BackendLoadingPage-module__retryButton__yKN2D",at={page:GF,card:VF,logo:WF,progressLabel:zF,statusText:KF,failedText:$F,hint:QF,details:JF,summary:YF,errorDetails:XF,retryButton:ZF};function ho({status:e,elapsed:t,totalSec:a,errorMessage:n,onRetry:o,statusText:i,hintText:s,retryLabel:r,showRetry:l=!0,retryDisabled:d=!1}){const{t:u}=ve(),p=e==="timeout"||e==="error",m=i||(e==="error"?u("startup.error","Backend failed to start."):e
203==="checking"?t===0?u("startup.starting","Starting backend..."):u("startup.checking","Connecting to backend..."):u("startup.timeout",{seconds:t,defaultValue:"Backend failed to start within {{seconds}} seconds."})),k=Math.min(Math.round(t/a*100),100);return c.jsx("div",{className:at.page,children:c.jsxs("div",{className:at.card,children:[c.jsx("img",{src:"/qwenpaw.png",alt:"QwenPaw",className:at.logo}),c.jsx(si,{type:"dashboard",percent:k,status:p?"exception":"active",strokeColor:"var(--app-accent)",trailColor:"var(--app-fill-subtle)",gapPosition:"bottom",format:()=>c.jsx("div",{className:at.progressLabel,children:`${t}s`}),size:160,strokeWidth:8}),c.jsx("p",{className:`${at.statusText} ${p?at.failedText:""}`,children:m}),p&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:at.hint,children:s||(e==="error"?u("startup.errorHint","The backend process could not be launched. Check application logs for details."):u("startup.timeoutHint","Backend failed to start. Please retry, or check application logs for details."))}),n&&c.jsxs("details",{className:at.details,children:[c.jsx("summary",{className:at.summary,children:u("startup.errorDetails","Show error details")}),c.jsx("pre",{className:at.errorDetails,children:n})]}),l&&c.jsx("button",{className:at.retryButton,onClick:o,disabled:d,type:"button",children:r||u("startup.retry","Retry")})]})]})})}async function eO(){const e=await mo.getStatus();return{mode:e.mode==="hub"?"hub":"standard",authStatus:e}}async function tO(e){if(!(e??await mo.getStatus()).enabled)return"ok";const a=Sa();if(!a)return"auth-required";const n=await fetch(ee("/auth/verify"),{headers:{Authorization:`Bearer ${a}`}});if(n.ok)return"ok";if(n.status===401||n.status===403)return tn(),"auth-required";throw new Error(`Authentication service returned ${n.status}`)}function aO(){const e=t=>{var s;if(t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;const a=t.target,n=(s=a==null?void 0:a.closest)==null?void 0:s.call(a,"a[href]");if(!n||n.target!=="_blank")return;const o=n.getAttribute("href");if(!o)return;const i=Wu(o);i&&(t.preventDefault(),Es(i))};return document.addEventListener("click",e,!0),()=>document.removeEventListener("click",e,!0)}ri.extend(Jh);const nO=ne("./pages/Login/index"),oO=ne("./pages/Hub/index"),iO=h.lazy(()=>f(()=>import("./DesktopOS-Co1B_JSN.js"),__vite__mapDeps([440,3,108,140,114,4,5,6,250,142,2,107,109,176,115,7,441]))),vd={zh:dh,en:li,ja:lh,ru:rh,id:sh},Td={zh:"zh-cn",en:"en",ja:"ja",ru:"ru",id:"id"},sO=ih`
204* {
205  margin: 0;
206  box-sizing: border-box;
207}
208`;function ni({children:e,authStatus:t,useHardRedirect:a=!1}){const[n,o]=h.useState("loading"),[i,s]=h.useState(""),[r,l]=h.useState(0);if(h.useEffect(()=>{let d=!1;return o("loading"),s(""),tO(t).then(u=>{d||o(u)}).catch(u=>{d||(s(u instanceof Error?u.message:"Authentication failed"),o("error"))}),()=>{d=!0}},[t,r]),n==="loading")return null;if(n==="error")return c.jsx(ho,{status:"error",elapsed:0,totalSec:1,errorMessage:i,onRetry:()=>l(d=>d+1)});if(n==="auth-required"){const d=Pu(window.location);return a?(window.location.replace(Au(window.location)),null):c.jsx(go,{to:d,replace:!0})}return c.jsx(c.Fragment,{children:e})}function Sd({children:e,enabled:t}){const{t:a}=ve(),[n,o]=h.useState(null),[i,s]=h.useState(""),[r,l]=h.useState(!1),[d,u]=h.useState(0);h.useEffect(()=>{if(!t)return;let m=!1;return o(null),s(""),pa.getHealth().then(k=>{m||o(k)}).catch(k=>{m||s(k instanceof Error?k.message:"Runtime security preflight failed")}),()=>{m=!0}},[t,d]);const p=async()=>{l(!0),s("");try{await pa.restartOwnRuntime(),u(m=>m+1)}catch(m){s(m instanceof Error?m.message:"Runtime restart failed")}finally{l(!1)}};if(h.useEffect(()=>{!t||!n||n.runtime_available||window.location.replace(Rs(window.location.pathname,"/hub/admin"))},[t,n]),!t)return c.jsx(c.Fragment,{children:e});if(!n&&!i)return null;if((n==null?void 0:n.runtime_desired_state)==="stopped"){const m=n.runtime_start_policy==="owner_allowed";return c.jsx(ho,{status:"error",elapsed:0,totalSec:1,statusText:a(m?"account.runtimeStoppedTitle":"account.runtimeDisabledTitle"),hintText:a(m?"account.runtimeStoppedDescription":"account.runtimeDisabledDescription"),errorMessage:i,onRetry:p,retryLabel:a(r?"account.runtimeRestarting":"account.runtimeRestart"),showRetry:m,retryDisabled:r})}return n!=null&&n.runtime_available?c.jsx(c.Fragment,{children:e}):n?null:c.jsx(ho,{status:"error",elapsed:0,totalSec:1,errorMessage:i,onRetry:()=>u(m=>m+1)})}function rO({backendInfo:e}){const t=e.mode==="hub",a=wo(window.location.pathname),{i18n:n}=ve(),{isDark:o}=un(),i=o?uh:ph,s=n.resolvedLanguage||n.language||"en",[r,l]=h.useState(vd[s]??li);h.useEffect(()=>{localStorage.getItem("language")||Qu.getLanguage().then(({language:p})=>{p&&p!==n.language&&(n.changeLanguage(p),localStorage.setItem("language",p))}).catch(p=>console.error("Failed to fetch language preference:",p)),HF.getState().fetch()},[]),h.useEffect(()=>{const p=m=>{const k=m.split("-")[0];l(vd[k]??li),ri.locale(Td[k]??"en")};return ri.locale(Td[s.split("-")[0]]??"en"),n.on("languageChanged",p),()=>{n.off("languageChanged",p)}},[n]),h.useEffect(()=>{if(!Is())return;const p=m=>m.preventDefault();return window.addEventListener("contextmenu",p),()=>window.removeEventListener("contextmenu",p)},[]),h.useEffect(()=>{if(Ls())return aO()},[]);const u=wu(window.location.pathname)?c.jsx(ni,{authStatus:e.authStatus,useHardRedirect:!0,children:c.jsx(Sd,{enabled:t,children:c.jsx(h.Suspense,{fallback:null,children:c.jsx(iO,{})})})}):c.jsx(nm,{basename:a,children:c.jsxs(wd,{children:[c.jsx(Ln,{path:"/login",element:c.jsx(h.Suspense,{fallback:null,children:c.jsx(nO,{})})}),c.jsx(Ln,{path:"/hub/admin",element:t?c.jsx(ni,{authStatus:e.authStatus,children:c.jsx(h.Suspense,{fallback:null,children:c.jsx(oO,{})})}):c.jsx(go,{to:"/",replace:!0})}),c.jsx(Ln,{path:"/*",element:c.jsx(ni,{authStatus:e.authStatus,children:c.jsx(Sd,{enabled:t,children:c.jsx(qE,{hubMode:t})})})})]})});return c.jsxs(c.Fragment,{children:[c.jsx(sO,{}),c.jsx(ch,{...i,prefix:"qwenpaw",prefixCls:"qwenpaw",locale:r,theme:{...i.theme,algorithm:o?Xs.darkAlgorithm:Xs.defaultAlgorithm,token:{colorPrimary:"#FF7F16"}},children:c.jsxs(Pd,{children:[c.jsx(jF,{}),c.jsx(YM,{children:c.jsx(_F,{children:c.jsx(tD,{children:u})})})]})})]})}function lO(){return c.jsx(_S,{children:c.jsx(dO,{})})}function dO(){const[e,t]=h.useState("loading"),[a,n]=h.useState(""),[o,i]=h.useState(0);return h.useEffect(()=>{let s=!1;return t("loading"),n(""),eO().then(r=>{s||t(r)}).catch(r=>{s||(n(r instanceof Error?r.message:"Backend detection failed"),t("error"))}),()=>{s=!0}},[o]),e==="loading"?null:e==="error"?c.jsx(ho,{status:"error",elapsed:0,totalSec:1,errorMessage:a,onRetry:()=>i(s=>s+1)}):c.jsx(SF,{children:c.jsx(rO,{backendInfo:e})})}const oe=(e,t)=>()=>Ht.t(e,t??e),cO=[{id:"core.inbox",location:"primary.agentScoped",label:oe("nav.inbox"),icon:ii,route:"core.inbox",order:10},{id:"core.marketplace",location:"primary.agentScoped",label:oe("nav.marketplace","Extension"),icon:mh,route:"core.marketplace",order:15},{id:"core.control-group",location:"primary.agentScoped",label:oe("nav.control"),isGroup:!0,order:20},{id:"core.channels",location:"primary.agentScoped",parentId:"core.control-group",label:oe("nav.channels"),icon:hh,route:"core.channels",order:10},{id:"core.sessions",location:"primary.agentScoped",parentId:"core.control-group",label:oe("nav.sessions"),icon:gh,route:"core.sessions",order:20},{id:"core.cron-jobs",location:"primary.agentScoped",parentId:"core.control-group",label:oe("nav.cronJobs"),icon:Zs,route:"core.cron-jobs",order:30},{id:"core.heartbeat",location:"primary.agentScoped",parentId:"core.control-group",label:oe("nav.heartbeat"),icon:fh,route:"core.heartbeat",order:40},{id:"core.workspace-group",location:"primary.agentScoped",label:oe("nav.agent"),isGroup:!0,order:30},{id:"core.files",location:"primary.agentScoped",parentId:"core.workspace-group",label:oe("nav.files"),icon:bh,route:"core.files",order:5},{id:"core.skills",location:"primary.agentScoped",parentId:"core.workspace-group",label:oe("nav.skills"),icon:kh,route:"core.skills",order:10},{id:"core.tools",location:"primary.agentScoped",parentId:"core.workspace-group",label:oe("nav.tools"),icon:yh,route:"core.tools",order:20},{id:"core.mcp",location:"primary.agentScoped",parentId:"core.workspace-group",label:oe("nav.mcp"),icon:vh,route:"core.mcp",order:40},{id:"core.acp",location:"primary.agentScoped",parentId:"core.workspace-group",label:oe("nav.acp"),icon:Th,route:"core.acp",order:50},{id:"core.agent-config",location:"primary.agentScoped",parentId:"core.workspace-group",label:oe("nav.agentConfig"),icon:Sh,route:"core.agent-config",order:60},{id:"core.agent-stats",location:"primary.agentScoped",parentId:"core.workspace-group",label:oe("nav.agentStats"),icon:Ch,route:"core.agent-stats",order:70},{id:"core.checkpoints",location:"primary.agentScoped",parentId:"core.agent-group",label:oe("checkpoints.nav"),icon:wh,route:"core.checkpoints",order:80},{id:"core.settings-group",location:"primary.settings",label:oe("nav.settings"),isGroup:!0,order:10},{id:"core.agents",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.agents"),icon:Ph,route:"core.agents",order:10},{id:"core.models",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.models"),icon:Ah,route:"core.models",order:20},{id:"core.skill-pool",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.skillPool","Skill Pool"),icon:Mh,route:"core.skill-pool",order:30},{id:"core.environments",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.environments"),icon:Dh,route:"core.environments",order:50},{id:"core.offload-policy",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.offloadPolicy","Tool Offload"),icon:Zs,route:"core.offload-policy",order:55},{id:"core.security",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.security"),icon:xh,route:"core.security",order:60},{id:"core.token-usage",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.tokenUsage"),icon:Rh,route:"core.token-usage",order:70},{id:"core.backups",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.backups"),icon:Ih,route:"core.backups",order:80},{id:"core.voice-transcription",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.voiceTranscription"),icon:_h,route:"core.voice-transcription",order:90},{id:"core.debug",location:"primary.settings",parentId:"core.settings-group",label:oe("nav.debug","Debug"),icon:Lh,route:"core.debug",order:100}];je.addBuiltin(cO);const uO=ne("../../pages/Chat"),pO=ne("../../pages/Control/Channels"),mO=ne("../../pages/Control/Sessions"),hO=ne("../../pages/Inbox"),gO=ne("../../pages/Control/CronJobs"),fO=ne("../../pages/Control/Heartbeat"),bO=ne("../../pages/Agent/Config"),kO=ne("../../pages/Agent/Skills"),yO=ne("../../pages/Settings/SkillPool"),vO=ne("../../pages/Agent/Tools"),TO=ne("../../pages/Agent/Checkpoints"),SO=ne("../../pages/Agent/MCP"),CO=ne("../../pages/Agent/ACP"),wO=ne("../../pages/Settings/Models"),PO=ne("../../pages/Settings/Environments"),AO
208=ne("../../pages/Settings/OffloadPolicy"),MO=ne("../../pages/Settings/Security"),DO=ne("../../pages/Settings/TokenUsage"),xO=ne("../../pages/Settings/AgentStats"),RO=ne("../../pages/Settings/VoiceTranscription"),IO=ne("../../pages/Settings/Agents"),_O=ne("../../pages/Settings/Debug"),LO=ne("../../pages/Settings/Backups"),EO=ne("../../pages/AppCenter"),FO=ne("../../pages/Market"),OO=ne("../../pages/Files");function BO(){return c.jsx(go,{to:"/chat",replace:!0})}function NO(){return c.jsx(go,{to:"/acp",replace:!0})}const HO=[{id:"core.root",path:"/",component:BO},{id:"core.chat",path:"/chat/*",component:uO},{id:"core.files",path:"/files",component:OO},{id:"core.channels",path:"/channels",component:pO},{id:"core.sessions",path:"/sessions",component:mO},{id:"core.inbox",path:"/inbox",component:hO},{id:"core.cron-jobs",path:"/cron-jobs",component:gO},{id:"core.heartbeat",path:"/heartbeat",component:fO},{id:"core.skills",path:"/skills",component:kO},{id:"core.skill-pool",path:"/skill-pool",component:yO},{id:"core.tools",path:"/tools",component:vO},{id:"core.mcp",path:"/mcp",component:SO},{id:"core.acp",path:"/acp",component:CO},{id:"core.acp-alias",path:"/ACP",component:NO},{id:"core.checkpoints",path:"/checkpoints",component:TO},{id:"core.agents",path:"/agents",component:IO},{id:"core.models",path:"/models",component:wO},{id:"core.environments",path:"/environments",component:PO},{id:"core.offload-policy",path:"/offload-policy",component:AO},{id:"core.agent-config",path:"/agent-config",component:bO},{id:"core.security",path:"/security",component:MO},{id:"core.token-usage",path:"/token-usage",component:DO},{id:"core.agent-stats",path:"/agent-stats",component:xO},{id:"core.voice-transcription",path:"/voice-transcription",component:RO},{id:"core.debug",path:"/debug",component:_O},{id:"core.backups",path:"/backups",component:LO},{id:"core.marketplace",path:"/market",component:FO},{id:"core.app-center.embed",path:"/apps/:appId",component:EO}];ot.addBuiltin(HO);bF();if(typeof window<"u"){const e=n=>!!n.dataTransfer&&Array.from(n.dataTransfer.types).includes("Files");window.addEventListener("dragover",n=>{e(n)&&n.preventDefault()}),window.addEventListener("drop",n=>{e(n)&&n.preventDefault()});const t=console.error,a=console.warn;console.error=function(...n){var i;const o=((i=n[0])==null?void 0:i.toString())||"";o.includes(":first-child")||o.includes("pseudo class")||t.apply(console,n)},console.warn=function(...n){var i;const o=((i=n[0])==null?void 0:i.toString())||"";o.includes(":first-child")||o.includes("pseudo class")||o.includes("potentially unsafe")||a.apply(console,n)}}om.createRoot(document.getElementById("root")).render(c.jsx(lO,{}));const UO=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));export{ke as $,Rs as A,JO as B,Ou as C,jS as D,Ge as E,ZO as F,un as G,Ql as H,ie as I,qa as J,Sp as K,Os as L,Jl as M,$S as N,Kt as O,CC as P,qT as Q,_e as R,Rv as S,KS as T,ea as U,GS as V,zS as W,Cn as X,an as Y,yF as Z,ma as _,PC as a,dB as a$,Up as a0,Ls as a1,Ao as a2,ft as a3,rB as a4,Dw as a5,Rw as a6,Tw as a7,UP as a8,Gt as a9,Sl as aA,Ku as aB,Fs as aC,lB as aD,BE as aE,Ki as aF,ja as aG,OE as aH,$u as aI,_s as aJ,Fe as aK,Bp as aL,Zu as aM,pC as aN,Qk as aO,uB as aP,oB as aQ,nB as aR,Mp as aS,DC as aT,IC as aU,FC as aV,KC as aW,aB as aX,LC as aY,Yu as aZ,GC as a_,Sw as aa,xw as ab,Ns as ac,Cw as ad,bw as ae,ww as af,OP as ag,LT as ah,MP as ai,Yo as aj,RP as ak,BP as al,mP as am,Su as an,lv as ao,pa as ap,LM as aq,tn as ar,TA as as,aD as at,sB as au,QO as av,mo as aw,$O as ax,MC as ay,ov as az,RS as b,RC as b0,Ua as b1,jC as b2,Xu as b3,EC as b4,iw as b5,xC as b6,ji as b7,ip as b8,Ha as b9,iB as ba,ot as bb,je as bc,vF as bd,XO as be,Ml as bf,NE as bg,pD as bh,tB as bi,ba as c,Fu as d,Eu as e,We as f,Pt as g,ee as h,xe as i,md as j,ua as k,Fi as l,Jh as m,HF as n,Es as o,eB as p,LS as q,v as r,ue as s,Rp as t,dn as u,FE as v,cB as w,wu as x,YO as y,Mu as z};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.