libre-webui 0.24.0 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/backend/dist/routes/chat.d.ts.map +1 -1
  2. package/backend/dist/routes/chat.js +57 -4
  3. package/backend/dist/routes/chat.js.map +1 -1
  4. package/backend/dist/services/chatService.d.ts +8 -1
  5. package/backend/dist/services/chatService.d.ts.map +1 -1
  6. package/backend/dist/services/chatService.js +67 -13
  7. package/backend/dist/services/chatService.js.map +1 -1
  8. package/backend/dist/services/contextCompactionService.d.ts +11 -6
  9. package/backend/dist/services/contextCompactionService.d.ts.map +1 -1
  10. package/backend/dist/services/contextCompactionService.js +127 -27
  11. package/backend/dist/services/contextCompactionService.js.map +1 -1
  12. package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -1
  13. package/backend/dist/services/durableChatGenerationService.js +7 -1
  14. package/backend/dist/services/durableChatGenerationService.js.map +1 -1
  15. package/backend/dist/services/ollamaService.d.ts.map +1 -1
  16. package/backend/dist/services/ollamaService.js +6 -1
  17. package/backend/dist/services/ollamaService.js.map +1 -1
  18. package/backend/dist/services/pluginService.d.ts +10 -0
  19. package/backend/dist/services/pluginService.d.ts.map +1 -1
  20. package/backend/dist/services/pluginService.js +42 -7
  21. package/backend/dist/services/pluginService.js.map +1 -1
  22. package/backend/dist/services/preferencesService.d.ts.map +1 -1
  23. package/backend/dist/services/preferencesService.js +3 -0
  24. package/backend/dist/services/preferencesService.js.map +1 -1
  25. package/backend/dist/types/index.d.ts +7 -0
  26. package/backend/dist/types/index.d.ts.map +1 -1
  27. package/backend/dist/types/index.js.map +1 -1
  28. package/backend/dist/utils/chatContext.d.ts +7 -0
  29. package/backend/dist/utils/chatContext.d.ts.map +1 -1
  30. package/backend/dist/utils/chatContext.js +13 -2
  31. package/backend/dist/utils/chatContext.js.map +1 -1
  32. package/backend/dist/utils/openAIResponsesAdapter.d.ts.map +1 -1
  33. package/backend/dist/utils/openAIResponsesAdapter.js +3 -1
  34. package/backend/dist/utils/openAIResponsesAdapter.js.map +1 -1
  35. package/backend/dist/utils/pluginChatAdapter.d.ts +1 -0
  36. package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
  37. package/backend/dist/utils/pluginChatAdapter.js +82 -19
  38. package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
  39. package/backend/dist/utils/pluginModelCatalog.d.ts +20 -0
  40. package/backend/dist/utils/pluginModelCatalog.d.ts.map +1 -1
  41. package/backend/dist/utils/pluginModelCatalog.js +101 -9
  42. package/backend/dist/utils/pluginModelCatalog.js.map +1 -1
  43. package/backend/dist/utils/thinkingOptions.d.ts +23 -3
  44. package/backend/dist/utils/thinkingOptions.d.ts.map +1 -1
  45. package/backend/dist/utils/thinkingOptions.js +35 -9
  46. package/backend/dist/utils/thinkingOptions.js.map +1 -1
  47. package/backend/dist/websocketServer.d.ts.map +1 -1
  48. package/backend/dist/websocketServer.js +1 -1
  49. package/backend/dist/websocketServer.js.map +1 -1
  50. package/backend/package.json +1 -1
  51. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  52. package/frontend/dist/assets/index-CDQ12KBq.js +34 -0
  53. package/frontend/dist/assets/index-DkFWzmFD.css +1 -0
  54. package/frontend/dist/index.html +11 -11
  55. package/frontend/dist/js/ArtifactContainer-B-hs0F5K.js +1 -0
  56. package/frontend/dist/js/{ArtifactDemoPage-TONeQvof.js → ArtifactDemoPage-QFtJw-u4.js} +1 -1
  57. package/frontend/dist/js/{ArtifactSandboxFrame-CV2XXu_t.js → ArtifactSandboxFrame-S9g_q47-.js} +2 -2
  58. package/frontend/dist/js/ArtifactSlideOutPanel-D0UOo8RW.js +1 -0
  59. package/frontend/dist/js/ChatPage-fdd8500b.js +23 -0
  60. package/frontend/dist/js/FirstTimeSetup-BTjafGOq.js +1 -0
  61. package/frontend/dist/js/GalleryPage-hR9AJ6b-.js +1 -0
  62. package/frontend/dist/js/HomePage-JvTzq-Pp.js +1 -0
  63. package/frontend/dist/js/LibreClawPage-CLJvtXft.js +1 -0
  64. package/frontend/dist/js/{ModelManagerModals-D0amaOnl.js → ModelManagerModals-DBmm_slu.js} +1 -1
  65. package/frontend/dist/js/ModelSelector-A-viVFEc.js +1 -0
  66. package/frontend/dist/js/ModelsPage-C4Rm-TZF.js +2 -0
  67. package/frontend/dist/js/NotesPage-C7bPU_KF.js +1 -0
  68. package/frontend/dist/js/{PersonasPage-DYP67Qiy.js → PersonasPage-DpvxbFzv.js} +2 -2
  69. package/frontend/dist/js/{PluginUsagePage-QtCgymRu.js → PluginUsagePage-laF-M2X9.js} +1 -1
  70. package/frontend/dist/js/{RichMessageContent-Bxi_u0gC.js → RichMessageContent-D0mK9vRA.js} +1 -1
  71. package/frontend/dist/js/SettingsModal-DNEQ5sTt.js +1 -0
  72. package/frontend/dist/js/{SystemPage-xFSTYdBS.js → SystemPage-Xr7XJv8c.js} +1 -1
  73. package/frontend/dist/js/{UserManagementPage-Cp430WCP.js → UserManagementPage-DGmbGTC2.js} +1 -1
  74. package/frontend/dist/js/WorkPage-DNKFD9gS.js +6 -0
  75. package/frontend/dist/js/{api-DUUxxx_B.js → api-DGVZHSkS.js} +2 -2
  76. package/frontend/dist/js/{appStore-CJtomipz.js → appStore-DXlmTjIC.js} +2 -2
  77. package/frontend/dist/js/ar-DW79oSyN.js +2 -0
  78. package/frontend/dist/js/{authStore-BckFDL70.js → authStore-B97lJ5Ee.js} +3 -3
  79. package/frontend/dist/js/bn-BEAmE7VH.js +2 -0
  80. package/frontend/dist/js/chatStore-zilBUd1p.js +3 -0
  81. package/frontend/dist/js/{config-CNVNpf_q.js → config-CmEh9o8U.js} +1 -1
  82. package/frontend/dist/js/cs-irpRMzRo.js +2 -0
  83. package/frontend/dist/js/da-cgilTVxc.js +2 -0
  84. package/frontend/dist/js/de-BU-eH3gU.js +2 -0
  85. package/frontend/dist/js/es-B2LRpZ0p.js +2 -0
  86. package/frontend/dist/js/{estree-D1TYSBcf.js → estree-CZO8RS52.js} +1 -1
  87. package/frontend/dist/js/fr-Cd5JM-oQ.js +2 -0
  88. package/frontend/dist/js/hi-CvOhdtiK.js +2 -0
  89. package/frontend/dist/js/{html-Dmddj0zf.js → html-C31pxhBG.js} +1 -1
  90. package/frontend/dist/js/id-BtRK5nR_.js +2 -0
  91. package/frontend/dist/js/is-CnEqwgRF.js +2 -0
  92. package/frontend/dist/js/it-CI6WjId6.js +2 -0
  93. package/frontend/dist/js/ja-B6gFOHi6.js +2 -0
  94. package/frontend/dist/js/ko-DuAhnmMf.js +2 -0
  95. package/frontend/dist/js/{markdown-Bl_LsHEk.js → markdown-C1CEqXpL.js} +1 -1
  96. package/frontend/dist/js/{messageCodeStyles-CgKxn4tN.js → messageCodeStyles-BqQ6kOSU.js} +2 -2
  97. package/frontend/dist/js/ms-C8BIP7MZ.js +2 -0
  98. package/frontend/dist/js/nl-DnEdspER.js +2 -0
  99. package/frontend/dist/js/pl-Ddyyvbse.js +2 -0
  100. package/frontend/dist/js/pt-BYuzm70F.js +2 -0
  101. package/frontend/dist/js/ru-CmSPFxPX.js +2 -0
  102. package/frontend/dist/js/{standalone-BWau8hEE.js → standalone-Dz0pkxn0.js} +1 -1
  103. package/frontend/dist/js/sv-Dd6SQ9f1.js +2 -0
  104. package/frontend/dist/js/th-CpH8745B.js +2 -0
  105. package/frontend/dist/js/tr-DuVD75iJ.js +2 -0
  106. package/frontend/dist/js/{typescript-DxGn3Yn-.js → typescript-DeXPhp90.js} +1 -1
  107. package/frontend/dist/js/{ui-jlx9WA5A.js → ui-CO0DPqrI.js} +2 -2
  108. package/frontend/dist/js/{ui-vendor-54SgntkX.js → ui-vendor-mqjSfAaS.js} +1 -1
  109. package/frontend/dist/js/uk-B0MU-M8k.js +2 -0
  110. package/frontend/dist/js/{vi-BgRaIrQC.js → vi-BLmFNp_z.js} +2 -2
  111. package/frontend/dist/js/{workApi-DWRpZ_cq.js → workApi-C4QtuhcE.js} +2 -2
  112. package/frontend/dist/js/zh-BQu0TLhw.js +2 -0
  113. package/package.json +1 -1
  114. package/frontend/dist/assets/index-BlTbxYPP.js +0 -33
  115. package/frontend/dist/assets/index-CbiWSGOj.css +0 -1
  116. package/frontend/dist/js/ArtifactContainer-C-n1vPsA.js +0 -1
  117. package/frontend/dist/js/ArtifactSlideOutPanel-2exw7YqL.js +0 -1
  118. package/frontend/dist/js/ChatPage-wnyG_TyC.js +0 -23
  119. package/frontend/dist/js/FirstTimeSetup-smhj0X6o.js +0 -1
  120. package/frontend/dist/js/GalleryPage-BZfeWlBg.js +0 -1
  121. package/frontend/dist/js/HomePage-gf4GgI6z.js +0 -1
  122. package/frontend/dist/js/LibreClawPage-CRKei1MM.js +0 -1
  123. package/frontend/dist/js/ModelSelector-C5Tn6y0p.js +0 -1
  124. package/frontend/dist/js/ModelsPage-Rbags4Xq.js +0 -2
  125. package/frontend/dist/js/NotesPage-9NR9HZZ8.js +0 -1
  126. package/frontend/dist/js/SettingsModal-B4RelkLP.js +0 -1
  127. package/frontend/dist/js/WorkPage-DFES41Qm.js +0 -6
  128. package/frontend/dist/js/ar-DMH3qbt6.js +0 -2
  129. package/frontend/dist/js/bn-CGDX8khx.js +0 -2
  130. package/frontend/dist/js/chatStore-DK-_wd-j.js +0 -3
  131. package/frontend/dist/js/cs-CJLgUk3m.js +0 -2
  132. package/frontend/dist/js/da-DnZMnCVM.js +0 -2
  133. package/frontend/dist/js/de-CWpguVQ5.js +0 -2
  134. package/frontend/dist/js/es-DVU1vjm0.js +0 -2
  135. package/frontend/dist/js/fr-pWnSnypD.js +0 -2
  136. package/frontend/dist/js/hi-B6xDfxA5.js +0 -2
  137. package/frontend/dist/js/id-BThSTUAG.js +0 -2
  138. package/frontend/dist/js/is-BOohDFie.js +0 -2
  139. package/frontend/dist/js/it-BdRArcCC.js +0 -2
  140. package/frontend/dist/js/ja-5Cq35sMr.js +0 -2
  141. package/frontend/dist/js/ko-BlzNRtpQ.js +0 -2
  142. package/frontend/dist/js/ms-CtGeurkZ.js +0 -2
  143. package/frontend/dist/js/nl-MKPHGjVF.js +0 -2
  144. package/frontend/dist/js/pl-BwBrqCey.js +0 -2
  145. package/frontend/dist/js/pt-CKzoHWBB.js +0 -2
  146. package/frontend/dist/js/ru-BQC4jh0Y.js +0 -2
  147. package/frontend/dist/js/sv-Cm0qXxzM.js +0 -2
  148. package/frontend/dist/js/th-DUPbiRI2.js +0 -2
  149. package/frontend/dist/js/tr-AsFu_Br5.js +0 -2
  150. package/frontend/dist/js/uk-DrMMOZ17.js +0 -2
  151. package/frontend/dist/js/zh-B4rcgcAy.js +0 -2
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/workApi-DWRpZ_cq.js","js/rolldown-runtime-hePW80VL.js","js/router-vendor-CbPDks39.js","js/markdown-core-BmPPZiuD.js","js/utils-vendor-DWh39_3x.js","js/logger-DSXjF4ye.js","js/config-CNVNpf_q.js"])))=>i.map(i=>d[i]);
2
- import{n as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,p as n}from"./router-vendor-CbPDks39.js";import{d as r,t as i}from"./chatStore-DK-_wd-j.js";import{o as a,t as o}from"./utils-vendor-DWh39_3x.js";import{i as s,t as c}from"./logger-DSXjF4ye.js";import{r as l,t as u}from"./workApi-DWRpZ_cq.js";import{h as d,u as f}from"./api-DUUxxx_B.js";import{t as p}from"./appStore-CJtomipz.js";var m=1e5,h=`[Earlier live output omitted]
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/workApi-C4QtuhcE.js","js/rolldown-runtime-hePW80VL.js","js/router-vendor-CbPDks39.js","js/markdown-core-BmPPZiuD.js","js/utils-vendor-DWh39_3x.js","js/logger-DSXjF4ye.js","js/config-CmEh9o8U.js"])))=>i.map(i=>d[i]);
2
+ import{n as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,p as n}from"./router-vendor-CbPDks39.js";import{g as r,t as i}from"./chatStore-zilBUd1p.js";import{o as a,t as o}from"./utils-vendor-DWh39_3x.js";import{i as s,t as c}from"./logger-DSXjF4ye.js";import{r as l,t as u}from"./workApi-C4QtuhcE.js";import{h as d,u as f}from"./api-DGVZHSkS.js";import{t as p}from"./appStore-DXlmTjIC.js";var m=1e5,h=`[Earlier live output omitted]
3
3
 
4
- `,g=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,_=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}},v=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t!=`string`||!t.trim())continue;let r=Number(t);if(Number.isFinite(r))return r}},y=(e,t)=>{let n=String(e||``).trim().toLowerCase().replace(/[\s-]+/g,`_`);return n===`queued`?`queued`:n===`preparing`||n===`starting`?`preparing`:n===`thinking`||n===`running`||n===`working`?`thinking`:n===`using_tool`||n===`tool`||n===`tool_call`?`using_tool`:n===`responding`||n===`streaming`||n===`assistant`?`responding`:n===`completed`||n===`complete`||n===`done`?`completed`:n===`needs_input`||n===`needsinput`||n===`blocked`?`needs_input`:n===`failed`||n===`error`?`failed`:n===`cancelled`||n===`canceled`||n===`stopped`?`cancelled`:t},b=(e,t)=>{let n=_(t,`total`);if(n!==void 0)return x(n);let r=_(t,`text`,`content`,`delta`,`reasoning`)||``;return t.replace===!0||t.cumulative===!0?x(r):x(e+r)},x=e=>{let t=e.startsWith(h),n=t?e.slice(31):e;return!t&&n.length<=m?n:t&&n.length<=99969?h+n:h+n.slice(-99969)},S=(e,t,n,r)=>{if(r===n)return e;if(r.startsWith(n)){let i=r.slice(n.length),a=e[e.length-1];return a&&a.kind===t?[...e.slice(0,-1),{kind:t,text:x(a.text+i)}]:[...e,{kind:t,text:x(i)}]}return[...e.filter(e=>e.kind!==t),{kind:t,text:r}]},C=(e,t)=>e.some(e=>e.kind===`tool`&&e.toolId===t)?e:[...e,{kind:`tool`,toolId:t}],w=(e,t)=>{let n=g(e.usage)||e,r={...t};for(let[e,t]of[[`inputTokens`,[`inputTokens`,`input_tokens`,`promptTokens`,`prompt_tokens`]],[`outputTokens`,[`outputTokens`,`output_tokens`,`completionTokens`,`completion_tokens`]],[`reasoningTokens`,[`reasoningTokens`,`reasoning_tokens`]],[`cachedTokens`,[`cachedTokens`,`cached_tokens`]],[`totalTokens`,[`totalTokens`,`total_tokens`]],[`tokensPerSecond`,[`tokensPerSecond`,`tokens_per_second`]],[`durationMs`,[`durationMs`,`duration_ms`]]]){let i=v(n,...t);i!==void 0&&(r[e]=i)}return r.totalTokens===void 0&&(r.inputTokens!==void 0||r.outputTokens!==void 0)&&(r.totalTokens=(r.inputTokens||0)+(r.outputTokens||0)),r},T=(e,t)=>{let n=g(e.skill)||e,r=_(n,`name`,`title`,`skill`)||`Skill`;return{id:_(n,`id`,`skillId`,`skill_id`)||`${r}-${t}`,name:r,description:_(n,`description`,`summary`)}},E=(e,t,n)=>{let r=g(e.tool)||e,i=g(r.message),a=i?g(i.metadata):void 0,o=a?{...a,...r}:r,s=_(o,`name`,`toolName`,`tool_name`,`function`)||`tool`;return{id:_(o,`id`,`toolCallId`,`tool_call_id`,`callId`)||`${s}-${n}`,name:s,status:o.isError===!0||o.is_error===!0?`error`:`running`,arguments:o.arguments??o.input??o.args??o.parameters??void 0,metadata:g(o.metadata)||a,startedAt:v(o,`startedAt`,`started_at`,`timestamp`)||t}},D=(e,t)=>Array.isArray(e)?e.flatMap((e,n)=>{let r=g(e);if(!r)return[];let i=E(r,t,n),a=_(r,`output`,`content`,`result`),o=y(r.status,`using_tool`);return[{...i,status:r.isError===!0||r.is_error===!0?`error`:o===`completed`?`completed`:i.status,output:a,finishedAt:v(r,`finishedAt`,`finished_at`),durationMs:v(r,`durationMs`,`duration_ms`)}]}):[],O=(e,t,n)=>({taskId:e,runId:t,connection:`idle`,phase:`queued`,lastEventId:0,reasoning:``,response:``,timeline:[],tools:[],skills:[],startedAt:n,terminal:!1}),k=(e,t)=>{let n=g(t.data.liveRun)||g(t.data.live_run)||g(t.data.run)||t.data,r=g(t.data.task)||g(t.data.detail),i=r?g(r.activeRun):void 0,a=_(n,`reasoning`,`thinking`),o=_(n,`response`,`assistant`,`content`),s=y(n.phase??n.status??i?.status??r?.status,e.phase),c=e.lastEventId>0&&s!==`completed`&&s!==`needs_input`&&s!==`failed`&&s!==`cancelled`&&n.phase===void 0?e.phase:s,l=D(n.tools??n.toolActivities??n.tool_activities,t.timestamp),u=n.skills,d=Array.isArray(u)?u.flatMap((e,t)=>{let n=g(e);return n?[T(n,t)]:[]}):e.skills,f=n.terminal===!0||c===`completed`||c===`needs_input`||c===`failed`||c===`cancelled`,p=a===void 0?e.reasoning:x(a),m=o===void 0?e.response:x(o),h=l.length>0?l:e.tools,b=S(e.timeline,`reasoning`,e.reasoning,p);for(let e of h)b=C(b,e.id);return b=S(b,`response`,e.response,m),{...e,phase:c,reasoning:p,response:m,timeline:b,tools:h,skills:d,usage:g(n.usage)?w(n,e.usage):e.usage,round:v(n,`round`,`roundIndex`,`round_index`)??e.round,roundLimit:v(n,`roundLimit`,`round_limit`)??e.roundLimit,startedAt:v(n,`startedAt`,`started_at`)??(i?v(i,`startedAt`,`started_at`):void 0)??e.startedAt,finishedAt:v(n,`finishedAt`,`finished_at`)??e.finishedAt,error:_(n,`error`,`message`)??e.error,terminal:f}},A=(e,t)=>{let n=e.findIndex(e=>e.id===t.id);if(n===-1)return[...e,t];let r=[...e];return r[n]={...e[n],...t},r},ee=(e,t)=>{let n=e?.taskId===t.taskId&&e.runId===t.runId?e:O(t.taskId,t.runId,t.timestamp);if(t.type!==`snapshot`&&t.id<=n.lastEventId)return n;let r={...n,connection:`connected`,connectionError:void 0,lastEventId:Math.max(n.lastEventId,t.id)};if(t.type===`snapshot`)r=k(r,t);else if(t.type===`run_state`){let e=y(t.data.phase??t.data.status??t.data.state,r.phase);r={...r,phase:e,round:v(t.data,`round`,`roundIndex`,`round_index`)??r.round,roundLimit:v(t.data,`roundLimit`,`round_limit`)??r.roundLimit,startedAt:v(t.data,`startedAt`,`started_at`)??r.startedAt,terminal:r.terminal||e===`completed`||e===`needs_input`||e===`failed`||e===`cancelled`}}else if(t.type===`reasoning_delta`){let e=b(r.reasoning,t.data);r={...r,phase:`thinking`,reasoning:e,timeline:S(r.timeline,`reasoning`,r.reasoning,e)}}else if(t.type===`assistant_delta`){let e=b(r.response,t.data);r={...r,phase:`responding`,response:e,timeline:S(r.timeline,`response`,r.response,e)}}else if(t.type===`tool_call`){let e=E(t.data,t.timestamp,r.tools.length);r={...r,phase:`using_tool`,tools:A(r.tools,e),timeline:C(r.timeline,e.id)}}else if(t.type===`tool_result`){let e=E(t.data,t.timestamp,r.tools.length),n=r.tools.find(t=>t.id===e.id),i=t.data.isError===!0||t.data.is_error===!0||t.data.error===!0;r={...r,phase:`thinking`,tools:A(r.tools,{...n,...e,status:i?`error`:`completed`,arguments:n?.arguments??e.arguments,startedAt:n?.startedAt??e.startedAt,output:_(t.data,`output`,`content`,`result`,`message`)||``,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,durationMs:v(t.data,`durationMs`,`duration_ms`)})}}else if(t.type===`usage`)r={...r,usage:w(t.data,r.usage)};else if(t.type===`skill_loaded`){let e=T(t.data,r.skills.length);r={...r,skills:r.skills.some(t=>t.id===e.id)?r.skills:[...r.skills,e]}}else if(t.type===`error`)r={...r,phase:`failed`,error:_(t.data,`message`,`error`)||`The Work run stopped unexpectedly.`,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:t.data.terminal!==!1};else if(t.type===`done`){let e=y(t.data.status??t.data.state??t.data.phase,`completed`);r={...r,phase:e,error:_(t.data,`error`,`message`)??r.error,usage:g(t.data.usage)?w(t.data,r.usage):r.usage,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:!0}}return r},j=(e,t)=>Error(t?.error||t?.message||e),M=(e,t)=>{if(typeof e==`object`&&e&&`response`in e){let t=e.response,n=t?.data?.error||t?.data?.message;if(n)return n}return e instanceof Error&&e.message?e.message:t},te=e=>typeof e==`object`&&!!e&&`response`in e&&e.response?.status===409,ne=2500,re=24,N=new Map,P=e=>[...e].sort((e,t)=>t.updatedAt-e.updatedAt||t.createdAt-e.createdAt||e.id.localeCompare(t.id)),ie=({messages:e,messageCursor:t,hasMoreMessages:n,...r})=>r,F=(e,t)=>{let n=new Map(e.map(e=>[e.id,e]));for(let e of t)n.set(e.id,e);return[...n.values()].sort((e,t)=>e.messageIndex-t.messageIndex||e.createdAt-t.createdAt||e.id.localeCompare(t.id))},I=(e,t)=>{if(!e||e.id!==t.id)return t;let n=e.updatedAt>t.updatedAt?{...t,...e}:{...e,...t};if(e.messages.length===0)return{...n,messages:t.messages,messageCursor:t.messageCursor,hasMoreMessages:t.hasMoreMessages};let r=Math.max(...e.messages.map(e=>e.messageIndex)),i=Math.min(...t.messages.map(e=>e.messageIndex)),a=t.messages.length>0&&r+1<i;return{...n,messages:F(e.messages,t.messages),messageCursor:a?t.messageCursor:e.messageCursor,hasMoreMessages:a?t.hasMoreMessages:e.hasMoreMessages}},L=(e,t)=>{let n=e.find(e=>e.id===t.id);if(n&&n.updatedAt>t.updatedAt)return e;let r=ie(t),i=e.findIndex(e=>e.id===t.id);if(i===-1)return[r,...e];let a=[...e];return a[i]=r,a},R=(e,t)=>{let n=new Map(t.map(e=>[e.id,e])),r=new Set(e.map(e=>e.id)),i=P(t.filter(e=>!r.has(e.id))),a=e.flatMap(e=>{let t=n.get(e.id);return t?[e.updatedAt>t.updatedAt?e:t]:[]});return[...i,...a]},z=a((e,t)=>{let n=0,r=0,i=0,a=0,o=0,s=null,c=0,l=0,d=0,f=null,p=0,m=new Set,h=new Set,g=new Map,_=(e,t)=>`${e}\u0000${t}`,v=e=>e===n,y=e=>{if(!v(e))throw Error(`Work session changed.`)},b=()=>{l+=1,d+=1,f=null,h.clear()},x=()=>{let t=++c;return h.add(t),e({loadingFiles:!0}),t},S=(n,r,i)=>{h.delete(n),v(r)&&t().selectedTaskId===i&&e({loadingFiles:h.size>0})},C=e=>t().selectedTaskId===e,w=t=>{let n=++p;return g.set(n,t),C(t)&&e({actionLoading:!0,error:null}),n},T=(n,r)=>{if(g.delete(n),!v(r))return;let i=t().selectedTaskId;e({actionLoading:[...g.values()].some(e=>e===i)})},E=(t,n,r)=>{v(n)&&C(t)&&e({error:r})},D=(t,r=n,i=!1)=>{v(r)&&(i&&(o+=1),e(e=>({tasks:L(e.tasks,t),selectedTask:e.selectedTaskId===t.id?I(e.selectedTask,t):e.selectedTask})))},k=async(e,t,r)=>{let i=n,a=w(r);try{let n=await e();if(y(i),!n.success||!n.data)throw j(t,n);return D(n.data,i,!0),n.data}catch(e){let n=M(e,t);throw E(r,i,n),Error(n)}finally{T(a,i)}};return{capabilities:null,tasks:[],selectedTaskId:null,selectedTask:null,files:[],selectedFile:null,liveRuns:{},loadingTasks:!1,loadingTask:!1,loadingOlderMessages:!1,loadingFiles:!1,actionLoading:!1,error:null,loadCapabilities:async()=>{let t=n;try{let n=await u.capabilities();if(y(t),!n.success||!n.data)throw j(`Could not inspect the Work runtime.`,n);e({capabilities:n.data})}catch(n){v(t)&&e({capabilities:{available:!1,runtime:`docker`,image:``,reason:M(n,`The Work runtime is unavailable.`)}})}},loadTasks:async(t=!1)=>{let c=n,l=++r,d=o;t||(i=l,m.add(l),e({loadingTasks:!0,error:null}));try{let t=await u.listTasks();if(y(c),!t.success||!t.data)throw j(`Could not load Work tasks.`,t);let n=P(t.data);if(l<=a||d!==o)return;a=l,e(e=>{let t=R(e.tasks,n),r=e.selectedTaskId?t.find(t=>t.id===e.selectedTaskId):void 0,i=r&&e.selectedTask?{...e.selectedTask,...r,messages:e.selectedTask.messages,messageCursor:e.selectedTask.messageCursor,hasMoreMessages:e.selectedTask.hasMoreMessages}:e.selectedTask,a=s,o=a!==null&&l>a.requestId;return o&&(s=null),{tasks:t,selectedTask:i,...o&&e.error===a.message?{error:null}:{}}})}catch(n){let r=M(n,`Could not load Work tasks.`);!t&&v(c)&&l===i&&l>a&&d===o&&(s={requestId:l,message:r},e({error:r}))}finally{m.delete(l),!t&&v(c)&&e({loadingTasks:m.size>0})}},selectTask:t=>{b(),e(e=>({selectedTaskId:t,selectedTask:t&&e.selectedTask?.id===t?e.selectedTask:null,files:[],selectedFile:null,loadingFiles:!1,loadingOlderMessages:!1,actionLoading:[...g.values()].some(e=>e===t),error:null}))},loadTask:async(t,r=!1)=>{let i=n;r||e({loadingTask:!0,error:null});try{let e=await u.getTask(t);if(y(i),!e.success||!e.data)throw j(`Could not load this Work task.`,e);return D(e.data,i),e.data}catch(t){let n=M(t,`Could not load this Work task.`);throw!r&&v(i)&&e({error:n}),Error(n)}finally{!r&&v(i)&&e({loadingTask:!1})}},loadOlderMessages:async r=>{let i=n,a=t().selectedTask,o=a?.id===r?a.messageCursor:void 0;if(!a||a.id!==r||!a.hasMoreMessages||o===void 0)return[];e({loadingOlderMessages:!0,error:null});try{let t=await u.getMessages(r,o);if(y(i),!t.success||!t.data)throw j(`Could not load older Work messages.`,t);let n=t.data;return e(e=>{if(e.selectedTask?.id!==r)return{};let t=e.selectedTask.messageCursor===o;return{selectedTask:{...e.selectedTask,messages:F(e.selectedTask.messages,n.messages),messageCursor:t?n.cursor:e.selectedTask.messageCursor,hasMoreMessages:t?n.hasMore:e.selectedTask.hasMoreMessages}}}),n.messages}catch(n){let a=M(n,`Could not load older Work messages.`);throw v(i)&&t().selectedTaskId===r&&e({error:a}),Error(a)}finally{v(i)&&t().selectedTaskId===r&&e({loadingOlderMessages:!1})}},createTask:e=>k(()=>u.createTask(e),`Could not create the Work task.`,null),updateTask:(e,t)=>k(()=>u.updateTask(e,t),`Could not update the Work task.`,e),deleteTask:async r=>{let i=n,a=w(r);try{let n=await u.deleteTask(r);if(y(i),!n.success)throw j(`Could not delete the Work task.`,n);t().selectedTaskId===r&&b(),o+=1,e(e=>({tasks:e.tasks.filter(e=>e.id!==r),selectedTaskId:e.selectedTaskId===r?null:e.selectedTaskId,selectedTask:e.selectedTaskId===r?null:e.selectedTask,files:e.selectedTaskId===r?[]:e.files,selectedFile:e.selectedTaskId===r?null:e.selectedFile,liveRuns:Object.fromEntries(Object.entries(e.liveRuns).filter(([e])=>e!==r))}))}catch(e){let t=M(e,`Could not delete the Work task.`);throw E(r,i,t),Error(t)}finally{T(a,i)}},startRun:async(e,t)=>{let r=n,i=w(e);try{let n=await u.startRun(e,t);if(y(r),!n.success||!n.data)throw j(`Could not start the Work run.`,n);return D(n.data,r,!0),n.data}catch(t){let n=M(t,`Could not start the Work run.`);throw E(e,r,n),Error(n)}finally{T(i,r)}},cancelRun:async e=>{let r=n,i=w(e);try{let n=await u.cancelRun(e);if(y(r),!n.success)throw j(`Could not cancel the Work run.`,n);return n.data?(D(n.data,r,!0),n.data):(o+=1,await t().loadTask(e,!0))}catch(t){let n=M(t,`Could not cancel the Work run.`);throw E(e,r,n),Error(n)}finally{T(i,r)}},beginLiveRun:(t,n,r)=>{e(e=>{let i=e.liveRuns[t];return{liveRuns:{...e.liveRuns,[t]:i?.runId===n?{...i,startedAt:i.startedAt??r}:O(t,n,r)}}})},applyRunEvent:e=>{t().applyRunEvents([e])},applyRunEvents:t=>{t.length!==0&&e(e=>{let n={...e.liveRuns},r=e.tasks,i=e.selectedTask;for(let a of t){n[a.taskId]=ee(n[a.taskId],a);let t=a.type===`snapshot`?a.data.task??a.data.detail:void 0,o=t&&typeof t==`object`&&!Array.isArray(t)&&t.id===a.taskId&&Array.isArray(t.messages)?t:void 0;o&&(r=L(r,o),e.selectedTaskId===o.id&&(i=I(i,o)))}return{liveRuns:n,tasks:r,selectedTask:i}})},setLiveRunConnection:(t,n,r,i)=>{e(e=>{let a=e.liveRuns[t];return!a||a.runId!==n?{}:{liveRuns:{...e.liveRuns,[t]:{...a,connection:r,connectionError:i}}}})},clearLiveRun:(t,n)=>{e(e=>{if(n&&e.liveRuns[t]?.runId!==n)return{};let r={...e.liveRuns};return delete r[t],{liveRuns:r}})},loadFiles:async(r,i=``)=>{let a=n,o=++l,s=x();try{let n=await u.listFiles(r,i);if(y(a),!n.success||!n.data)throw j(`Could not load workspace files.`,n);return o===l&&t().selectedTaskId===r&&(N.delete(r),e({files:n.data})),n.data}catch(n){let s=o===l&&v(a)&&t().selectedTaskId===r;if(te(n)){let e=N.get(r)??0;return s&&e<re&&(N.set(r,e+1),setTimeout(()=>{o===l&&v(a)&&t().selectedTaskId===r&&t().loadFiles(r,i).catch(()=>void 0)},ne)),t().files}let c=M(n,`Could not load workspace files.`);throw s&&e({error:c}),Error(c)}finally{S(s,a,r)}},loadFile:async(r,i)=>{let a=n,o=++d,s=_(r,i);f=s;let c=x();try{let n=await u.getFile(r,i);if(y(a),!n.success||!n.data)throw j(`Could not open this workspace file.`,n);if(o!==d||f!==s||!v(a)||t().selectedTaskId!==r)throw Error(`Work file request was superseded.`);return e({selectedFile:n.data}),n.data}catch(n){let i=M(n,`Could not open this file.`);throw o===d&&v(a)&&t().selectedTaskId===r&&e({error:i}),Error(i)}finally{S(c,a,r)}},clearSelectedFile:()=>{d+=1,f=null,e({selectedFile:null})},saveFile:async(r,i,a,o)=>{let s=n,c=w(r),l=_(r,i);f===l&&(d+=1,f=null);try{let n=await u.saveFile(r,i,a,o);if(y(s),!n.success||!n.data)throw j(`Could not save this workspace file.`,n);return t().selectedTaskId===r&&t().selectedFile?.path===i&&(f===l&&(d+=1,f=null),e({selectedFile:n.data})),n.data}catch(e){let t=M(e,`Could not save this file.`);throw E(r,s,t),Error(t)}finally{T(c,s)}},startPreview:(e,t)=>k(()=>u.startPreview(e,t),`Could not start the workspace preview.`,e),stopPreview:e=>k(()=>u.stopPreview(e),`Could not stop the workspace preview.`,e),clearError:()=>e({error:null}),clearAllState:()=>{n+=1,i=++r,a=i,o+=1,s=null,m.clear(),g.clear(),b(),e({capabilities:null,tasks:[],selectedTaskId:null,selectedTask:null,files:[],selectedFile:null,liveRuns:{},loadingTasks:!1,loadingTask:!1,loadingOlderMessages:!1,loadingFiles:!1,actionLoading:!1,error:null})}}}),B=async(e,t,n)=>{let r=await t(e);return r.success&&await n(),r},V=c(`store:plugin-store`),H=a((e,t)=>({plugins:[],pluginStatus:[],pluginVariables:{},isLoading:!1,isUploading:!1,error:null,loadPlugins:async()=>{e({isLoading:!0,error:null});try{let t=await f.getAllPlugins();t.success&&t.data?e({plugins:t.data}):e({error:t.error||`Failed to load plugins`})}catch(t){e({error:r(t,`Failed to load plugins`)})}finally{e({isLoading:!1})}},uploadPlugin:async n=>{e({isUploading:!0,error:null});try{let r=await f.uploadPlugin(n);r.success&&r.data?await t().loadPlugins():e({error:r.error||`Failed to upload plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to upload plugin`})}finally{e({isUploading:!1})}},installPlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.installPlugin(n);r.success&&r.data?await t().loadPlugins():e({error:r.error||`Failed to install plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to install plugin`})}finally{e({isLoading:!1})}},updatePlugin:async(n,r)=>{e({isLoading:!0,error:null});try{let i=await f.updatePlugin(n,r);i.success&&i.data?await t().loadPlugins():e({error:i.error||`Failed to update plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to update plugin`})}finally{e({isLoading:!1})}},deletePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.deletePlugin(n);r.success?await t().loadPlugins():e({error:r.error||`Failed to delete plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to delete plugin`})}finally{e({isLoading:!1})}},activatePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await B(n,f.activatePlugin,()=>t().loadPlugins());r.success||e({error:r.error||`Failed to activate plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to activate plugin`})}finally{e({isLoading:!1})}},deactivatePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.deactivatePlugin(n);r.success?await t().loadPlugins():e({error:r.error||`Failed to deactivate plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to deactivate plugin`})}finally{e({isLoading:!1})}},loadPluginStatus:async()=>{try{let t=await f.getPluginStatus();t.success&&t.data&&e({pluginStatus:t.data})}catch(e){V.error(`Failed to load plugin status:`,e)}},exportPlugin:async t=>{e({isLoading:!0,error:null});try{let e=await f.exportPlugin(t),n=window.URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`${t}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n)}catch(t){e({error:t instanceof Error?t.message:`Failed to export plugin`})}finally{e({isLoading:!1})}},fetchPluginVariables:async t=>{try{let n=await f.getVariables(t);n.success&&n.data&&e(e=>({pluginVariables:{...e.pluginVariables,[t]:n.data}}))}catch(e){V.error(`Failed to fetch plugin variables:`,e)}},updatePluginVariables:async(e,n,r=[])=>{try{return(await f.setVariables(e,n,r)).success?(await t().fetchPluginVariables(e),!0):!1}catch(e){return V.error(`Failed to update plugin variables:`,e),!1}},resetPluginVariables:async t=>{try{let n=await f.resetVariables(t);return n.success&&n.data===!0?(e(e=>{let n={...e.pluginVariables};return delete n[t],{pluginVariables:n}}),!0):!1}catch(e){return V.error(`Failed to reset plugin variables:`,e),!1}},clearError:()=>e({error:null}),setError:t=>e({error:t})})),U=`libre-webui:work-draft:`,W=(e,t)=>`${U}${e}:${t}`,ae=(e,t)=>{try{let n=window.sessionStorage.getItem(W(e,t));if(!n)return null;let r=JSON.parse(n);return typeof r.content==`string`?{content:r.content,baseUpdatedAt:typeof r.baseUpdatedAt==`number`?r.baseUpdatedAt:void 0}:null}catch{return null}},oe=(e,t,n)=>{try{return window.sessionStorage.setItem(W(e,t),JSON.stringify(n)),!0}catch{return!1}},se=(e,t)=>{try{window.sessionStorage.removeItem(W(e,t))}catch{}},ce=e=>{let t=`${U}${e}:`;try{for(let e=window.sessionStorage.length-1;e>=0;e--){let n=window.sessionStorage.key(e);n?.startsWith(t)&&window.sessionStorage.removeItem(n)}}catch{}},G=()=>{try{for(let e=window.sessionStorage.length-1;e>=0;e--){let t=window.sessionStorage.key(e);t?.startsWith(U)&&window.sessionStorage.removeItem(t)}}catch{}},le=`/ws/work-terminal`;function K(e,t,n){let r;try{r=new URL(e)}catch{throw Error(`${t} must be an absolute URL.`)}if(!n.includes(r.protocol))throw Error(`${t} must use ${n.join(` or `)}.`);if(r.username||r.password||r.search||r.hash)throw Error(`${t} must not contain credentials, a query, or a fragment.`);return r}function q(e){return e.replace(/\/+$/,``)}function ue(e){return q(K(e,`VITE_WS_BASE_URL`,[`ws:`,`wss:`]).toString())}function de(e){let t=K(e,`VITE_API_BASE_URL`,[`http:`,`https:`]);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=t.pathname.replace(/\/api\/?$/,``),q(t.toString())}function J(e){let t=e.websocketBaseUrl?.trim();if(t)return ue(t);if(e.protocol===`file:`)return`ws://localhost:3001`;let n=e.apiBaseUrl?.trim();if(n)return de(n);let r=e.protocol===`https:`?`wss:`:`ws:`;return e.production?`${r}//${e.host}`:`${r}//${e.hostname}:3001`}function Y(e,t,n){let r=J(t),i=new URL(`${r}/${e.replace(/^\/+/,``)}`);for(let[e,t]of Object.entries(n))i.searchParams.set(e,t);return i.toString()}function fe(e,t){return Y(`/ws`,t,{ticket:e})}function pe(e,t,n){return Y(le,n,{taskId:e,ticket:t})}var X=c(`websocket`),Z=new class{constructor(){n(this,`ws`,null),n(this,`urlEnvironment`,void 0),n(this,`reconnectAttempts`,0),n(this,`maxReconnectAttempts`,5),n(this,`reconnectDelay`,1e3),n(this,`messageHandlers`,new Map),n(this,`connectPromise`,null),n(this,`shouldReconnect`,!1),n(this,`connectionEpoch`,0),this.urlEnvironment={protocol:window.location.protocol,host:window.location.host,hostname:window.location.hostname,apiBaseUrl:void 0,websocketBaseUrl:void 0,production:!0},X.debug(`WebSocket base URL resolved:`,J(this.urlEnvironment))}connect(){if(s())return X.debug(`Demo mode active: skipping WebSocket connection.`),Promise.resolve();if(this.ws?.readyState===WebSocket.OPEN)return Promise.resolve();if(this.connectPromise)return this.connectPromise;this.shouldReconnect=!0;let e=++this.connectionEpoch,t=this.openWithTicket(e).finally(()=>{this.connectPromise===t&&(this.connectPromise=null)});return this.connectPromise=t,t}async openWithTicket(e){let t;try{t=await l.post(`/auth/websocket-ticket`,{audience:`chat`})}catch(t){throw this.shouldReconnect&&e===this.connectionEpoch&&this.attemptReconnect(),t}let n=t.data.data?.ticket;if(!n)throw Error(`The server did not issue a WebSocket ticket.`);if(!(!this.shouldReconnect||e!==this.connectionEpoch))return X.debug(`WebSocket: Attempting to connect`),new Promise((t,r)=>{try{let i=fe(n,this.urlEnvironment);X.debug(`WebSocket: Connecting with a one-use ticket`);let a=new WebSocket(i);this.ws=a,a.onopen=()=>{if(!this.shouldReconnect||e!==this.connectionEpoch){a.close(),t();return}X.debug(`WebSocket connected successfully`),this.reconnectAttempts=0,t()},a.onmessage=e=>{try{let t=JSON.parse(e.data),n=this.messageHandlers.get(t.type);n?n(t.data):t.type===`connected`?X.debug(`WebSocket: Server confirmed connection`):X.warn(`WebSocket: No handler for message type:`,t.type)}catch(e){X.error(`Failed to parse WebSocket message:`,e)}},a.onclose=()=>{if(X.debug(`WebSocket disconnected`),this.ws===a&&(this.ws=null),e!==this.connectionEpoch){t();return}this.shouldReconnect&&this.attemptReconnect()},a.onerror=n=>{if(e!==this.connectionEpoch){t();return}X.error(`WebSocket error:`,n),r(n)}}catch(e){r(e)}})}disconnect(){this.shouldReconnect=!1,this.connectionEpoch+=1,this.connectPromise=null,this.ws&&(this.ws.close(),this.ws=null)}reconnect(){return this.disconnect(),this.connect()}send(e){return this.ws&&this.ws.readyState===WebSocket.OPEN?(X.debug(`WebSocket: Sending message:`,e),this.ws.send(JSON.stringify(e)),!0):(X.warn(`WebSocket is not connected. ReadyState:`,this.ws?.readyState),!1)}onMessage(e,t){this.messageHandlers.delete(e),this.messageHandlers.set(e,t)}offMessage(e){this.messageHandlers.delete(e)}dispatchMessage(e,t){this.messageHandlers.get(e)?.(t)}attemptReconnect(){if(s()){X.debug(`Demo mode active: skipping WebSocket reconnection.`);return}this.reconnectAttempts<this.maxReconnectAttempts?(this.reconnectAttempts++,X.debug(`Attempting to reconnect... (${this.reconnectAttempts}/${this.maxReconnectAttempts})`),setTimeout(()=>{this.shouldReconnect&&this.connect().catch(()=>{})},this.reconnectDelay*this.reconnectAttempts)):X.error(`Max reconnection attempts reached`)}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}},me=e({useAuthStore:()=>$}),Q=c(`auth-store`),$=a()(o((e,n)=>({user:null,token:null,systemInfo:null,workAccess:null,isAuthenticated:!1,isLoading:!1,login:(t,r,a)=>{let o=n().user?.id===t.id;localStorage.setItem(`auth-token`,r);let c=i.getState();c.clearAllState&&c.clearAllState(),z.getState().clearAllState(),o||(G(),p.getState().clearUserState()),e({user:t,token:r,systemInfo:a,isAuthenticated:!0,isLoading:!1}),setTimeout(async()=>{try{let e=H.getState();Q.debug(`Reinitializing app after login...`),Q.debug(`Reconnecting WebSocket with auth token...`);try{await Z.reconnect()}catch(e){Q.warn(`WebSocket reconnect after login failed; continuing app initialization:`,e)}try{!(await d.checkHealth()).success&&!s()&&Q.warn(`Ollama service not available after login`)}catch(e){Q.warn(`Ollama health check failed after login; continuing provider initialization:`,e)}let t=p.getState();await Promise.all([c.loadModels(),c.loadSessions(),c.loadPreferences(),t.loadPreferences(),e.loadPlugins(),n().refreshWorkAccess()]),Q.debug(`Reinitialized app after login`)}catch(e){Q.error(`Failed to reinitialize app after login:`,e)}},100)},logout:()=>{localStorage.removeItem(`auth-token`),Q.debug(`Disconnecting WebSocket on logout...`),Z.disconnect();let t=i.getState();t.clearAllState&&t.clearAllState(),z.getState().clearAllState(),G(),p.getState().clearUserState(),e({user:null,token:null,workAccess:null,isAuthenticated:!1,isLoading:!1})},setUser:t=>{e({user:t})},setSystemInfo:t=>{e({systemInfo:t})},setLoading:t=>{e({isLoading:t})},isAdmin:()=>{let{user:e}=n();return e?.role===`admin`},requiresAuth:()=>{let{systemInfo:e}=n();return e?.requiresAuth??!1},canUseWork:()=>{let{systemInfo:e,user:t,workAccess:r}=n();return e?.requiresAuth===!1||t?.role===`admin`||r?.allowed===!0},canUseAgents:()=>{let{systemInfo:e,user:t}=n();return e?.agentsEnabled===!0?e?.requiresAuth===!1||t?.role===`admin`:!1},refreshWorkAccess:async()=>{try{let{workApi:n}=await t(async()=>{let{workApi:e}=await import(`./workApi-DWRpZ_cq.js`).then(e=>e.n);return{workApi:e}},__vite__mapDeps([0,1,2,3,4,5,6])),r=await n.access();r.success&&r.data&&e({workAccess:r.data})}catch(e){Q.debug(`Could not load Work access mode:`,e)}}}),{name:`auth-store`,partialize:e=>({user:e.user,token:e.token,systemInfo:e.systemInfo,workAccess:e.workAccess,isAuthenticated:e.isAuthenticated})}));export{se as a,oe as c,pe as i,H as l,$ as n,ce as o,Z as r,ae as s,me as t,z as u};
4
+ `,g=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,_=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}},v=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t!=`string`||!t.trim())continue;let r=Number(t);if(Number.isFinite(r))return r}},y=(e,t)=>{let n=String(e||``).trim().toLowerCase().replace(/[\s-]+/g,`_`);return n===`queued`?`queued`:n===`preparing`||n===`starting`?`preparing`:n===`thinking`||n===`running`||n===`working`?`thinking`:n===`using_tool`||n===`tool`||n===`tool_call`?`using_tool`:n===`responding`||n===`streaming`||n===`assistant`?`responding`:n===`completed`||n===`complete`||n===`done`?`completed`:n===`needs_input`||n===`needsinput`||n===`blocked`?`needs_input`:n===`failed`||n===`error`?`failed`:n===`cancelled`||n===`canceled`||n===`stopped`?`cancelled`:t},b=(e,t)=>{let n=_(t,`total`);if(n!==void 0)return x(n);let r=_(t,`text`,`content`,`delta`,`reasoning`)||``;return t.replace===!0||t.cumulative===!0?x(r):x(e+r)},x=e=>{let t=e.startsWith(h),n=t?e.slice(31):e;return!t&&n.length<=m?n:t&&n.length<=99969?h+n:h+n.slice(-99969)},S=(e,t,n,r)=>{if(r===n)return e;if(r.startsWith(n)){let i=r.slice(n.length),a=e[e.length-1];return a&&a.kind===t?[...e.slice(0,-1),{kind:t,text:x(a.text+i)}]:[...e,{kind:t,text:x(i)}]}return[...e.filter(e=>e.kind!==t),{kind:t,text:r}]},C=(e,t)=>e.some(e=>e.kind===`tool`&&e.toolId===t)?e:[...e,{kind:`tool`,toolId:t}],w=(e,t)=>{let n=g(e.usage)||e,r={...t};for(let[e,t]of[[`inputTokens`,[`inputTokens`,`input_tokens`,`promptTokens`,`prompt_tokens`]],[`outputTokens`,[`outputTokens`,`output_tokens`,`completionTokens`,`completion_tokens`]],[`reasoningTokens`,[`reasoningTokens`,`reasoning_tokens`]],[`cachedTokens`,[`cachedTokens`,`cached_tokens`]],[`totalTokens`,[`totalTokens`,`total_tokens`]],[`tokensPerSecond`,[`tokensPerSecond`,`tokens_per_second`]],[`durationMs`,[`durationMs`,`duration_ms`]]]){let i=v(n,...t);i!==void 0&&(r[e]=i)}return r.totalTokens===void 0&&(r.inputTokens!==void 0||r.outputTokens!==void 0)&&(r.totalTokens=(r.inputTokens||0)+(r.outputTokens||0)),r},T=(e,t)=>{let n=g(e.skill)||e,r=_(n,`name`,`title`,`skill`)||`Skill`;return{id:_(n,`id`,`skillId`,`skill_id`)||`${r}-${t}`,name:r,description:_(n,`description`,`summary`)}},E=(e,t,n)=>{let r=g(e.tool)||e,i=g(r.message),a=i?g(i.metadata):void 0,o=a?{...a,...r}:r,s=_(o,`name`,`toolName`,`tool_name`,`function`)||`tool`;return{id:_(o,`id`,`toolCallId`,`tool_call_id`,`callId`)||`${s}-${n}`,name:s,status:o.isError===!0||o.is_error===!0?`error`:`running`,arguments:o.arguments??o.input??o.args??o.parameters??void 0,metadata:g(o.metadata)||a,startedAt:v(o,`startedAt`,`started_at`,`timestamp`)||t}},D=(e,t)=>Array.isArray(e)?e.flatMap((e,n)=>{let r=g(e);if(!r)return[];let i=E(r,t,n),a=_(r,`output`,`content`,`result`),o=y(r.status,`using_tool`);return[{...i,status:r.isError===!0||r.is_error===!0?`error`:o===`completed`?`completed`:i.status,output:a,finishedAt:v(r,`finishedAt`,`finished_at`),durationMs:v(r,`durationMs`,`duration_ms`)}]}):[],O=(e,t,n)=>({taskId:e,runId:t,connection:`idle`,phase:`queued`,lastEventId:0,reasoning:``,response:``,timeline:[],tools:[],skills:[],startedAt:n,terminal:!1}),k=(e,t)=>{let n=g(t.data.liveRun)||g(t.data.live_run)||g(t.data.run)||t.data,r=g(t.data.task)||g(t.data.detail),i=r?g(r.activeRun):void 0,a=_(n,`reasoning`,`thinking`),o=_(n,`response`,`assistant`,`content`),s=y(n.phase??n.status??i?.status??r?.status,e.phase),c=e.lastEventId>0&&s!==`completed`&&s!==`needs_input`&&s!==`failed`&&s!==`cancelled`&&n.phase===void 0?e.phase:s,l=D(n.tools??n.toolActivities??n.tool_activities,t.timestamp),u=n.skills,d=Array.isArray(u)?u.flatMap((e,t)=>{let n=g(e);return n?[T(n,t)]:[]}):e.skills,f=n.terminal===!0||c===`completed`||c===`needs_input`||c===`failed`||c===`cancelled`,p=a===void 0?e.reasoning:x(a),m=o===void 0?e.response:x(o),h=l.length>0?l:e.tools,b=S(e.timeline,`reasoning`,e.reasoning,p);for(let e of h)b=C(b,e.id);return b=S(b,`response`,e.response,m),{...e,phase:c,reasoning:p,response:m,timeline:b,tools:h,skills:d,usage:g(n.usage)?w(n,e.usage):e.usage,round:v(n,`round`,`roundIndex`,`round_index`)??e.round,roundLimit:v(n,`roundLimit`,`round_limit`)??e.roundLimit,startedAt:v(n,`startedAt`,`started_at`)??(i?v(i,`startedAt`,`started_at`):void 0)??e.startedAt,finishedAt:v(n,`finishedAt`,`finished_at`)??e.finishedAt,error:_(n,`error`,`message`)??e.error,terminal:f}},A=(e,t)=>{let n=e.findIndex(e=>e.id===t.id);if(n===-1)return[...e,t];let r=[...e];return r[n]={...e[n],...t},r},ee=(e,t)=>{let n=e?.taskId===t.taskId&&e.runId===t.runId?e:O(t.taskId,t.runId,t.timestamp);if(t.type!==`snapshot`&&t.id<=n.lastEventId)return n;let r={...n,connection:`connected`,connectionError:void 0,lastEventId:Math.max(n.lastEventId,t.id)};if(t.type===`snapshot`)r=k(r,t);else if(t.type===`run_state`){let e=y(t.data.phase??t.data.status??t.data.state,r.phase);r={...r,phase:e,round:v(t.data,`round`,`roundIndex`,`round_index`)??r.round,roundLimit:v(t.data,`roundLimit`,`round_limit`)??r.roundLimit,startedAt:v(t.data,`startedAt`,`started_at`)??r.startedAt,terminal:r.terminal||e===`completed`||e===`needs_input`||e===`failed`||e===`cancelled`}}else if(t.type===`reasoning_delta`){let e=b(r.reasoning,t.data);r={...r,phase:`thinking`,reasoning:e,timeline:S(r.timeline,`reasoning`,r.reasoning,e)}}else if(t.type===`assistant_delta`){let e=b(r.response,t.data);r={...r,phase:`responding`,response:e,timeline:S(r.timeline,`response`,r.response,e)}}else if(t.type===`tool_call`){let e=E(t.data,t.timestamp,r.tools.length);r={...r,phase:`using_tool`,tools:A(r.tools,e),timeline:C(r.timeline,e.id)}}else if(t.type===`tool_result`){let e=E(t.data,t.timestamp,r.tools.length),n=r.tools.find(t=>t.id===e.id),i=t.data.isError===!0||t.data.is_error===!0||t.data.error===!0;r={...r,phase:`thinking`,tools:A(r.tools,{...n,...e,status:i?`error`:`completed`,arguments:n?.arguments??e.arguments,startedAt:n?.startedAt??e.startedAt,output:_(t.data,`output`,`content`,`result`,`message`)||``,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,durationMs:v(t.data,`durationMs`,`duration_ms`)})}}else if(t.type===`usage`)r={...r,usage:w(t.data,r.usage)};else if(t.type===`skill_loaded`){let e=T(t.data,r.skills.length);r={...r,skills:r.skills.some(t=>t.id===e.id)?r.skills:[...r.skills,e]}}else if(t.type===`error`)r={...r,phase:`failed`,error:_(t.data,`message`,`error`)||`The Work run stopped unexpectedly.`,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:t.data.terminal!==!1};else if(t.type===`done`){let e=y(t.data.status??t.data.state??t.data.phase,`completed`);r={...r,phase:e,error:_(t.data,`error`,`message`)??r.error,usage:g(t.data.usage)?w(t.data,r.usage):r.usage,finishedAt:v(t.data,`finishedAt`,`finished_at`)||t.timestamp,terminal:!0}}return r},j=(e,t)=>Error(t?.error||t?.message||e),M=(e,t)=>{if(typeof e==`object`&&e&&`response`in e){let t=e.response,n=t?.data?.error||t?.data?.message;if(n)return n}return e instanceof Error&&e.message?e.message:t},te=e=>typeof e==`object`&&!!e&&`response`in e&&e.response?.status===409,ne=2500,re=24,N=new Map,P=e=>[...e].sort((e,t)=>t.updatedAt-e.updatedAt||t.createdAt-e.createdAt||e.id.localeCompare(t.id)),ie=({messages:e,messageCursor:t,hasMoreMessages:n,...r})=>r,F=(e,t)=>{let n=new Map(e.map(e=>[e.id,e]));for(let e of t)n.set(e.id,e);return[...n.values()].sort((e,t)=>e.messageIndex-t.messageIndex||e.createdAt-t.createdAt||e.id.localeCompare(t.id))},I=(e,t)=>{if(!e||e.id!==t.id)return t;let n=e.updatedAt>t.updatedAt?{...t,...e}:{...e,...t};if(e.messages.length===0)return{...n,messages:t.messages,messageCursor:t.messageCursor,hasMoreMessages:t.hasMoreMessages};let r=Math.max(...e.messages.map(e=>e.messageIndex)),i=Math.min(...t.messages.map(e=>e.messageIndex)),a=t.messages.length>0&&r+1<i;return{...n,messages:F(e.messages,t.messages),messageCursor:a?t.messageCursor:e.messageCursor,hasMoreMessages:a?t.hasMoreMessages:e.hasMoreMessages}},L=(e,t)=>{let n=e.find(e=>e.id===t.id);if(n&&n.updatedAt>t.updatedAt)return e;let r=ie(t),i=e.findIndex(e=>e.id===t.id);if(i===-1)return[r,...e];let a=[...e];return a[i]=r,a},R=(e,t)=>{let n=new Map(t.map(e=>[e.id,e])),r=new Set(e.map(e=>e.id)),i=P(t.filter(e=>!r.has(e.id))),a=e.flatMap(e=>{let t=n.get(e.id);return t?[e.updatedAt>t.updatedAt?e:t]:[]});return[...i,...a]},z=a((e,t)=>{let n=0,r=0,i=0,a=0,o=0,s=null,c=0,l=0,d=0,f=null,p=0,m=new Set,h=new Set,g=new Map,_=(e,t)=>`${e}\u0000${t}`,v=e=>e===n,y=e=>{if(!v(e))throw Error(`Work session changed.`)},b=()=>{l+=1,d+=1,f=null,h.clear()},x=()=>{let t=++c;return h.add(t),e({loadingFiles:!0}),t},S=(n,r,i)=>{h.delete(n),v(r)&&t().selectedTaskId===i&&e({loadingFiles:h.size>0})},C=e=>t().selectedTaskId===e,w=t=>{let n=++p;return g.set(n,t),C(t)&&e({actionLoading:!0,error:null}),n},T=(n,r)=>{if(g.delete(n),!v(r))return;let i=t().selectedTaskId;e({actionLoading:[...g.values()].some(e=>e===i)})},E=(t,n,r)=>{v(n)&&C(t)&&e({error:r})},D=(t,r=n,i=!1)=>{v(r)&&(i&&(o+=1),e(e=>({tasks:L(e.tasks,t),selectedTask:e.selectedTaskId===t.id?I(e.selectedTask,t):e.selectedTask})))},k=async(e,t,r)=>{let i=n,a=w(r);try{let n=await e();if(y(i),!n.success||!n.data)throw j(t,n);return D(n.data,i,!0),n.data}catch(e){let n=M(e,t);throw E(r,i,n),Error(n)}finally{T(a,i)}};return{capabilities:null,tasks:[],selectedTaskId:null,selectedTask:null,files:[],selectedFile:null,liveRuns:{},loadingTasks:!1,loadingTask:!1,loadingOlderMessages:!1,loadingFiles:!1,actionLoading:!1,error:null,loadCapabilities:async()=>{let t=n;try{let n=await u.capabilities();if(y(t),!n.success||!n.data)throw j(`Could not inspect the Work runtime.`,n);e({capabilities:n.data})}catch(n){v(t)&&e({capabilities:{available:!1,runtime:`docker`,image:``,reason:M(n,`The Work runtime is unavailable.`)}})}},loadTasks:async(t=!1)=>{let c=n,l=++r,d=o;t||(i=l,m.add(l),e({loadingTasks:!0,error:null}));try{let t=await u.listTasks();if(y(c),!t.success||!t.data)throw j(`Could not load Work tasks.`,t);let n=P(t.data);if(l<=a||d!==o)return;a=l,e(e=>{let t=R(e.tasks,n),r=e.selectedTaskId?t.find(t=>t.id===e.selectedTaskId):void 0,i=r&&e.selectedTask?{...e.selectedTask,...r,messages:e.selectedTask.messages,messageCursor:e.selectedTask.messageCursor,hasMoreMessages:e.selectedTask.hasMoreMessages}:e.selectedTask,a=s,o=a!==null&&l>a.requestId;return o&&(s=null),{tasks:t,selectedTask:i,...o&&e.error===a.message?{error:null}:{}}})}catch(n){let r=M(n,`Could not load Work tasks.`);!t&&v(c)&&l===i&&l>a&&d===o&&(s={requestId:l,message:r},e({error:r}))}finally{m.delete(l),!t&&v(c)&&e({loadingTasks:m.size>0})}},selectTask:t=>{b(),e(e=>({selectedTaskId:t,selectedTask:t&&e.selectedTask?.id===t?e.selectedTask:null,files:[],selectedFile:null,loadingFiles:!1,loadingOlderMessages:!1,actionLoading:[...g.values()].some(e=>e===t),error:null}))},loadTask:async(t,r=!1)=>{let i=n;r||e({loadingTask:!0,error:null});try{let e=await u.getTask(t);if(y(i),!e.success||!e.data)throw j(`Could not load this Work task.`,e);return D(e.data,i),e.data}catch(t){let n=M(t,`Could not load this Work task.`);throw!r&&v(i)&&e({error:n}),Error(n)}finally{!r&&v(i)&&e({loadingTask:!1})}},loadOlderMessages:async r=>{let i=n,a=t().selectedTask,o=a?.id===r?a.messageCursor:void 0;if(!a||a.id!==r||!a.hasMoreMessages||o===void 0)return[];e({loadingOlderMessages:!0,error:null});try{let t=await u.getMessages(r,o);if(y(i),!t.success||!t.data)throw j(`Could not load older Work messages.`,t);let n=t.data;return e(e=>{if(e.selectedTask?.id!==r)return{};let t=e.selectedTask.messageCursor===o;return{selectedTask:{...e.selectedTask,messages:F(e.selectedTask.messages,n.messages),messageCursor:t?n.cursor:e.selectedTask.messageCursor,hasMoreMessages:t?n.hasMore:e.selectedTask.hasMoreMessages}}}),n.messages}catch(n){let a=M(n,`Could not load older Work messages.`);throw v(i)&&t().selectedTaskId===r&&e({error:a}),Error(a)}finally{v(i)&&t().selectedTaskId===r&&e({loadingOlderMessages:!1})}},createTask:e=>k(()=>u.createTask(e),`Could not create the Work task.`,null),updateTask:(e,t)=>k(()=>u.updateTask(e,t),`Could not update the Work task.`,e),deleteTask:async r=>{let i=n,a=w(r);try{let n=await u.deleteTask(r);if(y(i),!n.success)throw j(`Could not delete the Work task.`,n);t().selectedTaskId===r&&b(),o+=1,e(e=>({tasks:e.tasks.filter(e=>e.id!==r),selectedTaskId:e.selectedTaskId===r?null:e.selectedTaskId,selectedTask:e.selectedTaskId===r?null:e.selectedTask,files:e.selectedTaskId===r?[]:e.files,selectedFile:e.selectedTaskId===r?null:e.selectedFile,liveRuns:Object.fromEntries(Object.entries(e.liveRuns).filter(([e])=>e!==r))}))}catch(e){let t=M(e,`Could not delete the Work task.`);throw E(r,i,t),Error(t)}finally{T(a,i)}},startRun:async(e,t)=>{let r=n,i=w(e);try{let n=await u.startRun(e,t);if(y(r),!n.success||!n.data)throw j(`Could not start the Work run.`,n);return D(n.data,r,!0),n.data}catch(t){let n=M(t,`Could not start the Work run.`);throw E(e,r,n),Error(n)}finally{T(i,r)}},cancelRun:async e=>{let r=n,i=w(e);try{let n=await u.cancelRun(e);if(y(r),!n.success)throw j(`Could not cancel the Work run.`,n);return n.data?(D(n.data,r,!0),n.data):(o+=1,await t().loadTask(e,!0))}catch(t){let n=M(t,`Could not cancel the Work run.`);throw E(e,r,n),Error(n)}finally{T(i,r)}},beginLiveRun:(t,n,r)=>{e(e=>{let i=e.liveRuns[t];return{liveRuns:{...e.liveRuns,[t]:i?.runId===n?{...i,startedAt:i.startedAt??r}:O(t,n,r)}}})},applyRunEvent:e=>{t().applyRunEvents([e])},applyRunEvents:t=>{t.length!==0&&e(e=>{let n={...e.liveRuns},r=e.tasks,i=e.selectedTask;for(let a of t){n[a.taskId]=ee(n[a.taskId],a);let t=a.type===`snapshot`?a.data.task??a.data.detail:void 0,o=t&&typeof t==`object`&&!Array.isArray(t)&&t.id===a.taskId&&Array.isArray(t.messages)?t:void 0;o&&(r=L(r,o),e.selectedTaskId===o.id&&(i=I(i,o)))}return{liveRuns:n,tasks:r,selectedTask:i}})},setLiveRunConnection:(t,n,r,i)=>{e(e=>{let a=e.liveRuns[t];return!a||a.runId!==n?{}:{liveRuns:{...e.liveRuns,[t]:{...a,connection:r,connectionError:i}}}})},clearLiveRun:(t,n)=>{e(e=>{if(n&&e.liveRuns[t]?.runId!==n)return{};let r={...e.liveRuns};return delete r[t],{liveRuns:r}})},loadFiles:async(r,i=``)=>{let a=n,o=++l,s=x();try{let n=await u.listFiles(r,i);if(y(a),!n.success||!n.data)throw j(`Could not load workspace files.`,n);return o===l&&t().selectedTaskId===r&&(N.delete(r),e({files:n.data})),n.data}catch(n){let s=o===l&&v(a)&&t().selectedTaskId===r;if(te(n)){let e=N.get(r)??0;return s&&e<re&&(N.set(r,e+1),setTimeout(()=>{o===l&&v(a)&&t().selectedTaskId===r&&t().loadFiles(r,i).catch(()=>void 0)},ne)),t().files}let c=M(n,`Could not load workspace files.`);throw s&&e({error:c}),Error(c)}finally{S(s,a,r)}},loadFile:async(r,i)=>{let a=n,o=++d,s=_(r,i);f=s;let c=x();try{let n=await u.getFile(r,i);if(y(a),!n.success||!n.data)throw j(`Could not open this workspace file.`,n);if(o!==d||f!==s||!v(a)||t().selectedTaskId!==r)throw Error(`Work file request was superseded.`);return e({selectedFile:n.data}),n.data}catch(n){let i=M(n,`Could not open this file.`);throw o===d&&v(a)&&t().selectedTaskId===r&&e({error:i}),Error(i)}finally{S(c,a,r)}},clearSelectedFile:()=>{d+=1,f=null,e({selectedFile:null})},saveFile:async(r,i,a,o)=>{let s=n,c=w(r),l=_(r,i);f===l&&(d+=1,f=null);try{let n=await u.saveFile(r,i,a,o);if(y(s),!n.success||!n.data)throw j(`Could not save this workspace file.`,n);return t().selectedTaskId===r&&t().selectedFile?.path===i&&(f===l&&(d+=1,f=null),e({selectedFile:n.data})),n.data}catch(e){let t=M(e,`Could not save this file.`);throw E(r,s,t),Error(t)}finally{T(c,s)}},startPreview:(e,t)=>k(()=>u.startPreview(e,t),`Could not start the workspace preview.`,e),stopPreview:e=>k(()=>u.stopPreview(e),`Could not stop the workspace preview.`,e),clearError:()=>e({error:null}),clearAllState:()=>{n+=1,i=++r,a=i,o+=1,s=null,m.clear(),g.clear(),b(),e({capabilities:null,tasks:[],selectedTaskId:null,selectedTask:null,files:[],selectedFile:null,liveRuns:{},loadingTasks:!1,loadingTask:!1,loadingOlderMessages:!1,loadingFiles:!1,actionLoading:!1,error:null})}}}),B=async(e,t,n)=>{let r=await t(e);return r.success&&await n(),r},V=c(`store:plugin-store`),H=a((e,t)=>({plugins:[],pluginStatus:[],pluginVariables:{},isLoading:!1,isUploading:!1,error:null,loadPlugins:async()=>{e({isLoading:!0,error:null});try{let t=await f.getAllPlugins();t.success&&t.data?e({plugins:t.data}):e({error:t.error||`Failed to load plugins`})}catch(t){e({error:r(t,`Failed to load plugins`)})}finally{e({isLoading:!1})}},uploadPlugin:async n=>{e({isUploading:!0,error:null});try{let r=await f.uploadPlugin(n);r.success&&r.data?await t().loadPlugins():e({error:r.error||`Failed to upload plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to upload plugin`})}finally{e({isUploading:!1})}},installPlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.installPlugin(n);r.success&&r.data?await t().loadPlugins():e({error:r.error||`Failed to install plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to install plugin`})}finally{e({isLoading:!1})}},updatePlugin:async(n,r)=>{e({isLoading:!0,error:null});try{let i=await f.updatePlugin(n,r);i.success&&i.data?await t().loadPlugins():e({error:i.error||`Failed to update plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to update plugin`})}finally{e({isLoading:!1})}},deletePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.deletePlugin(n);r.success?await t().loadPlugins():e({error:r.error||`Failed to delete plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to delete plugin`})}finally{e({isLoading:!1})}},activatePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await B(n,f.activatePlugin,()=>t().loadPlugins());r.success||e({error:r.error||`Failed to activate plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to activate plugin`})}finally{e({isLoading:!1})}},deactivatePlugin:async n=>{e({isLoading:!0,error:null});try{let r=await f.deactivatePlugin(n);r.success?await t().loadPlugins():e({error:r.error||`Failed to deactivate plugin`})}catch(t){e({error:t instanceof Error?t.message:`Failed to deactivate plugin`})}finally{e({isLoading:!1})}},loadPluginStatus:async()=>{try{let t=await f.getPluginStatus();t.success&&t.data&&e({pluginStatus:t.data})}catch(e){V.error(`Failed to load plugin status:`,e)}},exportPlugin:async t=>{e({isLoading:!0,error:null});try{let e=await f.exportPlugin(t),n=window.URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`${t}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n)}catch(t){e({error:t instanceof Error?t.message:`Failed to export plugin`})}finally{e({isLoading:!1})}},fetchPluginVariables:async t=>{try{let n=await f.getVariables(t);n.success&&n.data&&e(e=>({pluginVariables:{...e.pluginVariables,[t]:n.data}}))}catch(e){V.error(`Failed to fetch plugin variables:`,e)}},updatePluginVariables:async(e,n,r=[])=>{try{return(await f.setVariables(e,n,r)).success?(await t().fetchPluginVariables(e),!0):!1}catch(e){return V.error(`Failed to update plugin variables:`,e),!1}},resetPluginVariables:async t=>{try{let n=await f.resetVariables(t);return n.success&&n.data===!0?(e(e=>{let n={...e.pluginVariables};return delete n[t],{pluginVariables:n}}),!0):!1}catch(e){return V.error(`Failed to reset plugin variables:`,e),!1}},clearError:()=>e({error:null}),setError:t=>e({error:t})})),U=`libre-webui:work-draft:`,W=(e,t)=>`${U}${e}:${t}`,ae=(e,t)=>{try{let n=window.sessionStorage.getItem(W(e,t));if(!n)return null;let r=JSON.parse(n);return typeof r.content==`string`?{content:r.content,baseUpdatedAt:typeof r.baseUpdatedAt==`number`?r.baseUpdatedAt:void 0}:null}catch{return null}},oe=(e,t,n)=>{try{return window.sessionStorage.setItem(W(e,t),JSON.stringify(n)),!0}catch{return!1}},se=(e,t)=>{try{window.sessionStorage.removeItem(W(e,t))}catch{}},ce=e=>{let t=`${U}${e}:`;try{for(let e=window.sessionStorage.length-1;e>=0;e--){let n=window.sessionStorage.key(e);n?.startsWith(t)&&window.sessionStorage.removeItem(n)}}catch{}},G=()=>{try{for(let e=window.sessionStorage.length-1;e>=0;e--){let t=window.sessionStorage.key(e);t?.startsWith(U)&&window.sessionStorage.removeItem(t)}}catch{}},le=`/ws/work-terminal`;function K(e,t,n){let r;try{r=new URL(e)}catch{throw Error(`${t} must be an absolute URL.`)}if(!n.includes(r.protocol))throw Error(`${t} must use ${n.join(` or `)}.`);if(r.username||r.password||r.search||r.hash)throw Error(`${t} must not contain credentials, a query, or a fragment.`);return r}function q(e){return e.replace(/\/+$/,``)}function ue(e){return q(K(e,`VITE_WS_BASE_URL`,[`ws:`,`wss:`]).toString())}function de(e){let t=K(e,`VITE_API_BASE_URL`,[`http:`,`https:`]);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=t.pathname.replace(/\/api\/?$/,``),q(t.toString())}function J(e){let t=e.websocketBaseUrl?.trim();if(t)return ue(t);if(e.protocol===`file:`)return`ws://localhost:3001`;let n=e.apiBaseUrl?.trim();if(n)return de(n);let r=e.protocol===`https:`?`wss:`:`ws:`;return e.production?`${r}//${e.host}`:`${r}//${e.hostname}:3001`}function Y(e,t,n){let r=J(t),i=new URL(`${r}/${e.replace(/^\/+/,``)}`);for(let[e,t]of Object.entries(n))i.searchParams.set(e,t);return i.toString()}function fe(e,t){return Y(`/ws`,t,{ticket:e})}function pe(e,t,n){return Y(le,n,{taskId:e,ticket:t})}var X=c(`websocket`),Z=new class{constructor(){n(this,`ws`,null),n(this,`urlEnvironment`,void 0),n(this,`reconnectAttempts`,0),n(this,`maxReconnectAttempts`,5),n(this,`reconnectDelay`,1e3),n(this,`messageHandlers`,new Map),n(this,`connectPromise`,null),n(this,`shouldReconnect`,!1),n(this,`connectionEpoch`,0),this.urlEnvironment={protocol:window.location.protocol,host:window.location.host,hostname:window.location.hostname,apiBaseUrl:void 0,websocketBaseUrl:void 0,production:!0},X.debug(`WebSocket base URL resolved:`,J(this.urlEnvironment))}connect(){if(s())return X.debug(`Demo mode active: skipping WebSocket connection.`),Promise.resolve();if(this.ws?.readyState===WebSocket.OPEN)return Promise.resolve();if(this.connectPromise)return this.connectPromise;this.shouldReconnect=!0;let e=++this.connectionEpoch,t=this.openWithTicket(e).finally(()=>{this.connectPromise===t&&(this.connectPromise=null)});return this.connectPromise=t,t}async openWithTicket(e){let t;try{t=await l.post(`/auth/websocket-ticket`,{audience:`chat`})}catch(t){throw this.shouldReconnect&&e===this.connectionEpoch&&this.attemptReconnect(),t}let n=t.data.data?.ticket;if(!n)throw Error(`The server did not issue a WebSocket ticket.`);if(!(!this.shouldReconnect||e!==this.connectionEpoch))return X.debug(`WebSocket: Attempting to connect`),new Promise((t,r)=>{try{let i=fe(n,this.urlEnvironment);X.debug(`WebSocket: Connecting with a one-use ticket`);let a=new WebSocket(i);this.ws=a,a.onopen=()=>{if(!this.shouldReconnect||e!==this.connectionEpoch){a.close(),t();return}X.debug(`WebSocket connected successfully`),this.reconnectAttempts=0,t()},a.onmessage=e=>{try{let t=JSON.parse(e.data),n=this.messageHandlers.get(t.type);n?n(t.data):t.type===`connected`?X.debug(`WebSocket: Server confirmed connection`):X.warn(`WebSocket: No handler for message type:`,t.type)}catch(e){X.error(`Failed to parse WebSocket message:`,e)}},a.onclose=()=>{if(X.debug(`WebSocket disconnected`),this.ws===a&&(this.ws=null),e!==this.connectionEpoch){t();return}this.shouldReconnect&&this.attemptReconnect()},a.onerror=n=>{if(e!==this.connectionEpoch){t();return}X.error(`WebSocket error:`,n),r(n)}}catch(e){r(e)}})}disconnect(){this.shouldReconnect=!1,this.connectionEpoch+=1,this.connectPromise=null,this.ws&&(this.ws.close(),this.ws=null)}reconnect(){return this.disconnect(),this.connect()}send(e){return this.ws&&this.ws.readyState===WebSocket.OPEN?(X.debug(`WebSocket: Sending message:`,e),this.ws.send(JSON.stringify(e)),!0):(X.warn(`WebSocket is not connected. ReadyState:`,this.ws?.readyState),!1)}onMessage(e,t){this.messageHandlers.delete(e),this.messageHandlers.set(e,t)}offMessage(e){this.messageHandlers.delete(e)}dispatchMessage(e,t){this.messageHandlers.get(e)?.(t)}attemptReconnect(){if(s()){X.debug(`Demo mode active: skipping WebSocket reconnection.`);return}this.reconnectAttempts<this.maxReconnectAttempts?(this.reconnectAttempts++,X.debug(`Attempting to reconnect... (${this.reconnectAttempts}/${this.maxReconnectAttempts})`),setTimeout(()=>{this.shouldReconnect&&this.connect().catch(()=>{})},this.reconnectDelay*this.reconnectAttempts)):X.error(`Max reconnection attempts reached`)}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}},me=e({useAuthStore:()=>$}),Q=c(`auth-store`),$=a()(o((e,n)=>({user:null,token:null,systemInfo:null,workAccess:null,isAuthenticated:!1,isLoading:!1,login:(t,r,a)=>{let o=n().user?.id===t.id;localStorage.setItem(`auth-token`,r);let c=i.getState();c.clearAllState&&c.clearAllState(),z.getState().clearAllState(),o||(G(),p.getState().clearUserState()),e({user:t,token:r,systemInfo:a,isAuthenticated:!0,isLoading:!1}),setTimeout(async()=>{try{let e=H.getState();Q.debug(`Reinitializing app after login...`),Q.debug(`Reconnecting WebSocket with auth token...`);try{await Z.reconnect()}catch(e){Q.warn(`WebSocket reconnect after login failed; continuing app initialization:`,e)}try{!(await d.checkHealth()).success&&!s()&&Q.warn(`Ollama service not available after login`)}catch(e){Q.warn(`Ollama health check failed after login; continuing provider initialization:`,e)}let t=p.getState();await Promise.all([c.loadModels(),c.loadSessions(),c.loadPreferences(),t.loadPreferences(),e.loadPlugins(),n().refreshWorkAccess()]),Q.debug(`Reinitialized app after login`)}catch(e){Q.error(`Failed to reinitialize app after login:`,e)}},100)},logout:()=>{localStorage.removeItem(`auth-token`),Q.debug(`Disconnecting WebSocket on logout...`),Z.disconnect();let t=i.getState();t.clearAllState&&t.clearAllState(),z.getState().clearAllState(),G(),p.getState().clearUserState(),e({user:null,token:null,workAccess:null,isAuthenticated:!1,isLoading:!1})},setUser:t=>{e({user:t})},setSystemInfo:t=>{e({systemInfo:t})},setLoading:t=>{e({isLoading:t})},isAdmin:()=>{let{user:e}=n();return e?.role===`admin`},requiresAuth:()=>{let{systemInfo:e}=n();return e?.requiresAuth??!1},canUseWork:()=>{let{systemInfo:e,user:t,workAccess:r}=n();return e?.requiresAuth===!1||t?.role===`admin`||r?.allowed===!0},canUseAgents:()=>{let{systemInfo:e,user:t}=n();return e?.agentsEnabled===!0?e?.requiresAuth===!1||t?.role===`admin`:!1},refreshWorkAccess:async()=>{try{let{workApi:n}=await t(async()=>{let{workApi:e}=await import(`./workApi-C4QtuhcE.js`).then(e=>e.n);return{workApi:e}},__vite__mapDeps([0,1,2,3,4,5,6])),r=await n.access();r.success&&r.data&&e({workAccess:r.data})}catch(e){Q.debug(`Could not load Work access mode:`,e)}}}),{name:`auth-store`,partialize:e=>({user:e.user,token:e.token,systemInfo:e.systemInfo,workAccess:e.workAccess,isAuthenticated:e.isAuthenticated})}));export{se as a,oe as c,pe as i,H as l,$ as n,ce as o,Z as r,ae as s,me as t,z as u};
@@ -0,0 +1,2 @@
1
+ var e={common:{loading:`লোড হচ্ছে...`,save:`সংরক্ষণ`,saving:`সংরক্ষণ হচ্ছে...`,cancel:`বাতিল`,delete:`মুছুন`,edit:`সম্পাদনা`,close:`বন্ধ`,back:`পিছনে`,next:`পরবর্তী`,confirm:`নিশ্চিত করুন`,error:`ত্রুটি`,success:`সফল`,warning:`সতর্কতা`,or:`অথবা`,optional:`ঐচ্ছিক`,enabled:`সক্রিয়`,disabled:`নিষ্ক্রিয়`,on:`চালু`,off:`বন্ধ`,yes:`হ্যাঁ`,no:`না`,search:`অনুসন্ধান`,noResults:`কোনো ফলাফল পাওয়া যায়নি`,retry:`পুনরায় চেষ্টা করুন`,refresh:`রিফ্রেশ`,download:`ডাউনলোড`,upload:`আপলোড`,export:`এক্সপোর্ট`,import:`ইম্পোর্ট`,reset:`রিসেট`,apply:`প্রয়োগ করুন`,clear:`মুছুন`,all:`সব`,none:`কিছুই না`,default:`ডিফল্ট`,custom:`কাস্টম`,remove:`সরান`,home:`হোম`,more:`বেশি`},brand:{name:`Libre WebUI`,shortName:`Libre`},auth:{login:{title:`স্বাগতম`,subtitle:`আপনার অ্যাকাউন্টে সাইন ইন করুন`,username:`ব্যবহারকারীর নাম`,usernamePlaceholder:`আপনার ব্যবহারকারীর নাম লিখুন`,password:`পাসওয়ার্ড`,passwordPlaceholder:`আপনার পাসওয়ার্ড লিখুন`,signIn:`সাইন ইন`,signingIn:`সাইন ইন হচ্ছে...`,noAccount:`অ্যাকাউন্ট নেই?`,signUpHere:`এখানে সাইন আপ করুন`,loginSuccess:`লগইন সফল!`,loginFailed:`লগইন ব্যর্থ`,checkCredentials:`লগইন ব্যর্থ। আপনার তথ্য পরীক্ষা করুন।`,approvalPending:`আপনার অ্যাকাউন্ট অ্যাডমিনিস্ট্রেটরের অনুমোদনের অপেক্ষায় আছে।`,enterBoth:`অনুগ্রহ করে ব্যবহারকারীর নাম এবং পাসওয়ার্ড উভয়ই লিখুন`,githubSuccess:`GitHub লগইন সফল!`,githubFailed:`GitHub প্রমাণীকরণ ব্যর্থ`,githubVerifyFailed:`GitHub প্রমাণীকরণ যাচাই করতে ব্যর্থ`,verificationFailed:`নিরাপত্তা যাচাই ব্যর্থ। পৃষ্ঠা রিফ্রেশ করে আবার চেষ্টা করুন।`},signup:{title:`অ্যাকাউন্ট তৈরি করুন`,subtitle:`আপনার নতুন অ্যাকাউন্টের জন্য সাইন আপ করুন`,username:`ব্যবহারকারীর নাম`,usernamePlaceholder:`একটি ব্যবহারকারীর নাম বেছে নিন`,email:`ইমেইল`,emailPlaceholder:`your@email.com`,password:`পাসওয়ার্ড`,passwordPlaceholder:`একটি পাসওয়ার্ড বেছে নিন`,confirmPassword:`পাসওয়ার্ড নিশ্চিত করুন`,confirmPasswordPlaceholder:`আপনার পাসওয়ার্ড নিশ্চিত করুন`,createAccount:`অ্যাকাউন্ট তৈরি করুন`,creatingAccount:`অ্যাকাউন্ট তৈরি হচ্ছে...`,hasAccount:`ইতিমধ্যে অ্যাকাউন্ট আছে?`,signInHere:`এখানে সাইন ইন করুন`,signupSuccess:`অ্যাকাউন্ট সফলভাবে তৈরি হয়েছে!`,approvalPending:`নিবন্ধন গৃহীত হয়েছে। একজন অ্যাডমিনিস্ট্রেটরকে অবশ্যই আপনার অ্যাকাউন্ট অনুমোদন করতে হবে।`,awaitingApproval:`অনুমোদনের অপেক্ষায়`,awaitingApprovalDescription:`আপনার অ্যাকাউন্ট তৈরি করা হয়েছে, তবে সাইন ইন করার আগে একজন অ্যাডমিনিস্ট্রেটরকে অবশ্যই এটি সক্রিয় করতে হবে।`,backToSignIn:`সাইন ইনে ফিরে যান`,signupFailed:`সাইন আপ ব্যর্থ`,tryAgain:`সাইন আপ ব্যর্থ। অনুগ্রহ করে আবার চেষ্টা করুন।`,usernameRequired:`ব্যবহারকারীর নাম এবং পাসওয়ার্ড প্রয়োজন`,passwordMismatch:`পাসওয়ার্ড মিলছে না`,passwordTooShort:`পাসওয়ার্ড কমপক্ষে ৬ অক্ষরের হতে হবে`},logout:{button:`লগ আউট`,success:`সফলভাবে লগ আউট হয়েছে`},oauth:{continueWith:`{{provider}} দিয়ে চালিয়ে যান`,connectingTo:`{{provider}} এ সংযোগ হচ্ছে...`,github:`GitHub`,huggingFace:`Hugging Face`},checkingAuth:`প্রমাণীকরণ যাচাই হচ্ছে...`,welcome:`স্বাগতম`,noEmail:`কোনো ইমেইল দেওয়া হয়নি`,role:`ভূমিকা`,id:`আইডি`,userId:`ইউজার আইডি`,signInDescription:`চালিয়ে যেতে আপনার GitHub অ্যাকাউন্ট দিয়ে সাইন ইন করুন`,signInWithGitHub:`GitHub দিয়ে সাইন ইন করুন`,jwtActive:`JWT প্রমাণীকরণ সক্রিয়`,jwtDescription:`GitHub OAuth সহ JWT প্রমাণীকরণ`,github:`GitHub`,provider:`প্রদানকারী`,tagline:`আপনার AI স্ট্যাক আপনার কাছে উত্তর দেওয়া উচিত।`,selfHosted:`সেলফ-হোস্টেড · Apache 2.0`,highlights:{local:{title:`লোকাল ফার্স্ট`,body:`আপনার কথোপকথন এবং ফাইলগুলি আপনি এটি চালানো মেশিনেই থাকে।`},providers:{title:`যেকোনো প্রোভাইডার`,body:`Ollama-এর মাধ্যমে লোকাল মডেল, পাশাপাশি আপনি যোগ করতে চয়ন করা রিমোট প্রোভাইডার।`},work:{title:`বিচ্ছিন্ন কাজ`,body:`একটি মডেলকে ফাইল, একটি টার্মিনাল এবং একটি প্রিভিউ সহ একটি স্যান্ডবক্সড ওয়ার্কস্পেস দিন।`}},oidc:{defaultProviderName:`সিঙ্গেল সাইন-অন`}},setup:{welcome:{title:`Libre WebUI তে স্বাগতম`,subtitle:`শুরু করা যাক`,description:`কয়েকটি ধাপে আপনার Libre WebUI সেট আপ করুন`,createAdmin:`অ্যাডমিন অ্যাকাউন্ট তৈরি করুন`,features:{secure:{title:`নিরাপদ এবং ব্যক্তিগত`,description:`আপনার কথোপকথন আপনার ডিভাইসে থাকে`},fast:{title:`দ্রুত এবং প্রতিক্রিয়াশীল`,description:`গতি এবং কর্মক্ষমতার জন্য অপ্টিমাইজ করা`},openSource:{title:`ওপেন সোর্স`,description:`বিনামূল্যে এবং ওপেন সোর্স সফটওয়্যার`}}},admin:{title:`অ্যাডমিন অ্যাকাউন্ট তৈরি করুন`,subtitle:`অ্যাডমিনিস্ট্রেটর সেটআপ`,description:`আপনার Libre WebUI এর জন্য প্রথম অ্যাডমিন অ্যাকাউন্ট তৈরি করুন`,usernamePlaceholder:`অ্যাডমিন ব্যবহারকারীর নাম লিখুন`,passwordPlaceholder:`পাসওয়ার্ড লিখুন (ন্যূনতম ৬ অক্ষর)`,confirmPlaceholder:`আপনার পাসওয়ার্ড নিশ্চিত করুন`,creating:`তৈরি হচ্ছে...`,createAdmin:`অ্যাডমিন তৈরি করুন`,success:`অ্যাডমিন অ্যাকাউন্ট সফলভাবে তৈরি হয়েছে!`,failed:`অ্যাডমিন অ্যাকাউন্ট তৈরি করতে ব্যর্থ`,approvalUnexpected:`প্রাথমিক অ্যাডমিনিস্ট্রেটর সক্রিয় করা যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।`,fillAllFields:`অনুগ্রহ করে সব ফিল্ড পূরণ করুন`,note:`এটি আপনার Libre WebUI এর প্রাথমিক অ্যাডমিনিস্ট্রেটর অ্যাকাউন্ট হবে`},encryptionKey:{title:`আপনার এনক্রিপশন কী সংরক্ষণ করুন`,subtitle:`গুরুত্বপূর্ণ: এই কী সংরক্ষণ করুন`,description:`এই এনক্রিপশন কী আপনার সংবেদনশীল ডেটা রক্ষা করে। এটি নিরাপদে সংরক্ষণ করুন - আপনার ডাটাবেস পুনরুদ্ধার করতে হলে এটি প্রয়োজন হবে।`,warning:`সতর্কতা`,warningText:`যদি আপনি এই কী হারান এবং ডাটাবেস পুনরুদ্ধার করতে হয়, আপনার এনক্রিপ্ট করা ডেটা (API কী, পছন্দসমূহ) পুনরুদ্ধার করা যাবে না।`,label:`আপনার এনক্রিপশন কী`,loading:`লোড হচ্ছে...`,copyToClipboard:`ক্লিপবোর্ডে কপি করুন`,copied:`এনক্রিপশন কী ক্লিপবোর্ডে কপি হয়েছে!`,copyFailed:`ক্লিপবোর্ডে কী কপি করতে ব্যর্থ`,envNote:`এই কী আপনার backend/.env ফাইলে ENCRYPTION_KEY হিসাবে সংরক্ষিত আছে`,acknowledgment:`আমি আমার এনক্রিপশন কী একটি নিরাপদ স্থানে সংরক্ষণ করেছি এবং বুঝতে পারছি যে এটি হারালে ডেটা ক্ষতি হতে পারে।`,confirmRequired:`অনুগ্রহ করে নিশ্চিত করুন যে আপনি এনক্রিপশন কী সংরক্ষণ করেছেন`,continue:`Libre WebUI তে চালিয়ে যান`}},chat:JSON.parse(`{"greeting":{"morning":"সুপ্রভাত","afternoon":"শুভ অপরাহ্ন","evening":"শুভ সন্ধ্যা","night":"শুভ রাত্রি"},"followUp":"ফলো-আপ","welcome":{"helpToday":"আজ আমি কীভাবে সাহায্য করতে পারি?","helpTonight":"আজ রাতে আমি কীভাবে সাহায্য করতে পারি?","variety":{"create":{"title":"আমরা কী বানাব?","subtitle":"একটা ভাবনা, খসড়া, কিংবা সহজে না-মেটা সমস্যা দিয়ে শুরু করুন।"},"explore":{"title":"কোথা থেকে শুরু করব?","subtitle":"যে প্রশ্নটা বারবার মনে ফিরে আসে, সেটাই নিয়ে আসুন।"},"imagine":{"title":"আপনি কী কল্পনা করছেন?","subtitle":"আমরা একসঙ্গে তাকে রূপ দিতে পারি।"},"focus":{"title":"কোন বিষয়টা এখন মনোযোগ চায়?","subtitle":"চলুন, পরের ধাপটা পরিষ্কার করি।"},"untangle":{"title":"কোথায় জট লেগেছে?","subtitle":"আগে এলোমেলো অবস্থাতেই বলুন।"},"momentum":{"title":"আপনি তৈরি হলেই শুরু করি।","subtitle":"কোনো ভাবনা, পরিকল্পনা বা অসমাপ্ত কথার সূত্র আবার ধরুন।"},"open":{"title":"আপনার মনে কী চলছে?","subtitle":"ছোট্ট ভাবনা হোক বা বড় প্রকল্প—দুটোই চলবে।"},"challenge":{"title":"আমরা কী সমাধান করছি?","subtitle":"এখনও কী ঠিকমতো কাজ করছে না, বলুন।"},"draft":{"title":"কোথাও থেকে শুরু করা যাক।","subtitle":"এখনই নিখুঁত হতে হবে না।"},"possibility":{"title":"এটা কী হয়ে উঠতে পারে?","subtitle":"কাঁচামালটুকুই আগে দেখান।"},"unexpected":{"title":"অপ্রত্যাশিত কিছু বানাই।","subtitle":"একটা সীমা, একটা আবহ, কিংবা আধা-গড়া ভাবনা দিন।"}}},"input":{"placeholder":"একটি বার্তা পাঠান","messagePlaceholder":"বার্তা...","attachImages":"ছবি সংযুক্ত করুন","attachments":"সংযুক্তি এবং উন্নত বৈশিষ্ট্য","sendMessage":"বার্তা পাঠান","stopGeneration":"জেনারেশন বন্ধ করুন","menu":{"uploadImages":"ছবি আপলোড করুন","attachDocument":"নথি সংযুক্ত করুন","attachWebpage":"ওয়েবপেজ সংযুক্ত করুন","structuredOutput":"কাঠামোবদ্ধ আউটপুট","attach":"সংযুক্ত করুন","documentAttached":"নথি সংযুক্ত হয়েছে","webpageAttached":"ওয়েবপেজ সংযুক্ত হয়েছে","attachFailed":"সংযুক্ত করা যায়নি","attachKnowledge":"জ্ঞান সংযুক্ত করুন","noCollections":"এখনও কোনো সংগ্রহ নেই — সেটিংস → নথিতে তৈরি করুন"},"voiceInput":"ভয়েস ইনপুট","voiceStop":"শোনা বন্ধ করুন","transcriptionSource":"কথা শনাক্তকরণের উৎস","browserSpeech":"ব্রাউজারের স্পিচ পরিষেবা","providerTranscriptionDisclosure":"ট্রান্সক্রিপশনের জন্য অডিও রেকর্ড করে {{provider}}-এ পাঠান","webSearchOn":"ওয়েব অনুসন্ধান চালু — উত্তরে লাইভ ফলাফল ব্যবহৃত হয়","webSearchOff":"এই বার্তার জন্য ওয়েবে অনুসন্ধান করুন","thinkingOn":"চিন্তা চালু ({{level}})","thinkingOff":"উত্তরের আগে চিন্তা করুন"},"session":{"new":"নতুন চ্যাট","work":"কাজ","chat":"চ্যাট","private":"ব্যক্তিগত","incognito":"ইনকগনিটো চ্যাট","privateMode":"ব্যক্তিগত মোড","privateDescription":"এই কথোপকথন সংরক্ষণ করা হবে না","privateTooltip":"একটি ব্যক্তিগত কথোপকথন শুরু করুন যা সংরক্ষণ করা হবে না","deleteConfirm":"আপনি কি এই চ্যাট মুছতে চান?","generatingTitle":"শিরোনাম তৈরি হচ্ছে","noChats":"এখনও কোনো চ্যাট নেই","createFirst":"উপরে আপনার প্রথম চ্যাট তৈরি করুন","chats":"চ্যাট","renameChat":"চ্যাট পুনঃনামকরণ করুন","openNewTab":"নতুন ট্যাবে খুলুন","pinChat":"পিন করুন","unpinChat":"পিন সরান","deleteChat":"চ্যাট মুছুন","archiveChat":"চ্যাট সংরক্ষণাগারে রাখুন","groups":{"pinned":"পিন করা","today":"আজ","yesterday":"গতকাল","previous7Days":"গত ৭ দিন","previous30Days":"গত ৩০ দিন","older":"পুরানো"},"folder":{"new":"নতুন ফোল্ডার","namePlaceholder":"ফোল্ডারের নাম","move":"ফোল্ডারে সরান","remove":"ফোল্ডার থেকে সরান","delete":"ফোল্ডার মুছুন","deleteConfirm":"এই ফোল্ডারটি মুছবেন? ভিতরের চ্যাটগুলি থাকবে।"}},"persona":{"applied":"পার্সোনা প্রয়োগ করা হয়েছে","label":"পার্সোনা","loadFailed":"ব্যক্তিত্বের বিবরণ লোড করা যায়নি","removeFailed":"পার্সোনা সরাতে ব্যর্থ হয়েছে"},"model":{"updated":"মডেল আপডেট হয়েছে","noModels":"কোনো মডেল উপলব্ধ নেই","noModelsDescription":"কোনো মডেল উপলব্ধ নেই। নিশ্চিত করুন যে Ollama চলছে এবং মডেল ইনস্টল করা আছে।","pullCommand":"ollama pull llama3.2:3b","noModelsTooltip":"কোনো মডেল উপলব্ধ নেই। অনুগ্রহ করে নিশ্চিত করুন যে Ollama চলছে এবং মডেল ইনস্টল করা আছে।","selectBeforePrivateChat":"ব্যক্তিগত চ্যাট শুরু করার আগে একটি উপলব্ধ মডেল নির্বাচন করুন","selectBeforeSending":"পাঠানোর আগে একটি উপলব্ধ মডেল নির্বাচন করুন"},"footer":{"disclaimer":"LLM ভুল করতে পারে - গুরুত্বপূর্ণ তথ্য যাচাই করুন","images":"{{count}}টি ছবি","images_plural":"{{count}}টি ছবি","structuredOutput":"স্ট্রাকচার্ড আউটপুট"},"mediaUpload":{"dropImagesHere":"এখানে ছবি ছেড়ে দিন বা","supportedFormats":"সমর্থিত: JPG, PNG, GIF, WebP (সর্বোচ্চ ১০MB প্রতিটি)","browse":"ব্রাউজ করুন"},"structuredOutput":{"title":"রেসপন্স ফরম্যাট","none":"কোনোটি নয় (প্রাকৃতিক ভাষা)","noneDescription":"ডিফল্ট প্রাকৃতিক ভাষা প্রতিক্রিয়া","json":"JSON","jsonDescription":"স্ট্রাকচার্ড JSON ফরম্যাট","list":"তালিকা","listDescription":"আইটেমের অ্যারে","summary":"সারাংশ","summaryDescription":"মূল পয়েন্ট সহ ডকুমেন্ট সারাংশ","analysis":"বিশ্লেষণ","analysisDescription":"সুবিধা/অসুবিধা সহ স্ট্রাকচার্ড বিশ্লেষণ","custom":"কাস্টম স্কিমা","customDescription":"আপনার নিজের JSON স্কিমা সংজ্ঞায়িত করুন","customSchema":"কাস্টম JSON স্কিমা","schemaPreview":"স্কিমা প্রিভিউ","applySchema":"স্কিমা প্রয়োগ করুন","cancel":"বাতিল","enabled":"স্ট্রাকচার্ড আউটপুট সক্রিয়"},"controls":{"title":"চ্যাট নিয়ন্ত্রণ","systemPrompt":"সিস্টেম প্রম্পট","systemPromptPlaceholder":"শুধু এই চ্যাটে প্রযোজ্য নির্দেশনা…","advancedParams":"উন্নত প্যারামিটার","advancedParamsDescription":"এই চ্যাটের জন্য ওভাররাইড। খালি ঘরে গ্লোবাল ডিফল্ট ব্যবহৃত হয়।","fromModel":"মডেল থেকে","fromModelHint":"এই মানটি মডেলের নিজস্ব প্রস্তাবিত সেটিংস থেকে এসেছে।","contextCapped":"প্রসঙ্গ {{trained}}-এর মধ্যে {{context}}-এ সীমাবদ্ধ, যাতে মডেলটি লোড হতে পারে।","saved":"নিয়ন্ত্রণ সংরক্ষিত হয়েছে","saveFailed":"নিয়ন্ত্রণ সংরক্ষণ করা যায়নি","params":{"temperature":"তাপমাত্রা","topP":"Top P","topK":"Top K","minP":"Min P","maxTokens":"সর্বোচ্চ টোকেন","repeatPenalty":"পুনরাবৃত্তি জরিমানা","seed":"সিড","contextLength":"প্রসঙ্গ দৈর্ঘ্য"},"thinking":"চিন্তা","thinkingDescription":"উত্তর দেওয়ার আগে মডেল কতটা চিন্তা করে। যুক্তি করতে না পারা মডেল এটি উপেক্ষা করে।","compaction":"প্রসঙ্গ সংকোচন","compactionDescription":"সার্ভার দীর্ঘ কথোপকথন সংকুচিত করলে, এই চ্যাটটি তা এড়িয়ে পূর্ণ ইতিহাস রাখতে পারে।","compactionDefault":"সার্ভারের ডিফল্ট","compactionOff":"এই চ্যাটে বন্ধ"},"message":{"sources":"উৎস"},"toasts":{"chatCreated":"নতুন চ্যাট তৈরি হয়েছে","createFailed":"সেশন তৈরি করা যায়নি","loadFailed":"সেশন লোড করা যায়নি","chatDeleted":"চ্যাট মুছে ফেলা হয়েছে","deleteFailed":"চ্যাট মুছে ফেলা যায়নি","deleteSessionFailed":"সেশন মুছে ফেলা যায়নি","historyCleared":"সমস্ত চ্যাট ইতিহাস মুছে ফেলা হয়েছে","historyClearFailed":"চ্যাট ইতিহাস মুছে ফেলা যায়নি","titleUpdated":"চ্যাট শিরোনাম আপডেট হয়েছে","updateFailed":"সেশন আপডেট করা যায়নি","noValidSession":"বৈধ চ্যাট সেশন নেই। অনুগ্রহ করে একটি চ্যাট তৈরি করুন বা নির্বাচন করুন।","sessionNotFound":"সেশন পাওয়া যায়নি বা অবৈধ। অনুগ্রহ করে একটি বৈধ চ্যাট সেশন নির্বাচন বা তৈরি করুন।","noModelProvider":"কোনো মডেল প্রদানকারী উপলব্ধ নেই","modelUnavailable":"নির্বাচিত মডেল \\"{{model}}\\" {{provider}} থেকে উপলব্ধ নেই। সেই প্রদানকারীটি আবার সক্রিয় করুন বা অন্য একটি মডেল নির্বাচন করুন।","modelSwitched":"{{model}} এ স্যুইচ করা হয়েছে (আগের মডেলটি আর উপলব্ধ নেই)","modelsLoadFailed":"মডেল লোড করা যায়নি","modelUpdated":"বর্তমান চ্যাটের জন্য মডেল আপডেট হয়েছে","modelUpdateFailed":"সেশনের মডেল আপডেট করা যায়নি"},"documents":{"title":"প্রসঙ্গে থাকা নথি"},"context":{"title":"প্রসঙ্গ উইন্ডো:","full":"{{percent}}% পূর্ণ","tokensUsed":"{{used}} / {{budget}} টোকেন ব্যবহৃত","tokensUsedNoBudget":"{{used}} টোকেন ব্যবহৃত","capped":"{{trained}} থেকে সীমিত"}}`),sidebar:{navigation:{chat:`চ্যাট`,models:`মডেল`,personas:`পার্সোনা`,imagine:`ইমাজিন`,agents:`এজেন্ট`,work:`কাজ`,settings:`সেটিংস`,usageAnalytics:`প্রোভাইডার ব্যবহার`,system:`সিস্টেম`,userManagement:`ব্যবহারকারী ব্যবস্থাপনা`,signOut:`সাইন আউট`,exploreLabel:`অন্বেষণ`,notes:`নোট`},toggleSize:`সাইডবার সাইজ টগল করুন`,expandSidebar:`সাইডবার প্রসারিত করুন`},user:{menu:{changePicture:`ছবি পরিবর্তন করুন`,settings:`সেটিংস`,usageAnalytics:`প্রোভাইডার ব্যবহার`,system:`সিস্টেম`,userManagement:`ব্যবহারকারী ব্যবস্থাপনা`,logout:`লগ আউট`},avatar:{title:`প্রোফাইল ছবি পরিবর্তন করুন`,updated:`প্রোফাইল ছবি আপডেট হয়েছে`,updateFailed:`প্রোফাইল ছবি আপডেট করতে ব্যর্থ`,saving:`সংরক্ষণ হচ্ছে...`,label:`অবতার`,uploadAvatarImage:`অবতার ছবি আপলোড করুন`,dragAndDrop:`একটি ছবি টেনে আনুন বা ব্রাউজ করতে ক্লিক করুন`,chooseImage:`ছবি বাছুন`,uploading:`আপলোড হচ্ছে...`,enterImageUrl:`অথবা ছবির URL লিখুন`,supportedFormats:`সমর্থিত: JPG, PNG, GIF, WebP (সর্বোচ্চ 2MB)। বর্গাকার ছবি সবচেয়ে ভালো কাজ করে।`,customAvatar:`কাস্টম অবতার ছবি`,clickToChange:`পরিবর্তন বা সরাতে ক্লিক করুন`,removed:`অবতার সরানো হয়েছে`,uploaded:`অবতার সফলভাবে আপলোড হয়েছে`,invalidFile:`অনুগ্রহ করে একটি বৈধ ছবি ফাইল নির্বাচন করুন`,fileTooLarge:`অবতার ছবির আকার 2MB এর কম হতে হবে`,readFailed:`ছবি ফাইল পড়তে ব্যর্থ`,uploadFailed:`অবতার ছবি আপলোড করতে ব্যর্থ`},profile:{noEmail:`কোনো ইমেইল দেওয়া হয়নি`}},settings:JSON.parse(`{"title":"সেটিংস","tabs":{"appearance":"চেহারা","model":"মডেল","systemMessage":"সিস্টেম বার্তা","plugins":"প্লাগইন","search":"অনুসন্ধান","generation":"জেনারেশন","documents":"ডকুমেন্ট","tts":"টেক্সট-টু-স্পিচ","imageGen":"ইমেজ জেনারেশন","data":"ডেটা","shortcuts":"শর্টকাট","about":"সম্পর্কে","sessions":"সেশন","apiKeys":"API কী"},"appearance":{"title":"চেহারা","language":{"title":"ভাষা","description":"আপনার পছন্দের ভাষা নির্বাচন করুন"},"theme":{"title":"থিম","light":"লাইট","dark":"ডার্ক","amoled":"বিশুদ্ধ কালো","system":"সিস্টেম"},"accent":{"title":"অ্যাকসেন্ট রং","custom":"কাস্টম রং","useColor":"{{color}} অ্যাকসেন্ট ব্যবহার করুন","behaviorTitle":"ইন্টারফেস প্যালেট","behaviorDescription":"অ্যাকসেন্ট শুধু নিয়ন্ত্রণে থাকবে নাকি পুরো হালকা বা গাঢ় ইন্টারফেসে প্রয়োগ হবে তা বেছে নিন।","defaultStyle":"ডিফল্ট","defaultStyleDescription":"হালকা ও গাঢ় থিমের নিরপেক্ষ পৃষ্ঠগুলো রাখুন।","adaptedStyle":"অ্যাকসেন্টে মানিয়ে নিন","adaptedStyleDescription":"পৃষ্ঠ, সীমানা ও লেখাকে আপনার অ্যাকসেন্ট রঙে রাঙান।"},"chatInterface":{"title":"চ্যাট ইন্টারফেস","showUsername":"ব্যবহারকারীর নাম দেখান","showUsernameDescription":"চ্যাট বার্তায় ব্যবহারকারীর নাম প্রদর্শন করুন","followUpSuggestions":"ফলো-আপ পরামর্শ","followUpSuggestionsDescription":"প্রতিটি উত্তরের পরে দ্রুত জবাবের পরামর্শ দিন","hapticFeedback":"হ্যাপটিক প্রতিক্রিয়া (Android)","hapticFeedbackDescription":"গুরুত্বপূর্ণ মোবাইল কাজের জন্য সূক্ষ্ম কম্পন ব্যবহার করুন"},"background":{"title":"ব্যাকগ্রাউন্ড ইমেজ","enable":"ব্যাকগ্রাউন্ড ইমেজ সক্রিয় করুন","enableDescription":"ব্লার ইফেক্ট সহ কাস্টম ব্যাকগ্রাউন্ড দেখান","blur":"ব্লার","opacity":"অপাসিটি","upload":"ব্যাকগ্রাউন্ড ইমেজ আপলোড করুন","dragDrop":"একটি ছবি টেনে আনুন বা ব্রাউজ করতে ক্লিক করুন","chooseImage":"ছবি বেছে নিন"}},"saveSettings":"সেটিংস সংরক্ষণ করুন","model":{"title":"মডেল সেটিংস","defaultModel":"ডিফল্ট মডেল","defaultModelDescription":"নতুন কথোপকথনের জন্য এই মডেলটি ডিফল্টভাবে ব্যবহৃত হবে","selectModel":"একটি মডেল নির্বাচন করুন","specializedModels":"বিশেষ মডেল","visionModel":"ভিশন মডেল","selectVisionModel":"বর্তমান চ্যাট মডেল ব্যবহার করুন","visionModelDescription":"যখনই আউটগোয়িং চ্যাট কন্টেক্সটে ছবি থাকে তখনই স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়। এমন একটি মডেল বেছে নিন যা ছবি ইনপুট সমর্থন করে।","visionModelUpdateFailed":"ভিশন মডেল আপডেট করতে ব্যর্থ হয়েছে: {{error}}","visionModelNoProvider":"এই ভিশন মডেলের কোনো প্রোভাইডার পরিচয় নেই। একটি উপলব্ধ মডেল নির্বাচন করুন।","persona":"পারসোনা","updateAll":"সব মডেল আপডেট করুন","updateAllDescription":"আপডেট চেক করুন এবং সব ইনস্টল করা মডেলের সর্বশেষ সংস্করণ পুল করুন","updateAllButton":"সব আপডেট করুন","updating":"মডেল আপডেট হচ্ছে...","currentModelInfo":"বর্তমান মডেল তথ্য","name":"নাম","size":"সাইজ","family":"ফ্যামিলি","format":"ফরম্যাট","status":"স্ট্যাটাস","statusStarting":"শুরু হচ্ছে...","statusComplete":"সম্পূর্ণ","statusError":"ত্রুটি","bulkOperations":"বাল্ক অপারেশন","autoTitle":{"title":"স্বয়ংক্রিয় শিরোনাম জেনারেশন","enable":"স্বয়ংক্রিয় শিরোনাম সক্রিয় করুন","enableDescription":"নতুন কথোপকথনের জন্য স্বয়ংক্রিয়ভাবে শিরোনাম তৈরি করুন","taskModel":"টাস্ক মডেল","selectTaskModel":"টাস্ক মডেল নির্বাচন করুন","taskModelDescription":"কথোপকথনের শিরোনাম তৈরিতে ব্যবহৃত মডেল"},"updatingModel":"{{name}} আপডেট হচ্ছে ({{current}}/{{total}})","modelsProgress":"{{total}} টি মডেলের মধ্যে {{current}} টি"},"systemMessage":{"title":"সিস্টেম বার্তা","description":"একটি কাস্টম সিস্টেম বার্তা সেট করুন যা সব নতুন কথোপকথনের জন্য ব্যবহৃত হবে।","placeholder":"একটি সিস্টেম বার্তা লিখুন...","saved":"সিস্টেম বার্তা সংরক্ষিত","saveFailed":"সিস্টেম বার্তা সংরক্ষণ করতে ব্যর্থ"},"plugins":{"title":"প্লাগইন","description":"আপনার ইনস্টল করা প্লাগইন পরিচালনা করুন","providerConnections":"প্রোভাইডার সংযোগ","providerConnectionsDescription":"প্লাগইনগুলির মাধ্যমে মডেল প্রোভাইডার সংযোগ করুন, কনফিগার করুন এবং পরিদর্শন করুন।","providers":"প্রোভাইডার","searchProviders":"প্রোভাইডার খুঁজুন","noProvidersFound":"কোনো প্রোভাইডার আপনার সার্চের সাথে মেলে না।","selectProvider":"একটি প্রোভাইডার নির্বাচন করুন","selectProviderDescription":"এর সংযোগ এবং মডেল ক্যাটালগ পরিদর্শন করতে একটি প্রোভাইডার বেছে নিন।","addNew":"নতুন প্লাগইন যোগ করুন","upload":"প্লাগইন আপলোড করুন","addJson":"JSON যোগ করুন","uploading":"আপলোড হচ্ছে...","jsonPlaceholder":"প্লাগইন JSON কনফিগারেশন পেস্ট করুন...","install":"প্লাগইন ইনস্টল করুন","noPlugins":"কোনো প্লাগইন ইনস্টল করা নেই","noPluginsDescription":"কার্যকারিতা বাড়াতে একটি প্লাগইন যোগ করুন","loading":"প্লাগইন লোড হচ্ছে...","installed":"ইনস্টল করা প্লাগইন","active":"সক্রিয় প্লাগইন","activeLabel":"সক্রিয়","inactive":"নিষ্ক্রিয়","activate":"সক্রিয় করুন","deactivate":"নিষ্ক্রিয় করুন","models":"মডেল","apiKeySet":"API কী সেট","apiKeyConfiguration":"API কী কনফিগারেশন","apiKeyDescription":"{{name}}-এর জন্য একটি ব্যক্তিগত API কী সংরক্ষণ করুন।","apiKeyEnvAlternative":"বিকল্পভাবে, সেট করুন","environmentVariable":"এনভায়রনমেন্ট ভেরিয়েবল","apiKeyConfigured":"API কী কনফিগার করা হয়েছে","apiKeyPlaceholder":"আপনার API কী লিখুন...","saveApiKey":"API কী সংরক্ষণ করুন","showApiKey":"API কী দেখান","hideApiKey":"API কী লুকান","configure":"কনফিগার করুন","providerSettings":"প্রোভাইডার সেটিংস","status":"স্ট্যাটাস","defaultEndpoint":"ডিফল্ট এন্ডপয়েন্ট","modelCatalog":"মডেল ক্যাটালগ","modelCatalogDescription":"এই প্রোভাইডার এবং এর ক্ষমতার জন্য আবিষ্কৃত এবং কনফিগার করা মডেল।","refreshModels":"মডেল রিফ্রেশ করুন","noModelsConfigured":"এই প্রদানকারীর জন্য কোনো মডেল কনফিগার করা নেই।","modelId":"মডেল ID","capabilities":"ক্ষমতা","modelCatalogUpdated":"মডেল ক্যাটালগ আপডেট হয়েছে: {{count}}টি মডেল।","modelCatalogUnchanged":"মডেল ক্যাটালগ ইতিমধ্যেই আপ-টু-ডেট আছে।","modelCatalogNeedsApiKey":"এই প্রদানকারীর লাইভ মডেল তালিকা লোড করতে একটি বৈধ API কী যোগ করুন।","modelCatalogUnavailable":"প্রদানকারীর মডেল তালিকা লোড করা যায়নি।","modelCatalogRefreshFailed":"মডেল ক্যাটালগ রিফ্রেশ করতে ব্যর্থ","capability":{"chat":"চ্যাট","embedding":"এম্বেডিং","image":"চিত্র","speech":"বক্তৃতা","transcription":"ট্রান্সক্রিপশন"},"exportPlugin":"প্লাগইন রপ্তানি","deletePlugin":"প্লাগইন মুছুন","apiKey":{"title":"API কী","placeholder":"API কী লিখুন","save":"কী সংরক্ষণ করুন","remove":"কী সরান","configured":"API কী কনফিগার করা হয়েছে","notConfigured":"API কী প্রয়োজন","saved":"API কী সফলভাবে সংরক্ষিত","removed":"API কী সরানো হয়েছে","saveFailed":"API কী সংরক্ষণ করতে ব্যর্থ","removeFailed":"API কী সরাতে ব্যর্থ","enterKey":"অনুগ্রহ করে একটি API কী লিখুন"},"variables":"Variables"},"generation":{"title":"জেনারেশন অপশন","description":"AI কীভাবে প্রতিক্রিয়া তৈরি করে তা কনফিগার করুন","scopeLabel":"প্রযোজ্য","scopeAll":"সব মডেল","scopeModel":"শুধু {{model}}","scopeAllHint":"প্রতিটি মডেল যে মানগুলি ব্যবহার করে, যদি না তার নিজস্ব সেটিং থাকে।","scopeModelHint":"শুধু এই মডেলের জন্য সংরক্ষিত হয় এবং সাধারণ সেটিংসকে অগ্রাহ্য করে।","advancedSettings":"উন্নত জেনারেশন সেটিংস","advancedSettingsDescription":"স্যাম্পলিং, টোকেন সীমা, কন্টেক্সট, পেনাল্টি এবং স্টপ সিকোয়েন্স","coreParameters":"কোর প্যারামিটার","temperature":"টেম্পারেচার","temperatureDescription":"র্যান্ডমনেস নিয়ন্ত্রণ করে। কম মান বেশি ফোকাসড, উচ্চ মান বেশি সৃজনশীল।","topP":"Top P","topPDescription":"নিউক্লিয়াস স্যাম্পলিং এর মাধ্যমে বৈচিত্র্য নিয়ন্ত্রণ করে। কম মান সম্ভাব্য টোকেনে ফোকাস করে।","topK":"Top K","topKDescription":"টোকেন নির্বাচন শীর্ষ K সর্বাধিক সম্ভাব্যতে সীমাবদ্ধ করে। নিষ্ক্রিয় করতে 0 সেট করুন।","minP":"Min P","minPDescription":"টোকেন নির্বাচনের জন্য ন্যূনতম সম্ভাব্যতা থ্রেশহোল্ড।","generationControl":"জেনারেশন কন্ট্রোল","maxTokens":"সর্বোচ্চ টোকেন","maxTokensDescription":"প্রতিক্রিয়ায় তৈরি করার সর্বোচ্চ টোকেন সংখ্যা।","repeatPenalty":"রিপিট পেনাল্টি","repeatPenaltyDescription":"পুনরাবৃত্ত টোকেনকে শাস্তি দেয়। উচ্চ মান পুনরাবৃত্তি কমায়।","contextLength":"কনটেক্সট লেংথ","contextLengthDescription":"কথোপকথনের জন্য সর্বোচ্চ কনটেক্সট উইন্ডো সাইজ।","seed":"সিড","optional":"ঐচ্ছিক","random":"র্যান্ডম","seedDescription":"পুনরুৎপাদনযোগ্য আউটপুটের জন্য একটি নির্দিষ্ট সিড সেট করুন।","advancedOptions":"উন্নত অপশন","presencePenalty":"প্রেজেন্স পেনাল্টি","presencePenaltyDescription":"কনটেক্সটে প্রদর্শিত টোকেনকে শাস্তি দেয়।","frequencyPenalty":"ফ্রিকোয়েন্সি পেনাল্টি","frequencyPenaltyDescription":"ঘন ঘন ব্যবহৃত টোকেনকে শাস্তি দেয়।","stopSequences":"স্টপ সিকোয়েন্স","commaSeparated":"কমা দ্বারা পৃথক","stopSequencesDescription":"কাস্টম টোকেন যা পাওয়া গেলে জেনারেশন বন্ধ হবে।","resetDefaults":"ডিফল্টে রিসেট করুন","saveOptions":"অপশন সংরক্ষণ করুন","embeddingSettings":"এমবেডিং সেটিংস","enableEmbeddings":"ডকুমেন্ট এমবেডিং সক্রিয় করুন","thinking":"চিন্তা","thinkingDescription":"উত্তরের জন্য ডিফল্ট চিন্তার মাত্রা। প্রতিটি চ্যাট এটি বদলাতে পারে।","thinkingLevels":{"default":"মডেলের ডিফল্ট","defaultWith":"মডেলের ডিফল্ট ({{level}})","off":"বন্ধ","on":"চালু","low":"কম","medium":"মাঝারি","high":"বেশি"}},"documents":{"title":"ডকুমেন্ট সেটিংস","embeddings":{"title":"এমবেডিং","enable":"ডকুমেন্ট এমবেডিং সক্রিয় করুন","model":"এমবেডিং মডেল","modelDescription":"ডকুমেন্ট এমবেডিং এর জন্য ব্যবহৃত মডেল নির্বাচন করুন","chunkSize":"চাংক সাইজ","chunkSizeInTokens":"(টোকেনে)","chunkSizeDescription":"এমবেডিং এর জন্য টেক্সট চাংকের সাইজ","chunkOverlap":"চাংক ওভারল্যাপ","chunkOverlapInTokens":"(টোকেনে)","chunkOverlapDescription":"পরপর চাংকের মধ্যে ওভারল্যাপ","similarityThreshold":"সিমিলারিটি থ্রেশহোল্ড","similarityDescription":"ফলাফল অন্তর্ভুক্ত করার ন্যূনতম সিমিলারিটি স্কোর","status":"এমবেডিং স্ট্যাটাস","statusLabel":"স্ট্যাটাস","available":"উপলব্ধ","unavailable":"অনুপলব্ধ","chunksWithEmbeddings":"এমবেডিং সহ চাংক","coverage":"কভারেজ","regenerate":"এমবেডিং পুনরায় তৈরি করুন","regenerating":"পুনরায় তৈরি হচ্ছে..."},"collections":{"title":"জ্ঞান সংগ্রহ","description":"নথিগুলিকে সংগ্রহে ভাগ করুন এবং যেকোনো চ্যাটে সংযুক্ত করুন।","namePlaceholder":"সংগ্রহের নাম","create":"তৈরি করুন","none":"কোনো সংগ্রহ নেই","deleteConfirm":"এই সংগ্রহটি মুছবেন? ভিতরের নথিগুলি থাকবে।","createFailed":"সংগ্রহ তৈরি করা যায়নি","deleteFailed":"সংগ্রহ মুছে ফেলা যায়নি","assignFailed":"নথি সরানো যায়নি"},"library":{"title":"আপলোড করা নথি","description":"চ্যাট প্রসঙ্গ হিসেবে উপলব্ধ নথি। চ্যাটে আপলোড করা নথি শুধু সেই কথোপকথনে থাকে; চ্যাট বা সংগ্রহবিহীন নথি প্রতিটি কথোপকথনে যুক্ত হয়।","empty":"এখনও কোনো নথি আপলোড করা হয়নি।","chatScope":"একটি চ্যাট","everyChatScope":"সব চ্যাট","deleteConfirm":"\\"{{name}}\\" মুছবেন? এটি সব চ্যাট থেকে মুছে যাবে।","deleteFailed":"নথি মুছে ফেলা যায়নি"}},"tts":{"title":"টেক্সট-টু-স্পিচ","description":"বার্তা জোরে পড়ার জন্য টেক্সট-টু-স্পিচ সেটিংস কনফিগার করুন","loadingProviders":"TTS প্রোভাইডার লোড হচ্ছে...","noProviders":"কোনো TTS প্রোভাইডার নেই","noProvidersDescription":"টেক্সট-টু-স্পিচ সক্রিয় করতে TTS সমর্থন সহ একটি প্লাগইন কনফিগার করুন","enable":"TTS সক্রিয় করুন","enableDescription":"সহকারী বার্তার জন্য টেক্সট-টু-স্পিচ অনুমতি দিন","autoPlay":"প্রতিক্রিয়া অটো-প্লে","autoPlayDescription":"স্বয়ংক্রিয়ভাবে নতুন সহকারী বার্তা জোরে পড়ুন","streamSentences":"স্বাভাবিক ব্যাচভিত্তিক প্লেব্যাক","streamSentencesDescription":"আগেই বাক্যাংশ অনুযায়ী কয়েকটি ব্যাচ তৈরি করে একটি নিরবচ্ছিন্ন প্রতিক্রিয়া হিসেবে চালান।","voiceConfiguration":"ভয়েস কনফিগারেশন","model":"TTS মডেল","modelDescription":"টেক্সট-টু-স্পিচ জেনারেশনের জন্য মডেল নির্বাচন করুন","voice":"ভয়েস","selectVoice":"একটি ভয়েস নির্বাচন করুন","voiceDescription":"টেক্সট-টু-স্পিচের জন্য ভয়েস বেছে নিন","providerDefaultVoice":"বক্তব্য তৈরির সময় কোনো রেফারেন্স রেকর্ডিং না দিলে এই মডেলটি তার ডিফল্ট কণ্ঠ ব্যবহার করে।","voiceCloningAvailable":"ভয়েস ক্লোনিং উপলভ্য","voiceCloningAvailableDescription":"সম্মতি নিয়ে তৈরি রেফারেন্স রেকর্ডিং ও তার হুবহু প্রতিলিপি থেকে বক্তব্য বানাতে Imagine → Audio ব্যবহার করুন। চাইলে রেফারেন্সটি পুনর্ব্যবহারযোগ্য কণ্ঠ হিসেবে সংরক্ষণ করতে পারেন।","savedVoiceOption":"{{name}} (সংরক্ষিত কণ্ঠ)","savedVoices":"সংরক্ষিত কণ্ঠসমূহ","loadingSavedVoices":"সংরক্ষিত কণ্ঠ লোড হচ্ছে…","deleteSavedVoice":"সংরক্ষিত কণ্ঠ {{name}} মুছুন","deleteSavedVoiceConfirm":"সংরক্ষিত কণ্ঠ “{{name}}” মুছবেন? এর রেফারেন্স রেকর্ডিং ও প্রতিলিপি মুছে ফেলা হবে।","savedVoiceDeleted":"সংরক্ষিত কণ্ঠ মুছে ফেলা হয়েছে","savedVoicePreferenceCleanupFailed":"সংরক্ষিত কণ্ঠ মুছে ফেলা হয়েছে, কিন্তু বক্তব্য সেটিং রিসেট করা যায়নি","savedVoiceDeleteFailed":"সংরক্ষিত কণ্ঠ মুছতে ব্যর্থ","speed":"গতি","speedSlow":"0.5x","speedNormal":"1.0x","speedFast":"2.0x","availableProviders":"উপলব্ধ প্রোভাইডার","models":"মডেল","test":"পরীক্ষা","testing":"পরীক্ষা হচ্ছে...","stop":"বন্ধ"},"imageGen":{"title":"ইমেজ জেনারেশন","description":"ইমেজ জেনারেশন সেটিংস এবং প্রোভাইডার কনফিগার করুন","loadingProviders":"ইমেজ জেনারেশন প্রোভাইডার লোড হচ্ছে...","noProviders":"কোনো ইমেজ জেনারেশন প্রোভাইডার নেই","noProvidersDescription":"ইমেজ জেনারেশন সমর্থন সহ একটি প্লাগইন কনফিগার করুন","enable":"ইমেজ জেনারেশন সক্রিয় করুন","enableDescription":"কথোপকথনে AI ইমেজ জেনারেশন অনুমতি দিন","configuration":"কনফিগারেশন","model":"মডেল","modelDescription":"ইমেজ জেনারেশনের জন্য মডেল নির্বাচন করুন","size":"সাইজ","sizeDescription":"তৈরি ইমেজের রেজোলিউশন","quality":"কোয়ালিটি","qualityDescription":"তৈরি ইমেজের কোয়ালিটি লেভেল","style":"স্টাইল","styleDescription":"তৈরি ইমেজের স্টাইল প্রিসেট","availableProviders":"উপলব্ধ প্রোভাইডার","models":"মডেল"},"data":{"title":"ডেটা ম্যানেজমেন্ট","export":"ডেটা এক্সপোর্ট","exportDescription":"পছন্দ, চ্যাট ফোল্ডার, সেশন ও বার্তা, নোট, জ্ঞান সংগ্রহ এবং নথি থেকে নেওয়া লেখা-সহ একটি বহনযোগ্য আর্কাইভ ডাউনলোড করুন।","archiveScopeV3":"পছন্দ, চ্যাট, ফোল্ডার, নোট, জ্ঞান সংগ্রহ এবং নথি থেকে নেওয়া লেখা অন্তর্ভুক্ত। অ্যাকাউন্ট ও গোপন তথ্য, বায়োমেট্রিক ক্লোন করা কণ্ঠ, তৈরি মিডিয়া, পারসোনা ও মেমরি এবং Work ডেটা বা ভলিউম অন্তর্ভুক্ত নয়।","exportAll":"সব ডেটা এক্সপোর্ট করুন","import":"ডেটা ইম্পোর্ট","importDescription":"পূর্ববর্তী এক্সপোর্ট থেকে ডেটা ইম্পোর্ট করুন।","importData":"ডেটা ইম্পোর্ট করুন","importing":"ইম্পোর্ট হচ্ছে...","clearSessions":"সেশন মুছুন","clearSessionsDescription":"সব চ্যাট সেশন মুছুন। এই ক্রিয়া পূর্বাবস্থায় ফেরানো যাবে না।","clearAll":"সব মুছুন","clearing":"মোছা হচ্ছে...","importOptions":"ইম্পোর্ট অপশন","importOptionsDescription":"বিদ্যমান ডেটা কীভাবে হ্যান্ডেল করতে হবে তা বেছে নিন","validatingArchive":"আর্কাইভ যাচাই ও পরিবর্তন গণনা করা হচ্ছে…","archiveValidationFailed":"আর্কাইভ যাচাই ব্যর্থ হয়েছে","preflightReport":"আমদানি পূর্বরূপ","preflightIncoming":"{{folders}} ফোল্ডার · {{sessions}} চ্যাট · {{messages}} বার্তা · {{notes}} নোট · {{collections}} সংগ্রহ · {{documents}} নথি · {{chunks}} খণ্ড","preflightRemappedIds":"অন্য অ্যাকাউন্টের ডেটা সুরক্ষায় {{count}}টি ID পুনরায় নির্ধারণ করা হবে।","skipDuplicates":"ডুপ্লিকেট স্কিপ করুন","overwrite":"বিদ্যমান ওভাররাইট করুন","importResults":"ইম্পোর্ট ফলাফল","preferences":"পছন্দসমূহ","imported":"ইম্পোর্ট করা হয়েছে","failed":"ব্যর্থ","sessions":"সেশন","sessionFolders":"সেশন ফোল্ডার","notes":"নোট","knowledgeCollections":"জ্ঞান সংগ্রহ","importedLabel":"ইম্পোর্ট করা হয়েছে","overwrittenLabel":"ওভাররাইট করা","skipped":"স্কিপ করা হয়েছে","toCreate":"তৈরি হবে","toOverwrite":"ওভাররাইট হবে","toSkip":"এড়ানো হবে","documents":"ডকুমেন্ট","warnings":"সতর্কতা","refreshAfterImportFailed":"ডেটা আমদানি হয়েছে, তবে কিছু দৃশ্য রিফ্রেশ করা যায়নি। সব পরিবর্তন দেখতে Libre WebUI পুনরায় লোড করুন।","errors":"ত্রুটি","archivedChats":{"title":"সংরক্ষণাগারভুক্ত চ্যাট","empty":"কোনো সংরক্ষণাগারভুক্ত চ্যাট নেই","unarchive":"সংরক্ষণাগার থেকে সরান"}},"about":{"title":"সম্পর্কে","versionLabel":"সংস্করণ","ollama":{"title":"Ollama স্ট্যাটাস","version":"সংস্করণ","healthy":"সুস্থ","unhealthy":"অসুস্থ"},"stats":{"models":"মডেল","sessions":"সেশন"},"features":{"privacy":{"title":"গোপনীয়তা প্রথমে","description":"আপনার ডেটা আপনার ডিভাইসে থাকে"},"openSource":{"title":"ওপেন সোর্স","description":"বিনামূল্যে এবং ওপেন সোর্স সফটওয়্যার"},"localInference":{"title":"লোকাল ইনফারেন্স","description":"Ollama দিয়ে স্থানীয়ভাবে AI মডেল চালান"}},"openSourceBy":"{{company}} দ্বারা ওপেন সোর্স","links":{"title":"লিংক","github":"GitHub","githubDescription":"সোর্স কোড দেখুন এবং অবদান রাখুন","website":"ওয়েবসাইট","websiteDescription":"আমাদের ওয়েবসাইট দেখুন","documentation":"Documentation","reportIssue":"সমস্যা রিপোর্ট করুন","reportIssueDescription":"বাগ রিপোর্ট এবং ফিচার অনুরোধ","documentationDescription":"Guides, tutorials and API reference","forgejo":"Forgejo Mirror","forgejoDescription":"Self-hosted Forgejo repository","sponsor":"পৃষ্ঠপোষক","sponsorDescription":"প্রকল্পে আর্থিক সহায়তা করুন"},"version":"সংস্করণ {{version}}"},"groups":{"general":"সাধারণ","chat":"চ্যাট","media":"কণ্ঠ ও ছবি","connections":"সংযোগ"},"search":{"title":"ওয়েব অনুসন্ধান","description":"স্ব-হোস্টেড SearXNG ইনস্ট্যান্সের মাধ্যমে ওয়েবে অনুসন্ধান করুন। চালু করলে চ্যাট কম্পোজারে একটি অনুসন্ধান টগল আসে এবং নেটওয়ার্ক-সক্ষম Work টাস্ক অনুসন্ধান করতে পারে।","enableLabel":"ওয়েব অনুসন্ধান চালু করুন","enableDescription":"চ্যাট এবং Work টাস্কে ওয়েব অনুসন্ধান দিন। অনুসন্ধান সার্ভার-সাইডে কনফিগার করা ইনস্ট্যান্সে চলে।","urlLabel":"SearXNG URL","urlDescription":"সার্ভার থেকে পৌঁছানো যায় এমন SearXNG ইনস্ট্যান্সের বেস URL। অন্তর্ভুক্ত প্রাইভেট ডিপ্লয় স্ট্যাক দেয় http://searxng:8080।","maxResultsLabel":"প্রতি অনুসন্ধানে ফলাফল","maxResultsDescription":"কতটি ফলাফল উত্তর বা টুল কলে যাবে, ১-১০।","maxResultsInvalid":"প্রতি অনুসন্ধানে ফলাফল ১ থেকে ১০-এর মধ্যে হতে হবে।","safeSearchLabel":"নিরাপদ অনুসন্ধান","safeSearchDescription":"স্পষ্ট ফলাফল ফিল্টার করতে ইঞ্জিনকে বলুন।","test":"সংযোগ পরীক্ষা","testing":"পরীক্ষা চলছে…","testOk":"অনুসন্ধান কাজ করছে — {{results}}টি ফলাফল এসেছে","testFailed":"অনুসন্ধান পরীক্ষা ব্যর্থ","save":"সংরক্ষণ","saved":"অনুসন্ধান সেটিংস সংরক্ষিত","saveFailed":"অনুসন্ধান সেটিংস সংরক্ষণ করা যায়নি"},"compaction":{"title":"প্রসঙ্গ সংকোচন","description":"কোনো কথোপকথন টোকেনের সীমা ছাড়িয়ে গেলে সার্ভার তার পুরোনো বার্তাগুলোর সারসংক্ষেপ তৈরি করে এবং কেবল সাম্প্রতিকগুলোই হুবহু রাখে। এই সার্ভারের সব ব্যবহারকারীর ক্ষেত্রে প্রযোজ্য।","thresholdLabel":"টোকেন সীমা","thresholdDescription":"আনুমানিক প্রসঙ্গ টোকেন, যার উপরে পুরোনো ইতিহাস সংক্ষিপ্ত করা হয়, 500-1,000,000।","thresholdInvalid":"টোকেন সীমা 500 থেকে 1,000,000-এর মধ্যে হতে হবে।","keepRecentLabel":"রাখা সাম্প্রতিক বার্তা","keepRecentDescription":"সর্বশেষ কতগুলো বার্তা সব সময় হুবহু থাকবে, 2-200।","keepRecentInvalid":"রাখা সাম্প্রতিক বার্তার সংখ্যা 2 থেকে 200-এর মধ্যে হতে হবে।","modelLabel":"সংকোচনের মডেল","modelDescription":"যে মডেল সারসংক্ষেপ লেখে। কোনোটি বেছে না নিলে সেশনের নিজস্ব মডেলই ব্যবহৃত হয়।","sessionModelOption":"সেশনের মডেল ব্যবহার করুন","promptLabel":"কাস্টম সারসংক্ষেপ প্রম্পট","promptPlaceholder":"অন্তর্নির্মিত প্রম্পট ব্যবহার করতে ফাঁকা রাখুন","promptDescription":"টেমপ্লেট চলক {{previousSummaryVariable}} এবং {{messagesVariable}} আগের সারসংক্ষেপ ও যেসব বার্তা সংক্ষিপ্ত করা হচ্ছে তা দিয়ে প্রতিস্থাপিত হয়।","saved":"সংকোচনের সেটিংস সংরক্ষিত হয়েছে","saveFailed":"সংকোচনের সেটিংস সংরক্ষণ করা যায়নি","loadFailed":"সংকোচনের সেটিংস লোড করা যায়নি"},"sessions":{"title":"সেশন","description":"এই অ্যাকাউন্ট যেসব জায়গায় লগ ইন করা আছে। কোনো সেশন লগ আউট করলে তা সঙ্গে সঙ্গে কার্যকর হয়; আবার লগ ইন করলে অ্যাক্সেস ফিরে আসে।","signOutOthers":"অন্যান্য সেশন লগ আউট করুন","signingOutOthers":"লগ আউট হচ্ছে…","signOut":"লগ আউট","signingOut":"লগ আউট হচ্ছে…","revoked":"সেশন লগ আউট হয়েছে।","revokeFailed":"সেশনটি লগ আউট করা যায়নি।","othersRevoked":"লগ আউট হওয়া অন্যান্য সেশন: {{count}}","loadFailed":"সেশনগুলি লোড করা যায়নি।","empty":"কোনো সেশন পাওয়া যায়নি।","current":"এই সেশন","revokedBadge":"লগ আউট হয়েছে","unknownDevice":"অজানা ডিভাইস","createdAt":"লগ ইন","lastSeenAt":"সর্বশেষ সক্রিয়","expiresAt":"মেয়াদ শেষ"},"apiKeys":{"title":"API কী","description":"স্ক্রিপ্ট ও ইন্টিগ্রেশনের জন্য সীমিত-স্কোপের টোকেন। প্রতিটি কী শুধু আপনার বেছে নেওয়া স্কোপগুলিতে অ্যাক্সেস পায়।","newKeyTitle":"আপনার নতুন API কী","copy":"কপি করুন","copied":"ক্লিপবোর্ডে কপি হয়েছে।","copyFailed":"কপি করা যায়নি।","showOnceWarning":"এখনই কপি করুন — এটি আর দেখানো হবে না।","dismiss":"সম্পন্ন","createTitle":"একটি কী তৈরি করুন","nameLabel":"নাম","namePlaceholder":"যেমন CI পাইপলাইন","nameRequired":"কী-টির একটি নাম দিন।","expiryLabel":"কত দিনে মেয়াদ শেষ (ঐচ্ছিক)","expiryPlaceholder":"কখনও না","expiryInvalid":"মেয়াদ অবশ্যই পূর্ণসংখ্যক দিনের হতে হবে।","scopesLabel":"স্কোপ","scopesRequired":"অন্তত একটি স্কোপ নির্বাচন করুন।","create":"কী তৈরি করুন","creating":"তৈরি হচ্ছে…","created":"API কী তৈরি হয়েছে।","createFailed":"API কী তৈরি করা যায়নি।","revoke":"বাতিল করুন","revoking":"বাতিল হচ্ছে…","revoked":"API কী বাতিল হয়েছে।","revokeFailed":"API কী বাতিল করা যায়নি।","revokedBadge":"বাতিল","loadFailed":"API কীগুলি লোড করা যায়নি।","empty":"এখনও কোনো API কী নেই।","createdAt":"তৈরি","lastUsedAt":"সর্বশেষ ব্যবহৃত","expiresAt":"মেয়াদ শেষ","neverExpires":"কখনও না"}}`),models:{title:`মডেল`,subtitle:`আপনার Ollama মডেল পুল, পরিচালনা এবং মনিটর করুন`,installed:`ইনস্টল করা মডেল`,available:`উপলব্ধ মডেল`,pull:`মডেল পুল করুন`,pulling:`পুল হচ্ছে...`,delete:`মডেল মুছুন`,deleting:`মোছা হচ্ছে...`,size:`সাইজ`,modified:`পরিবর্তিত`,family:`ফ্যামিলি`,parameters:`প্যারামিটার`,quantization:`কোয়ান্টাইজেশন`,noModels:`কোনো মডেল ইনস্টল করা নেই`,pullFirst:`শুরু করতে একটি মডেল পুল করুন`,noModelsFound:`কোনো মডেল পাওয়া যায়নি`},personas:{title:`পার্সোনা`,create:`পার্সোনা তৈরি করুন`,edit:`পার্সোনা সম্পাদনা করুন`,delete:`পার্সোনা মুছুন`,name:`নাম`,description:`বিবরণ`,systemPrompt:`সিস্টেম প্রম্পট`,model:`মডেল`,avatar:`অবতার`,background:`ব্যাকগ্রাউন্ড`,noPersonas:`কোনো পার্সোনা তৈরি করা হয়নি`,createFirst:`আপনার চ্যাট অভিজ্ঞতা কাস্টমাইজ করতে আপনার প্রথম পার্সোনা তৈরি করুন`},gallery:{title:`গ্যালারি`,subtitle:`আপনার AI-তৈরি ইমেজ গ্যালারি`,imageCount:`{{count}}টি ইমেজ`,generate:`ইমেজ তৈরি করুন`,generateDescription:`AI দিয়ে ইমেজ তৈরি করুন`,generating:`তৈরি হচ্ছে...`,prompt:`প্রম্পট`,promptPlaceholder:`আপনি যে ইমেজ তৈরি করতে চান তা বর্ণনা করুন...`,noImages:`এখনও কোনো ইমেজ তৈরি হয়নি`,download:`ডাউনলোড`,delete:`মুছুন`,regenerate:`পুনরায় তৈরি করুন`,model:`মডেল`,size:`সাইজ`,quality:`কোয়ালিটি`,created:`তৈরি করা হয়েছে`},errors:{generic:`একটি ত্রুটি ঘটেছে`,network:`নেটওয়ার্ক ত্রুটি। আপনার সংযোগ পরীক্ষা করুন।`,unauthorized:`এই ক্রিয়া সম্পাদন করার অনুমতি নেই।`,notFound:`অনুরোধকৃত রিসোর্স পাওয়া যায়নি।`,serverError:`সার্ভার ত্রুটি। পরে আবার চেষ্টা করুন।`,validation:`আপনার ইনপুট পরীক্ষা করুন এবং আবার চেষ্টা করুন।`},keyboard:{title:`কীবোর্ড শর্টকাট`,toggleSidebar:`সাইডবার টগল করুন`,openSettings:`সেটিংস খুলুন`,toggleDarkMode:`ডার্ক মোড টগল করুন`,showShortcuts:`কীবোর্ড শর্টকাট দেখান`,closeModals:`মোডাল বন্ধ করুন`,groups:{navigation:`নেভিগেশন`,general:`সাধারণ`,chat:`চ্যাট`,workspace:`ওয়ার্কস্পেস`},actions:{sendMessage:`বার্তা পাঠান`,newLine:`বার্তায় নতুন লাইন`,saveEdit:`সম্পাদিত বার্তা সংরক্ষণ করুন`,cancelEdit:`সম্পাদনা বাতিল করুন`,saveFile:`ফাইল সংরক্ষণ করুন`,formatCode:`কোড ফরম্যাট করুন`},description:`Libre WebUI-তে উপলব্ধ সব কীবোর্ড শর্টকাট।`,newChat:`নতুন চ্যাট`,newWork:`নতুন Work সেশন`,openPalette:`কমান্ড প্যালেট খুলুন`},modelManager:{title:`মডেল`,loading:`মডেল লোড হচ্ছে...`,systemStatus:{online:`Ollama অনলাইন`,offline:`Ollama অফলাইন`,models:`মডেল`,models_plural:`মডেল`,running:`চলমান`,vram:`VRAM`},sections:{pull:`নতুন মডেল পুল করুন`,library:`লাইব্রেরি ব্রাউজ করুন`,huggingface:`HuggingFace Hub`,running:`চলমান মডেল`,local:`লোকাল মডেল`,advanced:`উন্নত অ্যাকশন`,catalog:`মডেল তালিকা`},catalog:{searchPlaceholder:`নাম বা সরবরাহকারী দিয়ে মডেল খুঁজুন...`,noModels:`এখনো কোনো মডেল উপলব্ধ নেই।`,empty:`আপনার অনুসন্ধানের সঙ্গে কোনো মডেল মেলেনি।`,providerOllama:`Ollama`,hidden:`লুকানো`,visibilityFailed:`মডেলের দৃশ্যমানতা হালনাগাদ করা যায়নি।`,filterAll:`সব মডেল`,filterLocal:`স্থানীয়`,filterProviders:`সরবরাহকারী`,filterHidden:`লুকানো`,enableAll:`দেখানো গুলো চালু করুন`,disableAll:`দেখানো গুলো বন্ধ করুন`,rename:`নাম ও ছবি সম্পাদনা`,setPicture:`ছবি নির্ধারণ`,clearPicture:`ছবি সরান`,pictureInvalid:`একটি ছবি ফাইল বাছুন।`,pictureTooLarge:`ছবি ১৯২ KB-এর কম হতে হবে।`,saving:`সংরক্ষণ হচ্ছে…`,hide:`ব্যবহারকারীদের থেকে লুকান`,show:`ব্যবহারকারীদের দেখান`},pull:{placeholder:`মডেলের নাম লিখুন (যেমন llama3.2:3b, deepseek-r1:14b)`,button:`পুল`,cancel:`বাতিল`,popular:`জনপ্রিয় মডেল:`,browseAll:`ollama.com এ সব মডেল ব্রাউজ করুন`,success:`মডেল {{name}} সফলভাবে পুল করা হয়েছে`,cancelled:`মডেল পুল বাতিল করা হয়েছে`,failed:`মডেল পুল করতে ব্যর্থ`,enterName:`অনুগ্রহ করে একটি মডেলের নাম লিখুন`,restricted:`এই ইনস্ট্যান্সে মডেল ইনস্টলেশন শুধুমাত্র অ্যাডমিনদের জন্য সীমাবদ্ধ।`},progress:{starting:`শুরু হচ্ছে...`,pulling:`মডেল ডাউনলোড হচ্ছে...`,pullingLayer:`ডাউনলোড হচ্ছে`,verifying:`অখণ্ডতা যাচাই হচ্ছে...`,verifyingDigest:`sha256 ডাইজেস্ট যাচাই হচ্ছে`,writing:`ম্যানিফেস্ট লেখা হচ্ছে...`,cleaning:`পরিষ্কার করা হচ্ছে...`},library:{available:`উপলব্ধ`,search:`মডেল অনুসন্ধান করুন...`,noResults:`আপনার মানদণ্ডের সাথে মিলে যায় এমন কোনো মডেল পাওয়া যায়নি`,installed:`ইনস্টল করা`,more:`+{{count}} আরও`,refresh:`লাইব্রেরি রিফ্রেশ করুন`},huggingface:{browseAll:`HuggingFace-এ সব দেখুন`,checkingGguf:`GGUF ফাইল খোঁজা হচ্ছে...`,noGgufAvailable:`সরাসরি Ollama পুলের জন্য কোনো GGUF ফাইল নেই`,ggufFilesCount:`GGUF ফাইল ({{count}}) - সরাসরি Ollama-তে পুল করুন`,noModelsFound:`কোনো মডেল পাওয়া যায়নি`,noResults:`কোনো মডেল পাওয়া যায়নি। আপনার অনুসন্ধান বা ফিল্টার পরিবর্তন করুন।`,browseAllLink:`সব দেখুন`,search:`HuggingFace মডেল খুঁজুন...`,by:`দ্বারা`,gated:`সীমাবদ্ধ অ্যাক্সেস`,viewOnHF:`HuggingFace-এ দেখুন`,sortDownloads:`ডাউনলোড`,sortLikes:`লাইক`,sortRecent:`সাম্প্রতিক`,taskTextGeneration:`টেক্সট জেনারেশন`,taskTextToSpeech:`টেক্সট টু স্পিচ`,taskTextToImage:`টেক্সট টু ইমেজ`,taskSpeechRecognition:`স্পিচ রিকগনিশন`,tasks:{textGen:`টেক্সট জেনারেশন`,tts:`টেক্সট টু স্পিচ`,image:`টেক্সট টু ইমেজ`,stt:`স্পিচ রিকগনিশন`},sort:{downloads:`সর্বাধিক ডাউনলোড`,likes:`সর্বাধিক জনপ্রিয়`,recent:`সম্প্রতি আপডেট`}},local:{noModels:`এখনও কোনো মডেল ইনস্টল করা হয়নি`,pullToStart:`শুরু করতে উপরে একটি মডেল পুল করুন`,installed:`ইনস্টল করা`,running:`চলমান`,info:`তথ্য`,copy:`কপি`,delete:`মুছুন`,deleteConfirm:`আপনি কি মডেল "{{name}}" মুছতে চান?`,deleteSuccess:`মডেল {{name}} সফলভাবে মোছা হয়েছে`,deleteFailed:`মডেল মুছতে ব্যর্থ`},advanced:{createModel:`মডেল তৈরি করুন`,fromModelfile:`Modelfile থেকে`,copyModel:`মডেল কপি করুন`,duplicateExisting:`বিদ্যমান ডুপ্লিকেট করুন`,testEmbeddings:`এমবেডিং পরীক্ষা করুন`,generateVectors:`ভেক্টর তৈরি করুন`,healthCheck:`হেলথ চেক`,testConnection:`সংযোগ পরীক্ষা করুন`,healthy:`Ollama সুস্থ!`},modals:{details:{title:`মডেল বিবরণ`,info:`মডেল তথ্য`,family:`ফ্যামিলি`,parameters:`প্যারামিটার`,quantization:`কোয়ান্টাইজেশন`,format:`ফরম্যাট`,systemPrompt:`সিস্টেম প্রম্পট`,template:`টেমপ্লেট`,license:`লাইসেন্স`,modelfile:`Modelfile`,noDetails:`কোনো বিবরণ উপলব্ধ নেই`},copy:{title:`মডেল কপি করুন`,source:`সোর্স মডেল`,selectModel:`একটি মডেল নির্বাচন করুন...`,newName:`নতুন মডেল নাম`,placeholder:`যেমন my-custom-model`,copying:`কপি হচ্ছে...`,button:`মডেল কপি করুন`,success:`মডেল {{name}} এ কপি করা হয়েছে`,failed:`মডেল কপি করতে ব্যর্থ`,enterBoth:`অনুগ্রহ করে সোর্স এবং ডেস্টিনেশন উভয় নাম লিখুন`},create:{title:`কাস্টম মডেল তৈরি করুন`,name:`মডেল নাম`,namePlaceholder:`যেমন my-assistant`,modelfile:`Modelfile`,modelfilePlaceholder:`FROM llama3.2
2
+ SYSTEM You are a helpful assistant.`,see:`দেখুন`,docs:`Modelfile ডকস`,docsLink:`সিনট্যাক্স রেফারেন্সের জন্য`,creating:`তৈরি হচ্ছে...`,button:`মডেল তৈরি করুন`,success:`মডেল {{name}} সফলভাবে তৈরি হয়েছে`,failed:`মডেল তৈরি করতে ব্যর্থ`,enterBoth:`অনুগ্রহ করে মডেল নাম এবং Modelfile কন্টেন্ট লিখুন`},embeddings:{title:`এমবেডিং পরীক্ষা করুন`,model:`এমবেডিং মডেল`,selectModel:`একটি মডেল নির্বাচন করুন...`,recommended:`সুপারিশকৃত: nomic-embed-text, mxbai-embed-large`,input:`ইনপুট টেক্সট`,placeholder:`এমবেডিং তৈরির জন্য টেক্সট লিখুন...`,generating:`তৈরি হচ্ছে...`,button:`এমবেডিং তৈরি করুন`,result:`ফলাফল ({{count}} মাত্রা)`,success:`{{count}}-মাত্রার এমবেডিং ভেক্টর তৈরি হয়েছে`,failed:`এমবেডিং তৈরি করতে ব্যর্থ`,enterBoth:`অনুগ্রহ করে একটি মডেল নির্বাচন করুন এবং টেক্সট লিখুন`}}},personaManager:{title:`পার্সোনা`,subtitle:`কাস্টম ব্যক্তিত্ব, স্মৃতি এবং আচরণ সহ AI পার্সোনা তৈরি এবং পরিচালনা করুন`,loading:`পার্সোনা লোড হচ্ছে...`,createButton:`পার্সোনা তৈরি করুন`,importExport:`ইম্পোর্ট/এক্সপোর্ট`,stats:{title:`আপনার পার্সোনা`,count:`{{count}}টি পার্সোনা তৈরি হয়েছে`,count_plural:`{{count}}টি পার্সোনা তৈরি হয়েছে`},empty:{title:`এখনও কোনো পার্সোনা নেই`,description:`ব্যক্তিগতকৃত AI ইন্টারঅ্যাকশন শুরু করতে আপনার প্রথম পার্সোনা তৈরি করুন`,button:`আপনার প্রথম পার্সোনা তৈরি করুন`},deleteConfirm:`আপনি কি "{{name}}" মুছতে চান?`,deleteSuccess:`পার্সোনা "{{name}}" সফলভাবে মোছা হয়েছে`,downloadSuccess:`পার্সোনা "{{name}}" সফলভাবে ডাউনলোড হয়েছে`,failed:`পার্সোনা {{action}} করতে ব্যর্থ`},personaForm:{title:{create:`নতুন পার্সোনা তৈরি করুন`,edit:`পার্সোনা সম্পাদনা করুন`},subtitle:{create:`কাস্টম ব্যক্তিত্ব, মেমরি সিস্টেম এবং অ্যাডাপ্টিভ লার্নিং ক্ষমতা সহ একটি নতুন AI পার্সোনা তৈরি করুন`,edit:`উন্নত মেমরি, অ্যাডাপ্টিভ লার্নিং এবং বুদ্ধিমান প্যারামিটার সহ আপনার AI পার্সোনা কাস্টমাইজ করুন`},loading:`ফর্ম লোড হচ্ছে...`,saved:`সংরক্ষিত`,tabs:{basic:`মৌলিক`,parameters:`প্যারামিটার`,memory:`মেমরি এবং লার্নিং`,advanced:`উন্নত`},basic:{name:`নাম`,namePlaceholder:`পার্সোনার নাম লিখুন`,model:`মডেল`,selectModel:`একটি মডেল নির্বাচন করুন`,description:`বিবরণ`,descriptionPlaceholder:`আপনার পার্সোনা বর্ণনা করুন...`,systemPrompt:`সিস্টেম প্রম্পট`,systemPromptPlaceholder:`আপনার পার্সোনার আচরণ সংজ্ঞায়িত করে এমন সিস্টেম প্রম্পট লিখুন...`,systemPromptHint:`সিস্টেম প্রম্পট নির্ধারণ করে আপনার পার্সোনা কীভাবে আচরণ করবে এবং প্রতিক্রিয়া জানাবে।`},parameters:{temperature:`টেম্পারেচার`,temperatureHint:`সৃজনশীলতা বনাম ধারাবাহিকতা নিয়ন্ত্রণ করে`,topP:`Top-P`,topPHint:`প্রতিক্রিয়া বৈচিত্র্য নিয়ন্ত্রণ করে`,topK:`Top-K`,topKHint:`শব্দভান্ডার শীর্ষ-k টোকেনে সীমাবদ্ধ করে`,contextWindow:`কনটেক্সট উইন্ডো`,contextWindowHint:`সর্বোচ্চ কথোপকথন ইতিহাসের দৈর্ঘ্য`,maxTokens:`সর্বোচ্চ টোকেন`,maxTokensHint:`সর্বোচ্চ প্রতিক্রিয়ার দৈর্ঘ্য`,repeatPenalty:`রিপিট পেনাল্টি`,repeatPenaltyHint:`পুনরাবৃত্তিমূলক প্রতিক্রিয়া কমায়`},memory:{title:`মেমরি সিস্টেম`,subtitle:`পার্সোনা সময়ের সাথে কথোপকথন মনে রাখে`,enableHint:`আপনার পার্সোনাকে কথোপকথন মনে রাখতে এবং সময়ের সাথে কনটেক্সট তৈরি করতে মেমরি সিস্টেম সক্রিয় করুন।`,loading:`মেমরি স্ট্যাটাস লোড হচ্ছে...`,noData:`এখনও কোনো মেমরি ডেটা নেই`,memories:`স্মৃতি`,mbUsed:`MB ব্যবহৃত`,lastBackup:`শেষ ব্যাকআপ`,never:`কখনো না`,maxMemories:`সর্বোচ্চ স্মৃতি`,maxMemoriesHint:`এই পার্সোনা কতগুলি স্মৃতি সংরক্ষণ করতে পারে`,retention:`মেমরি রিটেনশন`,retentionHint:`ক্লিনআপের আগে স্মৃতি রাখার দিন`,autoCleanup:`পুরানো স্মৃতি স্বয়ংক্রিয়-ক্লিনআপ`,wipeAll:`সব স্মৃতি মুছুন`,wipeCannot:`এটি পূর্বাবস্থায় ফেরানো যাবে না`,wipeButton:`মুছুন`,wiping:`মোছা হচ্ছে...`,wipeConfirm:`আপনি কি সব স্মৃতি মুছতে চান? এটি পূর্বাবস্থায় ফেরানো যাবে না।`,wipeSuccess:`{{count}}টি স্মৃতি মোছা হয়েছে`},learning:{title:`অ্যাডাপ্টিভ লার্নিং`,subtitle:`পার্সোনা ইন্টারঅ্যাকশনের উপর ভিত্তি করে বিকশিত হয়`,enableHint:`আপনার পার্সোনাকে আপনার ইন্টারঅ্যাকশনের উপর ভিত্তি করে বিকশিত এবং প্রতিক্রিয়া ব্যক্তিগতকৃত করতে অ্যাডাপ্টিভ লার্নিং সক্রিয় করুন।`,speed:`লার্নিং স্পিড`,slow:`ধীর`,slowDesc:`ধীরে ধীরে পরিবর্তন`,balanced:`সুষম`,balancedDesc:`মাঝারি গতি`,fast:`দ্রুত`,fastDesc:`দ্রুত অভিযোজন`,autoAdapt:`ব্যবহারকারীর পছন্দে স্বয়ং-অভিযোজিত`,whatLearns:`পার্সোনা যা শেখে:`,conversationTone:`কথোপকথনের স্বর`,responseStyle:`প্রতিক্রিয়া শৈলী`,userPreferences:`ব্যবহারকারীর পছন্দ`,topicInterests:`বিষয় আগ্রহ`},advanced:{embeddingModel:`এমবেডিং মডেল`,embeddingHint:`মেমরি এনকোডিং এবং সেমান্টিক সার্চের জন্য ব্যবহৃত মডেল নির্বাচন করুন। এমবেডিং মডেলগুলি প্রথমে দেখানো হয়, তারপর অন্যান্য উপলব্ধ মডেল।`,noModels:`কোনো মডেল পাওয়া যায়নি`,embeddingModels:`এমবেডিং মডেল`,otherModels:`অন্যান্য মডেল`,installHint:`একটি এমবেডিং মডেল ইনস্টল করুন:`,recommended:`সুপারিশকৃত: nomic-embed-text, mxbai-embed-large, bge-m3, snowflake-arctic-embed`,aboutTitle:`উন্নত সেটিংস সম্পর্কে`,aboutDescription:`এমবেডিং মডেল মেমরি সিস্টেম দ্বারা সেমান্টিক অর্থ বোঝতে এবং কথোপকথনের সময় প্রাসঙ্গিক স্মৃতি খুঁজে পেতে ব্যবহৃত হয়। আপনার ব্যবহারের ক্ষেত্রে এবং উপলব্ধ রিসোর্সের সাথে মেলে এমন একটি মডেল বেছে নিন।`},actions:{cancel:`বাতিল`,save:`সংরক্ষণ`,saving:`সংরক্ষণ হচ্ছে...`,saveClose:`সংরক্ষণ এবং বন্ধ`,create:`তৈরি করুন`},success:{created:`পার্সোনা তৈরি হয়েছে`,updated:`পার্সোনা আপডেট হয়েছে`},error:{saveFailed:`সংরক্ষণ করতে ব্যর্থ`}},personaCard:{enhanced:`উন্নত`,systemPrompt:`সিস্টেম প্রম্পট`,memories:`স্মৃতি`,use:`ব্যবহার করুন`,editTooltip:`পার্সোনা সম্পাদনা করুন`,downloadTooltip:`পার্সোনা ডাউনলোড করুন`,backup:`ব্যাকআপ`,exportDNA:`DNA এক্সপোর্ট করুন`,wipeMemories:`স্মৃতি মুছুন`,wipeConfirm:`আপনি কি এই পার্সোনার সব স্মৃতি মুছতে চান? এই ক্রিয়া পূর্বাবস্থায় ফেরানো যাবে না।`,wipeSuccess:`{{count}}টি স্মৃতি মোছা হয়েছে`,backupSuccess:`পার্সোনা ব্যাকআপ সফলভাবে ডাউনলোড হয়েছে`,dnaSuccess:`পার্সোনা DNA সফলভাবে এক্সপোর্ট হয়েছে`,failed:`{{action}} করতে ব্যর্থ`},userManager:JSON.parse(`{"title":"ব্যবহারকারী ব্যবস্থাপনা","subtitle":"ব্যবহারকারী অ্যাকাউন্ট এবং অনুমতি পরিচালনা করুন","pageDescription":"আপনার Libre WebUI ইনস্ট্যান্সের জন্য ব্যবহারকারী অ্যাকাউন্ট, অনুমতি এবং অ্যাক্সেস নিয়ন্ত্রণ পরিচালনা করুন।","loading":"ব্যবহারকারী লোড হচ্ছে...","createUser":"ব্যবহারকারী তৈরি করুন","search":"ব্যবহারকারী অনুসন্ধান করুন...","noUsers":"কোনো ব্যবহারকারী পাওয়া যায়নি","noUsersMatching":"আপনার অনুসন্ধানের সাথে মিলে যায় এমন কোনো ব্যবহারকারী নেই","columns":{"user":"ব্যবহারকারী","email":"ইমেইল","role":"ভূমিকা","created":"তৈরি করা হয়েছে","actions":"অ্যাকশন"},"roles":{"admin":"অ্যাডমিন","user":"ব্যবহারকারী"},"noEmail":"কোনো ইমেইল নেই","deleteConfirm":"আপনি কি ব্যবহারকারী \\"{{name}}\\" মুছতে চান?","deleteSuccess":"ব্যবহারকারী সফলভাবে মোছা হয়েছে","deleteFailed":"ব্যবহারকারী মুছতে ব্যর্থ","cannotDeleteSelf":"আপনি নিজের অ্যাকাউন্ট মুছতে পারবেন না","approval":{"title":"অপেক্ষমাণ অনুমোদন","description":"এই ইনস্ট্যান্সে প্রবেশের অনুমতি দেওয়ার আগে নতুন নিবন্ধনগুলি পর্যালোচনা করুন।","registered":"নিবন্ধিত","activate":"অ্যাকাউন্ট সক্রিয় করুন","reject":"নিবন্ধন প্রত্যাখ্যান করুন","approved":"{{name}} এখন সাইন ইন করতে পারবেন।","failed":"অ্যাকাউন্টটি অনুমোদন করা যায়নি।","notification":"{{count}}টি নিবন্ধন আপনার অনুমোদনের অপেক্ষায় আছে।","notificationBadge":"{{count}}টি অপেক্ষমাণ ব্যবহারকারী অনুমোদন"},"form":{"title":{"create":"ব্যবহারকারী তৈরি করুন","edit":"ব্যবহারকারী সম্পাদনা করুন"},"username":"ব্যবহারকারীর নাম","usernamePlaceholder":"ব্যবহারকারীর নাম লিখুন","email":"ইমেইল","emailPlaceholder":"ইমেইল লিখুন (ঐচ্ছিক)","password":"পাসওয়ার্ড","passwordPlaceholder":"পাসওয়ার্ড লিখুন","passwordHint":"বর্তমান পাসওয়ার্ড রাখতে খালি রাখুন","role":"ভূমিকা","creating":"তৈরি হচ্ছে...","updating":"আপডেট হচ্ছে...","createButton":"ব্যবহারকারী তৈরি করুন","updateButton":"ব্যবহারকারী আপডেট করুন","createSuccess":"ব্যবহারকারী সফলভাবে তৈরি হয়েছে","updateSuccess":"ব্যবহারকারী সফলভাবে আপডেট হয়েছে","createFailed":"ব্যবহারকারী তৈরি করতে ব্যর্থ","updateFailed":"ব্যবহারকারী আপডেট করতে ব্যর্থ"},"workAccess":{"title":"Work অ্যাক্সেস","description":"সব সক্রিয় ব্যবহারকারীকে বিচ্ছিন্ন স্যান্ডবক্সে Work টাস্ক তৈরি ও চালানোর অনুমতি দিন। প্রশাসকদের সবসময় অ্যাক্সেস থাকে; হোস্ট ফোল্ডার ওয়ার্কস্পেস শুধুমাত্র প্রশাসকদের জন্য থাকে।","saved":"Work অ্যাক্সেস আপডেট হয়েছে","saveFailed":"Work অ্যাক্সেস আপডেট করা যায়নি"},"workPolicies":{"title":"Work নীতি","description":"নামযুক্ত রানটাইম প্রিসেট (ইমেজ, সীমা, নিষ্ক্রিয় বন্ধ) যার অধীনে টাস্ক তৈরি করা যায়। খালি ক্ষেত্র গ্লোবাল ডিফল্ট উত্তরাধিকার পায়।","add":"নীতি যোগ করুন","name":"নাম","image":"ইমেজ","memory":"মেমরি","cpu":"CPU","pids":"PID সীমা","workspaceSize":"ওয়ার্কস্পেস আকার","idleMinutes":"নিষ্ক্রিয় বন্ধ (মিনিট)","networkDefault":"নেটওয়ার্ক ডিফল্ট","networkInherit":"ডিফল্ট উত্তরাধিকার","networkOn":"সক্রিয়","networkOff":"নিষ্ক্রিয়","save":"সংরক্ষণ","cancel":"বাতিল","edit":"নীতি সম্পাদনা","delete":"নীতি মুছুন","deleteConfirm":"এই নীতি মুছবেন? এটি ব্যবহারকারী টাস্কগুলি গ্লোবাল ডিফল্টে ফিরে যাবে।","empty":"এখনও কোনো নীতি নেই। টাস্কগুলি গ্লোবাল রানটাইম ডিফল্ট ব্যবহার করে।","saved":"Work নীতি সংরক্ষিত হয়েছে","deleted":"Work নীতি মুছে ফেলা হয়েছে","failed":"Work নীতি সংরক্ষণ করা যায়নি","invalidNumber":"PID সীমা এবং নিষ্ক্রিয় বন্ধ অবশ্যই সংখ্যা হতে হবে।"},"modelAccess":{"title":"মডেল ডাউনলোড","description":"সব সক্রিয় ব্যবহারকারীকে Ollama এবং Hugging Face ব্রাউজার থেকে মডেল টানতে দিন। প্রশাসকরা সবসময় মডেল ডাউনলোড করতে পারেন।","saved":"মডেল ডাউনলোড অ্যাক্সেস আপডেট হয়েছে","saveFailed":"মডেল ডাউনলোড অ্যাক্সেস আপডেট করা যায়নি"},"webSearchAccess":{"title":"ওয়েব অনুসন্ধান","description":"সব সক্রিয় ব্যবহারকারীকে চ্যাট এবং Work টাস্কে ওয়েব অনুসন্ধান ব্যবহার করতে দিন। প্রশাসকরা সবসময় ব্যবহার করতে পারেন। ইঞ্জিনটি সেটিংস > অনুসন্ধানে কনফিগার করুন।","saved":"ওয়েব অনুসন্ধান অ্যাক্সেস আপডেট হয়েছে","saveFailed":"ওয়েব অনুসন্ধান অ্যাক্সেস আপডেট করা যায়নি"},"agentAccess":{"title":"এজেন্ট","description":"প্রশাসকদের জন্য এজেন্ট বিভাগ (Libre Claw) চালু করুন। এজেন্ট CLI সার্ভার ব্যবহারকারী হিসেবে হোস্টে চলে, Work স্যান্ডবক্সের বাইরে।","saved":"এজেন্ট অ্যাক্সেস আপডেট হয়েছে","saveFailed":"এজেন্ট অ্যাক্সেস আপডেট করা যায়নি","lockedByEnv":"AGENT_CLI_MODELS_ENABLED এনভায়রনমেন্ট ভেরিয়েবল দ্বারা নির্ধারিত।"},"groups":{"title":"গ্রুপ","description":"শেয়ার করা অ্যাক্সেস পরিচালনা করতে অ্যাকাউন্টগুলিকে গ্রুপে রাখুন, এবং কোনো অ্যাকাউন্ট কার্যত কী করতে পারে তা দেখুন।","newGroup":"নতুন গ্রুপ","nameLabel":"নাম","nameRequired":"গ্রুপটির একটি নাম দিন।","descriptionLabel":"বিবরণ (ঐচ্ছিক)","create":"গ্রুপ তৈরি করুন","creating":"তৈরি হচ্ছে…","created":"গ্রুপ তৈরি হয়েছে।","createFailed":"গ্রুপ তৈরি করা যায়নি।","deleted":"গ্রুপ মোছা হয়েছে।","deleteFailed":"গ্রুপ মোছা যায়নি।","deleteGroup":"গ্রুপ মুছুন","loadFailed":"গ্রুপগুলি লোড করা যায়নি।","empty":"এখনও কোনো গ্রুপ নেই।","memberCount":"সদস্য: {{count}}","noMembers":"এখনও কোনো সদস্য নেই।","addedAt":"যোগ করা হয়েছে","addMember":"সদস্য যোগ করুন","add":"যোগ করুন","selectUser":"একজন ব্যবহারকারী নির্বাচন করুন…","memberAdded":"সদস্য যোগ হয়েছে।","memberAddFailed":"সদস্য যোগ করা যায়নি।","removeMember":"সদস্য সরান","memberRemoved":"সদস্য সরানো হয়েছে।","memberRemoveFailed":"সদস্য সরানো যায়নি।","effectiveTitle":"কার্যকর অ্যাক্সেস","effectiveDescription":"ভূমিকা, গ্রুপ ও অনুমোদন মিলিয়ে কোনো অ্যাকাউন্ট শেষ পর্যন্ত কী অ্যাক্সেস পায় তা দেখতে একটি অ্যাকাউন্ট বেছে নিন।","accessLookupFailed":"কার্যকর অ্যাক্সেস লোড করা যায়নি।","roleLabel":"ভূমিকা","statusLabel":"অবস্থা","memberOf":"গ্রুপ","featuresLabel":"ফিচার অ্যাক্সেস","grantsLabel":"অনুমোদন","grantVia":"মাধ্যমে"},"audit":{"title":"নিরাপত্তা অডিট লগ","description":"এই ইনস্ট্যান্সে সাম্প্রতিক লগ ইন, অনুমতি যাচাই ও প্রশাসনিক পরিবর্তনসমূহ।","actionFilter":"অ্যাকশন","actionPlaceholder":"যেমন auth.login","resultFilter":"ফলাফল","resultSuccess":"সফল","resultDenied":"প্রত্যাখ্যাত","resultFailure":"ব্যর্থ","limitFilter":"সীমা","loadFailed":"অডিট লগ লোড করা যায়নি।","empty":"এখনও কোনো অডিট ইভেন্ট রেকর্ড হয়নি।","actor":"সম্পাদনকারী","target":"লক্ষ্য"}}`),usageAnalytics:{eyebrow:`প্রশাসন`,title:`প্রদানকারী ব্যবহার`,description:`এই ইনস্ট্যান্সে সক্রিয় প্লাগইনগুলিতে আউটবাউন্ড API কল এবং মডেল ব্যবহার অনুসরণ করুন।`,days:`{{count}} দিন`,refresh:`ব্যবহার রিফ্রেশ করুন`,loadFailed:`প্রদানকারী ব্যবহার লোড করা যায়নি।`,metrics:{calls:`কল`,tokens:`টোকেন`},cards:{calls:`API কল`,callsDetail:`{{count}} জন সক্রিয় ব্যবহারকারী জুড়ে`,tokens:`রিপোর্ট করা টোকেন`,tokensDetail:`{{count}}টি কলে রিপোর্ট করা ব্যবহার`,success:`সাফল্যের হার`,successDetail:`{{count}}টি ব্যর্থ কল`,latency:`গড় বিলম্ব`,latencyDetail:`শেষ-থেকে-শেষ প্রদানকারী সময়`},activity:{title:`সময়ের সাথে ব্যবহার`,callsDescription:`সক্রিয় প্লাগইনগুলিতে দৈনিক আউটবাউন্ড অনুরোধ`,tokensDescription:`প্রদানকারীদের দ্বারা রিপোর্ট করা দৈনিক টোকেন মোট`,chartLabel:`দৈনিক প্রদানকারী {{metric}} চার্ট`},models:{title:`মডেল ব্যবহার`,description:`এই সময়ের মধ্যে সবচেয়ে বেশি ট্রাফিক বহনকারী মডেলগুলি।`,model:`মডেল`,success:`সাফল্য`,latency:`বিলম্ব`},providers:{title:`সক্রিয় প্লাগইন ট্রাফিক`},capabilities:{title:`ক্ষমতার মিশ্রণ`,characters:`{{count}} অক্ষর`,bytes:`{{count}} বাইট`,images:`{{count}} ছবি`,jobs:`{{count}} ভিডিও কাজ`,inputs:`{{count}} ইনপুট`,reportedTokens:`{{count}} রিপোর্ট করা টোকেন`},empty:{title:`এখনও কোনো প্রদানকারী কল নেই`,description:`একটি সক্রিয় প্লাগইন চ্যাট, কাজ, এম্বেডিং, ছবি, বক্তৃতা, শব্দ বা ভিডিও অনুরোধগুলি পরিচালনা করার পরে কলগুলি এখানে উপস্থিত হবে।`},privacyNote:`আউটবাউন্ড প্লাগইন সীমানায় সার্ভারে ব্যবহার মাপা হয়। Libre WebUI প্রদানকারী, মডেল, সময়, স্থিতি এবং রিপোর্ট করা কাউন্টার সংরক্ষণ করে—কখনও প্রম্পট, প্রতিক্রিয়া, এন্ডপয়েন্ট, শংসাপত্র বা প্রদানকারী ত্রুটি বডি নয়। টোকেন মোটগুলিতে কেবলমাত্র সেই কলগুলি অন্তর্ভুক্ত থাকে যেখানে প্রদানকারী ব্যবহারের মেটাডেটা ফেরত দিয়েছে।`,heatmap:{title:`এক বছরের কার্যকলাপ`,description:`গত এক বছরের দৈনিক প্রোভাইডার কল, প্রতিদিনের সর্বাধিক ব্যবহৃত মডেল অনুযায়ী রঙিন।`,calls:`কল`,noCalls:`কোনো কল নেই`,other:`অন্যান্য মডেল`,less:`কম`,more:`বেশি`,yearTotal:`গত এক বছরে {{formatted}} কল`}},systemPage:{eyebrow:`প্রশাসন`,title:`সিস্টেম`,description:`এই Libre WebUI ইনস্ট্যান্স হোস্ট করা মেশিন এবং রানটাইম পর্যবেক্ষণ করুন।`,updated:`আপডেট করা হয়েছে {{date}}`,refresh:`সিস্টেম তথ্য রিফ্রেশ করুন`,loadFailed:`সিস্টেম তথ্য লোড করা যায়নি।`,cards:{uptime:`হোস্ট আপটাইম`,uptimeDetail:`{{date}} থেকে চলছে`,memory:`ব্যবহৃত মেমরি`,memoryDetail:`{{total}} এর {{used}}`,freeSpace:`ফাঁকা স্থান`,freeSpaceDetail:`{{label}} · মোট {{total}}`,containers:`চলমান কন্টেইনার`,containersDetail:`Docker এর কাছে পরিচিত {{total}} টি কন্টেইনার`,dockerUnavailable:`Docker অনুপলব্ধ`,unavailable:`অনুপলব্ধ`},host:{title:`হোস্ট এবং রানটাইম`,description:`অপারেটিং সিস্টেম, প্রসেসর এবং Libre WebUI প্রক্রিয়ার বিবরণ।`,container:`কন্টেইনার রানটাইম`,native:`নেটিভ রানটাইম`,hostname:`হোস্টনেম`,operatingSystem:`অপারেটিং সিস্টেম`,processor:`প্রসেসর`,logicalCpus:`লজিক্যাল CPU`,loadAverage:`লোড গড় · ১ / ৫ / ১৫ মিনিট`,libreVersion:`Libre WebUI`,nodeVersion:`Node.js`,process:`প্রসেস`,workingDirectory:`ওয়ার্কিং ডিরেক্টরি`},memory:{title:`মেমরি`,description:`রানটাইম-দৃশ্যমান সিস্টেম মেমরি এবং অ্যাপ্লিকেশন প্রসেস ব্যবহার।`,usedOf:`{{total}}-এর মধ্যে {{used}} ব্যবহৃত`,free:`{{value}} খালি`,processRss:`প্রসেস RSS`,heapUsed:`V8 হিপ ব্যবহৃত`,heapTotal:`V8 হিপ মোট`,external:`বহিস্থ মেমরি`},storage:{title:`স্টোরেজ`,description:`রানটাইম ফাইলসিস্টেম এবং স্থায়ী অ্যাপ্লিকেশন ডেটার জন্য উপলব্ধ স্থান।`,used:`{{value}} ব্যবহৃত`,free:`{{value}} খালি`,empty:`এই রানটাইমে ফাইলসিস্টেম তথ্য অনুপলব্ধ।`},docker:{title:`Docker`,description:`শুধুমাত্র পঠনযোগ্য Docker Engine স্থিতি এবং সীমিত কন্টেইনার তালিকা।`,connected:`সংযুক্ত`,unavailable:`অনুপলব্ধ`,unavailableDetail:`Docker Engine ডায়াগনস্টিক্স অনুপলব্ধ।`,socketStatus:`লোকাল সকেট: {{status}}`,mounted:`মাউন্ট করা`,notMounted:`মাউন্ট করা নয়`,running:`চলমান`,stopped:`বন্ধ`,paused:`বিরতি`,total:`মোট`,version:`সংস্করণ`,host:`হোস্ট`,architecture:`আর্কিটেকচার`,cpus:`CPU`,memory:`মেমরি`,container:`কন্টেইনার`,image:`ইমেজ`,state:`অবস্থা`,created:`তৈরি হয়েছে`,empty:`Docker সংযুক্ত আছে এবং বর্তমানে কোনো কন্টেইনার তালিকাভুক্ত নেই।`},network:{title:`নেটওয়ার্ক`,description:`রানটাইম-দৃশ্যমান ইন্টারফেস, ঠিকানা এবং Linux ট্রাফিক কাউন্টার।`,internal:`অভ্যন্তরীণ`,empty:`অ্যাপ্লিকেশন রানটাইমে কোনো নেটওয়ার্ক ইন্টারফেস দৃশ্যমান নয়।`},securityNote:`এই পৃষ্ঠাটি কেবল প্রশাসকদের জন্য সীমাবদ্ধ। সার্ভার কেবল অপারেশনাল সারাংশ প্রদান করে: এটি এনভায়রনমেন্ট ভেরিয়েবল, ক্রেডেনশিয়াল, Docker লেবেল, মাউন্ট, কন্টেইনার কমান্ড বা ইন্সপেক্ট পেলোড প্রকাশ করে না। যখন Libre WebUI একটি কন্টেইনারে চলে, তখন হোস্ট-স্তরের CPU এবং মেমরির বিবরণ এর লোকাল সকেট উপলব্ধ থাকলে Docker Engine থেকে আসে; অন্যান্য মান অ্যাপ্লিকেশন রানটাইম বর্ণনা করে।`,work:{title:`Work`,description:`সব ব্যবহারকারীর স্যান্ডবক্স`,access:`অ্যাক্সেস`,accessAdmins:`শুধুমাত্র প্রশাসক`,accessAllUsers:`সব ব্যবহারকারী`,runtimeAvailable:`উপলব্ধ`,runtimeUnavailable:`অনুপলব্ধ`,activeRuntimes:`সক্রিয় রানটাইম`,pendingCleanups:`অমীমাংসিত ক্লিনআপ`,orphans:`অনাথ কনটেইনার`,owner:`মালিক`,task:`টাস্ক`,state:`অবস্থা`,preview:`প্রিভিউ`,terminals:`টার্মিনাল`,updated:`আপডেট হয়েছে`,stateRunning:`চলছে`,stateStopped:`বন্ধ`,stateStarting:`শুরু হচ্ছে`,stateUnknown:`অজানা`,noTasks:`এখনও কোনো Work টাস্ক নেই।`}},chatHistory:{label:`কথোপকথনের ইতিহাস`,jumpToTurn:`পর্ব {{index}} / {{total}}-এ যান`},chatMessage:{you:`আপনি`,assistant:`সহকারী`,system:`সিস্টেম`,conversationSummary:`কথোপকথনের সারাংশ`,restoreCompacted:`সারাংশ করা বার্তাগুলি পুনরুদ্ধার করুন`,restoreFailed:`সারাংশ করা বার্তাগুলি পুনরুদ্ধার করা যায়নি`,copy:`কপি`,copyMessage:`বার্তা কপি করুন`,copied:`কপি হয়েছে!`,regenerate:`পুনরায় তৈরি করুন`,regenerateResponse:`প্রতিক্রিয়া পুনরায় তৈরি করুন`,edit:`সম্পাদনা`,editSystemMessage:`সিস্টেম বার্তা সম্পাদনা করুন`,saveChanges:`পরিবর্তন সংরক্ষণ করুন`,cancelEditing:`সম্পাদনা বাতিল করুন`,saveAndSubmit:`সংরক্ষণ ও পাঠান`,goodResponse:`ভালো উত্তর`,badResponse:`খারাপ উত্তর`,delete:`মুছুন`,deleteConfirm:`এই বার্তা মুছবেন?`,branch:`ব্রাঞ্চ`,speaking:`বলছে...`,speakMessage:`বার্তা বলুন`,stopSpeaking:`বলা বন্ধ করুন`,showMore:`আরও দেখান`,showLess:`কম দেখান`,thinking:`চিন্তা করছে`,thoughtFor:`{{duration}} ধরে ভেবেছে`,hiddenLines:`লুকানো লাইন: {{count}}`,systemMessagePlaceholder:`আপনার সিস্টেম বার্তা লিখুন...`,fullSizeImage:`পূর্ণ সাইজ ইমেজ`,startConversation:`একটি কথোপকথন শুরু করুন`,startConversationDescription:`আপনার AI সহকারীর সাথে চ্যাট শুরু করতে একটি বার্তা পাঠান। প্রশ্ন করুন, কোডে সাহায্য পান, বা একটি স্বাভাবিক কথোপকথন করুন।`,scrollToBottom:`নিচে স্ক্রোল করুন`,newMessages:`নতুন বার্তা`},imageGallery:{title:`ইমেজ গ্যালারি`,noImages:`এখনও কোনো ইমেজ নেই`,noImagesHint:`ডানদিকের প্যানেল ব্যবহার করে আপনার প্রথম ইমেজ তৈরি করুন`,delete:`মুছুন`,download:`ডাউনলোড`,deleteConfirm:`আপনি কি এই ইমেজ মুছতে চান?`,deleteSuccess:`ইমেজ মোছা হয়েছে`,deleteFailed:`ইমেজ মুছতে ব্যর্থ`,downloadFailed:`ইমেজ ডাউনলোড করতে ব্যর্থ`,loadMore:`আরও লোড করুন ({{current}} এর মধ্যে {{total}})`,loadFailed:`গ্যালারি লোড করতে ব্যর্থ`},imageGeneration:{title:`ইমেজ তৈরি করুন`,prompt:`প্রম্পট`,promptPlaceholder:`আপনি যে ইমেজ তৈরি করতে চান তা বর্ণনা করুন...`,model:`মডেল`,selectModel:`মডেল নির্বাচন করুন`,noModels:`কোনো ইমেজ জেনারেশন মডেল উপলব্ধ নেই`,configurePlugin:`ইমেজ জেনারেশন সমর্থন সহ একটি প্লাগইন কনফিগার করুন`,size:`সাইজ`,quality:`কোয়ালিটি`,style:`স্টাইল`,generate:`তৈরি করুন`,generating:`তৈরি হচ্ছে...`,success:`ইমেজ সফলভাবে তৈরি হয়েছে`,failed:`ইমেজ তৈরি করতে ব্যর্থ`,enterPrompt:`অনুগ্রহ করে একটি প্রম্পট লিখুন`,promptTooLong:`প্রম্পট সর্বোচ্চ {{max}} অক্ষরের সীমা অতিক্রম করেছে`},mediaGeneration:{title:`মিডিয়া তৈরি করুন`,description:`সক্রিয় মিডিয়া প্রদানকারীর মাধ্যমে ভিডিও, শব্দ, সঙ্গীত বা বক্তৃতা তৈরি করুন।`,image:`ছবি`,video:`ভিডিও`,audio:`অডিও`,sound:`শব্দ`,speech:`বক্তৃতা`,model:`মডেল`,voice:`ভয়েস বা ভয়েস আইডি`,cloneVoice:`একটি রেফারেন্স কণ্ঠ ক্লোন করুন`,cloneVoiceDescription:`পূর্বনির্ধারিত কণ্ঠের বদলে একটি রেফারেন্স রেকর্ডিং অনুসারে এই বক্তব্য তৈরি করুন।`,referenceAudio:`রেফারেন্স অডিও`,referenceTranscript:`হুবহু রেফারেন্স প্রতিলিপি`,referenceTranscriptPlaceholder:`রেফারেন্স রেকর্ডিংয়ে যা বলা হয়েছে ঠিক তা-ই লিখুন…`,referenceAudioTooLarge:`রেফারেন্স অডিওর আকার {{max}} বা তার কম হতে হবে।`,cloneConsent:`বক্তার অনুমতি থাকলেই কেবল কণ্ঠ ক্লোন করুন। এই বক্তব্য তৈরির জন্য রেকর্ডিংটি নির্বাচিত প্রদানকারীর কাছে পাঠানো হয় এবং Libre WebUI এটি সংরক্ষণ করে না।`,saveVoiceProfile:`পুনর্ব্যবহারযোগ্য কণ্ঠ হিসেবে সংরক্ষণ করুন`,saveVoiceProfileDescription:`এই রেফারেন্স রেকর্ডিং ও প্রতিলিপি নিরাপদে সংরক্ষণ করুন। এই কণ্ঠ ব্যবহার করা প্রতিটি বক্তব্য ব্যাচের জন্য Libre WebUI এগুলো নির্বাচিত প্রদানকারীর কাছে পাঠায়।`,voiceProfileName:`সংরক্ষিত কণ্ঠের নাম`,voiceProfileNamePlaceholder:`যেমন, আমার কণ্ঠ`,voiceStorageConsent:`আমি নিশ্চিত করছি যে এই কণ্ঠ ক্লোন ও সংরক্ষণের জন্য বক্তার অনুমতি আমার রয়েছে। আমি না মোছা পর্যন্ত রেফারেন্সটি সংরক্ষিত থাকবে।`,resolution:`রেজোলিউশন`,aspectRatio:`অ্যাসপেক্ট রেশিও`,duration:`সময়কাল`,providerDefault:`প্রদানকারীর ডিফল্ট`,generateAudio:`সমর্থিত হলে ভিডিওর সাথে অডিও তৈরি করুন`,prompt:`প্রম্পট`,text:`উচ্চারণের জন্য টেক্সট`,videoPlaceholder:`দৃশ্য, গতি, ক্যামেরা এবং আলোর বর্ণনা দিন...`,audioPlaceholder:`আপনি যে টেক্সটটি ভয়েস দিয়ে উচ্চারণ করতে চান তা লিখুন...`,soundPlaceholder:`আপনার পছন্দের শব্দ, সঙ্গীত, পরিবেশ বা কথ্য প্রতিক্রিয়া বর্ণনা করুন...`,generate:`তৈরি করুন`,generating:`তৈরি হচ্ছে… এতে কয়েক মিনিট সময় লাগতে পারে`,success:`মিডিয়া তৈরি হয়েছে এবং Imagine-এ সংরক্ষিত হয়েছে`,successWithSavedVoice:`মিডিয়া তৈরি হয়েছে এবং “{{name}}” এখন বক্তব্য সেটিংসে উপলভ্য`,failed:`মিডিয়া তৈরি করতে ব্যর্থ`,loadFailed:`মিডিয়া প্রদানকারী লোড করতে ব্যর্থ`,noModels:`কোনো {{kind}} মডেল উপলব্ধ নেই। প্রথমে একটি সামঞ্জস্যপূর্ণ প্রদানকারী সক্রিয় করুন এবং এর ক্রেডেনশিয়াল সংরক্ষণ করুন।`},mediaGallery:{itemCount:`{{count}}টি আইটেম`,empty:`এখনও কোনো মিডিয়া তৈরি হয়নি`,emptyHint:`একটি ছবি, ভিডিও বা ভয়েস ক্লিপ তৈরি করুন এবং এটি এখানে উপস্থিত হবে।`,filters:{all:`সব`,image:`ছবি`,video:`ভিডিও`,audio:`অডিও`}},errorBoundary:{title:`কিছু ভুল হয়েছে`,description:`আমরা একটি অপ্রত্যাশিত ত্রুটির সম্মুখীন হয়েছি। অনুগ্রহ করে পেজ রিফ্রেশ করুন।`,tryAgain:`পেজ রিফ্রেশ করুন`,goHome:`হোমে যান`,errorDetails:`ত্রুটির বিবরণ (ডেভেলপমেন্ট)`},documents:{title:`ডকুমেন্ট`,upload:`ডকুমেন্ট আপলোড করুন`,uploading:`আপলোড হচ্ছে...`,noDocuments:`কোনো ডকুমেন্ট আপলোড করা হয়নি`,uploadHint:`আপনার কথোপকথনে ব্যবহার করতে ডকুমেন্ট আপলোড করুন`,delete:`মুছুন`,deleteConfirm:`আপনি কি এই ডকুমেন্ট মুছতে চান?`,deleteSuccess:`ডকুমেন্ট মোছা হয়েছে`,deleteFailed:`ডকুমেন্ট মুছতে ব্যর্থ`,uploadSuccess:`ডকুমেন্ট সফলভাবে আপলোড হয়েছে`,uploadFailed:`ডকুমেন্ট আপলোড করতে ব্যর্থ`,types:`সমর্থিত: PDF, TXT, MD, DOCX`,unsupportedFileType:`শুধুমাত্র PDF এবং TXT ফাইল সমর্থিত`,fileSizeTooLarge:`ফাইল সাইজ ১০MB এর কম হতে হবে`,uploadSuccessWithName:`ডকুমেন্ট "{{name}}" সফলভাবে আপলোড হয়েছে`,removeSuccess:`ডকুমেন্ট সফলভাবে সরানো হয়েছে`,removeFailed:`ডকুমেন্ট সরাতে ব্যর্থ`,removeError:`ডকুমেন্ট সরানোর সময় একটি ত্রুটি ঘটেছে`,clickToUpload:`আপলোড করতে ক্লিক করুন`,orDragAndDrop:`অথবা টেনে আনুন`,fileTypesAndSize:`১০MB পর্যন্ত PDF বা TXT ফাইল`,uploadedDocuments:`আপলোড করা ডকুমেন্ট`,removeDocument:`ডকুমেন্ট সরান`},ttsButton:{speak:`বলুন`,stop:`বন্ধ`,speaking:`বলছে...`,generateFailed:`স্পিচ তৈরি করতে ব্যর্থ`,playbackFailed:`অডিও প্লেব্যাক ব্যর্থ`,stopSpeaking:`বলা বন্ধ করুন`,preparingSpeech:`স্পিচ প্রস্তুত হচ্ছে...`,generatingSpeech:`স্পিচ তৈরি হচ্ছে...`,bufferingSpeech:`স্পিচ বাফার হচ্ছে...`,enableAudio:`অডিও চালু করে জোরে পড়ুন`,enableAudioShort:`অডিও চালু করুন`,readAloud:`জোরে পড়ুন`},artifacts:{title:`আর্টিফ্যাক্ট`,code:`কোড`,preview:`প্রিভিউ`,copy:`কোড কপি করুন`,copied:`কপি হয়েছে!`,download:`ডাউনলোড`,expand:`প্রসারিত করুন`,collapse:`সংকুচিত করুন`,openInNewTab:`নতুন ট্যাবে খুলুন`,invalidSvg:`অবৈধ SVG কন্টেন্ট`,invalidJson:`অবৈধ JSON কন্টেন্ট`,previewMode:`প্রিভিউ মোড`,codeMode:`কোড মোড`,copyContent:`কন্টেন্ট কপি করুন`,openInPanel:`প্যানেলে খুলুন`,openInNewWindow:`নতুন উইন্ডোতে খুলুন`,created:`তৈরি করা হয়েছে`,closePanelEsc:`প্যানেল বন্ধ করুন (Esc)`,copyButton:`কপি`,open:`খুলুন`,dragEdgeToResize:`সাইজ পরিবর্তন করতে প্রান্ত টানুন`,previewUnavailable:`Preview unavailable`,previewUnavailableDescription:`This artifact does not contain renderable preview content. Switch to code view to inspect the source.`,versionOf:`সংস্করণ {{current}} / {{total}}`,previousVersion:`পূর্ববর্তী সংস্করণ`,nextVersion:`পরবর্তী সংস্করণ`},personaImportExport:{title:`পার্সোনা ইম্পোর্ট এবং এক্সপোর্ট`,description:`শেয়ার করতে আপনার পার্সোনা এক্সপোর্ট করুন বা অন্যদের থেকে পার্সোনা ইম্পোর্ট করুন`,exportPersonas:`পার্সোনা এক্সপোর্ট করুন`,importPersonas:`পার্সোনা ইম্পোর্ট করুন`,noPersonasToExport:`এক্সপোর্ট করার জন্য কোনো পার্সোনা নেই`,personasAvailable:`{{count}}টি পার্সোনা উপলব্ধ`,personasAvailable_plural:`{{count}}টি পার্সোনা উপলব্ধ`,exportAll:`সব এক্সপোর্ট করুন`,uploadJsonFile:`JSON ফাইল আপলোড করুন`,pasteJsonLabel:`JSON ডেটা পেস্ট করুন`,pasteJsonPlaceholder:`এখানে পার্সোনা JSON ডেটা পেস্ট করুন...`,importing:`ইম্পোর্ট হচ্ছে...`,importButton:`পার্সোনা ইম্পোর্ট করুন`,expectedFormat:`প্রত্যাশিত JSON ফরম্যাট:`,exportSuccess:`পার্সোনা "{{name}}" সফলভাবে এক্সপোর্ট হয়েছে`,exportFailed:`পার্সোনা এক্সপোর্ট করতে ব্যর্থ`,exportAllSuccess:`সব {{count}}টি পার্সোনা সফলভাবে এক্সপোর্ট হয়েছে`,exportAllFailed:`পার্সোনা এক্সপোর্ট করতে ব্যর্থ`,pasteJsonData:`অনুগ্রহ করে পার্সোনা JSON ডেটা পেস্ট করুন`,importMultipleSuccess:`{{count}}টি পার্সোনা সফলভাবে ইম্পোর্ট হয়েছে`,importMultipleFailed:`{{count}}টি পার্সোনা ইম্পোর্ট করতে ব্যর্থ`,importNoneFailed:`কোনো পার্সোনা ইম্পোর্ট করতে ব্যর্থ`,importSuccess:`পার্সোনা সফলভাবে ইম্পোর্ট হয়েছে`,importFailed:`পার্সোনা ইম্পোর্ট করতে ব্যর্থ`},generationStats:{details:`বিবরণ`,promptTokens:`প্রম্পট টোকেন:`,generatedTokens:`তৈরি টোকেন:`,totalTokens:`মোট টোকেন:`,speed:`গতি:`,promptEval:`প্রম্পট মূল্যায়ন:`,generation:`জেনারেশন:`,modelLoad:`মডেল লোড:`,totalTime:`মোট সময়:`,generatedAt:`তৈরির সময়:`},userMenu:{loggedOut:`সফলভাবে লগ আউট হয়েছে`,pictureUpdated:`প্রোফাইল ছবি আপডেট হয়েছে`,failedUpdateAvatar:`অবতার আপডেট ব্যর্থ`,failedUpdatePicture:`প্রোফাইল ছবি আপডেট ব্যর্থ`,noEmail:`কোনো ইমেইল দেওয়া হয়নি`,changePicture:`ছবি পরিবর্তন করুন`,settings:`সেটিংস`,userManagement:`ব্যবহারকারী ব্যবস্থাপনা`,signOut:`সাইন আউট`,changeProfilePicture:`প্রোফাইল ছবি পরিবর্তন করুন`},pluginManager:{title:`প্লাগইন ম্যানেজার`,upload:`আপলোড`,addJson:`JSON যোগ করুন`,browseHF:`HF Hub ব্রাউজ করুন`,confirmDelete:`আপনি কি এই প্লাগইনটি মুছতে চান?`,uploading:`প্লাগইন আপলোড হচ্ছে...`,pasteJson:`প্লাগইন JSON এখানে পেস্ট করুন...`,installPlugin:`প্লাগইন ইনস্টল করুন`,loading:`প্লাগইন লোড হচ্ছে...`,noPlugins:`কোনো প্লাগইন ইনস্টল করা হয়নি`,noPluginsDescription:`শুরু করতে একটি প্লাগইন ফাইল আপলোড করুন বা JSON থেকে যোগ করুন।`,active:`সক্রিয়`,id:`আইডি`,endpoint:`এন্ডপয়েন্ট`,activate:`সক্রিয় করুন`,deactivate:`নিষ্ক্রিয় করুন`,activePlugin:`সক্রিয় প্লাগইন`,activePluginDescription:`সব চ্যাট অনুরোধ এই প্লাগইনের মাধ্যমে পাঠানো হবে`,variables:{title:`ভেরিয়েবল`,save:`সংরক্ষণ`,saving:`সংরক্ষণ হচ্ছে...`,saved:`ভেরিয়েবল সংরক্ষিত`,saveFailed:`ভেরিয়েবল সংরক্ষণ ব্যর্থ`,resetDefaults:`ডিফল্টে রিসেট`,reset:`ভেরিয়েবল ডিফল্টে রিসেট হয়েছে`,resetFailed:`ভেরিয়েবল রিসেট করতে ব্যর্থ`,sensitiveSet:`মান সেট করা আছে (পরিবর্তনের জন্য নতুন মান দিন)`,showValue:`{{label}} মান দেখান`,hideValue:`{{label}} মান লুকান`,connection:`সংযোগ`,advanced:`উন্নত প্যারামিটার`,inherited:`প্রোভাইডারের ডিফল্ট ব্যবহার করুন`,inheritedValue:`প্রোভাইডারের ডিফল্ট ব্যবহার করুন ({{value}})`,enabled:`সক্ষম`,disabled:`অক্ষম`,required:`একটি মান প্রয়োজন`,fullApiEndpoint:`সম্পূর্ণ API এন্ডপয়েন্ট URL`,endpointHelp:`সম্পূর্ণ রিকোয়েস্ট URL লিখুন, এর অপারেশন পাথ সহ (যেমন, /v1/chat/completions), শুধুমাত্র প্রোভাইডার বেস URL নয়।`,invalidUrl:`একটি বৈধ সম্পূর্ণ API এন্ডপয়েন্ট URL লিখুন, যেমন https://provider.example/v1/chat/completions`,insecureUrl:`API এন্ডপয়েন্টগুলি অবশ্যই HTTP বা HTTPS ব্যবহার করবে।`,httpWarning:`HTTP ক্রেডেনশিয়াল বা ট্রাফিক এনক্রিপ্ট করে না। এটি শুধুমাত্র একটি বিশ্বস্ত নেটওয়ার্কে ব্যবহার করুন।`,invalidBaseUrl:`বেস URL-এ কোনো কোয়েরি স্ট্রিং বা ফ্র্যাগমেন্ট থাকতে পারে না।`,invalidApiPath:`অবশ্যই / দিয়ে শুরু হতে হবে এবং কোনো URL, কোয়েরি, ফ্র্যাগমেন্ট বা .. সেগমেন্ট থাকতে পারবে না`,tooLong:`মানটি অনেক বেশি দীর্ঘ`}},huggingface:{title:`HuggingFace মডেল ব্রাউজার`,subtitle:`Hub থেকে মডেল ব্রাউজ করুন ও নির্বাচন করুন`,searchPlaceholder:`মডেল খুঁজুন...`,filters:`ফিল্টার`,task:`টাস্ক`,sortBy:`সাজান`,noModels:`কোনো মডেল পাওয়া যায়নি`,adjustSearch:`আপনার অনুসন্ধান বা ফিল্টার সামঞ্জস্য করুন`,gated:`সীমাবদ্ধ`,selected:`নির্বাচিত`,select:`নির্বাচন`,refresh:`রিফ্রেশ`,modelsFound:`মডেল পাওয়া গেছে`},demoMode:{title:`ডেমো মোড`,github:`GitHub`},libreClaw:{title:`এজেন্ট`,subtitle:`স্থানীয় এজেন্ট রান, অনুমোদন, সময়সূচী, মেমরি, সরঞ্জাম, এবং ব্যবহার.`,dashboard:`ড্যাশবোর্ড`,connection:{disconnectedTitle:`Libre Claw ডেমন সংযুক্ত নয়`,disconnectedDescription:`স্থানীয়ভাবে <command>libre-claw start</command> দিয়ে শুরু করুন অথবা ব্যাকএন্ড পরিবেশে <env>LIBRE_CLAW_BASE_URL</env> সেট করুন।`},status:{connected:`সংযুক্ত`,disconnected:`সংযোগ বিচ্ছিন্ন`,activeRuns:`{{count}} সক্রিয়`,activeRuns_plural:`{{count}} সক্রিয়`},states:{queued:`সারিবদ্ধ`,running:`চলছে`,blocked:`অবরুদ্ধ`,done:`সম্পন্ন`,failed:`ব্যর্থ হয়েছে`,cancelled:`বাতিল`},startRun:{title:`এজেন্ট রান শুরু করুন`,placeholder:`একটি রেপো পরিদর্শন করতে, একটি বাগ ঠিক করতে, একটি পর্যালোচনা চালাতে, একটি প্রতিবেদনের সময়সূচী করতে Libre Clawকে বলুন...`,chatRun:`চ্যাট রান`,goalMode:`লক্ষ্য মোড`,providerOverride:`প্রদানকারী ওভাররাইড`,modelOverride:`মডেল ওভাররাইড`,run:`চালান`},modelRoute:{title:`মডেল রুট`,providerPlaceholder:`প্রদানকারী`,modelPlaceholder:`মডেল`,persistGlobal:`Libre Claw গ্লোবাল কনফিগারেশনে স্থির থাকুন`,saveModel:`মডেল সংরক্ষণ করুন`,theme:`Libre Claw থিম`,saveTheme:`থিম সংরক্ষণ করুন`},runs:{title:`রানসমূহ`,empty:`এখনও কোনো Libre Claw রান নেই।`},timeline:{title:`রানের টাইমলাইন`,empty:`এর ইভেন্টগুলি পরিদর্শন করতে একটি দৌড় নির্বাচন করুন৷`,streaming:`স্ট্রিমিং...`,assistantResponse:`সহকারীর প্রতিক্রিয়া`,resultOk:`ঠিক আছে`,resultError:`ত্রুটি`,labels:{userMessage:`ব্যবহারকারীর বার্তা`,toolCall:`টুল কল`,toolResult:`টুল ফলাফল`,approvalRequest:`অনুমোদনের অনুরোধ`,approvalResponse:`অনুমোদন প্রতিক্রিয়া`,runStarted:`রান শুরু হয়েছে`,runFinished:`রান শেষ হয়েছে`,usage:`ব্যবহার`,error:`ত্রুটি`}},approvals:{needed:`অনুমোদন প্রয়োজন`,allowOnce:`একবার অনুমতি দিন`,alwaysAllowTool:`সর্বদা টুল মঞ্জুরি`,deny:`প্রত্যাখ্যান করুন`,toolApprovalRequested:`টুল অনুমোদন অনুরোধ করা হয়েছে`},automations:{title:`অটোমেশন`,namePlaceholder:`নাম`,schedulePlaceholder:`daily 09:00`,promptPlaceholder:`অটোমেশন প্রম্পট`,create:`তৈরি করুন`,empty:`কোন নির্ধারিত Libre Claw অটোমেশন।`,runNow:`এখন চালান`,pause:`বিরতি`,resume:`পুনরায় শুরু করুন`,routes:{report:`রিপোর্ট`,telegram:`Telegram`},status:{active:`সক্রিয়`,paused:`বিরতি দেওয়া হয়েছে`}},usageFallback:{title:`ব্যবহার এবং ফলব্যাক`,usage:`ব্যবহার`,fallbackRoute:`ফলব্যাক রুট`,noUsage:`এখনও কোন ব্যবহার রেকর্ড.`},metrics:{provider:`প্রদানকারী`,model:`মডেল`,input:`ইনপুট`,output:`আউটপুট`,cached:`ক্যাশে`,reasoning:`যুক্তি`,cost:`খরচ`,tool:`টুল`,resolution:`রেজোলিউশন`,state:`অবস্থা`,stopReason:`বন্ধের কারণ`,tokens:`{{formatted}} টোকেন`,tokens_plural:`{{formatted}} টোকেন`},fallbacks:{tool:`টুল`,unknown:`অজানা`,resolved:`সমাধান করা`,unknownError:`অজানা ত্রুটি`},toasts:{loadStatusFailed:`Libre Claw স্থিতি লোড করা যায়নি`,enterTask:`Libre Claw এর জন্য একটি টাস্ক লিখুন`,runStarted:`Libre Claw রান শুরু হয়েছে`,startRunFailed:`Libre Claw রান শুরু করা যায়নি`,runCancelled:`রান বাতিল হয়েছে`,cancelRunFailed:`রান বাতিল করা যায়নি`,approved:`অনুমোদিত`,denied:`অস্বীকার করেছে`,resolvePermissionFailed:`অনুমতি সমাধান করা যায়নি`,providerModelRequired:`প্রদানকারী এবং মডেল প্রয়োজন`,modelUpdated:`Libre Claw মডেল আপডেট করা হয়েছে`,updateModelFailed:`মডেল আপডেট করা যায়নি`,themeUpdated:`Libre Claw থিম আপডেট করা হয়েছে`,updateThemeFailed:`থিম আপডেট করা যায়নি`,automationRequired:`অটোমেশন নাম, সময়সূচী, এবং প্রম্পট প্রয়োজন`,automationCreated:`অটোমেশন তৈরি করা হয়েছে`,createAutomationFailed:`অটোমেশন তৈরি করা যায়নি`,automationUpdated:`অটোমেশন আপডেট করা হয়েছে`,updateAutomationFailed:`অটোমেশন আপডেট করা যায়নি`}},work:JSON.parse(`{"title":"কাজ","subtitle":"বিচ্ছিন্ন মডেল ওয়ার্কস্পেস","tasks":{"title":"কাজের টাস্ক","subtitle":"স্থায়ী লোকাল ওয়ার্কস্পেস","new":"নতুন টাস্ক","emptyTitle":"এখনো কোনো কাজের টাস্ক নেই","empty":"প্রথম বার্তা পাঠানোর পর আপনার কাজের টাস্কগুলো এখানে দেখা যাবে।","untitled":"শিরোনামহীন টাস্ক","actions":"টাস্কের কাজ","delete":"টাস্ক মুছুন","deleteNamed":"{{title}} মুছুন","deleteConfirm":"“{{title}}” এবং এর ওয়ার্কস্পেস স্থায়ীভাবে মুছবেন?","close":"কাজের টাস্ক বন্ধ করুন","open":"কাজের টাস্ক খুলুন","rename":"টাস্কের শিরোনাম","loading":"টাস্ক লোড হচ্ছে…","notFound":"এই কাজের টাস্কটি পাওয়া যাচ্ছে না","back":"নতুন টাস্ক শুরু করুন","status":"স্ট্যাটাস: {{status}}"},"landing":{"title":"নতুন কাজের টাস্ক শুরু করুন","description":"লোকাল বা কনফিগার করা প্রোভাইডারের মডেলকে একটি স্থায়ী, বিচ্ছিন্ন ওয়ার্কস্পেস দিন। এটি ফাইল পরীক্ষা করতে, টুল চালাতে এবং আপনি ফিরে এলে আগের জায়গা থেকে কাজ চালিয়ে যেতে পারবে।","isolated":"বিচ্ছিন্ন","isolatedBody":"প্রতিটি টাস্কের নিজস্ব কনটেইনার ও ফাইল থাকে।","durable":"স্থায়ী","durableBody":"পরে এর কথোপকথন ও ওয়ার্কস্পেসে ফিরে আসুন।","controlled":"নিয়ন্ত্রিত","controlledBody":"রানটাইম ও টাস্কের ফাইল হোস্ট থেকে বিচ্ছিন্ন থাকে।"},"composer":{"placeholder":"আপনি কী বানাতে বা পরিবর্তন করতে চান তা লিখুন…","model":"কাজের মডেল","noModels":"কাজের সঙ্গে সামঞ্জস্যপূর্ণ কোনো মডেল নেই","cancel":"থামান","send":"চালান","hint":"প্রতিটি টাস্কের নিজস্ব ফাইল ও ইতিহাস থাকে। ব্যবহারের আগে মডেলের আউটপুট যাচাই করুন।","remoteTitle":"রিমোট প্রোভাইডার","remoteHint":"কথোপকথন ও টুলের আউটপুট কনফিগার করা সার্ভিসে পাঠানো হয়। একটি স্বয়ংক্রিয় রান একাধিক প্রোভাইডার কল করতে পারে এবং খরচ হতে পারে। কোনো টুল ফাইলের বিষয়বস্তু ফেরত না দিলে ওয়ার্কস্পেসের ফাইল লোকালেই থাকে।","remoteDismiss":"খারিজ করুন","remoteDismissLabel":"রিমোট প্রোভাইডারের নোটিশ খারিজ করুন","remoteDismissFailed":"রিমোট প্রোভাইডারের পছন্দ সংরক্ষণ করা যায়নি।","noModelSelected":"কাজের সঙ্গে সামঞ্জস্যপূর্ণ কোনো মডেল নির্বাচন করা নেই।"},"conversation":{"ready":"ওয়ার্কস্পেস প্রস্তুত","empty":"নিচে টাস্কটি চালিয়ে যান। এই কথোপকথন ও এর ফাইল এই ওয়ার্কস্পেসের সঙ্গেই থাকবে।","loadOlder":"পুরোনো বার্তা লোড করুন"},"status":{"preparing":"বিচ্ছিন্ন ওয়ার্কস্পেস প্রস্তুত হচ্ছে…","running":"লোকাল ওয়ার্কস্পেসে কাজ চলছে…"},"statusLabels":{"idle":"নিষ্ক্রিয়","thinking":"ভাবছে","complete":"সম্পূর্ণ","needsInput":"ইনপুট প্রয়োজন","error":"ত্রুটি"},"live":{"connecting":"লাইভ আপডেটের সাথে সংযোগ করা হচ্ছে…","reconnecting":"লাইভ আপডেটে পুনরায় সংযোগ করা হচ্ছে…","unavailable":"লাইভ আপডেট পাওয়া যাচ্ছে না","newActivity":"নতুন কার্যকলাপ","skillsLoaded":"ওয়ার্কস্পেস দক্ষতা · {{count}}"},"runtime":{"unavailable":"রানটাইম পাওয়া যাচ্ছে না","ready":"রানটাইম প্রস্তুত","readyOllama":"Docker প্রস্তুত","readyPlugin":"Docker + প্লাগইন প্রস্তুত","readyHybrid":"Docker + মডেল প্রস্তুত","reason":"Docker এবং একটি উপলভ্য Ollama বা প্লাগইন মডেল প্রোভাইডার প্রয়োজন।"},"workspace":{"label":"ওয়ার্কস্পেস ভিউ","files":"ফাইল","activity":"কার্যকলাপ","preview":"প্রিভিউ","resize":"কথোপকথন ও ওয়ার্কস্পেসের আকার বদলান","resizeHint":"আকার বদলাতে টানুন। সূক্ষ্ম নিয়ন্ত্রণে অ্যারো কী ব্যবহার করুন। রিসেট করতে ডাবল-ক্লিক করুন বা Enter চাপুন।","splitSize":"কথোপকথন {{conversation}}%, ওয়ার্কস্পেস {{workspace}}%","terminal":"টার্মিনাল","git":"Git"},"files":{"discard":"সংরক্ষণ না করা ফাইলের পরিবর্তন বাতিল করবেন?","leaveWithDraft":"এই ফাইল ছেড়ে যাবেন? সংরক্ষণ না করা সম্পাদনা ব্রাউজারে খসড়া হিসেবে থাকবে।","up":"মূল ফোল্ডার","back":"ফাইলে ফিরে যান","empty":"এই ফোল্ডারে এখনো কোনো ফাইল নেই।","select":"দেখতে ও সম্পাদনা করতে একটি ফাইল বেছে নিন।","editorLabel":"ফাইল এডিটর: {{path}}","format":"ফরম্যাট","formatted":"কোড ফরম্যাট করা হয়েছে।","formatFailed":"এই ফাইল ফরম্যাট করা যায়নি।","formatShortcut":"ফরম্যাট (Shift+Alt+F)","formatTooLarge":"শুধু 100,000 অক্ষর ও 4,000 লাইনের কম ফাইল ফরম্যাট করা যাবে।","formatUnsupported":"এই ধরনের ফাইলে ফরম্যাটিং উপলভ্য নয়।","saveShortcut":"সংরক্ষণ (⌘/Ctrl+S)","highlightPaused":"সম্পাদনা দ্রুত রাখতে বড় ফাইলে লাইভ হাইলাইটিং বিরত রাখা হয়েছে।","plainTextLarge":"প্লেইন টেক্সট · বড় ফাইল","changes":"পরিবর্তনসমূহ","changesSince":"গত পালার পর থেকে কী পরিবর্তিত হয়েছে","diffLabel":"গত পালার পর থেকে পরিবর্তন: {{path}}","diffFolded":"{{count}}টি অপরিবর্তিত লাইন"},"activity":{"empty":"কমান্ড, ফাইল অপারেশন ও টুলের ফলাফল এখানে দেখা যাবে।","toolActivity":"টুলের কার্যকলাপ","details":"বিস্তারিত","kinds":{"message":"বার্তা","toolCall":"টুল কল","toolResult":"টুলের ফলাফল","error":"ত্রুটি"}},"preview":{"command":"ঐচ্ছিক স্টার্ট কমান্ড","start":"প্রিভিউ শুরু করুন","stop":"প্রিভিউ থামান","open":"খুলুন","starting":"প্রিভিউ শুরু হচ্ছে…","frameTitle":"ওয়ার্কস্পেস প্রিভিউ","failed":"প্রিভিউ শুরু করা যায়নি। কার্যকলাপ দেখুন, তারপর অন্য কমান্ড চেষ্টা করুন।","empty":"এখানে দেখতে এই ওয়ার্কস্পেসের ভেতর অ্যাপটি চালু করুন।"},"mobile":{"surface":"টাস্ক ভিউ","conversation":"কথোপকথন","workspace":"ওয়ার্কস্পেস"},"toasts":{"runFailed":"কাজের টাস্ক শুরু করা যায়নি।","updateFailed":"এই টাস্ক আপডেট করা যায়নি।","renameFailed":"এই টাস্কের নাম পরিবর্তন করা যায়নি।","cancelled":"কাজের রান থামানো হয়েছে।","cancelFailed":"কাজের রান থামানো যায়নি।","deleteFailed":"এই কাজের টাস্ক মুছতে পারেনি।","saveFailed":"এই ফাইল সংরক্ষণ করা যায়নি।","saved":"ফাইল সংরক্ষণ করা হয়েছে।","previewFailed":"প্রিভিউ শুরু করা যায়নি।","previewStopFailed":"প্রিভিউ থামানো যায়নি।"},"terminal":{"connecting":"স্যান্ডবক্সে একটি শেল খোলা হচ্ছে…","closed":"টার্মিনাল সেশন শেষ হয়েছে।","failed":"টার্মিনাল সেশন শুরু করা যায়নি।","reconnect":"পুনরায় সংযোগ","unavailable":"এই ডিপ্লয়মেন্টে ইন্টারঅ্যাকটিভ টার্মিনাল উপলব্ধ নয়।","blockedByRun":"মডেল এই কনটেইনার ব্যবহার করছে। পালা শেষ হলে টার্মিনাল খুলবে।","taskRunning":"মডেলের পালা চলছে"},"policy":{"label":"রানটাইম নীতি","default":"ডিফল্ট (গ্লোবাল সীমা)"},"git":{"actionFailed":"Git অ্যাকশন ব্যর্থ।","blockedByPreview":"Git অবস্থা বদলানোর আগে প্রিভিউ বন্ধ করুন।","blockedByRun":"মডেলের পালা শেষ হলে Git লেখার অ্যাকশন খুলবে।","branchCreated":"{{name}} তৈরি হয়েছে।","branchSwitched":"{{name}}-এ পরিবর্তন হয়েছে।","clean":"ওয়ার্কিং ট্রি পরিষ্কার।","commit":"স্টেজ করা পরিবর্তন কমিট করুন","commitMessage":"কমিট বার্তা","committed":"কমিট তৈরি হয়েছে।","detached":"বিচ্ছিন্ন HEAD","diff":"ডিফ প্রিভিউ","diffFailed":"এই ডিফ লোড করা যায়নি।","history":"স্থানীয় ইতিহাস","initialize":"Git চালু করুন","initializeDescription":"স্ট্যাটাস, ডিফ, ব্রাঞ্চ ও কমিটের জন্য স্থানীয় রিপোজিটরি তৈরি করুন। কোনো রিমোট ক্রেডেনশিয়াল যুক্ত নয়।","initialized":"Git রিপোজিটরি চালু হয়েছে।","loadFailed":"Git স্ট্যাটাস লোড করা যায়নি।","localOnly":"শুধু স্থানীয় Git। পুশ, পুল ও পুল রিকোয়েস্টের জন্য আলাদা বিশ্বস্ত ক্রেডেনশিয়াল ব্রোকার দরকার।","newBranch":"নতুন স্থানীয় ব্রাঞ্চ","noCommits":"এখনো কোনো কমিট নেই।","noDiff":"এখনো কোনো টেক্সট ডিফ নেই। স্টেজ করার পরে আনট্র্যাকড ফাইল দেখা যাবে।","notInitialized":"Git চালু নেই","selectChange":"ডিফ দেখতে একটি পরিবর্তিত ফাইল নির্বাচন করুন।","selectPath":"{{path}} নির্বাচন","stageAll":"সব স্টেজ করুন","stageSelected":"{{count}}টি স্টেজ করুন","staged":"পরিবর্তন স্টেজ হয়েছে।","switchBranch":"স্থানীয় ব্রাঞ্চ বদলান","changes":"পরিবর্তনসমূহ","createBranch":"তৈরি করুন","filterFiles":"পরিবর্তিত ফাইল ফিল্টার করুন","noFilterMatches":"এই ফিল্টারের সাথে মেলে এমন কোনো পরিবর্তিত ফাইল নেই।","allChanges":"সব পরিবর্তন","diffTruncated":"এই ডিফটি সংক্ষিপ্ত করা হয়েছে।","binaryFile":"বাইনারি ফাইল, কোনো টেক্সট ডিফ নেই।"},"hostWorkspace":{"hint":"বিচ্ছিন্ন ওয়ার্কস্পেসের জন্য খালি রাখুন, অথবা এই মেশিনের একটি ফোল্ডারে টাস্ক নির্দেশ করুন।","label":"ওয়ার্কস্পেস ফোল্ডার (ঐচ্ছিক)","warning":"টাস্ক সরাসরি এই ফোল্ডার পড়তে ও লিখতে পারবে। বিচ্ছিন্ন ওয়ার্কস্পেস ব্যবহারে খালি রাখুন।"}}`),personaBackground:{label:`পটভূমি চিত্র`,uploadBackgroundImage:`পটভূমি চিত্র আপলোড করুন`,dragAndDrop:`একটি চিত্র টেনে আনুন বা ব্রাউজ করতে ক্লিক করুন`,chooseImage:`চিত্র বেছে নিন`,uploading:`আপলোড হচ্ছে...`,enterImageUrl:`অথবা চিত্রের URL প্রবেশ করুন`,supportedFormats:`সমর্থিত: JPG, PNG, GIF, WebP (সর্বোচ্চ 5MB)। প্রশস্ত ল্যান্ডস্কেপ চিত্র সেরা কাজ করে।`,customBackground:`কাস্টম পটভূমি চিত্র`,clickToChange:`পরিবর্তন বা সরাতে ক্লিক করুন`,removed:`পটভূমি সরানো হয়েছে`,uploaded:`পটভূমি সফলভাবে আপলোড হয়েছে`,invalidFile:`একটি বৈধ চিত্র ফাইল নির্বাচন করুন`,fileTooLarge:`পটভূমি চিত্রের আকার 5MB এর কম হতে হবে`,readFailed:`চিত্র ফাইল পড়তে ব্যর্থ`,uploadFailed:`পটভূমি চিত্র আপলোড করতে ব্যর্থ`},modelSelector:{searchInstalled:`Search installed models...`,searchOllama:`Search Ollama library...`,searchHuggingFace:`Search HuggingFace...`,selectModel:`Select Model`,personas:`Personas`,ollamaModels:`Ollama Models`,pluginModels:`Plugin Models`,actions:`Actions`,installed:`Installed`,use:`Use`,pull:`Pull`,pullRestricted:`এই ইনস্ট্যান্সে মডেল ইনস্টলেশন শুধুমাত্র অ্যাডমিনদের জন্য সীমাবদ্ধ।`,adminOnlyPull:`শুধু অ্যাডমিন`,legacyProvider:`প্রোভাইডার নথিভুক্ত নয়`,providerNotRecorded:`প্রোভাইডার নথিভুক্ত নয়`,providerUnavailable:`প্রোভাইডার অনুপলব্ধ`,reselectProvider:`এই মডেল পিন করতে একটি প্রোভাইডার পুনরায় নির্বাচন করুন`,unavailable:`অনুপলব্ধ`,unavailableSelections:`অনুপলব্ধ নির্বাচন`,agentModels:`এজেন্ট`},whatsNew:{title:`নতুন কী আছে`,releaseNotes:`রিলিজ নোট`,cta:`ঠিক আছে, চলুন`},notes:{title:`নোট`,new:`নতুন নোট`,untitled:`শিরোনামহীন`,empty:`এখনও কোনো নোট নেই`,selectOrCreate:`একটি নোট নির্বাচন করুন বা নতুন তৈরি করুন`,contentPlaceholder:`মার্কডাউনে লিখুন…`,saved:`সংরক্ষিত`,saveFailed:`নোট সংরক্ষণ করা যায়নি`,createFailed:`নোট তৈরি করা যায়নি`,deleteConfirm:`এই নোটটি মুছবেন?`,deleteFailed:`নোট মুছে ফেলা যায়নি`},home:{active:`সক্রিয়`,continue:`চালিয়ে যান`,start:`শুরু`,explore:`অন্বেষণ`},palette:{empty:`কোনো মিল নেই।`,placeholder:`চ্যাট, Work, অ্যাকশন খুঁজুন…`,toggleTheme:`থিম বদলান`,actions:`অ্যাকশন`,chats:`চ্যাট`,search:`অনুসন্ধান`,settings:`সেটিংস`,work:`কাজ`},tabs:{actions:`ট্যাব অ্যাকশন`,close:`ট্যাব বন্ধ করুন`,closeAll:`সব ট্যাব বন্ধ করুন`,closeOthers:`অন্য ট্যাবগুলি বন্ধ করুন`,closeRight:`ডানের ট্যাবগুলি বন্ধ করুন`,home:`হোম`,label:`খোলা ট্যাব`,new:`নতুন ট্যাব`,newWork:`নতুন Work`,chat:`চ্যাট`,newChat:`নতুন চ্যাট`,work:`কাজ`}};export{e as default};