libre-webui 0.21.3 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (945) hide show
  1. package/README.md +308 -328
  2. package/backend/dist/cli/migrateSqliteToPostgres.d.ts +2 -0
  3. package/backend/dist/cli/migrateSqliteToPostgres.d.ts.map +1 -0
  4. package/backend/dist/cli/migrateSqliteToPostgres.js +113 -0
  5. package/backend/dist/cli/migrateSqliteToPostgres.js.map +1 -0
  6. package/backend/dist/cli/recoveryBackup.d.ts +3 -0
  7. package/backend/dist/cli/recoveryBackup.d.ts.map +1 -0
  8. package/backend/dist/cli/recoveryBackup.js +251 -0
  9. package/backend/dist/cli/recoveryBackup.js.map +1 -0
  10. package/backend/dist/cli/recoveryInventory.d.ts +2 -0
  11. package/backend/dist/cli/recoveryInventory.d.ts.map +1 -0
  12. package/backend/dist/cli/recoveryInventory.js +109 -0
  13. package/backend/dist/cli/recoveryInventory.js.map +1 -0
  14. package/backend/dist/db.d.ts +27 -0
  15. package/backend/dist/db.d.ts.map +1 -1
  16. package/backend/dist/db.js +333 -16
  17. package/backend/dist/db.js.map +1 -1
  18. package/backend/dist/env.d.ts.map +1 -1
  19. package/backend/dist/env.js +12 -2
  20. package/backend/dist/env.js.map +1 -1
  21. package/backend/dist/index.d.ts.map +1 -1
  22. package/backend/dist/index.js +235 -47
  23. package/backend/dist/index.js.map +1 -1
  24. package/backend/dist/main.d.ts +2 -0
  25. package/backend/dist/main.d.ts.map +1 -0
  26. package/backend/dist/main.js +137 -0
  27. package/backend/dist/main.js.map +1 -0
  28. package/backend/dist/middleware/auth.d.ts.map +1 -1
  29. package/backend/dist/middleware/auth.js +7 -3
  30. package/backend/dist/middleware/auth.js.map +1 -1
  31. package/backend/dist/middleware/chatCancellationAdmission.d.ts +7 -0
  32. package/backend/dist/middleware/chatCancellationAdmission.d.ts.map +1 -0
  33. package/backend/dist/middleware/chatCancellationAdmission.js +17 -0
  34. package/backend/dist/middleware/chatCancellationAdmission.js.map +1 -0
  35. package/backend/dist/middleware/coordinatedRateLimit.d.ts +18 -0
  36. package/backend/dist/middleware/coordinatedRateLimit.d.ts.map +1 -0
  37. package/backend/dist/middleware/coordinatedRateLimit.js +52 -0
  38. package/backend/dist/middleware/coordinatedRateLimit.js.map +1 -0
  39. package/backend/dist/middleware/sharedRateLimit.d.ts +26 -0
  40. package/backend/dist/middleware/sharedRateLimit.d.ts.map +1 -0
  41. package/backend/dist/middleware/sharedRateLimit.js +99 -0
  42. package/backend/dist/middleware/sharedRateLimit.js.map +1 -0
  43. package/backend/dist/models/personaModel.d.ts +1 -26
  44. package/backend/dist/models/personaModel.d.ts.map +1 -1
  45. package/backend/dist/models/personaModel.js +54 -247
  46. package/backend/dist/models/personaModel.js.map +1 -1
  47. package/backend/dist/models/userModel.d.ts +23 -66
  48. package/backend/dist/models/userModel.d.ts.map +1 -1
  49. package/backend/dist/models/userModel.js +110 -187
  50. package/backend/dist/models/userModel.js.map +1 -1
  51. package/backend/dist/persistence/chatGenerationTypes.d.ts +24 -0
  52. package/backend/dist/persistence/chatGenerationTypes.d.ts.map +1 -0
  53. package/backend/dist/persistence/chatGenerationTypes.js +7 -0
  54. package/backend/dist/persistence/chatGenerationTypes.js.map +1 -0
  55. package/backend/dist/persistence/extensionTypes.d.ts +185 -0
  56. package/backend/dist/persistence/extensionTypes.d.ts.map +1 -0
  57. package/backend/dist/persistence/extensionTypes.js +13 -0
  58. package/backend/dist/persistence/extensionTypes.js.map +1 -0
  59. package/backend/dist/persistence/identityDeletionTypes.d.ts +16 -0
  60. package/backend/dist/persistence/identityDeletionTypes.d.ts.map +1 -0
  61. package/backend/dist/persistence/identityDeletionTypes.js +7 -0
  62. package/backend/dist/persistence/identityDeletionTypes.js.map +1 -0
  63. package/backend/dist/persistence/index.d.ts +48 -0
  64. package/backend/dist/persistence/index.d.ts.map +1 -0
  65. package/backend/dist/persistence/index.js +159 -0
  66. package/backend/dist/persistence/index.js.map +1 -0
  67. package/backend/dist/persistence/postgresConfig.d.ts +32 -0
  68. package/backend/dist/persistence/postgresConfig.d.ts.map +1 -0
  69. package/backend/dist/persistence/postgresConfig.js +91 -0
  70. package/backend/dist/persistence/postgresConfig.js.map +1 -0
  71. package/backend/dist/persistence/postgresCoreMigration.d.ts +8 -0
  72. package/backend/dist/persistence/postgresCoreMigration.d.ts.map +1 -0
  73. package/backend/dist/persistence/postgresCoreMigration.js +179 -0
  74. package/backend/dist/persistence/postgresCoreMigration.js.map +1 -0
  75. package/backend/dist/persistence/postgresDatabase.d.ts +40 -0
  76. package/backend/dist/persistence/postgresDatabase.d.ts.map +1 -0
  77. package/backend/dist/persistence/postgresDatabase.js +148 -0
  78. package/backend/dist/persistence/postgresDatabase.js.map +1 -0
  79. package/backend/dist/persistence/postgresExtensionMigration.d.ts +4 -0
  80. package/backend/dist/persistence/postgresExtensionMigration.d.ts.map +1 -0
  81. package/backend/dist/persistence/postgresExtensionMigration.js +143 -0
  82. package/backend/dist/persistence/postgresExtensionMigration.js.map +1 -0
  83. package/backend/dist/persistence/postgresExtensionRepositories.d.ts +6 -0
  84. package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -0
  85. package/backend/dist/persistence/postgresExtensionRepositories.js +550 -0
  86. package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -0
  87. package/backend/dist/persistence/postgresImportState.d.ts +9 -0
  88. package/backend/dist/persistence/postgresImportState.d.ts.map +1 -0
  89. package/backend/dist/persistence/postgresImportState.js +64 -0
  90. package/backend/dist/persistence/postgresImportState.js.map +1 -0
  91. package/backend/dist/persistence/postgresMigrationRegistry.d.ts +4 -0
  92. package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -0
  93. package/backend/dist/persistence/postgresMigrationRegistry.js +33 -0
  94. package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -0
  95. package/backend/dist/persistence/postgresMigrationTypes.d.ts +24 -0
  96. package/backend/dist/persistence/postgresMigrationTypes.d.ts.map +1 -0
  97. package/backend/dist/persistence/postgresMigrationTypes.js +7 -0
  98. package/backend/dist/persistence/postgresMigrationTypes.js.map +1 -0
  99. package/backend/dist/persistence/postgresMigrations.d.ts +15 -0
  100. package/backend/dist/persistence/postgresMigrations.d.ts.map +1 -0
  101. package/backend/dist/persistence/postgresMigrations.js +333 -0
  102. package/backend/dist/persistence/postgresMigrations.js.map +1 -0
  103. package/backend/dist/persistence/postgresPersistence.d.ts +17 -0
  104. package/backend/dist/persistence/postgresPersistence.d.ts.map +1 -0
  105. package/backend/dist/persistence/postgresPersistence.js +332 -0
  106. package/backend/dist/persistence/postgresPersistence.js.map +1 -0
  107. package/backend/dist/persistence/postgresPluginDefinitionMigration.d.ts +4 -0
  108. package/backend/dist/persistence/postgresPluginDefinitionMigration.d.ts.map +1 -0
  109. package/backend/dist/persistence/postgresPluginDefinitionMigration.js +40 -0
  110. package/backend/dist/persistence/postgresPluginDefinitionMigration.js.map +1 -0
  111. package/backend/dist/persistence/postgresResourceRepositories.d.ts +7 -0
  112. package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -0
  113. package/backend/dist/persistence/postgresResourceRepositories.js +776 -0
  114. package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -0
  115. package/backend/dist/persistence/postgresSchemaInspector.d.ts +14 -0
  116. package/backend/dist/persistence/postgresSchemaInspector.d.ts.map +1 -0
  117. package/backend/dist/persistence/postgresSchemaInspector.js +817 -0
  118. package/backend/dist/persistence/postgresSchemaInspector.js.map +1 -0
  119. package/backend/dist/persistence/resourceTypes.d.ts +207 -0
  120. package/backend/dist/persistence/resourceTypes.d.ts.map +1 -0
  121. package/backend/dist/persistence/resourceTypes.js +38 -0
  122. package/backend/dist/persistence/resourceTypes.js.map +1 -0
  123. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts +4 -0
  124. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -0
  125. package/backend/dist/persistence/sqliteExtensionRepositories.js +494 -0
  126. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -0
  127. package/backend/dist/persistence/sqliteMigrations.d.ts +93 -0
  128. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -0
  129. package/backend/dist/persistence/sqliteMigrations.js +2232 -0
  130. package/backend/dist/persistence/sqliteMigrations.js.map +1 -0
  131. package/backend/dist/persistence/sqlitePersistence.d.ts +23 -0
  132. package/backend/dist/persistence/sqlitePersistence.d.ts.map +1 -0
  133. package/backend/dist/persistence/sqlitePersistence.js +596 -0
  134. package/backend/dist/persistence/sqlitePersistence.js.map +1 -0
  135. package/backend/dist/persistence/sqliteResourceRepositories.d.ts +4 -0
  136. package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -0
  137. package/backend/dist/persistence/sqliteResourceRepositories.js +663 -0
  138. package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -0
  139. package/backend/dist/persistence/sqliteSyncExecutor.d.ts +5 -0
  140. package/backend/dist/persistence/sqliteSyncExecutor.d.ts.map +1 -0
  141. package/backend/dist/persistence/sqliteSyncExecutor.js +19 -0
  142. package/backend/dist/persistence/sqliteSyncExecutor.js.map +1 -0
  143. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts +80 -0
  144. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -0
  145. package/backend/dist/persistence/sqliteToPostgresMigration.js +1543 -0
  146. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -0
  147. package/backend/dist/persistence/types.d.ts +131 -0
  148. package/backend/dist/persistence/types.d.ts.map +1 -0
  149. package/backend/dist/persistence/types.js +18 -0
  150. package/backend/dist/persistence/types.js.map +1 -0
  151. package/backend/dist/persistence/voiceProfileNameLookup.d.ts +9 -0
  152. package/backend/dist/persistence/voiceProfileNameLookup.d.ts.map +1 -0
  153. package/backend/dist/persistence/voiceProfileNameLookup.js +15 -0
  154. package/backend/dist/persistence/voiceProfileNameLookup.js.map +1 -0
  155. package/backend/dist/platform/coordination/index.d.ts +7 -0
  156. package/backend/dist/platform/coordination/index.d.ts.map +1 -0
  157. package/backend/dist/platform/coordination/index.js +24 -0
  158. package/backend/dist/platform/coordination/index.js.map +1 -0
  159. package/backend/dist/platform/coordination/localCoordinator.d.ts +49 -0
  160. package/backend/dist/platform/coordination/localCoordinator.d.ts.map +1 -0
  161. package/backend/dist/platform/coordination/localCoordinator.js +380 -0
  162. package/backend/dist/platform/coordination/localCoordinator.js.map +1 -0
  163. package/backend/dist/platform/coordination/redisCoordinator.d.ts +83 -0
  164. package/backend/dist/platform/coordination/redisCoordinator.d.ts.map +1 -0
  165. package/backend/dist/platform/coordination/redisCoordinator.js +726 -0
  166. package/backend/dist/platform/coordination/redisCoordinator.js.map +1 -0
  167. package/backend/dist/platform/coordination/service.d.ts +11 -0
  168. package/backend/dist/platform/coordination/service.d.ts.map +1 -0
  169. package/backend/dist/platform/coordination/service.js +55 -0
  170. package/backend/dist/platform/coordination/service.js.map +1 -0
  171. package/backend/dist/platform/coordination/sharedAdmission.d.ts +53 -0
  172. package/backend/dist/platform/coordination/sharedAdmission.d.ts.map +1 -0
  173. package/backend/dist/platform/coordination/sharedAdmission.js +194 -0
  174. package/backend/dist/platform/coordination/sharedAdmission.js.map +1 -0
  175. package/backend/dist/platform/coordination/types.d.ts +76 -0
  176. package/backend/dist/platform/coordination/types.d.ts.map +1 -0
  177. package/backend/dist/platform/coordination/types.js +32 -0
  178. package/backend/dist/platform/coordination/types.js.map +1 -0
  179. package/backend/dist/platform/events/durableEventGateway.d.ts +54 -0
  180. package/backend/dist/platform/events/durableEventGateway.d.ts.map +1 -0
  181. package/backend/dist/platform/events/durableEventGateway.js +262 -0
  182. package/backend/dist/platform/events/durableEventGateway.js.map +1 -0
  183. package/backend/dist/platform/events/index.d.ts +3 -0
  184. package/backend/dist/platform/events/index.d.ts.map +1 -0
  185. package/backend/dist/platform/events/index.js +8 -0
  186. package/backend/dist/platform/events/index.js.map +1 -0
  187. package/backend/dist/platform/events/service.d.ts +8 -0
  188. package/backend/dist/platform/events/service.d.ts.map +1 -0
  189. package/backend/dist/platform/events/service.js +25 -0
  190. package/backend/dist/platform/events/service.js.map +1 -0
  191. package/backend/dist/platform/jobs/chatGenerationEnqueuer.d.ts +3 -0
  192. package/backend/dist/platform/jobs/chatGenerationEnqueuer.d.ts.map +1 -0
  193. package/backend/dist/platform/jobs/chatGenerationEnqueuer.js +55 -0
  194. package/backend/dist/platform/jobs/chatGenerationEnqueuer.js.map +1 -0
  195. package/backend/dist/platform/jobs/documentIngestionEnqueuer.d.ts +3 -0
  196. package/backend/dist/platform/jobs/documentIngestionEnqueuer.d.ts.map +1 -0
  197. package/backend/dist/platform/jobs/documentIngestionEnqueuer.js +38 -0
  198. package/backend/dist/platform/jobs/documentIngestionEnqueuer.js.map +1 -0
  199. package/backend/dist/platform/jobs/domainJobContracts.d.ts +30 -0
  200. package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -0
  201. package/backend/dist/platform/jobs/domainJobContracts.js +53 -0
  202. package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -0
  203. package/backend/dist/platform/jobs/domainJobHandlers.d.ts +11 -0
  204. package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -0
  205. package/backend/dist/platform/jobs/domainJobHandlers.js +612 -0
  206. package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -0
  207. package/backend/dist/platform/jobs/durableEventIdentity.d.ts +8 -0
  208. package/backend/dist/platform/jobs/durableEventIdentity.d.ts.map +1 -0
  209. package/backend/dist/platform/jobs/durableEventIdentity.js +33 -0
  210. package/backend/dist/platform/jobs/durableEventIdentity.js.map +1 -0
  211. package/backend/dist/platform/jobs/durableJobRuntime.d.ts +57 -0
  212. package/backend/dist/platform/jobs/durableJobRuntime.d.ts.map +1 -0
  213. package/backend/dist/platform/jobs/durableJobRuntime.js +131 -0
  214. package/backend/dist/platform/jobs/durableJobRuntime.js.map +1 -0
  215. package/backend/dist/platform/jobs/durableJobRuntimeBackend.d.ts +28 -0
  216. package/backend/dist/platform/jobs/durableJobRuntimeBackend.d.ts.map +1 -0
  217. package/backend/dist/platform/jobs/durableJobRuntimeBackend.js +62 -0
  218. package/backend/dist/platform/jobs/durableJobRuntimeBackend.js.map +1 -0
  219. package/backend/dist/platform/jobs/durableJobService.d.ts +85 -0
  220. package/backend/dist/platform/jobs/durableJobService.d.ts.map +1 -0
  221. package/backend/dist/platform/jobs/durableJobService.js +726 -0
  222. package/backend/dist/platform/jobs/durableJobService.js.map +1 -0
  223. package/backend/dist/platform/jobs/durableJobTypes.d.ts +195 -0
  224. package/backend/dist/platform/jobs/durableJobTypes.d.ts.map +1 -0
  225. package/backend/dist/platform/jobs/durableJobTypes.js +72 -0
  226. package/backend/dist/platform/jobs/durableJobTypes.js.map +1 -0
  227. package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts +87 -0
  228. package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts.map +1 -0
  229. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js +429 -0
  230. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js.map +1 -0
  231. package/backend/dist/platform/jobs/identityDeletionEnqueuer.d.ts +3 -0
  232. package/backend/dist/platform/jobs/identityDeletionEnqueuer.d.ts.map +1 -0
  233. package/backend/dist/platform/jobs/identityDeletionEnqueuer.js +36 -0
  234. package/backend/dist/platform/jobs/identityDeletionEnqueuer.js.map +1 -0
  235. package/backend/dist/platform/jobs/index.d.ts +18 -0
  236. package/backend/dist/platform/jobs/index.d.ts.map +1 -0
  237. package/backend/dist/platform/jobs/index.js +34 -0
  238. package/backend/dist/platform/jobs/index.js.map +1 -0
  239. package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.d.ts +4 -0
  240. package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.d.ts.map +1 -0
  241. package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.js +25 -0
  242. package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.js.map +1 -0
  243. package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.d.ts +4 -0
  244. package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.d.ts.map +1 -0
  245. package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.js +23 -0
  246. package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.js.map +1 -0
  247. package/backend/dist/platform/jobs/postgresDurableJobMigration.d.ts +11 -0
  248. package/backend/dist/platform/jobs/postgresDurableJobMigration.d.ts.map +1 -0
  249. package/backend/dist/platform/jobs/postgresDurableJobMigration.js +106 -0
  250. package/backend/dist/platform/jobs/postgresDurableJobMigration.js.map +1 -0
  251. package/backend/dist/platform/jobs/postgresDurableJobRepository.d.ts +88 -0
  252. package/backend/dist/platform/jobs/postgresDurableJobRepository.d.ts.map +1 -0
  253. package/backend/dist/platform/jobs/postgresDurableJobRepository.js +1185 -0
  254. package/backend/dist/platform/jobs/postgresDurableJobRepository.js.map +1 -0
  255. package/backend/dist/platform/jobs/postgresDurableJobService.d.ts +86 -0
  256. package/backend/dist/platform/jobs/postgresDurableJobService.d.ts.map +1 -0
  257. package/backend/dist/platform/jobs/postgresDurableJobService.js +696 -0
  258. package/backend/dist/platform/jobs/postgresDurableJobService.js.map +1 -0
  259. package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts +53 -0
  260. package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts.map +1 -0
  261. package/backend/dist/platform/jobs/postgresDurableJobWorker.js +393 -0
  262. package/backend/dist/platform/jobs/postgresDurableJobWorker.js.map +1 -0
  263. package/backend/dist/platform/jobs/resourceDeletionEnqueuer.d.ts +3 -0
  264. package/backend/dist/platform/jobs/resourceDeletionEnqueuer.d.ts.map +1 -0
  265. package/backend/dist/platform/jobs/resourceDeletionEnqueuer.js +43 -0
  266. package/backend/dist/platform/jobs/resourceDeletionEnqueuer.js.map +1 -0
  267. package/backend/dist/platform/jobs/sqliteDurableJobRepository.d.ts +166 -0
  268. package/backend/dist/platform/jobs/sqliteDurableJobRepository.d.ts.map +1 -0
  269. package/backend/dist/platform/jobs/sqliteDurableJobRepository.js +1008 -0
  270. package/backend/dist/platform/jobs/sqliteDurableJobRepository.js.map +1 -0
  271. package/backend/dist/platform/jobs/videoGenerationEnqueuer.d.ts +4 -0
  272. package/backend/dist/platform/jobs/videoGenerationEnqueuer.d.ts.map +1 -0
  273. package/backend/dist/platform/jobs/videoGenerationEnqueuer.js +46 -0
  274. package/backend/dist/platform/jobs/videoGenerationEnqueuer.js.map +1 -0
  275. package/backend/dist/platform/jobs/workExecutionEnqueuer.d.ts +3 -0
  276. package/backend/dist/platform/jobs/workExecutionEnqueuer.d.ts.map +1 -0
  277. package/backend/dist/platform/jobs/workExecutionEnqueuer.js +38 -0
  278. package/backend/dist/platform/jobs/workExecutionEnqueuer.js.map +1 -0
  279. package/backend/dist/platform/ollamaRuntimeConfig.d.ts +40 -0
  280. package/backend/dist/platform/ollamaRuntimeConfig.d.ts.map +1 -0
  281. package/backend/dist/platform/ollamaRuntimeConfig.js +72 -0
  282. package/backend/dist/platform/ollamaRuntimeConfig.js.map +1 -0
  283. package/backend/dist/platform/recovery/backupArchive.d.ts +120 -0
  284. package/backend/dist/platform/recovery/backupArchive.d.ts.map +1 -0
  285. package/backend/dist/platform/recovery/backupArchive.js +842 -0
  286. package/backend/dist/platform/recovery/backupArchive.js.map +1 -0
  287. package/backend/dist/platform/recovery/index.d.ts +3 -0
  288. package/backend/dist/platform/recovery/index.d.ts.map +1 -0
  289. package/backend/dist/platform/recovery/index.js +8 -0
  290. package/backend/dist/platform/recovery/index.js.map +1 -0
  291. package/backend/dist/platform/recovery/teamBackupArchive.d.ts +98 -0
  292. package/backend/dist/platform/recovery/teamBackupArchive.d.ts.map +1 -0
  293. package/backend/dist/platform/recovery/teamBackupArchive.js +1203 -0
  294. package/backend/dist/platform/recovery/teamBackupArchive.js.map +1 -0
  295. package/backend/dist/platform/runtimeConfig.d.ts +70 -0
  296. package/backend/dist/platform/runtimeConfig.d.ts.map +1 -0
  297. package/backend/dist/platform/runtimeConfig.js +205 -0
  298. package/backend/dist/platform/runtimeConfig.js.map +1 -0
  299. package/backend/dist/platform/storage/aesGcmKeyring.d.ts +26 -0
  300. package/backend/dist/platform/storage/aesGcmKeyring.d.ts.map +1 -0
  301. package/backend/dist/platform/storage/aesGcmKeyring.js +135 -0
  302. package/backend/dist/platform/storage/aesGcmKeyring.js.map +1 -0
  303. package/backend/dist/platform/storage/blobReferenceRepository.d.ts +36 -0
  304. package/backend/dist/platform/storage/blobReferenceRepository.d.ts.map +1 -0
  305. package/backend/dist/platform/storage/blobReferenceRepository.js +117 -0
  306. package/backend/dist/platform/storage/blobReferenceRepository.js.map +1 -0
  307. package/backend/dist/platform/storage/blobStore.d.ts +111 -0
  308. package/backend/dist/platform/storage/blobStore.d.ts.map +1 -0
  309. package/backend/dist/platform/storage/blobStore.js +46 -0
  310. package/backend/dist/platform/storage/blobStore.js.map +1 -0
  311. package/backend/dist/platform/storage/documentVectorIndex.d.ts +44 -0
  312. package/backend/dist/platform/storage/documentVectorIndex.d.ts.map +1 -0
  313. package/backend/dist/platform/storage/documentVectorIndex.js +110 -0
  314. package/backend/dist/platform/storage/documentVectorIndex.js.map +1 -0
  315. package/backend/dist/platform/storage/durableBlobQuotaPolicy.d.ts +82 -0
  316. package/backend/dist/platform/storage/durableBlobQuotaPolicy.d.ts.map +1 -0
  317. package/backend/dist/platform/storage/durableBlobQuotaPolicy.js +583 -0
  318. package/backend/dist/platform/storage/durableBlobQuotaPolicy.js.map +1 -0
  319. package/backend/dist/platform/storage/index.d.ts +19 -0
  320. package/backend/dist/platform/storage/index.d.ts.map +1 -0
  321. package/backend/dist/platform/storage/index.js +35 -0
  322. package/backend/dist/platform/storage/index.js.map +1 -0
  323. package/backend/dist/platform/storage/localEncryptedBlobStore.d.ts +120 -0
  324. package/backend/dist/platform/storage/localEncryptedBlobStore.d.ts.map +1 -0
  325. package/backend/dist/platform/storage/localEncryptedBlobStore.js +1205 -0
  326. package/backend/dist/platform/storage/localEncryptedBlobStore.js.map +1 -0
  327. package/backend/dist/platform/storage/personaMemoryIndexing.d.ts +12 -0
  328. package/backend/dist/platform/storage/personaMemoryIndexing.d.ts.map +1 -0
  329. package/backend/dist/platform/storage/personaMemoryIndexing.js +25 -0
  330. package/backend/dist/platform/storage/personaMemoryIndexing.js.map +1 -0
  331. package/backend/dist/platform/storage/pgVectorStore.d.ts +37 -0
  332. package/backend/dist/platform/storage/pgVectorStore.d.ts.map +1 -0
  333. package/backend/dist/platform/storage/pgVectorStore.js +493 -0
  334. package/backend/dist/platform/storage/pgVectorStore.js.map +1 -0
  335. package/backend/dist/platform/storage/platformDomainRepositories.d.ts +244 -0
  336. package/backend/dist/platform/storage/platformDomainRepositories.d.ts.map +1 -0
  337. package/backend/dist/platform/storage/platformDomainRepositories.js +7 -0
  338. package/backend/dist/platform/storage/platformDomainRepositories.js.map +1 -0
  339. package/backend/dist/platform/storage/platformStorageRuntime.d.ts +35 -0
  340. package/backend/dist/platform/storage/platformStorageRuntime.d.ts.map +1 -0
  341. package/backend/dist/platform/storage/platformStorageRuntime.js +299 -0
  342. package/backend/dist/platform/storage/platformStorageRuntime.js.map +1 -0
  343. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts +4 -0
  344. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts.map +1 -0
  345. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js +1017 -0
  346. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js.map +1 -0
  347. package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.d.ts +4 -0
  348. package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.d.ts.map +1 -0
  349. package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.js +40 -0
  350. package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.js.map +1 -0
  351. package/backend/dist/platform/storage/resourceContentCleanup.d.ts +29 -0
  352. package/backend/dist/platform/storage/resourceContentCleanup.d.ts.map +1 -0
  353. package/backend/dist/platform/storage/resourceContentCleanup.js +100 -0
  354. package/backend/dist/platform/storage/resourceContentCleanup.js.map +1 -0
  355. package/backend/dist/platform/storage/resourceDeletionLifecycle.d.ts +14 -0
  356. package/backend/dist/platform/storage/resourceDeletionLifecycle.d.ts.map +1 -0
  357. package/backend/dist/platform/storage/resourceDeletionLifecycle.js +31 -0
  358. package/backend/dist/platform/storage/resourceDeletionLifecycle.js.map +1 -0
  359. package/backend/dist/platform/storage/s3EncryptedBlobStore.d.ts +140 -0
  360. package/backend/dist/platform/storage/s3EncryptedBlobStore.d.ts.map +1 -0
  361. package/backend/dist/platform/storage/s3EncryptedBlobStore.js +1309 -0
  362. package/backend/dist/platform/storage/s3EncryptedBlobStore.js.map +1 -0
  363. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts +71 -0
  364. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts.map +1 -0
  365. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js +766 -0
  366. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js.map +1 -0
  367. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts +4 -0
  368. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts.map +1 -0
  369. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js +1037 -0
  370. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js.map +1 -0
  371. package/backend/dist/platform/storage/sqliteToTeamStorageMigration.d.ts +25 -0
  372. package/backend/dist/platform/storage/sqliteToTeamStorageMigration.d.ts.map +1 -0
  373. package/backend/dist/platform/storage/sqliteToTeamStorageMigration.js +1292 -0
  374. package/backend/dist/platform/storage/sqliteToTeamStorageMigration.js.map +1 -0
  375. package/backend/dist/platform/storage/storageFactory.d.ts +81 -0
  376. package/backend/dist/platform/storage/storageFactory.d.ts.map +1 -0
  377. package/backend/dist/platform/storage/storageFactory.js +518 -0
  378. package/backend/dist/platform/storage/storageFactory.js.map +1 -0
  379. package/backend/dist/platform/storage/storageSchemaContracts.d.ts +22 -0
  380. package/backend/dist/platform/storage/storageSchemaContracts.d.ts.map +1 -0
  381. package/backend/dist/platform/storage/storageSchemaContracts.js +299 -0
  382. package/backend/dist/platform/storage/storageSchemaContracts.js.map +1 -0
  383. package/backend/dist/platform/storage/vectorStore.d.ts +117 -0
  384. package/backend/dist/platform/storage/vectorStore.d.ts.map +1 -0
  385. package/backend/dist/platform/storage/vectorStore.js +40 -0
  386. package/backend/dist/platform/storage/vectorStore.js.map +1 -0
  387. package/backend/dist/platform/workPersistence/index.d.ts +9 -0
  388. package/backend/dist/platform/workPersistence/index.d.ts.map +1 -0
  389. package/backend/dist/platform/workPersistence/index.js +14 -0
  390. package/backend/dist/platform/workPersistence/index.js.map +1 -0
  391. package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.d.ts +9 -0
  392. package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.d.ts.map +1 -0
  393. package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.js +47 -0
  394. package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.js.map +1 -0
  395. package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.d.ts +3 -0
  396. package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.d.ts.map +1 -0
  397. package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.js +28 -0
  398. package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.js.map +1 -0
  399. package/backend/dist/platform/workPersistence/postgresWorkMigration.d.ts +3 -0
  400. package/backend/dist/platform/workPersistence/postgresWorkMigration.d.ts.map +1 -0
  401. package/backend/dist/platform/workPersistence/postgresWorkMigration.js +101 -0
  402. package/backend/dist/platform/workPersistence/postgresWorkMigration.js.map +1 -0
  403. package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts +79 -0
  404. package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts.map +1 -0
  405. package/backend/dist/platform/workPersistence/postgresWorkPersistence.js +521 -0
  406. package/backend/dist/platform/workPersistence/postgresWorkPersistence.js.map +1 -0
  407. package/backend/dist/platform/workPersistence/service.d.ts +6 -0
  408. package/backend/dist/platform/workPersistence/service.d.ts.map +1 -0
  409. package/backend/dist/platform/workPersistence/service.js +27 -0
  410. package/backend/dist/platform/workPersistence/service.js.map +1 -0
  411. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts +77 -0
  412. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts.map +1 -0
  413. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js +463 -0
  414. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js.map +1 -0
  415. package/backend/dist/platform/workPersistence/types.d.ts +159 -0
  416. package/backend/dist/platform/workPersistence/types.d.ts.map +1 -0
  417. package/backend/dist/platform/workPersistence/types.js +13 -0
  418. package/backend/dist/platform/workPersistence/types.js.map +1 -0
  419. package/backend/dist/platform/workPersistence/workExecutionTypes.d.ts +13 -0
  420. package/backend/dist/platform/workPersistence/workExecutionTypes.d.ts.map +1 -0
  421. package/backend/dist/platform/workPersistence/workExecutionTypes.js +7 -0
  422. package/backend/dist/platform/workPersistence/workExecutionTypes.js.map +1 -0
  423. package/backend/dist/platform/workPersistence/workMessageContentCodec.d.ts +8 -0
  424. package/backend/dist/platform/workPersistence/workMessageContentCodec.d.ts.map +1 -0
  425. package/backend/dist/platform/workPersistence/workMessageContentCodec.js +25 -0
  426. package/backend/dist/platform/workPersistence/workMessageContentCodec.js.map +1 -0
  427. package/backend/dist/platform/workPersistence/workTextSafety.d.ts +3 -0
  428. package/backend/dist/platform/workPersistence/workTextSafety.d.ts.map +1 -0
  429. package/backend/dist/platform/workPersistence/workTextSafety.js +8 -0
  430. package/backend/dist/platform/workPersistence/workTextSafety.js.map +1 -0
  431. package/backend/dist/routes/agentCli.js +1 -1
  432. package/backend/dist/routes/agentCli.js.map +1 -1
  433. package/backend/dist/routes/artifacts.d.ts.map +1 -1
  434. package/backend/dist/routes/artifacts.js +2 -1
  435. package/backend/dist/routes/artifacts.js.map +1 -1
  436. package/backend/dist/routes/auth.d.ts.map +1 -1
  437. package/backend/dist/routes/auth.js +64 -18
  438. package/backend/dist/routes/auth.js.map +1 -1
  439. package/backend/dist/routes/chat.d.ts.map +1 -1
  440. package/backend/dist/routes/chat.js +519 -85
  441. package/backend/dist/routes/chat.js.map +1 -1
  442. package/backend/dist/routes/documents.d.ts.map +1 -1
  443. package/backend/dist/routes/documents.js +134 -28
  444. package/backend/dist/routes/documents.js.map +1 -1
  445. package/backend/dist/routes/embeddings.d.ts.map +1 -1
  446. package/backend/dist/routes/embeddings.js +2 -1
  447. package/backend/dist/routes/embeddings.js.map +1 -1
  448. package/backend/dist/routes/health.d.ts +3 -0
  449. package/backend/dist/routes/health.d.ts.map +1 -0
  450. package/backend/dist/routes/health.js +52 -0
  451. package/backend/dist/routes/health.js.map +1 -0
  452. package/backend/dist/routes/huggingfaceHub.d.ts.map +1 -1
  453. package/backend/dist/routes/huggingfaceHub.js +2 -1
  454. package/backend/dist/routes/huggingfaceHub.js.map +1 -1
  455. package/backend/dist/routes/imageGen.d.ts.map +1 -1
  456. package/backend/dist/routes/imageGen.js +42 -10
  457. package/backend/dist/routes/imageGen.js.map +1 -1
  458. package/backend/dist/routes/jobs.d.ts +3 -0
  459. package/backend/dist/routes/jobs.d.ts.map +1 -0
  460. package/backend/dist/routes/jobs.js +117 -0
  461. package/backend/dist/routes/jobs.js.map +1 -0
  462. package/backend/dist/routes/libreClaw.d.ts.map +1 -1
  463. package/backend/dist/routes/libreClaw.js +10 -7
  464. package/backend/dist/routes/libreClaw.js.map +1 -1
  465. package/backend/dist/routes/media.d.ts.map +1 -1
  466. package/backend/dist/routes/media.js +523 -77
  467. package/backend/dist/routes/media.js.map +1 -1
  468. package/backend/dist/routes/notes.d.ts.map +1 -1
  469. package/backend/dist/routes/notes.js +21 -21
  470. package/backend/dist/routes/notes.js.map +1 -1
  471. package/backend/dist/routes/ollama.d.ts.map +1 -1
  472. package/backend/dist/routes/ollama.js +40 -12
  473. package/backend/dist/routes/ollama.js.map +1 -1
  474. package/backend/dist/routes/personas.d.ts.map +1 -1
  475. package/backend/dist/routes/personas.js +4 -2
  476. package/backend/dist/routes/personas.js.map +1 -1
  477. package/backend/dist/routes/plugins.d.ts.map +1 -1
  478. package/backend/dist/routes/plugins.js +79 -51
  479. package/backend/dist/routes/plugins.js.map +1 -1
  480. package/backend/dist/routes/preferences.d.ts.map +1 -1
  481. package/backend/dist/routes/preferences.js +290 -25
  482. package/backend/dist/routes/preferences.js.map +1 -1
  483. package/backend/dist/routes/search.d.ts.map +1 -1
  484. package/backend/dist/routes/search.js +23 -14
  485. package/backend/dist/routes/search.js.map +1 -1
  486. package/backend/dist/routes/stt.d.ts +9 -0
  487. package/backend/dist/routes/stt.d.ts.map +1 -0
  488. package/backend/dist/routes/stt.js +217 -0
  489. package/backend/dist/routes/stt.js.map +1 -0
  490. package/backend/dist/routes/systemDiagnostics.d.ts.map +1 -1
  491. package/backend/dist/routes/systemDiagnostics.js +2 -1
  492. package/backend/dist/routes/systemDiagnostics.js.map +1 -1
  493. package/backend/dist/routes/tts.d.ts.map +1 -1
  494. package/backend/dist/routes/tts.js +577 -28
  495. package/backend/dist/routes/tts.js.map +1 -1
  496. package/backend/dist/routes/users.d.ts.map +1 -1
  497. package/backend/dist/routes/users.js +16 -25
  498. package/backend/dist/routes/users.js.map +1 -1
  499. package/backend/dist/routes/work.d.ts.map +1 -1
  500. package/backend/dist/routes/work.js +167 -113
  501. package/backend/dist/routes/work.js.map +1 -1
  502. package/backend/dist/services/agentAccessService.d.ts +2 -2
  503. package/backend/dist/services/agentAccessService.d.ts.map +1 -1
  504. package/backend/dist/services/agentAccessService.js +5 -14
  505. package/backend/dist/services/agentAccessService.js.map +1 -1
  506. package/backend/dist/services/agentCliService.d.ts +3 -2
  507. package/backend/dist/services/agentCliService.d.ts.map +1 -1
  508. package/backend/dist/services/agentCliService.js +44 -16
  509. package/backend/dist/services/agentCliService.js.map +1 -1
  510. package/backend/dist/services/assistantCompletionService.d.ts +2 -1
  511. package/backend/dist/services/assistantCompletionService.d.ts.map +1 -1
  512. package/backend/dist/services/assistantCompletionService.js +7 -3
  513. package/backend/dist/services/assistantCompletionService.js.map +1 -1
  514. package/backend/dist/services/authService.d.ts +7 -2
  515. package/backend/dist/services/authService.d.ts.map +1 -1
  516. package/backend/dist/services/authService.js +23 -10
  517. package/backend/dist/services/authService.js.map +1 -1
  518. package/backend/dist/services/chatGenerationService.d.ts +5 -4
  519. package/backend/dist/services/chatGenerationService.d.ts.map +1 -1
  520. package/backend/dist/services/chatGenerationService.js +23 -17
  521. package/backend/dist/services/chatGenerationService.js.map +1 -1
  522. package/backend/dist/services/chatRequestService.d.ts +4 -3
  523. package/backend/dist/services/chatRequestService.d.ts.map +1 -1
  524. package/backend/dist/services/chatRequestService.js +3 -3
  525. package/backend/dist/services/chatRequestService.js.map +1 -1
  526. package/backend/dist/services/chatService.d.ts +66 -16
  527. package/backend/dist/services/chatService.d.ts.map +1 -1
  528. package/backend/dist/services/chatService.js +402 -111
  529. package/backend/dist/services/chatService.js.map +1 -1
  530. package/backend/dist/services/codexOAuthService.d.ts +2 -2
  531. package/backend/dist/services/codexOAuthService.d.ts.map +1 -1
  532. package/backend/dist/services/codexOAuthService.js +63 -7
  533. package/backend/dist/services/codexOAuthService.js.map +1 -1
  534. package/backend/dist/services/dataArchiveService.d.ts +88 -0
  535. package/backend/dist/services/dataArchiveService.d.ts.map +1 -0
  536. package/backend/dist/services/dataArchiveService.js +1027 -0
  537. package/backend/dist/services/dataArchiveService.js.map +1 -0
  538. package/backend/dist/services/documentService.d.ts +67 -14
  539. package/backend/dist/services/documentService.d.ts.map +1 -1
  540. package/backend/dist/services/documentService.js +938 -193
  541. package/backend/dist/services/documentService.js.map +1 -1
  542. package/backend/dist/services/durableChatCompletion.d.ts +16 -0
  543. package/backend/dist/services/durableChatCompletion.d.ts.map +1 -0
  544. package/backend/dist/services/durableChatCompletion.js +34 -0
  545. package/backend/dist/services/durableChatCompletion.js.map +1 -0
  546. package/backend/dist/services/durableChatGenerationService.d.ts +19 -0
  547. package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -0
  548. package/backend/dist/services/durableChatGenerationService.js +341 -0
  549. package/backend/dist/services/durableChatGenerationService.js.map +1 -0
  550. package/backend/dist/services/embeddingService.d.ts +1 -1
  551. package/backend/dist/services/embeddingService.d.ts.map +1 -1
  552. package/backend/dist/services/embeddingService.js +16 -13
  553. package/backend/dist/services/embeddingService.js.map +1 -1
  554. package/backend/dist/services/encryptionService.d.ts +28 -1
  555. package/backend/dist/services/encryptionService.d.ts.map +1 -1
  556. package/backend/dist/services/encryptionService.js +131 -51
  557. package/backend/dist/services/encryptionService.js.map +1 -1
  558. package/backend/dist/services/followUpService.d.ts +1 -1
  559. package/backend/dist/services/followUpService.d.ts.map +1 -1
  560. package/backend/dist/services/followUpService.js +1 -1
  561. package/backend/dist/services/followUpService.js.map +1 -1
  562. package/backend/dist/services/galleryService.d.ts +38 -37
  563. package/backend/dist/services/galleryService.d.ts.map +1 -1
  564. package/backend/dist/services/galleryService.js +356 -251
  565. package/backend/dist/services/galleryService.js.map +1 -1
  566. package/backend/dist/services/healthService.d.ts +65 -0
  567. package/backend/dist/services/healthService.d.ts.map +1 -0
  568. package/backend/dist/services/healthService.js +379 -0
  569. package/backend/dist/services/healthService.js.map +1 -0
  570. package/backend/dist/services/legacyCiphertextIntegrity.d.ts +40 -0
  571. package/backend/dist/services/legacyCiphertextIntegrity.d.ts.map +1 -0
  572. package/backend/dist/services/legacyCiphertextIntegrity.js +406 -0
  573. package/backend/dist/services/legacyCiphertextIntegrity.js.map +1 -0
  574. package/backend/dist/services/mediaGenerationJobService.d.ts +27 -5
  575. package/backend/dist/services/mediaGenerationJobService.d.ts.map +1 -1
  576. package/backend/dist/services/mediaGenerationJobService.js +185 -55
  577. package/backend/dist/services/mediaGenerationJobService.js.map +1 -1
  578. package/backend/dist/services/memoryService.d.ts +7 -83
  579. package/backend/dist/services/memoryService.d.ts.map +1 -1
  580. package/backend/dist/services/memoryService.js +428 -573
  581. package/backend/dist/services/memoryService.js.map +1 -1
  582. package/backend/dist/services/memoryUtils.d.ts.map +1 -1
  583. package/backend/dist/services/memoryUtils.js +8 -1
  584. package/backend/dist/services/memoryUtils.js.map +1 -1
  585. package/backend/dist/services/modelAccessService.d.ts +3 -3
  586. package/backend/dist/services/modelAccessService.d.ts.map +1 -1
  587. package/backend/dist/services/modelAccessService.js +8 -16
  588. package/backend/dist/services/modelAccessService.js.map +1 -1
  589. package/backend/dist/services/mutationEngineService.d.ts +0 -7
  590. package/backend/dist/services/mutationEngineService.d.ts.map +1 -1
  591. package/backend/dist/services/mutationEngineService.js +7 -78
  592. package/backend/dist/services/mutationEngineService.js.map +1 -1
  593. package/backend/dist/services/ollamaService.d.ts +4 -4
  594. package/backend/dist/services/ollamaService.d.ts.map +1 -1
  595. package/backend/dist/services/ollamaService.js +62 -31
  596. package/backend/dist/services/ollamaService.js.map +1 -1
  597. package/backend/dist/services/personaService.d.ts.map +1 -1
  598. package/backend/dist/services/personaService.js +19 -54
  599. package/backend/dist/services/personaService.js.map +1 -1
  600. package/backend/dist/services/pluginActivationService.d.ts +6 -5
  601. package/backend/dist/services/pluginActivationService.d.ts.map +1 -1
  602. package/backend/dist/services/pluginActivationService.js +36 -76
  603. package/backend/dist/services/pluginActivationService.js.map +1 -1
  604. package/backend/dist/services/pluginAudioGenerationService.d.ts +11 -6
  605. package/backend/dist/services/pluginAudioGenerationService.d.ts.map +1 -1
  606. package/backend/dist/services/pluginAudioGenerationService.js +74 -16
  607. package/backend/dist/services/pluginAudioGenerationService.js.map +1 -1
  608. package/backend/dist/services/pluginCacheInvalidation.d.ts +38 -0
  609. package/backend/dist/services/pluginCacheInvalidation.d.ts.map +1 -0
  610. package/backend/dist/services/pluginCacheInvalidation.js +198 -0
  611. package/backend/dist/services/pluginCacheInvalidation.js.map +1 -0
  612. package/backend/dist/services/pluginCapabilityRegistryService.d.ts +3 -3
  613. package/backend/dist/services/pluginCapabilityRegistryService.d.ts.map +1 -1
  614. package/backend/dist/services/pluginCapabilityRegistryService.js +11 -7
  615. package/backend/dist/services/pluginCapabilityRegistryService.js.map +1 -1
  616. package/backend/dist/services/pluginCredentialsService.d.ts +9 -8
  617. package/backend/dist/services/pluginCredentialsService.d.ts.map +1 -1
  618. package/backend/dist/services/pluginCredentialsService.js +48 -89
  619. package/backend/dist/services/pluginCredentialsService.js.map +1 -1
  620. package/backend/dist/services/pluginEmbeddingService.d.ts +8 -7
  621. package/backend/dist/services/pluginEmbeddingService.d.ts.map +1 -1
  622. package/backend/dist/services/pluginEmbeddingService.js +13 -11
  623. package/backend/dist/services/pluginEmbeddingService.js.map +1 -1
  624. package/backend/dist/services/pluginImageGenerationService.d.ts +10 -8
  625. package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
  626. package/backend/dist/services/pluginImageGenerationService.js +119 -14
  627. package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
  628. package/backend/dist/services/pluginSTTService.d.ts +47 -0
  629. package/backend/dist/services/pluginSTTService.d.ts.map +1 -0
  630. package/backend/dist/services/pluginSTTService.js +199 -0
  631. package/backend/dist/services/pluginSTTService.js.map +1 -0
  632. package/backend/dist/services/pluginService.d.ts +94 -40
  633. package/backend/dist/services/pluginService.d.ts.map +1 -1
  634. package/backend/dist/services/pluginService.js +799 -274
  635. package/backend/dist/services/pluginService.js.map +1 -1
  636. package/backend/dist/services/pluginTTSService.d.ts +26 -8
  637. package/backend/dist/services/pluginTTSService.d.ts.map +1 -1
  638. package/backend/dist/services/pluginTTSService.js +277 -25
  639. package/backend/dist/services/pluginTTSService.js.map +1 -1
  640. package/backend/dist/services/pluginUsageService.d.ts +4 -4
  641. package/backend/dist/services/pluginUsageService.d.ts.map +1 -1
  642. package/backend/dist/services/pluginUsageService.js +44 -93
  643. package/backend/dist/services/pluginUsageService.js.map +1 -1
  644. package/backend/dist/services/pluginVariablesService.d.ts +14 -7
  645. package/backend/dist/services/pluginVariablesService.d.ts.map +1 -1
  646. package/backend/dist/services/pluginVariablesService.js +116 -81
  647. package/backend/dist/services/pluginVariablesService.js.map +1 -1
  648. package/backend/dist/services/pluginVideoGenerationService.d.ts +19 -8
  649. package/backend/dist/services/pluginVideoGenerationService.d.ts.map +1 -1
  650. package/backend/dist/services/pluginVideoGenerationService.js +116 -20
  651. package/backend/dist/services/pluginVideoGenerationService.js.map +1 -1
  652. package/backend/dist/services/preferencesService.d.ts +31 -21
  653. package/backend/dist/services/preferencesService.d.ts.map +1 -1
  654. package/backend/dist/services/preferencesService.js +104 -102
  655. package/backend/dist/services/preferencesService.js.map +1 -1
  656. package/backend/dist/services/recoveryInventoryService.d.ts +244 -0
  657. package/backend/dist/services/recoveryInventoryService.d.ts.map +1 -0
  658. package/backend/dist/services/recoveryInventoryService.js +1436 -0
  659. package/backend/dist/services/recoveryInventoryService.js.map +1 -0
  660. package/backend/dist/services/simpleGitHubOAuth.js +3 -3
  661. package/backend/dist/services/simpleGitHubOAuth.js.map +1 -1
  662. package/backend/dist/services/simpleHuggingFaceOAuth.d.ts.map +1 -1
  663. package/backend/dist/services/simpleHuggingFaceOAuth.js +3 -3
  664. package/backend/dist/services/simpleHuggingFaceOAuth.js.map +1 -1
  665. package/backend/dist/services/systemDiagnosticsService.d.ts.map +1 -1
  666. package/backend/dist/services/systemDiagnosticsService.js +2 -2
  667. package/backend/dist/services/systemDiagnosticsService.js.map +1 -1
  668. package/backend/dist/services/systemSettingsService.d.ts +5 -0
  669. package/backend/dist/services/systemSettingsService.d.ts.map +1 -0
  670. package/backend/dist/services/systemSettingsService.js +24 -0
  671. package/backend/dist/services/systemSettingsService.js.map +1 -0
  672. package/backend/dist/services/titleGenerationService.d.ts +1 -1
  673. package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
  674. package/backend/dist/services/titleGenerationService.js +1 -1
  675. package/backend/dist/services/titleGenerationService.js.map +1 -1
  676. package/backend/dist/services/voiceProfileService.d.ts +44 -0
  677. package/backend/dist/services/voiceProfileService.d.ts.map +1 -0
  678. package/backend/dist/services/voiceProfileService.js +195 -0
  679. package/backend/dist/services/voiceProfileService.js.map +1 -0
  680. package/backend/dist/services/webSearchService.d.ts +7 -7
  681. package/backend/dist/services/webSearchService.d.ts.map +1 -1
  682. package/backend/dist/services/webSearchService.js +40 -35
  683. package/backend/dist/services/webSearchService.js.map +1 -1
  684. package/backend/dist/services/websocketTicketService.d.ts +39 -0
  685. package/backend/dist/services/websocketTicketService.d.ts.map +1 -0
  686. package/backend/dist/services/websocketTicketService.js +183 -0
  687. package/backend/dist/services/websocketTicketService.js.map +1 -0
  688. package/backend/dist/services/workAccessService.d.ts +3 -3
  689. package/backend/dist/services/workAccessService.d.ts.map +1 -1
  690. package/backend/dist/services/workAccessService.js +8 -16
  691. package/backend/dist/services/workAccessService.js.map +1 -1
  692. package/backend/dist/services/workAdminService.d.ts +3 -3
  693. package/backend/dist/services/workAdminService.d.ts.map +1 -1
  694. package/backend/dist/services/workAdminService.js +4 -4
  695. package/backend/dist/services/workAdminService.js.map +1 -1
  696. package/backend/dist/services/workAgentService.d.ts +25 -1
  697. package/backend/dist/services/workAgentService.d.ts.map +1 -1
  698. package/backend/dist/services/workAgentService.js +294 -126
  699. package/backend/dist/services/workAgentService.js.map +1 -1
  700. package/backend/dist/services/workEventService.d.ts +15 -2
  701. package/backend/dist/services/workEventService.d.ts.map +1 -1
  702. package/backend/dist/services/workEventService.js +201 -3
  703. package/backend/dist/services/workEventService.js.map +1 -1
  704. package/backend/dist/services/workKubernetesDriver.d.ts +8 -7
  705. package/backend/dist/services/workKubernetesDriver.d.ts.map +1 -1
  706. package/backend/dist/services/workKubernetesDriver.js +65 -21
  707. package/backend/dist/services/workKubernetesDriver.js.map +1 -1
  708. package/backend/dist/services/workModelProviderService.d.ts +2 -2
  709. package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
  710. package/backend/dist/services/workModelProviderService.js +38 -34
  711. package/backend/dist/services/workModelProviderService.js.map +1 -1
  712. package/backend/dist/services/workPolicyService.d.ts +7 -7
  713. package/backend/dist/services/workPolicyService.d.ts.map +1 -1
  714. package/backend/dist/services/workPolicyService.js +50 -51
  715. package/backend/dist/services/workPolicyService.js.map +1 -1
  716. package/backend/dist/services/workPreviewProxyService.d.ts +8 -8
  717. package/backend/dist/services/workPreviewProxyService.d.ts.map +1 -1
  718. package/backend/dist/services/workPreviewProxyService.js +47 -44
  719. package/backend/dist/services/workPreviewProxyService.js.map +1 -1
  720. package/backend/dist/services/workRuntimeDriver.d.ts +21 -18
  721. package/backend/dist/services/workRuntimeDriver.d.ts.map +1 -1
  722. package/backend/dist/services/workRuntimeDriver.js +69 -20
  723. package/backend/dist/services/workRuntimeDriver.js.map +1 -1
  724. package/backend/dist/services/workRuntimeService.d.ts +18 -13
  725. package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
  726. package/backend/dist/services/workRuntimeService.js +438 -194
  727. package/backend/dist/services/workRuntimeService.js.map +1 -1
  728. package/backend/dist/services/workRuntimeShared.d.ts +2 -0
  729. package/backend/dist/services/workRuntimeShared.d.ts.map +1 -1
  730. package/backend/dist/services/workRuntimeShared.js.map +1 -1
  731. package/backend/dist/services/workTaskService.d.ts +42 -36
  732. package/backend/dist/services/workTaskService.d.ts.map +1 -1
  733. package/backend/dist/services/workTaskService.js +445 -350
  734. package/backend/dist/services/workTaskService.js.map +1 -1
  735. package/backend/dist/services/workTerminalService.d.ts +1 -1
  736. package/backend/dist/services/workTerminalService.d.ts.map +1 -1
  737. package/backend/dist/services/workTerminalService.js +33 -6
  738. package/backend/dist/services/workTerminalService.js.map +1 -1
  739. package/backend/dist/storage.d.ts +72 -40
  740. package/backend/dist/storage.d.ts.map +1 -1
  741. package/backend/dist/storage.js +312 -660
  742. package/backend/dist/storage.js.map +1 -1
  743. package/backend/dist/types/index.d.ts +28 -0
  744. package/backend/dist/types/index.d.ts.map +1 -1
  745. package/backend/dist/types/index.js.map +1 -1
  746. package/backend/dist/types/work.d.ts +7 -2
  747. package/backend/dist/types/work.d.ts.map +1 -1
  748. package/backend/dist/utils/chatCancellation.d.ts +48 -0
  749. package/backend/dist/utils/chatCancellation.d.ts.map +1 -0
  750. package/backend/dist/utils/chatCancellation.js +152 -0
  751. package/backend/dist/utils/chatCancellation.js.map +1 -0
  752. package/backend/dist/utils/chatDocumentContext.d.ts +1 -1
  753. package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
  754. package/backend/dist/utils/chatDocumentContext.js +11 -5
  755. package/backend/dist/utils/chatDocumentContext.js.map +1 -1
  756. package/backend/dist/utils/chatStreamCoalescer.d.ts +15 -0
  757. package/backend/dist/utils/chatStreamCoalescer.d.ts.map +1 -0
  758. package/backend/dist/utils/chatStreamCoalescer.js +59 -0
  759. package/backend/dist/utils/chatStreamCoalescer.js.map +1 -0
  760. package/backend/dist/utils/dataDirectory.d.ts +49 -0
  761. package/backend/dist/utils/dataDirectory.d.ts.map +1 -0
  762. package/backend/dist/utils/dataDirectory.js +291 -0
  763. package/backend/dist/utils/dataDirectory.js.map +1 -0
  764. package/backend/dist/utils/generationUtils.d.ts.map +1 -1
  765. package/backend/dist/utils/generationUtils.js +18 -6
  766. package/backend/dist/utils/generationUtils.js.map +1 -1
  767. package/backend/dist/utils/jwt.d.ts.map +1 -1
  768. package/backend/dist/utils/jwt.js +2 -3
  769. package/backend/dist/utils/jwt.js.map +1 -1
  770. package/backend/dist/utils/ollamaModelDefaults.d.ts.map +1 -1
  771. package/backend/dist/utils/ollamaModelDefaults.js +2 -7
  772. package/backend/dist/utils/ollamaModelDefaults.js.map +1 -1
  773. package/backend/dist/utils/ollamaStreaming.d.ts +2 -1
  774. package/backend/dist/utils/ollamaStreaming.d.ts.map +1 -1
  775. package/backend/dist/utils/ollamaStreaming.js +49 -11
  776. package/backend/dist/utils/ollamaStreaming.js.map +1 -1
  777. package/backend/dist/utils/pluginConnectionVariables.d.ts.map +1 -1
  778. package/backend/dist/utils/pluginConnectionVariables.js +11 -3
  779. package/backend/dist/utils/pluginConnectionVariables.js.map +1 -1
  780. package/backend/dist/utils/pluginDefinitionTrust.d.ts.map +1 -1
  781. package/backend/dist/utils/pluginDefinitionTrust.js +4 -3
  782. package/backend/dist/utils/pluginDefinitionTrust.js.map +1 -1
  783. package/backend/dist/utils/pluginStreaming.d.ts +2 -1
  784. package/backend/dist/utils/pluginStreaming.d.ts.map +1 -1
  785. package/backend/dist/utils/pluginStreaming.js +5 -1
  786. package/backend/dist/utils/pluginStreaming.js.map +1 -1
  787. package/backend/dist/utils/pluginUpload.d.ts +1 -0
  788. package/backend/dist/utils/pluginUpload.d.ts.map +1 -1
  789. package/backend/dist/utils/pluginUpload.js +9 -2
  790. package/backend/dist/utils/pluginUpload.js.map +1 -1
  791. package/backend/dist/utils/pluginValidation.d.ts.map +1 -1
  792. package/backend/dist/utils/pluginValidation.js +29 -1
  793. package/backend/dist/utils/pluginValidation.js.map +1 -1
  794. package/backend/dist/utils/sttAudioUpload.d.ts +24 -0
  795. package/backend/dist/utils/sttAudioUpload.d.ts.map +1 -0
  796. package/backend/dist/utils/sttAudioUpload.js +500 -0
  797. package/backend/dist/utils/sttAudioUpload.js.map +1 -0
  798. package/backend/dist/utils/ttsVoiceCloneUpload.d.ts +34 -0
  799. package/backend/dist/utils/ttsVoiceCloneUpload.d.ts.map +1 -0
  800. package/backend/dist/utils/ttsVoiceCloneUpload.js +224 -0
  801. package/backend/dist/utils/ttsVoiceCloneUpload.js.map +1 -0
  802. package/backend/dist/utils/websocketMessages.d.ts +2 -1
  803. package/backend/dist/utils/websocketMessages.d.ts.map +1 -1
  804. package/backend/dist/utils/websocketMessages.js +16 -2
  805. package/backend/dist/utils/websocketMessages.js.map +1 -1
  806. package/backend/dist/websocketServer.d.ts +4 -1
  807. package/backend/dist/websocketServer.d.ts.map +1 -1
  808. package/backend/dist/websocketServer.js +290 -44
  809. package/backend/dist/websocketServer.js.map +1 -1
  810. package/backend/dist/workTerminalServer.d.ts +9 -0
  811. package/backend/dist/workTerminalServer.d.ts.map +1 -1
  812. package/backend/dist/workTerminalServer.js +221 -52
  813. package/backend/dist/workTerminalServer.js.map +1 -1
  814. package/backend/dist/worker.d.ts +2 -0
  815. package/backend/dist/worker.d.ts.map +1 -0
  816. package/backend/dist/worker.js +250 -0
  817. package/backend/dist/worker.js.map +1 -0
  818. package/backend/package.json +19 -9
  819. package/bin/cli.js +126 -99
  820. package/bin/runtime-paths.js +108 -0
  821. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  822. package/frontend/dist/artifact-runtime/framer-motion.js +5 -5
  823. package/frontend/dist/artifact-runtime/lucide-react.js +1 -1
  824. package/frontend/dist/assets/index-CUhEG7E2.js +33 -0
  825. package/frontend/dist/assets/index-kxtZQLV6.css +1 -0
  826. package/frontend/dist/assets/{markdown-math-ClQbWekD.css → markdown-math-ClTedVi7.css} +1 -1
  827. package/frontend/dist/index.html +18 -18
  828. package/frontend/dist/js/{ArtifactContainer-Dy2Q0iIL.js → ArtifactContainer-BTEDhBnv.js} +1 -1
  829. package/frontend/dist/js/{ArtifactDemoPage-K79dWshB.js → ArtifactDemoPage-B0gN3YTl.js} +1 -1
  830. package/frontend/dist/js/{ArtifactSandboxFrame-DhqLNUtY.js → ArtifactSandboxFrame-CLBXQkZs.js} +3 -3
  831. package/frontend/dist/js/{ArtifactSlideOutPanel-Cl8JG7bz.js → ArtifactSlideOutPanel-CfqHPFdE.js} +1 -1
  832. package/frontend/dist/js/{Button-CTXHujOd.js → Button-BV44cTnj.js} +1 -1
  833. package/frontend/dist/js/ChatPage-DIkAXZWA.js +23 -0
  834. package/frontend/dist/js/{FirstTimeSetup-kHhRzGJ8.js → FirstTimeSetup-B8phXGNA.js} +1 -1
  835. package/frontend/dist/js/GalleryPage-W4uI043I.js +1 -0
  836. package/frontend/dist/js/{HomePage-C1L8WAXL.js → HomePage-DlxehbyO.js} +1 -1
  837. package/frontend/dist/js/{LibreClawPage-Dyua8IUu.js → LibreClawPage-CgD0_G_F.js} +1 -1
  838. package/frontend/dist/js/{ModelManagerModals-CuMRGUd-.js → ModelManagerModals-D7jIT3v1.js} +1 -1
  839. package/frontend/dist/js/{ModelSelector-CqHc-Ln4.js → ModelSelector-BYxJU1UV.js} +1 -1
  840. package/frontend/dist/js/ModelsPage-C4XdCKP5.js +2 -0
  841. package/frontend/dist/js/NotesPage-CDECOl4V.js +1 -0
  842. package/frontend/dist/js/{OptimizedSyntaxHighlighter-CWYUn9Oe.js → OptimizedSyntaxHighlighter-XwqZEoTf.js} +1 -1
  843. package/frontend/dist/js/{PersonasPage-D_6WBCH5.js → PersonasPage-CjSLPrgS.js} +2 -2
  844. package/frontend/dist/js/PluginUsagePage-DJOXJuH4.js +1 -0
  845. package/frontend/dist/js/RichMessageContent-Debeh6bi.js +3 -0
  846. package/frontend/dist/js/SettingsModal-cUqAeYUP.js +1 -0
  847. package/frontend/dist/js/{SettingsToggle-DLHlCDBl.js → SettingsToggle-WTa0rgvY.js} +1 -1
  848. package/frontend/dist/js/{SystemPage-BMWEet9e.js → SystemPage-DxPw0GS7.js} +1 -1
  849. package/frontend/dist/js/UserManagementPage-CEdYFe_Z.js +1 -0
  850. package/frontend/dist/js/WorkPage-DDVeuG_9.js +6 -0
  851. package/frontend/dist/js/api-IzobHGND.js +14 -0
  852. package/frontend/dist/js/appStore-DKwC2vgn.js +2 -0
  853. package/frontend/dist/js/ar-xTSvTq05.js +2 -0
  854. package/frontend/dist/js/authStore-OaTuapL7.js +4 -0
  855. package/frontend/dist/js/{babel-CmENXdZw.js → babel-D24oDI9y.js} +1 -1
  856. package/frontend/dist/js/bn-iYAsohEA.js +2 -0
  857. package/frontend/dist/js/chatStore-DXGUVLXD.js +3 -0
  858. package/frontend/dist/js/{config-DkV1ka7I.js → config-DPEEuTAe.js} +1 -1
  859. package/frontend/dist/js/cs-YBHN88Hb.js +2 -0
  860. package/frontend/dist/js/da-D7qlLy_k.js +2 -0
  861. package/frontend/dist/js/de-DV671k2c.js +2 -0
  862. package/frontend/dist/js/es-kyBgzNq-.js +2 -0
  863. package/frontend/dist/js/{estree-D5KP-qbw.js → estree-ChwJsD2w.js} +1 -1
  864. package/frontend/dist/js/fr-Cw1vut7I.js +2 -0
  865. package/frontend/dist/js/hi-DWEFC024.js +2 -0
  866. package/frontend/dist/js/{html-Cm9c2akd.js → html-DFrVjciF.js} +1 -1
  867. package/frontend/dist/js/id-DlMHjjy0.js +2 -0
  868. package/frontend/dist/js/is-B9E_a7dG.js +2 -0
  869. package/frontend/dist/js/it-DawmVbLC.js +2 -0
  870. package/frontend/dist/js/ja-DmVvwY3W.js +2 -0
  871. package/frontend/dist/js/ko-DzOPpkVs.js +2 -0
  872. package/frontend/dist/js/{markdown-B2u7CnKN.js → markdown-FLLx7b67.js} +1 -1
  873. package/frontend/dist/js/markdown-core-BmPPZiuD.js +31 -0
  874. package/frontend/dist/js/{markdown-math-B7FlYsmr.js → markdown-math-mH7AZ_mb.js} +6 -6
  875. package/frontend/dist/js/{messageCodeStyles-DalG2j6U.js → messageCodeStyles-CBkkZY4n.js} +1 -1
  876. package/frontend/dist/js/ms-DpsaOPht.js +2 -0
  877. package/frontend/dist/js/nl-B1d8W22n.js +2 -0
  878. package/frontend/dist/js/pl-nCncRVgt.js +2 -0
  879. package/frontend/dist/js/{postcss-B5WIGhAY.js → postcss-Bx9CTcIc.js} +1 -1
  880. package/frontend/dist/js/pt-DHw8fGuu.js +2 -0
  881. package/frontend/dist/js/{react-vendor-DPNXrO-8.js → react-vendor-C5yShNlM.js} +1 -1
  882. package/frontend/dist/js/{router-vendor-Ca9zqOqT.js → router-vendor-CbPDks39.js} +1 -1
  883. package/frontend/dist/js/ru-Derl_YP_.js +2 -0
  884. package/frontend/dist/js/{standalone-Dwm1daef.js → standalone-i8-5bg5p.js} +1 -1
  885. package/frontend/dist/js/sv-pJAfBVo0.js +2 -0
  886. package/frontend/dist/js/{syntax-highlight-Ca9bHsaz.js → syntax-highlight-3EEX6CGL.js} +3 -3
  887. package/frontend/dist/js/th-C_7fIGnk.js +2 -0
  888. package/frontend/dist/js/tr-CPqsJvaP.js +2 -0
  889. package/frontend/dist/js/{typescript-CwieSptM.js → typescript-CQ3x-Uni.js} +1 -1
  890. package/frontend/dist/js/{ui-BnDZpjfc.js → ui-BHhR3Vok.js} +2 -2
  891. package/frontend/dist/js/ui-vendor-D3Ahl1x5.js +177 -0
  892. package/frontend/dist/js/uk-3o8P_kFi.js +2 -0
  893. package/frontend/dist/js/{useTranslation-CXY69qNk.js → useTranslation-C3ei3mJq.js} +1 -1
  894. package/frontend/dist/js/{utils-BM0_0iFj.js → utils-CuC1beTY.js} +1 -1
  895. package/frontend/dist/js/{utils-vendor-1zob7nK9.js → utils-vendor-BBa8OxtB.js} +1 -1
  896. package/frontend/dist/js/vi-Dv6N7OVD.js +2 -0
  897. package/frontend/dist/js/{workApi-BOS7crs9.js → workApi-Czu69yWS.js} +2 -2
  898. package/frontend/dist/js/{yaml-QD4znPfZ.js → yaml-DioTxVLA.js} +1 -1
  899. package/frontend/dist/js/zh-qg5iqtPi.js +2 -0
  900. package/package.json +16 -5
  901. package/plugins/huggingface.json +12 -3
  902. package/plugins/llama-cpp.json +18 -6
  903. package/plugins/longcat-audiodit.json +114 -0
  904. package/plugins/openai.json +18 -0
  905. package/frontend/dist/assets/index-BBpNbfKW.js +0 -16
  906. package/frontend/dist/assets/index-BLATyFmD.css +0 -1
  907. package/frontend/dist/js/ChatPage-BBayfMLS.js +0 -16
  908. package/frontend/dist/js/GalleryPage-By8VI39Q.js +0 -1
  909. package/frontend/dist/js/ModelsPage-ODeXhDDk.js +0 -2
  910. package/frontend/dist/js/NotesPage-CApzDjOq.js +0 -1
  911. package/frontend/dist/js/PluginUsagePage-kutS6SOd.js +0 -1
  912. package/frontend/dist/js/RichMessageContent-g6WT75Te.js +0 -3
  913. package/frontend/dist/js/SettingsModal-B7z51BCx.js +0 -1
  914. package/frontend/dist/js/UserManagementPage-D08lM51c.js +0 -1
  915. package/frontend/dist/js/WorkPage-DdVLefsK.js +0 -6
  916. package/frontend/dist/js/api-CLEmGcEh.js +0 -14
  917. package/frontend/dist/js/appStore-CGdhvp9P.js +0 -2
  918. package/frontend/dist/js/ar-BTmB2WVm.js +0 -2
  919. package/frontend/dist/js/authStore-Dh3beEOq.js +0 -4
  920. package/frontend/dist/js/bn-CQnH7YVT.js +0 -2
  921. package/frontend/dist/js/chatStore-CDeYWL_q.js +0 -3
  922. package/frontend/dist/js/cs-oTTZkQXr.js +0 -2
  923. package/frontend/dist/js/da-Br0gB6J6.js +0 -2
  924. package/frontend/dist/js/de-DE2iztTF.js +0 -2
  925. package/frontend/dist/js/es-DgthfVtl.js +0 -2
  926. package/frontend/dist/js/fr-BjxjFwPh.js +0 -2
  927. package/frontend/dist/js/hi-D1q7E-9N.js +0 -2
  928. package/frontend/dist/js/id-CDJZqLTF.js +0 -2
  929. package/frontend/dist/js/is-BU7Um_Tq.js +0 -2
  930. package/frontend/dist/js/it-CdAxr8P_.js +0 -2
  931. package/frontend/dist/js/ja-BLbQwz9u.js +0 -2
  932. package/frontend/dist/js/ko-CY5lpkAe.js +0 -2
  933. package/frontend/dist/js/markdown-core-DHnR5Hw8.js +0 -16
  934. package/frontend/dist/js/ms-tQ8AYXEQ.js +0 -2
  935. package/frontend/dist/js/nl-CRNi2oWT.js +0 -2
  936. package/frontend/dist/js/pl-CWtFRS_W.js +0 -2
  937. package/frontend/dist/js/pt-C7SPoLF8.js +0 -2
  938. package/frontend/dist/js/ru-Dz4AX8xc.js +0 -2
  939. package/frontend/dist/js/sv-ETy5-boa.js +0 -2
  940. package/frontend/dist/js/th-DpuMqvxU.js +0 -2
  941. package/frontend/dist/js/tr-C-1AYAqg.js +0 -2
  942. package/frontend/dist/js/ui-vendor-xUzKqAXI.js +0 -177
  943. package/frontend/dist/js/uk-CyS680gr.js +0 -2
  944. package/frontend/dist/js/vi-BG8HuiTz.js +0 -2
  945. package/frontend/dist/js/zh-NCs2mkHj.js +0 -2
@@ -0,0 +1,2 @@
1
+ var e={common:{loading:`Đang tải...`,save:`Lưu`,saving:`Đang lưu...`,cancel:`Hủy`,delete:`Xóa`,edit:`Chỉnh sửa`,close:`Đóng`,back:`Quay lại`,next:`Tiếp theo`,confirm:`Xác nhận`,error:`Lỗi`,success:`Thành công`,warning:`Cảnh báo`,or:`hoặc`,optional:`tùy chọn`,enabled:`Đã bật`,disabled:`Đã tắt`,on:`Bật`,off:`Tắt`,yes:`Có`,no:`Không`,search:`Tìm kiếm`,noResults:`Không tìm thấy kết quả`,retry:`Thử lại`,refresh:`Làm mới`,download:`Tải xuống`,upload:`Tải lên`,export:`Xuất`,import:`Nhập`,reset:`Đặt lại`,apply:`Áp dụng`,clear:`Xóa`,all:`Tất cả`,none:`Không có`,default:`Mặc định`,custom:`Tùy chỉnh`,remove:`Xóa`,home:`Trang chủ`,more:`Nhiều`},brand:{name:`Libre WebUI`,shortName:`Libre`},auth:{login:{title:`Chào mừng trở lại`,subtitle:`Đăng nhập vào tài khoản của bạn để tiếp tục`,username:`Tên người dùng`,usernamePlaceholder:`Nhập tên người dùng`,password:`Mật khẩu`,passwordPlaceholder:`Nhập mật khẩu`,signIn:`Đăng nhập`,signingIn:`Đang đăng nhập...`,noAccount:`Chưa có tài khoản?`,signUpHere:`Đăng ký tại đây`,loginSuccess:`Đăng nhập thành công!`,loginFailed:`Đăng nhập thất bại`,checkCredentials:`Đăng nhập thất bại. Vui lòng kiểm tra thông tin đăng nhập.`,enterBoth:`Vui lòng nhập cả tên người dùng và mật khẩu`,githubSuccess:`Đăng nhập GitHub thành công!`,githubFailed:`Xác thực GitHub thất bại`,githubVerifyFailed:`Không thể xác minh xác thực GitHub`,approvalPending:`Tài khoản của bạn đang chờ quản trị viên phê duyệt.`,verificationFailed:`Xác minh bảo mật thất bại. Hãy tải lại trang và thử lại.`},signup:{title:`Tạo tài khoản`,subtitle:`Đăng ký tài khoản mới`,username:`Tên người dùng`,usernamePlaceholder:`Chọn tên người dùng`,email:`Email`,emailPlaceholder:`email@example.com`,password:`Mật khẩu`,passwordPlaceholder:`Chọn mật khẩu`,confirmPassword:`Xác nhận mật khẩu`,confirmPasswordPlaceholder:`Xác nhận mật khẩu của bạn`,createAccount:`Tạo tài khoản`,creatingAccount:`Đang tạo tài khoản...`,hasAccount:`Đã có tài khoản?`,signInHere:`Đăng nhập tại đây`,signupSuccess:`Tạo tài khoản thành công!`,signupFailed:`Đăng ký thất bại`,tryAgain:`Đăng ký thất bại. Vui lòng thử lại.`,usernameRequired:`Tên người dùng và mật khẩu là bắt buộc`,passwordMismatch:`Mật khẩu không khớp`,passwordTooShort:`Mật khẩu phải có ít nhất 6 ký tự`,approvalPending:`Đã nhận đăng ký. Quản trị viên phải phê duyệt tài khoản của bạn.`,awaitingApproval:`Đang chờ phê duyệt`,awaitingApprovalDescription:`Tài khoản của bạn đã được tạo, nhưng quản trị viên phải kích hoạt nó trước khi bạn có thể đăng nhập.`,backToSignIn:`Quay lại đăng nhập`},logout:{button:`Đăng xuất`,success:`Đăng xuất thành công`},oauth:{continueWith:`Tiếp tục với {{provider}}`,connectingTo:`Đang kết nối đến {{provider}}...`,github:`GitHub`,huggingFace:`Hugging Face`},checkingAuth:`Đang kiểm tra xác thực...`,welcome:`Chào mừng`,noEmail:`Chưa cung cấp email`,role:`Vai trò`,id:`ID`,userId:`ID người dùng`,signInDescription:`Đăng nhập bằng tài khoản GitHub để tiếp tục`,signInWithGitHub:`Đăng nhập bằng GitHub`,jwtActive:`Xác thực JWT đang hoạt động`,jwtDescription:`Xác thực dựa trên JWT với GitHub OAuth`,github:`GitHub`,provider:`Nhà cung cấp`,tagline:`Ngăn xếp AI của bạn nên trả lời bạn.`,selfHosted:`Tự lưu trữ · Apache 2.0`,highlights:{local:{title:`Ưu tiên cục bộ`,body:`Các cuộc trò chuyện và tệp của bạn vẫn nằm trên máy bạn đang chạy ứng dụng này.`},providers:{title:`Bất kỳ nhà cung cấp nào`,body:`Mô hình cục bộ thông qua Ollama, cộng với các nhà cung cấp từ xa mà bạn chọn thêm.`},work:{title:`Công việc cô lập`,body:`Cấp cho mô hình một không gian làm việc sandbox với tệp, terminal và bản xem trước.`}}},setup:{welcome:{title:`Chào mừng đến với Libre WebUI`,subtitle:`Hãy bắt đầu`,description:`Thiết lập phiên bản Libre WebUI của bạn chỉ trong vài bước`,createAdmin:`Tạo tài khoản quản trị`,features:{secure:{title:`An toàn & Riêng tư`,description:`Cuộc trò chuyện của bạn được lưu trên thiết bị của bạn`},fast:{title:`Nhanh & Phản hồi tốt`,description:`Tối ưu hóa cho tốc độ và hiệu suất`},openSource:{title:`Mã nguồn mở`,description:`Phần mềm miễn phí và mã nguồn mở`}}},admin:{title:`Tạo tài khoản quản trị`,subtitle:`Thiết lập quản trị viên`,description:`Tạo tài khoản quản trị đầu tiên cho phiên bản Libre WebUI của bạn`,usernamePlaceholder:`Nhập tên người dùng quản trị`,passwordPlaceholder:`Nhập mật khẩu (tối thiểu 6 ký tự)`,confirmPlaceholder:`Xác nhận mật khẩu của bạn`,creating:`Đang tạo...`,createAdmin:`Tạo quản trị viên`,success:`Tạo tài khoản quản trị thành công!`,failed:`Không thể tạo tài khoản quản trị`,fillAllFields:`Vui lòng điền tất cả các trường`,note:`Đây sẽ là tài khoản quản trị chính cho phiên bản Libre WebUI của bạn`,approvalUnexpected:`Không thể kích hoạt quản trị viên ban đầu. Vui lòng thử lại.`},encryptionKey:{title:`Lưu khóa mã hóa của bạn`,subtitle:`Quan trọng: Lưu khóa này`,description:`Khóa mã hóa này bảo vệ dữ liệu nhạy cảm của bạn. Lưu trữ nó một cách an toàn - bạn sẽ cần nó nếu bạn cần khôi phục cơ sở dữ liệu.`,warning:`Cảnh báo`,warningText:`Nếu bạn mất khóa này và cần khôi phục cơ sở dữ liệu, dữ liệu được mã hóa của bạn (khóa API, tùy chọn) sẽ không thể khôi phục.`,label:`Khóa mã hóa của bạn`,loading:`Đang tải...`,copyToClipboard:`Sao chép vào clipboard`,copied:`Đã sao chép khóa mã hóa vào clipboard!`,copyFailed:`Không thể sao chép khóa vào clipboard`,envNote:`Khóa này cũng được lưu trong tệp backend/.env của bạn dưới dạng ENCRYPTION_KEY`,acknowledgment:`Tôi đã lưu khóa mã hóa của tôi ở nơi an toàn và hiểu rằng việc mất nó có thể dẫn đến mất dữ liệu.`,confirmRequired:`Vui lòng xác nhận rằng bạn đã lưu khóa mã hóa`,continue:`Tiếp tục đến Libre WebUI`}},chat:{greeting:{morning:`Chào buổi sáng`,afternoon:`Chào buổi chiều`,evening:`Chào buổi tối`,night:`Chúc ngủ ngon`},followUp:`Tiếp tục`,welcome:{helpToday:`Tôi có thể giúp gì cho bạn hôm nay?`,helpTonight:`Tôi có thể giúp gì cho bạn tối nay?`,variety:{create:{title:`Chúng ta sẽ tạo gì đây?`,subtitle:`Bắt đầu từ một ý nghĩ, bản phác thảo hay bài toán mãi chưa gỡ được.`},explore:{title:`Ta nên bắt đầu từ đâu?`,subtitle:`Hãy mang đến câu hỏi bạn vẫn luôn trăn trở.`},imagine:{title:`Bạn đang hình dung điều gì?`,subtitle:`Chúng ta có thể cùng nhau tạo hình cho nó.`},focus:{title:`Điều gì đáng để bạn tập trung?`,subtitle:`Hãy làm rõ bước tiếp theo.`},untangle:{title:`Điều gì đang rối?`,subtitle:`Cứ cho tôi xem phiên bản lộn xộn trước.`},momentum:{title:`Khi bạn sẵn sàng, ta bắt đầu.`,subtitle:`Tiếp tục một ý tưởng, kế hoạch hay mạch suy nghĩ còn dang dở.`},open:{title:`Bạn đang nghĩ gì?`,subtitle:`Một ý nghĩ nhỏ hay dự án đầy tham vọng đều được.`},challenge:{title:`Chúng ta cần giải quyết gì?`,subtitle:`Hãy cho tôi biết điều gì vẫn chưa ổn.`},draft:{title:`Hãy bắt đầu từ đâu đó.`,subtitle:`Chưa cần phải trau chuốt.`},possibility:{title:`Điều này có thể trở thành gì?`,subtitle:`Cho tôi xem những nguyên liệu thô.`},unexpected:{title:`Hãy tạo một điều bất ngờ.`,subtitle:`Cho tôi một giới hạn, một tâm trạng hay ý tưởng còn dang dở.`}}},input:{placeholder:`Gửi tin nhắn`,messagePlaceholder:`Tin nhắn...`,attachImages:`Đính kèm hình ảnh`,attachments:`Tệp đính kèm và tính năng nâng cao`,sendMessage:`Gửi tin nhắn`,stopGeneration:`Dừng tạo`,menu:{uploadImages:`Tải ảnh lên`,attachDocument:`Đính kèm tài liệu`,attachWebpage:`Đính kèm trang web`,structuredOutput:`Đầu ra có cấu trúc`,attach:`Đính kèm`,documentAttached:`Đã đính kèm tài liệu`,webpageAttached:`Đã đính kèm trang web`,attachFailed:`Không thể đính kèm`,attachKnowledge:`Đính kèm kiến thức`,noCollections:`Chưa có bộ sưu tập nào — tạo trong Cài đặt → Tài liệu`},voiceInput:`Nhập bằng giọng nói`,voiceStop:`Dừng nghe`,transcriptionSource:`Nguồn nhận dạng giọng nói`,browserSpeech:`Dịch vụ nhận dạng giọng nói của trình duyệt`,providerTranscriptionDisclosure:`Ghi âm và gửi âm thanh đến {{provider}} để chuyển thành văn bản`,webSearchOn:`Tìm kiếm web đang bật — trả lời dùng kết quả trực tiếp`,webSearchOff:`Tìm trên web cho tin nhắn này`},session:{new:`Cuộc trò chuyện mới`,work:`Công việc`,chat:`Trò chuyện`,private:`Riêng tư`,privateMode:`Chế độ riêng tư`,privateDescription:`Cuộc trò chuyện này sẽ không được lưu`,privateTooltip:`Bắt đầu cuộc trò chuyện riêng tư sẽ không được lưu`,deleteConfirm:`Bạn có chắc chắn muốn xóa cuộc trò chuyện này?`,generatingTitle:`Đang tạo tiêu đề`,noChats:`Chưa có cuộc trò chuyện nào`,createFirst:`Tạo cuộc trò chuyện đầu tiên của bạn ở trên`,chats:`Cuộc trò chuyện`,renameChat:`Đổi tên cuộc trò chuyện`,openNewTab:`Mở trong thẻ mới`,pinChat:`Ghim`,unpinChat:`Bỏ ghim`,deleteChat:`Xóa cuộc trò chuyện`,incognito:`Trò chuyện ẩn danh`,archiveChat:`Lưu trữ cuộc trò chuyện`,groups:{pinned:`Đã ghim`,today:`Hôm nay`,yesterday:`Hôm qua`,previous7Days:`7 ngày qua`,previous30Days:`30 ngày qua`,older:`Cũ hơn`},folder:{new:`Thư mục mới`,namePlaceholder:`Tên thư mục`,move:`Chuyển vào thư mục`,remove:`Gỡ khỏi thư mục`,delete:`Xóa thư mục`,deleteConfirm:`Xóa thư mục này? Các cuộc trò chuyện bên trong vẫn giữ nguyên.`}},persona:{applied:`Đã áp dụng persona`,label:`Persona`,loadFailed:`Không tải được chi tiết persona`,removeFailed:`Không thể xóa persona`},model:{updated:`Đã cập nhật mô hình`,noModels:`Không có mô hình nào`,noModelsDescription:`Không có mô hình nào. Hãy đảm bảo Ollama đang chạy và đã cài đặt các mô hình.`,pullCommand:`ollama pull llama3.2:3b`,noModelsTooltip:`Không có mô hình nào. Vui lòng đảm bảo Ollama đang chạy và các mô hình đã được cài đặt.`,selectBeforePrivateChat:`Chọn một mô hình khả dụng trước khi bắt đầu trò chuyện riêng tư`,selectBeforeSending:`Chọn một mô hình khả dụng trước khi gửi`},footer:{disclaimer:`LLM có thể mắc lỗi - hãy xác minh thông tin quan trọng`,images:`{{count}} hình ảnh`,images_plural:`{{count}} hình ảnh`,structuredOutput:`Đầu ra có cấu trúc`},mediaUpload:{dropImagesHere:`Thả hình ảnh vào đây hoặc`,supportedFormats:`Hỗ trợ: JPG, PNG, GIF, WebP (tối đa 10MB mỗi file)`,browse:`duyệt`},structuredOutput:{title:`Định dạng phản hồi`,none:`Không có (Ngôn ngữ tự nhiên)`,noneDescription:`Phản hồi ngôn ngữ tự nhiên mặc định`,json:`JSON`,jsonDescription:`Định dạng JSON có cấu trúc`,list:`Danh sách`,listDescription:`Mảng các mục`,summary:`Tóm tắt`,summaryDescription:`Tóm tắt tài liệu với các điểm chính`,analysis:`Phân tích`,analysisDescription:`Phân tích có cấu trúc với ưu/nhược điểm`,custom:`Schema tùy chỉnh`,customDescription:`Định nghĩa JSON schema của riêng bạn`,customSchema:`JSON schema tùy chỉnh`,schemaPreview:`Xem trước Schema`,applySchema:`Áp dụng Schema`,cancel:`Hủy`,enabled:`Đã bật đầu ra có cấu trúc`},controls:{title:`Điều khiển trò chuyện`,systemPrompt:`Prompt hệ thống`,systemPromptPlaceholder:`Hướng dẫn chỉ áp dụng cho cuộc trò chuyện này…`,advancedParams:`Tham số nâng cao`,advancedParamsDescription:`Ghi đè cho cuộc trò chuyện này. Ô trống dùng giá trị mặc định chung.`,fromModel:`từ mô hình`,fromModelHint:`Giá trị này đến từ cài đặt do chính mô hình đề xuất.`,contextCapped:`Ngữ cảnh giới hạn ở {{context}} trong {{trained}} mà mô hình được huấn luyện, để vẫn tải được.`,saved:`Đã lưu điều khiển`,saveFailed:`Không thể lưu điều khiển`,params:{temperature:`Nhiệt độ`,topP:`Top P`,topK:`Top K`,minP:`Min P`,maxTokens:`Số token tối đa`,repeatPenalty:`Phạt lặp lại`,seed:`Seed`,contextLength:`Độ dài ngữ cảnh`}},message:{sources:`Nguồn`},toasts:{chatCreated:`Đã tạo cuộc trò chuyện mới`,createFailed:`Không tạo được phiên`,loadFailed:`Không tải được phiên`,chatDeleted:`Đã xóa cuộc trò chuyện`,deleteFailed:`Không xóa được cuộc trò chuyện`,deleteSessionFailed:`Không xóa được phiên`,historyCleared:`Đã xóa toàn bộ lịch sử trò chuyện`,historyClearFailed:`Không xóa được lịch sử trò chuyện`,titleUpdated:`Đã cập nhật tiêu đề cuộc trò chuyện`,updateFailed:`Không cập nhật được phiên`,noValidSession:`Không có phiên trò chuyện hợp lệ. Vui lòng tạo hoặc chọn cuộc trò chuyện.`,sessionNotFound:`Không tìm thấy phiên hoặc phiên không hợp lệ. Vui lòng chọn hoặc tạo phiên trò chuyện hợp lệ.`,noModelProvider:`Không có nhà cung cấp mô hình nào khả dụng`,modelUnavailable:`Mô hình đã chọn "{{model}}" không khả dụng từ {{provider}}. Hãy kích hoạt lại nhà cung cấp đó hoặc chọn mô hình khác.`,modelSwitched:`Đã chuyển sang {{model}} (mô hình trước không còn khả dụng)`,modelsLoadFailed:`Không tải được mô hình`,modelUpdated:`Đã cập nhật mô hình cho cuộc trò chuyện hiện tại`,modelUpdateFailed:`Không cập nhật được mô hình của phiên`},documents:{title:`Tài liệu trong ngữ cảnh`}},sidebar:{navigation:{chat:`Trò chuyện`,models:`Mô hình`,personas:`Personas`,imagine:`Tưởng tượng`,settings:`Cài đặt`,userManagement:`Quản lý người dùng`,signOut:`Đăng xuất`,agents:`Tác nhân`,work:`Công việc`,exploreLabel:`Khám phá`,usageAnalytics:`Mức sử dụng nhà cung cấp`,system:`Hệ thống`,notes:`Ghi chú`},toggleSize:`Chuyển đổi kích thước thanh bên`,expandSidebar:`Mở rộng thanh bên`},user:{menu:{changePicture:`Đổi ảnh đại diện`,settings:`Cài đặt`,userManagement:`Quản lý người dùng`,logout:`Đăng xuất`,usageAnalytics:`Mức sử dụng nhà cung cấp`,system:`Hệ thống`},avatar:{title:`Đổi ảnh hồ sơ`,updated:`Đã cập nhật ảnh hồ sơ`,updateFailed:`Không thể cập nhật ảnh hồ sơ`,saving:`Đang lưu...`,label:`Ảnh đại diện`,uploadAvatarImage:`Tải lên ảnh đại diện`,dragAndDrop:`Kéo và thả ảnh hoặc nhấp để duyệt`,chooseImage:`Chọn ảnh`,uploading:`Đang tải lên...`,enterImageUrl:`Hoặc nhập URL ảnh`,supportedFormats:`Hỗ trợ: JPG, PNG, GIF, WebP (tối đa 2MB). Ảnh vuông hoạt động tốt nhất.`,customAvatar:`Ảnh đại diện tùy chỉnh`,clickToChange:`Nhấp để thay đổi hoặc xóa`,removed:`Đã xóa ảnh đại diện`,uploaded:`Tải lên ảnh đại diện thành công`,invalidFile:`Vui lòng chọn tệp ảnh hợp lệ`,fileTooLarge:`Kích thước ảnh đại diện phải nhỏ hơn 2MB`,readFailed:`Không thể đọc tệp ảnh`,uploadFailed:`Không thể tải lên ảnh đại diện`},profile:{noEmail:`Chưa cung cấp email`}},settings:JSON.parse(`{"title":"Cài đặt","tabs":{"appearance":"Giao diện","model":"Mô hình","systemMessage":"Tin nhắn hệ thống","plugins":"Plugin","search":"Tìm kiếm","generation":"Tạo nội dung","documents":"Tài liệu","tts":"Giọng nói","imageGen":"Hình ảnh","data":"Dữ liệu","shortcuts":"Phím tắt","about":"Giới thiệu"},"appearance":{"title":"Giao diện","language":{"title":"Ngôn ngữ","description":"Chọn ngôn ngữ ưa thích của bạn"},"theme":{"title":"Chủ đề","light":"Sáng","dark":"Tối","amoled":"Đen Thuần","system":"Hệ thống"},"accent":{"title":"Màu nhấn","custom":"Màu tùy chỉnh","useColor":"Dùng {{color}} làm màu nhấn","behaviorTitle":"Bảng màu giao diện","behaviorDescription":"Chọn chỉ dùng màu nhấn cho các điều khiển hoặc áp dụng cho toàn bộ giao diện sáng hay tối.","defaultStyle":"Mặc định","defaultStyleDescription":"Giữ các bề mặt trung tính của giao diện sáng và tối.","adaptedStyle":"Thích ứng với màu nhấn","adaptedStyleDescription":"Nhuộm bề mặt, đường viền và văn bản bằng màu nhấn."},"chatInterface":{"title":"Giao diện trò chuyện","showUsername":"Hiển thị tên người dùng","showUsernameDescription":"Hiển thị tên người dùng trong tin nhắn trò chuyện","followUpSuggestions":"Gợi ý tiếp theo","followUpSuggestionsDescription":"Gợi ý câu trả lời nhanh sau mỗi phản hồi","hapticFeedback":"Phản hồi xúc giác (Android)","hapticFeedbackDescription":"Dùng rung nhẹ cho các thao tác quan trọng trên thiết bị di động"},"background":{"title":"Hình nền","enable":"Bật hình nền","enableDescription":"Hiển thị hình nền tùy chỉnh với hiệu ứng mờ","blur":"Độ mờ","opacity":"Độ trong suốt","upload":"Tải lên hình nền","dragDrop":"Kéo và thả hình ảnh hoặc nhấp để duyệt","chooseImage":"Chọn hình ảnh"}},"saveSettings":"Lưu cài đặt","model":{"title":"Cài đặt mô hình","defaultModel":"Mô hình mặc định","defaultModelDescription":"Mô hình này sẽ được sử dụng mặc định cho các cuộc trò chuyện mới","selectModel":"Chọn mô hình","updateAll":"Cập nhật tất cả mô hình","updateAllDescription":"Kiểm tra cập nhật và tải phiên bản mới nhất của tất cả mô hình đã cài đặt","updateAllButton":"Cập nhật tất cả","updating":"Đang cập nhật mô hình...","currentModelInfo":"Thông tin mô hình hiện tại","name":"Tên","size":"Kích thước","family":"Họ","format":"Định dạng","status":"Trạng thái","statusStarting":"Đang khởi động...","statusComplete":"Hoàn tất","statusError":"Lỗi","bulkOperations":"Thao tác hàng loạt","autoTitle":{"title":"Tự động tạo tiêu đề","enable":"Bật tự động tạo tiêu đề","enableDescription":"Tự động tạo tiêu đề cho các cuộc trò chuyện mới","taskModel":"Mô hình tác vụ","selectTaskModel":"Chọn mô hình tác vụ","taskModelDescription":"Mô hình được sử dụng để tạo tiêu đề cuộc trò chuyện"},"persona":"Persona","updatingModel":"Đang cập nhật {{name}} ({{current}}/{{total}})","modelsProgress":"{{current}} trong {{total}} mô hình","specializedModels":"Mô hình chuyên biệt","visionModel":"Mô hình thị giác","selectVisionModel":"Sử dụng mô hình trò chuyện hiện tại","visionModelDescription":"Được sử dụng tự động bất cứ khi nào ngữ cảnh trò chuyện gửi đi có chứa hình ảnh. Chọn một mô hình hỗ trợ đầu vào hình ảnh.","visionModelUpdateFailed":"Không thể cập nhật mô hình thị giác: {{error}}","visionModelNoProvider":"Mô hình thị giác này không có thông tin nhà cung cấp. Hãy chọn một mô hình khả dụng."},"systemMessage":{"title":"Tin nhắn hệ thống","description":"Đặt tin nhắn hệ thống tùy chỉnh sẽ được sử dụng cho tất cả cuộc trò chuyện mới.","placeholder":"Nhập tin nhắn hệ thống...","saved":"Đã lưu tin nhắn hệ thống","saveFailed":"Không thể lưu tin nhắn hệ thống"},"plugins":{"title":"Plugin","description":"Quản lý các plugin đã cài đặt của bạn","addNew":"Thêm plugin mới","upload":"Tải lên plugin","addJson":"Thêm JSON","uploading":"Đang tải lên...","jsonPlaceholder":"Dán cấu hình JSON của plugin...","install":"Cài đặt plugin","noPlugins":"Chưa có plugin nào được cài đặt","noPluginsDescription":"Thêm plugin để mở rộng chức năng","loading":"Đang tải plugin...","installed":"Plugin đã cài đặt","active":"Plugin đang hoạt động","activeLabel":"Đang hoạt động","inactive":"Không hoạt động","activate":"Kích hoạt","deactivate":"Vô hiệu hóa","models":"mô hình","apiKeySet":"Đã đặt khóa API","apiKeyConfiguration":"Cấu hình khóa API","apiKeyEnvAlternative":"Hoặc, đặt biến","environmentVariable":"biến môi trường","apiKeyConfigured":"Đã cấu hình khóa API","apiKeyPlaceholder":"Nhập khóa API của bạn...","saveApiKey":"Lưu khóa API","apiKey":{"title":"Khóa API","placeholder":"Nhập khóa API","save":"Lưu khóa","remove":"Xóa khóa","configured":"Đã cấu hình khóa API","notConfigured":"Cần khóa API","saved":"Đã lưu khóa API thành công","removed":"Đã xóa khóa API","saveFailed":"Không thể lưu khóa API","removeFailed":"Không thể xóa khóa API","enterKey":"Vui lòng nhập khóa API"},"variables":"Variables","providerConnections":"Kết nối nhà cung cấp","providerConnectionsDescription":"Kết nối, cấu hình và kiểm tra các nhà cung cấp mô hình thông qua plugin.","providers":"Nhà cung cấp","searchProviders":"Tìm kiếm nhà cung cấp","noProvidersFound":"Không có nhà cung cấp nào khớp với tìm kiếm của bạn.","selectProvider":"Chọn một nhà cung cấp","selectProviderDescription":"Chọn một nhà cung cấp để kiểm tra kết nối và danh mục mô hình của nó.","apiKeyDescription":"Lưu trữ khóa API cá nhân cho {{name}}.","showApiKey":"Hiển thị khóa API","hideApiKey":"Ẩn khóa API","configure":"Cấu hình","providerSettings":"Cài đặt nhà cung cấp","status":"Trạng thái","defaultEndpoint":"Điểm cuối mặc định","modelCatalog":"Danh mục mô hình","modelCatalogDescription":"Các mô hình đã phát hiện và cấu hình cho nhà cung cấp này cùng khả năng của chúng.","refreshModels":"Làm mới mô hình","noModelsConfigured":"Không có mô hình nào được cấu hình cho nhà cung cấp này.","modelId":"ID mô hình","capabilities":"Khả năng","modelCatalogUpdated":"Danh mục mô hình đã cập nhật: {{count}} mô hình.","modelCatalogUnchanged":"Danh mục mô hình đã được cập nhật.","modelCatalogNeedsApiKey":"Thêm API key hợp lệ cho nhà cung cấp này để tải danh sách mô hình trực tiếp của nó.","modelCatalogUnavailable":"Không thể tải danh sách mô hình của nhà cung cấp.","modelCatalogRefreshFailed":"Không thể làm mới danh mục mô hình","capability":{"chat":"Trò chuyện","embedding":"Embedding","image":"Hình ảnh","speech":"Giọng nói","transcription":"Chuyển ngữ"},"exportPlugin":"Xuất plugin","deletePlugin":"Xóa plugin"},"generation":{"title":"Tùy chọn tạo nội dung","description":"Cấu hình cách AI tạo phản hồi","scopeLabel":"Áp dụng cho","scopeAll":"Tất cả mô hình","scopeModel":"Chỉ {{model}}","scopeAllHint":"Các giá trị mọi mô hình dùng, trừ khi mô hình đó có giá trị riêng.","scopeModelHint":"Chỉ lưu cho mô hình này và được ưu tiên hơn giá trị chung.","coreParameters":"Tham số cốt lõi","temperature":"Nhiệt độ","temperatureDescription":"Kiểm soát tính ngẫu nhiên. Giá trị thấp hơn tập trung hơn, giá trị cao hơn sáng tạo hơn.","topP":"Top P","topPDescription":"Kiểm soát sự đa dạng thông qua lấy mẫu hạt nhân. Giá trị thấp hơn tập trung vào các token có khả năng cao.","topK":"Top K","topKDescription":"Giới hạn lựa chọn token ở K token có khả năng cao nhất. Đặt 0 để vô hiệu hóa.","minP":"Min P","minPDescription":"Ngưỡng xác suất tối thiểu để lựa chọn token.","generationControl":"Kiểm soát tạo nội dung","maxTokens":"Số token tối đa","maxTokensDescription":"Số token tối đa để tạo trong phản hồi.","repeatPenalty":"Hình phạt lặp lại","repeatPenaltyDescription":"Phạt các token lặp lại. Giá trị cao hơn giảm sự lặp lại.","contextLength":"Độ dài ngữ cảnh","contextLengthDescription":"Kích thước cửa sổ ngữ cảnh tối đa cho cuộc trò chuyện.","seed":"Seed","optional":"tùy chọn","random":"Ngẫu nhiên","seedDescription":"Đặt seed cụ thể cho đầu ra có thể tái tạo.","advancedOptions":"Tùy chọn nâng cao","presencePenalty":"Hình phạt hiện diện","presencePenaltyDescription":"Phạt các token xuất hiện trong ngữ cảnh.","frequencyPenalty":"Hình phạt tần suất","frequencyPenaltyDescription":"Phạt các token được sử dụng thường xuyên.","stopSequences":"Chuỗi dừng","commaSeparated":"phân cách bằng dấu phẩy","stopSequencesDescription":"Các token tùy chỉnh sẽ dừng tạo khi gặp phải.","resetDefaults":"Đặt lại mặc định","saveOptions":"Lưu tùy chọn","embeddingSettings":"Cài đặt nhúng","enableEmbeddings":"Bật nhúng tài liệu","advancedSettings":"Cài đặt tạo nâng cao","advancedSettingsDescription":"Lấy mẫu, giới hạn token, ngữ cảnh, hình phạt và chuỗi dừng"},"documents":{"title":"Cài đặt tài liệu","embeddings":{"title":"Nhúng","enable":"Bật nhúng tài liệu","model":"Mô hình nhúng","modelDescription":"Chọn mô hình được sử dụng để nhúng tài liệu","chunkSize":"Kích thước đoạn","chunkSizeInTokens":"(tính bằng token)","chunkSizeDescription":"Kích thước các đoạn văn bản để nhúng","chunkOverlap":"Độ chồng chéo đoạn","chunkOverlapInTokens":"(tính bằng token)","chunkOverlapDescription":"Độ chồng chéo giữa các đoạn liên tiếp","similarityThreshold":"Ngưỡng tương đồng","similarityDescription":"Điểm tương đồng tối thiểu để bao gồm kết quả","status":"Trạng thái nhúng","statusLabel":"Trạng thái","available":"Khả dụng","unavailable":"Không khả dụng","chunksWithEmbeddings":"Đoạn có nhúng","coverage":"Độ phủ","regenerate":"Tạo lại nhúng","regenerating":"Đang tạo lại..."},"collections":{"title":"Bộ sưu tập kiến thức","description":"Nhóm tài liệu thành bộ sưu tập và đính kèm vào bất kỳ cuộc trò chuyện nào.","namePlaceholder":"Tên bộ sưu tập","create":"Tạo","none":"Không có bộ sưu tập","deleteConfirm":"Xóa bộ sưu tập này? Tài liệu bên trong vẫn giữ nguyên.","createFailed":"Không thể tạo bộ sưu tập","deleteFailed":"Không thể xóa bộ sưu tập","assignFailed":"Không thể di chuyển tài liệu"},"library":{"title":"Tài liệu đã tải lên","description":"Tài liệu có thể dùng làm ngữ cảnh trò chuyện. Tài liệu tải lên trong một cuộc trò chuyện chỉ ở lại cuộc đó; tài liệu không thuộc cuộc trò chuyện hay bộ sưu tập nào sẽ tham gia mọi cuộc trò chuyện.","empty":"Chưa có tài liệu nào được tải lên.","chatScope":"Một cuộc trò chuyện","everyChatScope":"Mọi cuộc trò chuyện","deleteConfirm":"Xóa \\"{{name}}\\"? Tài liệu sẽ biến mất khỏi mọi cuộc trò chuyện.","deleteFailed":"Không thể xóa tài liệu"}},"tts":{"title":"Chuyển văn bản thành giọng nói","description":"Cấu hình cài đặt chuyển văn bản thành giọng nói để đọc to tin nhắn","loadingProviders":"Đang tải nhà cung cấp TTS...","noProviders":"Không có nhà cung cấp TTS","noProvidersDescription":"Cấu hình plugin hỗ trợ TTS để bật chuyển văn bản thành giọng nói","enable":"Bật TTS","enableDescription":"Cho phép chuyển văn bản thành giọng nói cho tin nhắn trợ lý","autoPlay":"Tự động phát phản hồi","autoPlayDescription":"Tự động đọc to các tin nhắn trợ lý mới","streamSentences":"Phát tự nhiên theo lô","streamSentencesDescription":"Tạo trước nhiều lô theo cụm từ rồi phát dưới dạng một câu trả lời liền mạch.","voiceConfiguration":"Cấu hình giọng nói","model":"Mô hình TTS","modelDescription":"Chọn mô hình để chuyển văn bản thành giọng nói","voice":"Giọng nói","selectVoice":"Chọn giọng nói","voiceDescription":"Chọn giọng nói để chuyển văn bản thành giọng nói","providerDefaultVoice":"Mô hình này dùng giọng mặc định, trừ khi bạn cung cấp bản ghi tham chiếu khi tạo lời nói.","voiceCloningAvailable":"Có thể sao chép giọng nói","voiceCloningAvailableDescription":"Dùng Hình dung → Âm thanh để tạo lời nói từ bản ghi tham chiếu đã được cho phép và bản chép lời chính xác. Bạn có thể lưu bản tham chiếu làm giọng nói có thể tái sử dụng.","savedVoiceOption":"{{name}} (giọng đã lưu)","savedVoices":"Giọng đã lưu","loadingSavedVoices":"Đang tải giọng đã lưu…","deleteSavedVoice":"Xóa giọng đã lưu {{name}}","deleteSavedVoiceConfirm":"Xóa giọng đã lưu “{{name}}”? Bản ghi tham chiếu và bản chép lời sẽ bị xóa.","savedVoiceDeleted":"Đã xóa giọng lưu","savedVoicePreferenceCleanupFailed":"Đã xóa giọng lưu nhưng không thể đặt lại cài đặt Giọng nói","savedVoiceDeleteFailed":"Không thể xóa giọng đã lưu","speed":"Tốc độ","speedSlow":"0.5x","speedNormal":"1.0x","speedFast":"2.0x","availableProviders":"Nhà cung cấp khả dụng","models":"mô hình","test":"Kiểm tra","testing":"Đang kiểm tra...","stop":"Dừng"},"imageGen":{"title":"Tạo hình ảnh","description":"Cấu hình cài đặt và nhà cung cấp tạo hình ảnh","loadingProviders":"Đang tải nhà cung cấp tạo hình ảnh...","noProviders":"Không có nhà cung cấp tạo hình ảnh","noProvidersDescription":"Cấu hình plugin hỗ trợ tạo hình ảnh","enable":"Bật tạo hình ảnh","enableDescription":"Cho phép tạo hình ảnh AI trong cuộc trò chuyện","configuration":"Cấu hình","model":"Mô hình","modelDescription":"Chọn mô hình để tạo hình ảnh","size":"Kích thước","sizeDescription":"Độ phân giải của hình ảnh được tạo","quality":"Chất lượng","qualityDescription":"Mức chất lượng của hình ảnh được tạo","style":"Phong cách","styleDescription":"Preset phong cách cho hình ảnh được tạo","availableProviders":"Nhà cung cấp khả dụng","models":"mô hình"},"data":{"title":"Quản lý dữ liệu","export":"Xuất dữ liệu","exportDescription":"Tải xuống một tệp lưu trữ di động gồm tùy chọn, thư mục trò chuyện, phiên và tin nhắn, ghi chú, bộ sưu tập kiến thức và văn bản trích xuất từ tài liệu.","exportAll":"Xuất tất cả dữ liệu","import":"Nhập dữ liệu","importDescription":"Nhập dữ liệu từ bản xuất trước đó.","importData":"Nhập dữ liệu","importing":"Đang nhập...","clearSessions":"Xóa phiên","clearSessionsDescription":"Xóa tất cả phiên trò chuyện. Hành động này không thể hoàn tác.","clearAll":"Xóa tất cả","clearing":"Đang xóa...","importOptions":"Tùy chọn nhập","importOptionsDescription":"Chọn cách xử lý dữ liệu hiện có","validatingArchive":"Đang xác thực tệp lưu trữ và tính toán thay đổi…","archiveValidationFailed":"Xác thực tệp lưu trữ thất bại","preflightReport":"Xem trước nội dung nhập","preflightIncoming":"{{folders}} thư mục · {{sessions}} cuộc trò chuyện · {{messages}} tin nhắn · {{notes}} ghi chú · {{collections}} bộ sưu tập · {{documents}} tài liệu · {{chunks}} đoạn","preflightRemappedIds":"{{count}} ID sẽ được ánh xạ lại để bảo vệ dữ liệu của tài khoản khác.","skipDuplicates":"Bỏ qua bản sao","overwrite":"Ghi đè hiện có","importResults":"Kết quả nhập","preferences":"Tùy chọn","imported":"Đã nhập","failed":"Thất bại","sessions":"Phiên","sessionFolders":"Thư mục phiên","notes":"Ghi chú","knowledgeCollections":"Bộ sưu tập kiến thức","importedLabel":"đã nhập","overwrittenLabel":"đã ghi đè","skipped":"đã bỏ qua","toCreate":"sẽ tạo","toOverwrite":"sẽ ghi đè","toSkip":"sẽ bỏ qua","documents":"Tài liệu","warnings":"Cảnh báo","refreshAfterImportFailed":"Dữ liệu đã được nhập, nhưng không thể làm mới một số chế độ xem. Hãy tải lại Libre WebUI để xem mọi thay đổi.","errors":"Lỗi","archivedChats":{"title":"Cuộc trò chuyện đã lưu trữ","empty":"Không có cuộc trò chuyện nào được lưu trữ","unarchive":"Bỏ lưu trữ"},"archiveScopeV3":"Bao gồm tùy chọn, cuộc trò chuyện, thư mục, ghi chú, bộ sưu tập kiến thức và văn bản trích xuất từ tài liệu. Không bao gồm tài khoản và bí mật, giọng nói nhân bản sinh trắc học, nội dung đa phương tiện đã tạo, persona và bộ nhớ, cũng như dữ liệu hoặc ổ đĩa Work."},"about":{"title":"Giới thiệu","versionLabel":"Phiên bản","ollama":{"title":"Trạng thái Ollama","version":"Phiên bản","healthy":"Khỏe mạnh","unhealthy":"Không khỏe mạnh"},"stats":{"models":"Mô hình","sessions":"Phiên"},"features":{"privacy":{"title":"Ưu tiên quyền riêng tư","description":"Dữ liệu của bạn được lưu trên thiết bị của bạn"},"openSource":{"title":"Mã nguồn mở","description":"Phần mềm miễn phí và mã nguồn mở"},"localInference":{"title":"Suy luận cục bộ","description":"Chạy mô hình AI cục bộ với Ollama"}},"openSourceBy":"Mã nguồn mở bởi {{company}}","links":{"title":"Liên kết","github":"GitHub","githubDescription":"Xem mã nguồn và đóng góp","website":"Website","websiteDescription":"Truy cập website của chúng tôi","ollama":"Ollama","ollamaDescription":"Tìm hiểu thêm về Ollama","documentation":"Tài liệu","reportIssue":"Báo cáo vấn đề","reportIssueDescription":"Báo lỗi & yêu cầu tính năng","gitlab":"Bản sao GitLab","gitlabDescription":"Kho GitLab tự lưu trữ","documentationDescription":"Hướng dẫn, bài học và tham khảo API"},"version":"Phiên bản {{version}}"},"groups":{"general":"Chung","chat":"Trò chuyện","media":"Giọng nói & hình ảnh","connections":"Kết nối"},"search":{"title":"Tìm kiếm web","description":"Tìm kiếm trên web qua một phiên bản SearXNG tự lưu trữ. Khi bật, khung soạn chat có nút tìm kiếm và các tác vụ Work có mạng có thể tìm kiếm.","enableLabel":"Bật tìm kiếm web","enableDescription":"Cung cấp tìm kiếm web cho chat và tác vụ Work. Tìm kiếm chạy phía máy chủ trên phiên bản đã cấu hình.","urlLabel":"URL SearXNG","urlDescription":"URL gốc của phiên bản SearXNG mà máy chủ truy cập được. Bộ triển khai riêng đi kèm cung cấp http://searxng:8080.","maxResultsLabel":"Kết quả mỗi lần tìm","maxResultsDescription":"Bao nhiêu kết quả được đưa vào trả lời hoặc lệnh gọi công cụ, 1-10.","maxResultsInvalid":"Kết quả mỗi lần tìm phải từ 1 đến 10.","safeSearchLabel":"Tìm kiếm an toàn","safeSearchDescription":"Yêu cầu công cụ lọc kết quả nhạy cảm.","test":"Kiểm tra kết nối","testing":"Đang kiểm tra…","testOk":"Tìm kiếm hoạt động — trả về {{results}} kết quả","testFailed":"Kiểm tra tìm kiếm thất bại","save":"Lưu","saved":"Đã lưu cài đặt tìm kiếm","saveFailed":"Không thể lưu cài đặt tìm kiếm"}}`),models:{title:`Mô hình`,subtitle:`Tải, quản lý và giám sát mô hình Ollama của bạn`,installed:`Mô hình đã cài đặt`,available:`Mô hình khả dụng`,pull:`Tải mô hình`,pulling:`Đang tải...`,delete:`Xóa mô hình`,deleting:`Đang xóa...`,size:`Kích thước`,modified:`Đã sửa đổi`,family:`Họ`,parameters:`Tham số`,quantization:`Lượng tử hóa`,noModels:`Chưa có mô hình nào được cài đặt`,pullFirst:`Tải mô hình để bắt đầu`,noModelsFound:`Không tìm thấy mô hình`},personas:{title:`Personas`,create:`Tạo Persona`,edit:`Chỉnh sửa Persona`,delete:`Xóa Persona`,name:`Tên`,description:`Mô tả`,systemPrompt:`Prompt hệ thống`,model:`Mô hình`,avatar:`Ảnh đại diện`,background:`Hình nền`,noPersonas:`Chưa có persona nào được tạo`,createFirst:`Tạo persona đầu tiên của bạn để tùy chỉnh trải nghiệm trò chuyện`},gallery:{title:`Thư viện`,subtitle:`Thư viện hình ảnh do AI tạo của bạn`,imageCount:`{{count}} hình ảnh`,generate:`Tạo hình ảnh`,generateDescription:`Tạo hình ảnh với AI`,generating:`Đang tạo...`,prompt:`Prompt`,promptPlaceholder:`Mô tả hình ảnh bạn muốn tạo...`,noImages:`Chưa có hình ảnh nào được tạo`,download:`Tải xuống`,delete:`Xóa`,regenerate:`Tạo lại`,model:`Mô hình`,size:`Kích thước`,quality:`Chất lượng`,created:`Đã tạo`},errors:{generic:`Đã xảy ra lỗi`,network:`Lỗi mạng. Vui lòng kiểm tra kết nối của bạn.`,unauthorized:`Bạn không được phép thực hiện hành động này.`,notFound:`Không tìm thấy tài nguyên được yêu cầu.`,serverError:`Lỗi máy chủ. Vui lòng thử lại sau.`,validation:`Vui lòng kiểm tra đầu vào của bạn và thử lại.`},keyboard:{title:`Phím tắt`,toggleSidebar:`Chuyển đổi thanh bên`,openSettings:`Mở cài đặt`,toggleDarkMode:`Chuyển đổi chế độ tối`,showShortcuts:`Hiển thị phím tắt`,closeModals:`Đóng hộp thoại`,groups:{navigation:`Điều hướng`,general:`Chung`,chat:`Trò chuyện`,workspace:`Không gian làm việc`},actions:{sendMessage:`Gửi tin nhắn`,newLine:`Dòng mới trong tin nhắn`,saveEdit:`Lưu tin nhắn đã chỉnh sửa`,cancelEdit:`Hủy chỉnh sửa`,saveFile:`Lưu tệp`,formatCode:`Định dạng mã`},description:`Tất cả phím tắt có trong Libre WebUI.`,newChat:`Trò chuyện mới`,newWork:`Phiên Work mới`,openPalette:`Mở bảng lệnh`},modelManager:{title:`Mô hình`,loading:`Đang tải mô hình...`,systemStatus:{online:`Ollama trực tuyến`,offline:`Ollama ngoại tuyến`,models:`mô hình`,models_plural:`mô hình`,running:`đang chạy`,vram:`VRAM`},sections:{pull:`Tải mô hình mới`,library:`Duyệt thư viện`,running:`Mô hình đang chạy`,local:`Mô hình cục bộ`,advanced:`Hành động nâng cao`,huggingface:`HuggingFace Hub`},pull:{placeholder:`Nhập tên mô hình (vd: llama3.2:3b, deepseek-r1:14b)`,button:`Tải`,cancel:`Hủy`,popular:`Mô hình phổ biến:`,browseAll:`Duyệt tất cả mô hình trên ollama.com`,success:`Đã tải mô hình {{name}} thành công`,cancelled:`Đã hủy tải mô hình`,failed:`Không thể tải mô hình`,enterName:`Vui lòng nhập tên mô hình`,restricted:`Việc cài đặt mô hình trên phiên bản này chỉ dành cho quản trị viên.`},progress:{starting:`Đang khởi tạo...`,pulling:`Đang tải mô hình...`,pullingLayer:`đang tải`,verifying:`Đang xác minh tính toàn vẹn...`,verifyingDigest:`đang xác minh digest sha256`,writing:`Đang ghi manifest...`,cleaning:`Đang dọn dẹp...`},library:{available:`khả dụng`,search:`Tìm kiếm mô hình...`,noResults:`Không tìm thấy mô hình nào phù hợp với tiêu chí của bạn`,installed:`Đã cài đặt`,more:`+{{count}} thêm`,refresh:`Làm mới thư viện`},local:{noModels:`Chưa có mô hình nào được cài đặt`,pullToStart:`Tải mô hình ở trên để bắt đầu`,installed:`đã cài đặt`,running:`Đang chạy`,info:`Thông tin`,copy:`Sao chép`,delete:`Xóa`,deleteConfirm:`Bạn có chắc chắn muốn xóa mô hình "{{name}}"?`,deleteSuccess:`Đã xóa mô hình {{name}} thành công`,deleteFailed:`Không thể xóa mô hình`},advanced:{createModel:`Tạo mô hình`,fromModelfile:`Từ Modelfile`,copyModel:`Sao chép mô hình`,duplicateExisting:`Nhân đôi hiện có`,testEmbeddings:`Kiểm tra nhúng`,generateVectors:`Tạo vector`,healthCheck:`Kiểm tra sức khỏe`,testConnection:`Kiểm tra kết nối`,healthy:`Ollama đang hoạt động tốt!`},modals:{details:{title:`Chi tiết mô hình`,info:`Thông tin mô hình`,family:`Họ`,parameters:`Tham số`,quantization:`Lượng tử hóa`,format:`Định dạng`,systemPrompt:`Prompt hệ thống`,template:`Mẫu`,license:`Giấy phép`,modelfile:`Modelfile`,noDetails:`Không có chi tiết`},copy:{title:`Sao chép mô hình`,source:`Mô hình nguồn`,selectModel:`Chọn mô hình...`,newName:`Tên mô hình mới`,placeholder:`vd: my-custom-model`,copying:`Đang sao chép...`,button:`Sao chép mô hình`,success:`Đã sao chép mô hình sang {{name}}`,failed:`Không thể sao chép mô hình`,enterBoth:`Vui lòng nhập cả tên nguồn và tên đích`},create:{title:`Tạo mô hình tùy chỉnh`,name:`Tên mô hình`,namePlaceholder:`vd: my-assistant`,modelfile:`Modelfile`,modelfilePlaceholder:`FROM llama3.2
2
+ SYSTEM You are a helpful assistant.`,see:`Xem`,docs:`Tài liệu Modelfile`,docsLink:`để tham khảo cú pháp`,creating:`Đang tạo...`,button:`Tạo mô hình`,success:`Đã tạo mô hình {{name}} thành công`,failed:`Không thể tạo mô hình`,enterBoth:`Vui lòng nhập tên mô hình và nội dung Modelfile`},embeddings:{title:`Kiểm tra nhúng`,model:`Mô hình nhúng`,selectModel:`Chọn mô hình...`,recommended:`Khuyến nghị: nomic-embed-text, mxbai-embed-large`,input:`Văn bản đầu vào`,placeholder:`Nhập văn bản để tạo nhúng cho...`,generating:`Đang tạo...`,button:`Tạo nhúng`,result:`Kết quả ({{count}} chiều)`,success:`Đã tạo vector nhúng {{count}} chiều`,failed:`Không thể tạo nhúng`,enterBoth:`Vui lòng chọn mô hình và nhập văn bản`}},huggingface:{browseAll:`Xem tất cả trên HuggingFace`,checkingGguf:`Đang tìm tệp GGUF...`,noGgufAvailable:`Không có tệp GGUF để tải trực tiếp vào Ollama`,ggufFilesCount:`Tệp GGUF ({{count}}) - Tải trực tiếp vào Ollama`,noModelsFound:`Không tìm thấy mô hình`,noResults:`Không tìm thấy mô hình. Thử điều chỉnh tìm kiếm hoặc bộ lọc.`,browseAllLink:`Xem tất cả`,search:`Tìm kiếm mô hình HuggingFace...`,by:`bởi`,gated:`Truy cập hạn chế`,viewOnHF:`Xem trên HuggingFace`,sortDownloads:`Lượt tải`,sortLikes:`Lượt thích`,sortRecent:`Gần đây`,taskTextGeneration:`Tạo văn bản`,taskTextToSpeech:`Văn bản thành giọng nói`,taskTextToImage:`Văn bản thành hình ảnh`,taskSpeechRecognition:`Nhận dạng giọng nói`,tasks:{textGen:`Tạo văn bản`,tts:`Văn bản thành giọng nói`,image:`Văn bản thành hình ảnh`,stt:`Nhận dạng giọng nói`},sort:{downloads:`Tải nhiều nhất`,likes:`Được thích nhiều nhất`,recent:`Cập nhật gần đây`}}},personaManager:{title:`Personas`,subtitle:`Tạo và quản lý các persona AI với tính cách, bộ nhớ và hành vi tùy chỉnh`,loading:`Đang tải personas...`,createButton:`Tạo Persona`,importExport:`Nhập/Xuất`,stats:{title:`Personas của bạn`,count:`{{count}} persona đã tạo`,count_plural:`{{count}} personas đã tạo`},empty:{title:`Chưa có persona nào`,description:`Tạo persona đầu tiên của bạn để bắt đầu với tương tác AI được cá nhân hóa`,button:`Tạo Persona đầu tiên của bạn`},deleteConfirm:`Bạn có chắc chắn muốn xóa "{{name}}"?`,deleteSuccess:`Đã xóa persona "{{name}}" thành công`,downloadSuccess:`Đã tải xuống persona "{{name}}" thành công`,failed:`Không thể {{action}} persona`},personaForm:{title:{create:`Tạo Persona mới`,edit:`Chỉnh sửa Persona`},subtitle:{create:`Tạo một persona AI mới với tính cách tùy chỉnh, hệ thống bộ nhớ và khả năng học thích ứng`,edit:`Tùy chỉnh persona AI của bạn với bộ nhớ nâng cao, học thích ứng và tham số thông minh`},loading:`Đang tải form...`,saved:`Đã lưu`,tabs:{basic:`Cơ bản`,parameters:`Tham số`,memory:`Bộ nhớ & Học tập`,advanced:`Nâng cao`},basic:{name:`Tên`,namePlaceholder:`Nhập tên persona`,model:`Mô hình`,selectModel:`Chọn mô hình`,description:`Mô tả`,descriptionPlaceholder:`Mô tả persona của bạn...`,systemPrompt:`Prompt hệ thống`,systemPromptPlaceholder:`Nhập prompt hệ thống định nghĩa hành vi persona của bạn...`,systemPromptHint:`Prompt hệ thống định nghĩa cách persona của bạn sẽ hành xử và phản hồi.`},parameters:{temperature:`Nhiệt độ`,temperatureHint:`Kiểm soát sự sáng tạo vs nhất quán`,topP:`Top-P`,topPHint:`Kiểm soát sự đa dạng phản hồi`,topK:`Top-K`,topKHint:`Giới hạn từ vựng ở top-k token`,contextWindow:`Cửa sổ ngữ cảnh`,contextWindowHint:`Độ dài lịch sử hội thoại tối đa`,maxTokens:`Số token tối đa`,maxTokensHint:`Độ dài phản hồi tối đa`,repeatPenalty:`Hình phạt lặp lại`,repeatPenaltyHint:`Giảm phản hồi lặp lại`},memory:{title:`Hệ thống bộ nhớ`,subtitle:`Persona ghi nhớ các cuộc trò chuyện theo thời gian`,enableHint:`Bật hệ thống bộ nhớ để cho phép persona của bạn ghi nhớ các cuộc trò chuyện và xây dựng ngữ cảnh theo thời gian.`,loading:`Đang tải trạng thái bộ nhớ...`,noData:`Chưa có dữ liệu bộ nhớ`,memories:`Ký ức`,mbUsed:`MB đã dùng`,lastBackup:`Sao lưu lần cuối`,never:`Chưa bao giờ`,maxMemories:`Số ký ức tối đa`,maxMemoriesHint:`Số lượng ký ức persona này có thể lưu trữ`,retention:`Thời gian giữ ký ức`,retentionHint:`Số ngày giữ ký ức trước khi dọn dẹp`,autoCleanup:`Tự động dọn dẹp ký ức cũ`,wipeAll:`Xóa tất cả ký ức`,wipeCannot:`Không thể hoàn tác`,wipeButton:`Xóa`,wiping:`Đang xóa...`,wipeConfirm:`Bạn có chắc chắn muốn xóa tất cả ký ức? Không thể hoàn tác.`,wipeSuccess:`Đã xóa {{count}} ký ức`},learning:{title:`Học thích ứng`,subtitle:`Persona phát triển dựa trên tương tác`,enableHint:`Bật học thích ứng để cho phép persona của bạn phát triển và cá nhân hóa phản hồi dựa trên tương tác của bạn.`,speed:`Tốc độ học`,slow:`Chậm`,slowDesc:`Thay đổi dần dần`,balanced:`Cân bằng`,balancedDesc:`Tốc độ vừa phải`,fast:`Nhanh`,fastDesc:`Thích ứng nhanh`,autoAdapt:`Tự động thích ứng với sở thích người dùng`,whatLearns:`Những gì persona học:`,conversationTone:`Giọng điệu hội thoại`,responseStyle:`Phong cách phản hồi`,userPreferences:`Sở thích người dùng`,topicInterests:`Chủ đề quan tâm`},advanced:{embeddingModel:`Mô hình nhúng`,embeddingHint:`Chọn mô hình được sử dụng để mã hóa bộ nhớ và tìm kiếm ngữ nghĩa. Các mô hình nhúng được hiển thị trước, sau đó là các mô hình khả dụng khác.`,noModels:`Không tìm thấy mô hình`,embeddingModels:`Mô hình nhúng`,otherModels:`Mô hình khác`,installHint:`Cài đặt mô hình nhúng:`,recommended:`Khuyến nghị: nomic-embed-text, mxbai-embed-large, bge-m3, snowflake-arctic-embed`,aboutTitle:`Về cài đặt nâng cao`,aboutDescription:`Mô hình nhúng được sử dụng bởi hệ thống bộ nhớ để hiểu ý nghĩa ngữ nghĩa và tìm các ký ức liên quan trong cuộc trò chuyện. Chọn mô hình phù hợp với trường hợp sử dụng và tài nguyên khả dụng của bạn.`},actions:{cancel:`Hủy`,save:`Lưu`,saving:`Đang lưu...`,saveClose:`Lưu & Đóng`,create:`Tạo`},success:{created:`Đã tạo persona`,updated:`Đã cập nhật persona`},error:{saveFailed:`Không thể lưu`}},personaCard:{enhanced:`Nâng cao`,systemPrompt:`Prompt hệ thống`,memories:`ký ức`,use:`Sử dụng`,editTooltip:`Chỉnh sửa persona`,downloadTooltip:`Tải xuống persona`,backup:`Sao lưu`,exportDNA:`Xuất DNA`,wipeMemories:`Xóa ký ức`,wipeConfirm:`Bạn có chắc chắn muốn xóa tất cả ký ức của persona này? Hành động này không thể hoàn tác.`,wipeSuccess:`Đã xóa {{count}} ký ức`,backupSuccess:`Đã tải xuống bản sao lưu persona thành công`,dnaSuccess:`Đã xuất DNA persona thành công`,failed:`Không thể {{action}}`},userManager:{title:`Quản lý người dùng`,subtitle:`Quản lý tài khoản và quyền hạn người dùng`,pageDescription:`Quản lý tài khoản người dùng, quyền và kiểm soát truy cập cho phiên bản Libre WebUI của bạn.`,loading:`Đang tải người dùng...`,createUser:`Tạo người dùng`,search:`Tìm kiếm người dùng...`,noUsers:`Không tìm thấy người dùng`,noUsersMatching:`Không có người dùng nào khớp với tìm kiếm của bạn`,columns:{user:`Người dùng`,email:`Email`,role:`Vai trò`,created:`Đã tạo`,actions:`Hành động`},roles:{admin:`Quản trị viên`,user:`Người dùng`},noEmail:`Không có email`,deleteConfirm:`Bạn có chắc chắn muốn xóa người dùng "{{name}}"?`,deleteSuccess:`Đã xóa người dùng thành công`,deleteFailed:`Không thể xóa người dùng`,cannotDeleteSelf:`Bạn không thể xóa tài khoản của chính mình`,form:{title:{create:`Tạo người dùng`,edit:`Chỉnh sửa người dùng`},username:`Tên người dùng`,usernamePlaceholder:`Nhập tên người dùng`,email:`Email`,emailPlaceholder:`Nhập email (tùy chọn)`,password:`Mật khẩu`,passwordPlaceholder:`Nhập mật khẩu`,passwordHint:`Để trống để giữ mật khẩu hiện tại`,role:`Vai trò`,creating:`Đang tạo...`,updating:`Đang cập nhật...`,createButton:`Tạo người dùng`,updateButton:`Cập nhật người dùng`,createSuccess:`Đã tạo người dùng thành công`,updateSuccess:`Đã cập nhật người dùng thành công`,createFailed:`Không thể tạo người dùng`,updateFailed:`Không thể cập nhật người dùng`},approval:{title:`Phê duyệt đang chờ xử lý`,description:`Xem xét các đăng ký mới trước khi cho phép họ vào phiên bản này.`,registered:`Đã đăng ký`,activate:`Kích hoạt tài khoản`,reject:`Từ chối đăng ký`,approved:`{{name}} hiện có thể đăng nhập.`,failed:`Không thể phê duyệt tài khoản.`,notification:`{{count}} đăng ký đang chờ bạn phê duyệt.`,notificationBadge:`{{count}} phê duyệt người dùng đang chờ xử lý`},workAccess:{title:`Quyền truy cập Work`,description:`Cho phép mọi người dùng đang hoạt động tạo và chạy tác vụ Work trong các sandbox cô lập. Quản trị viên luôn có quyền truy cập; không gian làm việc thư mục máy chủ vẫn chỉ dành cho quản trị viên.`,saved:`Đã cập nhật quyền truy cập Work`,saveFailed:`Không thể cập nhật quyền truy cập Work`},workPolicies:{title:`Chính sách Work`,description:`Các preset runtime có tên (image, giới hạn, dừng khi rảnh) để tạo tác vụ. Trường trống kế thừa mặc định toàn cục.`,add:`Thêm chính sách`,name:`Tên`,image:`Image`,memory:`Bộ nhớ`,cpu:`CPU`,pids:`Giới hạn PID`,workspaceSize:`Kích thước không gian làm việc`,idleMinutes:`Dừng khi rảnh (phút)`,networkDefault:`Mạng mặc định`,networkInherit:`Kế thừa mặc định`,networkOn:`Bật`,networkOff:`Tắt`,save:`Lưu`,cancel:`Hủy`,edit:`Sửa chính sách`,delete:`Xóa chính sách`,deleteConfirm:`Xóa chính sách này? Các tác vụ đang dùng sẽ quay về mặc định toàn cục.`,empty:`Chưa có chính sách nào. Tác vụ dùng mặc định runtime toàn cục.`,saved:`Đã lưu chính sách Work`,deleted:`Đã xóa chính sách Work`,failed:`Không thể lưu chính sách Work`,invalidNumber:`Giới hạn PID và dừng khi rảnh phải là số.`},modelAccess:{title:`Tải mô hình`,description:`Cho phép tất cả người dùng đang hoạt động tải mô hình từ Ollama và trình duyệt Hugging Face. Quản trị viên luôn có thể tải mô hình.`,saved:`Đã cập nhật quyền tải mô hình`,saveFailed:`Không thể cập nhật quyền tải mô hình`},webSearchAccess:{title:`Tìm kiếm web`,description:`Cho phép tất cả người dùng đang hoạt động dùng tìm kiếm web trong chat và tác vụ Work. Quản trị viên luôn dùng được. Cấu hình công cụ trong Cài đặt > Tìm kiếm.`,saved:`Đã cập nhật quyền tìm kiếm web`,saveFailed:`Không thể cập nhật quyền tìm kiếm web`},agentAccess:{title:`Tác nhân`,description:`Cung cấp mục Tác nhân (Libre Claw) cho quản trị viên. CLI tác nhân chạy trên máy chủ với tư cách người dùng máy chủ, bên ngoài sandbox Work.`,saved:`Đã cập nhật quyền truy cập tác nhân`,saveFailed:`Không thể cập nhật quyền truy cập tác nhân`,lockedByEnv:`Bị khóa bởi biến môi trường AGENT_CLI_MODELS_ENABLED.`}},chatHistory:{label:`Lịch sử cuộc trò chuyện`,jumpToTurn:`Chuyển đến lượt {{index}} / {{total}}`},chatMessage:{you:`Bạn`,assistant:`Trợ lý`,system:`Hệ thống`,copy:`Sao chép`,copyMessage:`Sao chép tin nhắn`,copied:`Đã sao chép!`,regenerate:`Tạo lại`,regenerateResponse:`Tạo lại phản hồi`,edit:`Chỉnh sửa`,editSystemMessage:`Chỉnh sửa tin nhắn hệ thống`,saveChanges:`Lưu thay đổi`,cancelEditing:`Hủy chỉnh sửa`,saveAndSubmit:`Lưu & gửi`,goodResponse:`Phản hồi tốt`,badResponse:`Phản hồi kém`,delete:`Xóa`,deleteConfirm:`Xóa tin nhắn này?`,branch:`Nhánh`,speaking:`Đang nói...`,speakMessage:`Đọc tin nhắn`,stopSpeaking:`Dừng đọc`,showMore:`Hiển thị thêm`,showLess:`Hiển thị ít hơn`,thinking:`Đang suy nghĩ`,thoughtFor:`Đã suy nghĩ trong {{duration}}`,hiddenLines:`{{count}} dòng bị ẩn`,systemMessagePlaceholder:`Nhập tin nhắn hệ thống của bạn...`,fullSizeImage:`Hình ảnh kích thước đầy đủ`,startConversation:`Bắt đầu cuộc trò chuyện`,startConversationDescription:`Gửi tin nhắn để bắt đầu trò chuyện với trợ lý AI của bạn. Đặt câu hỏi, nhờ giúp đỡ về code, hoặc có một cuộc trò chuyện tự nhiên.`,scrollToBottom:`Cuộn xuống dưới`,newMessages:`Tin nhắn mới`},imageGallery:{title:`Thư viện hình ảnh`,noImages:`Chưa có hình ảnh nào`,noImagesHint:`Tạo hình ảnh đầu tiên của bạn bằng bảng điều khiển bên phải`,delete:`Xóa`,download:`Tải xuống`,deleteConfirm:`Bạn có chắc chắn muốn xóa hình ảnh này?`,deleteSuccess:`Đã xóa hình ảnh`,deleteFailed:`Không thể xóa hình ảnh`,downloadFailed:`Không thể tải xuống hình ảnh`,loadMore:`Tải thêm ({{current}} trong số {{total}})`,loadFailed:`Không thể tải thư viện`},imageGeneration:{title:`Tạo hình ảnh`,prompt:`Prompt`,promptPlaceholder:`Mô tả hình ảnh bạn muốn tạo...`,model:`Mô hình`,selectModel:`Chọn mô hình`,noModels:`Không có mô hình tạo hình ảnh nào khả dụng`,configurePlugin:`Cấu hình plugin hỗ trợ tạo hình ảnh`,size:`Kích thước`,quality:`Chất lượng`,style:`Phong cách`,generate:`Tạo`,generating:`Đang tạo...`,success:`Đã tạo hình ảnh thành công`,failed:`Không thể tạo hình ảnh`,enterPrompt:`Vui lòng nhập prompt`,promptTooLong:`Prompt vượt quá độ dài tối đa {{max}} ký tự`},errorBoundary:{title:`Đã xảy ra lỗi`,description:`Chúng tôi gặp phải lỗi không mong muốn. Vui lòng thử làm mới trang.`,tryAgain:`Làm mới trang`,goHome:`Về trang chủ`,errorDetails:`Chi tiết lỗi (Phát triển)`},documents:{title:`Tài liệu`,upload:`Tải lên tài liệu`,uploading:`Đang tải lên...`,noDocuments:`Chưa có tài liệu nào được tải lên`,uploadHint:`Tải lên tài liệu để sử dụng trong cuộc trò chuyện của bạn`,delete:`Xóa`,deleteConfirm:`Bạn có chắc chắn muốn xóa tài liệu này?`,deleteSuccess:`Đã xóa tài liệu`,deleteFailed:`Không thể xóa tài liệu`,uploadSuccess:`Đã tải lên tài liệu thành công`,uploadFailed:`Không thể tải lên tài liệu`,types:`Hỗ trợ: PDF, TXT, MD, DOCX`,unsupportedFileType:`Chỉ hỗ trợ file PDF và TXT`,fileSizeTooLarge:`Kích thước file phải nhỏ hơn 10MB`,uploadSuccessWithName:`Đã tải lên tài liệu "{{name}}" thành công`,removeSuccess:`Đã xóa tài liệu thành công`,removeFailed:`Không thể xóa tài liệu`,removeError:`Đã xảy ra lỗi khi xóa tài liệu`,clickToUpload:`Nhấp để tải lên`,orDragAndDrop:`hoặc kéo và thả`,fileTypesAndSize:`File PDF hoặc TXT tối đa 10MB`,uploadedDocuments:`Tài liệu đã tải lên`,removeDocument:`Xóa tài liệu`},ttsButton:{speak:`Đọc`,stop:`Dừng`,speaking:`Đang đọc...`,generateFailed:`Không thể tạo giọng nói`,playbackFailed:`Phát lại âm thanh thất bại`,stopSpeaking:`Dừng đọc`,preparingSpeech:`Đang chuẩn bị giọng nói...`,generatingSpeech:`Đang tạo giọng nói...`,bufferingSpeech:`Đang tải giọng nói...`,enableAudio:`Bật âm thanh và đọc to`,enableAudioShort:`Bật âm thanh`,readAloud:`Đọc to`},artifacts:{title:`Artifact`,code:`Code`,preview:`Xem trước`,copy:`Sao chép code`,copied:`Đã sao chép!`,download:`Tải xuống`,expand:`Mở rộng`,collapse:`Thu gọn`,openInNewTab:`Mở trong tab mới`,invalidSvg:`Nội dung SVG không hợp lệ`,invalidJson:`Nội dung JSON không hợp lệ`,previewMode:`Chế độ xem trước`,codeMode:`Chế độ code`,copyContent:`Sao chép nội dung`,openInPanel:`Mở trong bảng điều khiển`,openInNewWindow:`Mở trong cửa sổ mới`,created:`Đã tạo`,closePanelEsc:`Đóng bảng điều khiển (Esc)`,copyButton:`Sao chép`,open:`Mở`,dragEdgeToResize:`Kéo cạnh để thay đổi kích thước`,previewUnavailable:`Preview unavailable`,previewUnavailableDescription:`This artifact does not contain renderable preview content. Switch to code view to inspect the source.`,versionOf:`Phiên bản {{current}} / {{total}}`,previousVersion:`Phiên bản trước`,nextVersion:`Phiên bản sau`},personaImportExport:{title:`Nhập & Xuất Personas`,description:`Xuất personas của bạn để chia sẻ hoặc nhập personas từ người khác`,exportPersonas:`Xuất Personas`,importPersonas:`Nhập Personas`,noPersonasToExport:`Không có personas để xuất`,personasAvailable:`{{count}} persona khả dụng`,personasAvailable_plural:`{{count}} personas khả dụng`,exportAll:`Xuất tất cả`,uploadJsonFile:`Tải lên file JSON`,pasteJsonLabel:`Dán dữ liệu JSON`,pasteJsonPlaceholder:`Dán dữ liệu JSON persona vào đây...`,importing:`Đang nhập...`,importButton:`Nhập Persona(s)`,expectedFormat:`Định dạng JSON mong đợi:`,exportSuccess:`Đã xuất persona "{{name}}" thành công`,exportFailed:`Không thể xuất persona`,exportAllSuccess:`Đã xuất tất cả {{count}} personas thành công`,exportAllFailed:`Không thể xuất personas`,pasteJsonData:`Vui lòng dán dữ liệu JSON persona`,importMultipleSuccess:`Đã nhập thành công {{count}} personas`,importMultipleFailed:`Không thể nhập {{count}} personas`,importNoneFailed:`Không thể nhập bất kỳ personas nào`,importSuccess:`Đã nhập persona thành công`,importFailed:`Không thể nhập persona`},generationStats:{details:`Chi tiết`,promptTokens:`Token prompt:`,generatedTokens:`Token đã tạo:`,totalTokens:`Tổng token:`,speed:`Tốc độ:`,promptEval:`Đánh giá prompt:`,generation:`Tạo:`,modelLoad:`Tải mô hình:`,totalTime:`Tổng thời gian:`,generatedAt:`Tạo lúc:`},userMenu:{loggedOut:`Đăng xuất thành công`,pictureUpdated:`Ảnh đại diện đã cập nhật`,failedUpdateAvatar:`Cập nhật ảnh đại diện thất bại`,failedUpdatePicture:`Cập nhật ảnh đại diện thất bại`,noEmail:`Chưa cung cấp email`,changePicture:`Đổi ảnh`,settings:`Cài đặt`,userManagement:`Quản lý người dùng`,signOut:`Đăng xuất`,changeProfilePicture:`Đổi ảnh đại diện`},pluginManager:{title:`Quản lý plugin`,upload:`Tải lên`,addJson:`Thêm JSON`,browseHF:`Duyệt HF Hub`,confirmDelete:`Bạn có chắc chắn muốn xóa plugin này?`,uploading:`Đang tải plugin lên...`,pasteJson:`Dán JSON plugin vào đây...`,installPlugin:`Cài đặt plugin`,loading:`Đang tải plugin...`,noPlugins:`Chưa cài đặt plugin nào`,noPluginsDescription:`Tải lên tệp plugin hoặc thêm plugin từ JSON để bắt đầu.`,active:`Hoạt động`,id:`ID`,endpoint:`Endpoint`,activate:`Kích hoạt`,deactivate:`Vô hiệu hóa`,activePlugin:`Plugin đang hoạt động`,activePluginDescription:`Tất cả yêu cầu chat sẽ được chuyển qua plugin này`,variables:{title:`Biến`,save:`Lưu`,saving:`Đang lưu...`,saved:`Đã lưu biến`,saveFailed:`Không thể lưu biến`,resetDefaults:`Đặt lại mặc định`,reset:`Đã đặt lại biến`,sensitiveSet:`Giá trị đã được đặt (nhập giá trị mới để thay đổi)`,resetFailed:`Không thể đặt lại biến`,showValue:`Hiển thị giá trị {{label}}`,hideValue:`Ẩn giá trị {{label}}`,connection:`Kết nối`,advanced:`Tham số nâng cao`,inherited:`Sử dụng mặc định của nhà cung cấp`,inheritedValue:`Sử dụng mặc định của nhà cung cấp ({{value}})`,enabled:`Đã bật`,disabled:`Đã tắt`,required:`Yêu cầu một giá trị`,fullApiEndpoint:`URL điểm cuối API đầy đủ`,endpointHelp:`Nhập URL yêu cầu hoàn chỉnh, bao gồm đường dẫn hoạt động của nó (ví dụ: /v1/chat/completions), không chỉ URL cơ sở của nhà cung cấp.`,invalidUrl:`Nhập URL điểm cuối API đầy đủ hợp lệ, ví dụ https://provider.example/v1/chat/completions`,insecureUrl:`Các điểm cuối API phải sử dụng HTTP hoặc HTTPS.`,httpWarning:`HTTP không mã hóa thông tin xác thực hoặc lưu lượng truy cập. Chỉ sử dụng trên mạng đáng tin cậy.`,invalidBaseUrl:`URL cơ sở không được chứa chuỗi truy vấn hoặc phân đoạn.`,invalidApiPath:`Phải bắt đầu bằng / và không chứa URL, truy vấn, phân đoạn hoặc phân đoạn ..`,tooLong:`Giá trị quá dài`}},huggingface:{title:`Trình duyệt mô hình HuggingFace`,subtitle:`Duyệt và chọn mô hình từ Hub`,searchPlaceholder:`Tìm mô hình...`,filters:`Bộ lọc`,task:`Nhiệm vụ`,sortBy:`Sắp xếp theo`,noModels:`Không tìm thấy mô hình`,adjustSearch:`Thử điều chỉnh tìm kiếm hoặc bộ lọc`,gated:`Hạn chế`,selected:`Đã chọn`,select:`Chọn`,refresh:`Làm mới`,modelsFound:`mô hình được tìm thấy`},demoMode:{title:`Chế độ demo`,github:`GitHub`},personaBackground:{label:`Hình nền`,uploadBackgroundImage:`Tải lên hình nền`,dragAndDrop:`Kéo và thả hình ảnh hoặc nhấp để duyệt`,chooseImage:`Chọn hình ảnh`,uploading:`Đang tải lên...`,enterImageUrl:`Hoặc nhập URL hình ảnh`,supportedFormats:`Hỗ trợ: JPG, PNG, GIF, WebP (tối đa 5MB). Hình ảnh ngang rộng hoạt động tốt nhất.`,customBackground:`Hình nền tùy chỉnh`,clickToChange:`Nhấp để thay đổi hoặc xóa`,removed:`Đã xóa hình nền`,uploaded:`Tải lên hình nền thành công`,invalidFile:`Vui lòng chọn tệp hình ảnh hợp lệ`,fileTooLarge:`Kích thước hình nền phải nhỏ hơn 5MB`,readFailed:`Không thể đọc tệp hình ảnh`,uploadFailed:`Không thể tải lên hình nền`},modelSelector:{searchInstalled:`Tìm kiếm mô hình đã cài...`,searchOllama:`Tìm trong thư viện Ollama...`,searchHuggingFace:`Tìm trên HuggingFace...`,selectModel:`Chọn mô hình`,personas:`Nhân vật`,ollamaModels:`Mô hình Ollama`,pluginModels:`Mô hình plugin`,actions:`Hành động`,installed:`Đã cài`,use:`Dùng`,pull:`Tải`,pullRestricted:`Việc cài đặt mô hình trên phiên bản này chỉ dành cho quản trị viên.`,adminOnlyPull:`Chỉ quản trị viên`,legacyProvider:`nhà cung cấp chưa được ghi`,providerNotRecorded:`Nhà cung cấp chưa được ghi`,providerUnavailable:`nhà cung cấp không khả dụng`,reselectProvider:`chọn lại nhà cung cấp để ghim mô hình này`,unavailable:`không khả dụng`,unavailableSelections:`Lựa chọn không khả dụng`,agentModels:`Tác nhân`},libreClaw:{title:`Tác nhân`,subtitle:`Tác nhân cục bộ chạy, phê duyệt, lịch trình, bộ nhớ, công cụ và cách sử dụng.`,dashboard:`Bảng điều khiển`,connection:{disconnectedTitle:`Daemon Libre Claw chưa được kết nối`,disconnectedDescription:`Bắt đầu cục bộ với <command>libre-claw start</command> hoặc đặt <env>LIBRE_CLAW_BASE_URL</env> trong môi trường phụ trợ.`},status:{connected:`Đã kết nối`,disconnected:`Đã ngắt kết nối`,activeRuns:`{{count}} hoạt động`,activeRuns_plural:`{{count}} hoạt động`},states:{queued:`Đã xếp hàng`,running:`Đang chạy`,blocked:`Bị chặn`,done:`Xong`,failed:`thất bại`,cancelled:`Đã hủy`},startRun:{title:`Bắt đầu phiên chạy tác tử`,placeholder:`Yêu cầu Libre Claw kiểm tra kho lưu trữ, sửa lỗi, chạy đánh giá, lên lịch báo cáo...`,chatRun:`Chạy trò chuyện`,goalMode:`Chế độ mục tiêu`,providerOverride:`Ghi đè nhà cung cấp`,modelOverride:`Ghi đè mô hình`,run:`Chạy`},modelRoute:{title:`Tuyến đường mẫu`,providerPlaceholder:`nhà cung cấp`,modelPlaceholder:`người mẫu`,persistGlobal:`Kiên trì với cấu hình chung Libre Claw`,saveModel:`Lưu mô hình`,theme:`Chủ đề Libre Claw`,saveTheme:`Lưu chủ đề`},runs:{title:`Phiên chạy`,empty:`Chưa có phiên chạy Libre Claw nào.`},timeline:{title:`Dòng thời gian phiên chạy`,empty:`Chọn một lần chạy để kiểm tra các sự kiện của nó.`,streaming:`Đang truyền phát...`,assistantResponse:`Phản hồi của trợ lý`,resultOk:`được`,resultError:`lỗi`,labels:{userMessage:`Tin nhắn người dùng`,toolCall:`Cuộc gọi công cụ`,toolResult:`Kết quả công cụ`,approvalRequest:`Yêu cầu phê duyệt`,approvalResponse:`Phản hồi phê duyệt`,runStarted:`Phiên chạy đã bắt đầu`,runFinished:`Phiên chạy đã hoàn tất`,usage:`Cách sử dụng`,error:`Lỗi`}},approvals:{needed:`Cần phê duyệt`,allowOnce:`Cho phép một lần`,alwaysAllowTool:`Luôn cho phép công cụ`,deny:`Từ chối`,toolApprovalRequested:`Đã yêu cầu phê duyệt công cụ`},automations:{title:`Tự động hóa`,namePlaceholder:`Tên`,schedulePlaceholder:`daily 09:00`,promptPlaceholder:`Lời nhắc tự động hóa`,create:`Tạo`,empty:`Không có tự động hóa Libre Claw theo lịch trình.`,runNow:`Chạy ngay`,pause:`Tạm dừng`,resume:`Tiếp tục`,routes:{report:`Báo cáo`,telegram:`Telegram`},status:{active:`Đang hoạt động`,paused:`Đã tạm dừng`}},usageFallback:{title:`Cách sử dụng và dự phòng`,usage:`Cách sử dụng`,fallbackRoute:`Tuyến đường dự phòng`,noUsage:`Chưa có hồ sơ sử dụng.`},metrics:{provider:`nhà cung cấp`,model:`người mẫu`,input:`đầu vào`,output:`đầu ra`,cached:`Đã lưu vào bộ nhớ đệm`,reasoning:`Lý luận`,cost:`Chi phí`,tool:`Công cụ`,resolution:`Độ phân giải`,state:`Trạng thái`,stopReason:`Lý do dừng`,tokens:`{{formatted}} mã thông báo`,tokens_plural:`{{formatted}} mã thông báo`},fallbacks:{tool:`công cụ`,unknown:`không rõ`,resolved:`đã giải quyết`,unknownError:`Lỗi không xác định`},toasts:{loadStatusFailed:`Không thể tải trạng thái Libre Claw`,enterTask:`Nhập nhiệm vụ cho Libre Claw`,runStarted:`Phiên chạy Libre Claw đã bắt đầu`,startRunFailed:`Không thể bắt đầu phiên chạy Libre Claw`,runCancelled:`Phiên chạy đã bị hủy`,cancelRunFailed:`Không thể hủy phiên chạy`,approved:`Đã được phê duyệt`,denied:`Bị từ chối`,resolvePermissionFailed:`Không thể giải quyết quyền`,providerModelRequired:`Nhà cung cấp và mô hình là bắt buộc`,modelUpdated:`Đã cập nhật mô hình Libre Claw`,updateModelFailed:`Không thể cập nhật mô hình`,themeUpdated:`Đã cập nhật chủ đề Libre Claw`,updateThemeFailed:`Không thể cập nhật chủ đề`,automationRequired:`Bắt buộc phải có tên, lịch trình và lời nhắc tự động hóa`,automationCreated:`Đã tạo tự động hóa`,createAutomationFailed:`Không thể tạo tự động hóa`,automationUpdated:`Đã cập nhật tự động hóa`,updateAutomationFailed:`Không thể cập nhật tự động hóa`}},work:{title:`Công việc`,subtitle:`Không gian làm việc mô hình biệt lập`,tasks:{title:`Tác vụ công việc`,subtitle:`Không gian làm việc cục bộ lâu dài`,new:`Tác vụ mới`,emptyTitle:`Chưa có tác vụ công việc`,empty:`Tác vụ công việc của bạn sẽ xuất hiện ở đây sau khi bạn gửi tin nhắn đầu tiên.`,untitled:`Tác vụ chưa đặt tên`,actions:`Thao tác tác vụ`,delete:`Xóa tác vụ`,deleteNamed:`Xóa {{title}}`,deleteConfirm:`Xóa vĩnh viễn “{{title}}” và không gian làm việc của tác vụ này?`,close:`Đóng tác vụ công việc`,open:`Mở tác vụ công việc`,rename:`Tên tác vụ`,loading:`Đang tải tác vụ…`,notFound:`Tác vụ công việc này không khả dụng`,back:`Bắt đầu tác vụ mới`,status:`Trạng thái: {{status}}`},landing:{title:`Bắt đầu tác vụ công việc mới`,description:`Cung cấp cho mô hình cục bộ hoặc mô hình của nhà cung cấp đã cấu hình một không gian làm việc lâu dài và biệt lập. Mô hình có thể kiểm tra tệp, chạy công cụ và tiếp tục từ vị trí cũ khi bạn quay lại.`,isolated:`Biệt lập`,isolatedBody:`Mỗi tác vụ có vùng chứa và tệp riêng.`,durable:`Lâu dài`,durableBody:`Quay lại cuộc trò chuyện và không gian làm việc sau.`,controlled:`Được kiểm soát`,controlledBody:`Môi trường chạy và tệp tác vụ được biệt lập khỏi máy chủ.`},composer:{placeholder:`Mô tả nội dung bạn muốn tạo hoặc thay đổi…`,model:`Mô hình công việc`,noModels:`Không có mô hình tương thích với chế độ Công việc`,cancel:`Dừng`,send:`Chạy`,hint:`Mỗi tác vụ lưu tệp và lịch sử riêng. Hãy xem lại đầu ra của mô hình trước khi sử dụng.`,remoteTitle:`Nhà cung cấp từ xa`,remoteHint:`Cuộc trò chuyện và đầu ra công cụ được gửi đến dịch vụ đã cấu hình. Một lượt chạy tự động có thể gọi nhà cung cấp nhiều lần và phát sinh chi phí. Tệp trong không gian làm việc vẫn ở cục bộ trừ khi công cụ trả về nội dung của tệp.`,remoteDismiss:`Đóng`,remoteDismissLabel:`Đóng thông báo về nhà cung cấp từ xa`,remoteDismissFailed:`Không thể lưu tùy chọn nhà cung cấp từ xa.`,noModelSelected:`Chưa chọn mô hình tương thích với chế độ Công việc.`},conversation:{ready:`Không gian làm việc đã sẵn sàng`,empty:`Tiếp tục tác vụ bên dưới. Cuộc trò chuyện và các tệp vẫn được gắn với không gian làm việc này.`,loadOlder:`Tải tin nhắn cũ hơn`},status:{preparing:`Đang chuẩn bị không gian làm việc biệt lập…`,running:`Đang làm việc trong không gian cục bộ…`},statusLabels:{idle:`Đang chờ`,thinking:`Đang suy nghĩ`,complete:`Hoàn tất`,needsInput:`Cần nhập liệu`,error:`Lỗi`},live:{connecting:`Đang kết nối với cập nhật trực tiếp…`,reconnecting:`Đang kết nối lại với cập nhật trực tiếp…`,unavailable:`Cập nhật trực tiếp không khả dụng`,newActivity:`Hoạt động mới`,skillsLoaded:`Kỹ năng không gian làm việc · {{count}}`},runtime:{unavailable:`Môi trường chạy không khả dụng`,ready:`Môi trường chạy đã sẵn sàng`,readyOllama:`Docker đã sẵn sàng`,readyPlugin:`Docker + plugin đã sẵn sàng`,readyHybrid:`Docker + mô hình đã sẵn sàng`,reason:`Cần có Docker và nhà cung cấp mô hình Ollama hoặc plugin khả dụng.`},workspace:{label:`Chế độ xem không gian làm việc`,files:`Tệp`,activity:`Hoạt động`,preview:`Xem trước`,resize:`Đổi kích thước cuộc trò chuyện và không gian làm việc`,resizeHint:`Kéo để đổi kích thước. Dùng phím mũi tên để điều chỉnh chính xác. Nhấp đúp hoặc nhấn Enter để đặt lại.`,splitSize:`Cuộc trò chuyện {{conversation}}%, không gian làm việc {{workspace}}%`,terminal:`Terminal`,git:`Git`},files:{discard:`Bỏ các thay đổi tệp chưa lưu?`,leaveWithDraft:`Rời khỏi tệp này? Nội dung chỉnh sửa chưa lưu sẽ được giữ dưới dạng bản nháp trong trình duyệt.`,up:`Thư mục mẹ`,back:`Quay lại tệp`,empty:`Thư mục này chưa có tệp.`,select:`Chọn một tệp để kiểm tra và chỉnh sửa.`,editorLabel:`Trình sửa tệp: {{path}}`,format:`Định dạng`,formatted:`Đã định dạng mã.`,formatFailed:`Không thể định dạng tệp này.`,formatShortcut:`Định dạng (Shift+Alt+F)`,formatTooLarge:`Chỉ có thể định dạng tệp dưới 100.000 ký tự và 4.000 dòng.`,formatUnsupported:`Không hỗ trợ định dạng loại tệp này.`,saveShortcut:`Lưu (⌘/Ctrl+S)`,highlightPaused:`Tính năng tô sáng trực tiếp bị tạm dừng với tệp lớn để duy trì tốc độ chỉnh sửa.`,plainTextLarge:`Văn bản thuần · tệp lớn`,changes:`Thay đổi`,changesSince:`Những gì đã thay đổi kể từ lượt trước`,diffLabel:`Thay đổi kể từ lượt trước: {{path}}`,diffFolded:`{{count}} dòng không thay đổi`},activity:{empty:`Lệnh, thao tác tệp và kết quả công cụ sẽ xuất hiện ở đây.`,toolActivity:`Hoạt động công cụ`,details:`Chi tiết`,kinds:{message:`Tin nhắn`,toolCall:`Lệnh gọi công cụ`,toolResult:`Kết quả công cụ`,error:`Lỗi`}},preview:{command:`Lệnh khởi động không bắt buộc`,start:`Bắt đầu xem trước`,stop:`Dừng xem trước`,open:`Mở`,starting:`Đang bắt đầu xem trước…`,frameTitle:`Xem trước không gian làm việc`,failed:`Không thể bắt đầu bản xem trước. Hãy kiểm tra Hoạt động rồi thử một lệnh khác.`,empty:`Khởi động ứng dụng trong không gian làm việc này để kiểm tra tại đây.`},mobile:{surface:`Chế độ xem tác vụ`,conversation:`Cuộc trò chuyện`,workspace:`Không gian làm việc`},toasts:{runFailed:`Không thể bắt đầu tác vụ công việc.`,updateFailed:`Không thể cập nhật tác vụ này.`,renameFailed:`Không thể đổi tên tác vụ này.`,cancelled:`Đã dừng lượt chạy công việc.`,cancelFailed:`Không thể dừng lượt chạy công việc.`,deleteFailed:`Không thể xóa tác vụ công việc này.`,saveFailed:`Không thể lưu tệp này.`,saved:`Đã lưu tệp.`,previewFailed:`Không thể bắt đầu bản xem trước.`,previewStopFailed:`Không thể dừng bản xem trước.`},terminal:{connecting:`Đang mở shell trong hộp cát…`,closed:`Phiên terminal đã kết thúc.`,failed:`Không thể bắt đầu phiên terminal.`,reconnect:`Kết nối lại`,unavailable:`Terminal tương tác không khả dụng trong bản triển khai này.`,blockedByRun:`Mô hình đang dùng vùng chứa này. Terminal sẽ mở khi lượt kết thúc.`,taskRunning:`Lượt của mô hình đang chạy`},policy:{label:`Chính sách runtime`,default:`Mặc định (giới hạn toàn cục)`},git:{actionFailed:`Hành động Git thất bại.`,blockedByPreview:`Dừng bản xem trước trước khi thay đổi trạng thái Git.`,blockedByRun:`Hành động ghi Git sẽ mở khóa khi lượt của mô hình kết thúc.`,branchCreated:`Đã tạo {{name}}.`,branchSwitched:`Đã chuyển sang {{name}}.`,clean:`Cây làm việc sạch.`,commit:`Commit các thay đổi đã stage`,commitMessage:`Thông điệp commit`,committed:`Đã tạo commit.`,detached:`HEAD tách rời`,diff:`Xem trước diff`,diffFailed:`Không thể tải diff này.`,history:`Lịch sử cục bộ`,initialize:`Khởi tạo Git`,initializeDescription:`Tạo kho cục bộ cho trạng thái, diff, nhánh và commit. Không kết nối thông tin xác thực từ xa.`,initialized:`Đã khởi tạo kho Git.`,loadFailed:`Không thể tải trạng thái Git.`,localOnly:`Chỉ Git cục bộ. Push, pull và pull request cần một trung gian thông tin xác thực đáng tin cậy riêng.`,newBranch:`Nhánh cục bộ mới`,noCommits:`Chưa có commit.`,noDiff:`Chưa có diff văn bản. Tệp chưa theo dõi sẽ hiện sau khi stage.`,notInitialized:`Git chưa được khởi tạo`,selectChange:`Chọn một tệp đã thay đổi để xem diff.`,selectPath:`Chọn {{path}}`,stageAll:`Stage tất cả`,stageSelected:`Stage {{count}}`,staged:`Đã stage thay đổi.`,switchBranch:`Chuyển nhánh cục bộ`,changes:`Thay đổi`,createBranch:`Tạo`,filterFiles:`Lọc các tệp đã thay đổi`,noFilterMatches:`Không có tệp thay đổi nào khớp với bộ lọc này.`,allChanges:`Tất cả thay đổi`,diffTruncated:`Diff này đã bị cắt bớt.`,binaryFile:`Tệp nhị phân, không có diff văn bản.`},hostWorkspace:{hint:`Để trống cho không gian làm việc cô lập, hoặc trỏ tác vụ tới một thư mục trên máy này.`,label:`Thư mục không gian làm việc (tùy chọn)`,warning:`Tác vụ có thể đọc và ghi thư mục này trực tiếp. Để trống để dùng không gian cô lập.`}},usageAnalytics:{eyebrow:`Quản trị`,title:`Mức sử dụng nhà cung cấp`,description:`Theo dõi các cuộc gọi API gửi đi và mức tiêu thụ mô hình trên các plugin đã bật trong phiên bản này.`,days:`{{count}} ngày`,refresh:`Làm mới mức sử dụng`,loadFailed:`Không thể tải mức sử dụng của nhà cung cấp.`,metrics:{calls:`Cuộc gọi`,tokens:`Token`},cards:{calls:`Cuộc gọi API`,callsDetail:`Trên {{count}} người dùng đang hoạt động`,tokens:`Token đã báo cáo`,tokensDetail:`Mức sử dụng được báo cáo trên {{count}} cuộc gọi`,success:`Tỷ lệ thành công`,successDetail:`{{count}} cuộc gọi thất bại`,latency:`Độ trễ trung bình`,latencyDetail:`Thời gian nhà cung cấp từ đầu đến cuối`},activity:{title:`Mức sử dụng theo thời gian`,callsDescription:`Yêu cầu gửi đi hàng ngày tới các plugin đã bật`,tokensDescription:`Tổng token hàng ngày được báo cáo bởi nhà cung cấp`,chartLabel:`Biểu đồ {{metric}} nhà cung cấp hàng ngày`},models:{title:`Mức sử dụng theo mô hình`,description:`Các mô hình có lượng truy cập cao nhất trong giai đoạn này.`,model:`Mô hình`,success:`Thành công`,latency:`Độ trễ`},providers:{title:`Lưu lượng plugin đã bật`},capabilities:{title:`Phân bổ khả năng`,characters:`{{count}} ký tự`,bytes:`{{count}} byte`,images:`{{count}} hình ảnh`,jobs:`{{count}} tác vụ video`,inputs:`{{count}} đầu vào`,reportedTokens:`{{count}} token đã báo cáo`},empty:{title:`Chưa có lệnh gọi nhà cung cấp`,description:`Các lệnh gọi sẽ hiển thị tại đây sau khi một plugin đã bật xử lý yêu cầu trò chuyện, Work, nhúng, hình ảnh, giọng nói, âm thanh hoặc video.`},privacyNote:`Mức sử dụng được đo trên máy chủ tại ranh giới plugin gửi đi. Libre WebUI lưu trữ nhà cung cấp, mô hình, thời gian, trạng thái và bộ đếm đã báo cáo—không bao gồm lời nhắc, phản hồi, điểm cuối, thông tin xác thực hoặc nội dung lỗi của nhà cung cấp. Tổng token chỉ bao gồm các lệnh gọi mà nhà cung cấp trả về siêu dữ liệu sử dụng.`,heatmap:{title:`Một năm hoạt động`,description:`Lượt gọi nhà cung cấp hằng ngày trong năm qua, tô màu theo mô hình được dùng nhiều nhất mỗi ngày.`,calls:`lượt gọi`,noCalls:`Không có lượt gọi`,other:`Mô hình khác`,less:`Ít`,more:`Nhiều`,yearTotal:`{{formatted}} lượt gọi trong năm qua`}},systemPage:{eyebrow:`Quản trị`,title:`Hệ thống`,description:`Giám sát máy và môi trường chạy lưu trữ phiên bản Libre WebUI này.`,updated:`Đã cập nhật {{date}}`,refresh:`Làm mới thông tin hệ thống`,loadFailed:`Không thể tải thông tin hệ thống.`,cards:{uptime:`Thời gian hoạt động máy chủ`,uptimeDetail:`Hoạt động từ {{date}}`,memory:`Bộ nhớ đã dùng`,memoryDetail:`{{used}} trên {{total}}`,freeSpace:`Không gian trống`,freeSpaceDetail:`{{label}} · {{total}} tổng`,containers:`Container đang chạy`,containersDetail:`{{total}} container được Docker nhận biết`,dockerUnavailable:`Docker không khả dụng`,unavailable:`Không khả dụng`},host:{title:`Máy chủ & môi trường chạy`,description:`Hệ điều hành, bộ xử lý và chi tiết tiến trình Libre WebUI.`,container:`Môi trường chạy container`,native:`Runtime gốc`,hostname:`Tên máy chủ`,operatingSystem:`Hệ điều hành`,processor:`Bộ xử lý`,logicalCpus:`CPU logic`,loadAverage:`Tải trung bình · 1 / 5 / 15 phút`,libreVersion:`Libre WebUI`,nodeVersion:`Node.js`,process:`Tiến trình`,workingDirectory:`Thư mục làm việc`},memory:{title:`Bộ nhớ`,description:`Bộ nhớ hệ thống hiển thị trong runtime và mức sử dụng tiến trình ứng dụng.`,usedOf:`Đã dùng {{used}} trên {{total}}`,free:`{{value}} trống`,processRss:`RSS tiến trình`,heapUsed:`V8 heap đã dùng`,heapTotal:`Tổng V8 heap`,external:`Bộ nhớ ngoài`},storage:{title:`Lưu trữ`,description:`Dung lượng khả dụng cho hệ thống tệp runtime và dữ liệu ứng dụng cố định.`,used:`Đã dùng {{value}}`,free:`{{value}} trống`,empty:`Thông tin hệ thống tệp không có sẵn trong runtime này.`},docker:{title:`Docker`,description:`Trạng thái Docker Engine chỉ đọc và danh sách rút gọn các container.`,connected:`Đã kết nối`,unavailable:`Không khả dụng`,unavailableDetail:`Không thể chẩn đoán Docker Engine.`,socketStatus:`Socket cục bộ: {{status}}`,mounted:`đã gắn`,notMounted:`chưa gắn`,running:`Đang chạy`,stopped:`Đã dừng`,paused:`Đã tạm dừng`,total:`Tổng`,version:`Phiên bản`,host:`Máy chủ`,architecture:`Kiến trúc`,cpus:`CPU`,memory:`Bộ nhớ`,container:`Container`,image:`Image`,state:`Trạng thái`,created:`Đã tạo`,empty:`Docker đã được kết nối và hiện không có container nào được liệt kê.`},network:{title:`Mạng`,description:`Các giao diện, địa chỉ hiển thị trong thời gian chạy và bộ đếm lưu lượng Linux.`,internal:`nội bộ`,empty:`Không có giao diện mạng nào hiển thị với thời gian chạy của ứng dụng.`},securityNote:`Trang này chỉ dành cho quản trị viên. Máy chủ chỉ trả về tóm tắt hoạt động: nó không tiết lộ biến môi trường, thông tin xác thực, nhãn Docker, điểm gắn kết, lệnh container hoặc payload kiểm tra. Khi Libre WebUI chạy trong container, chi tiết CPU và bộ nhớ cấp máy chủ đến từ Docker Engine khi socket cục bộ của nó khả dụng; các giá trị khác mô tả thời gian chạy của ứng dụng.`,work:{title:`Work`,description:`Sandbox của mọi người dùng`,access:`Quyền truy cập`,accessAdmins:`Chỉ quản trị viên`,accessAllUsers:`Tất cả người dùng`,runtimeAvailable:`Khả dụng`,runtimeUnavailable:`Không khả dụng`,activeRuntimes:`Môi trường đang hoạt động`,pendingCleanups:`Dọn dẹp đang chờ`,orphans:`Container mồ côi`,owner:`Chủ sở hữu`,task:`Tác vụ`,state:`Trạng thái`,preview:`Xem trước`,terminals:`Terminal`,updated:`Đã cập nhật`,stateRunning:`Đang chạy`,stateStopped:`Đã dừng`,stateStarting:`Đang khởi động`,stateUnknown:`Không rõ`,noTasks:`Chưa có tác vụ Work nào.`}},mediaGeneration:{title:`Tạo phương tiện`,description:`Tạo video, âm thanh, nhạc hoặc giọng nói với nhà cung cấp phương tiện đã kích hoạt.`,image:`Hình ảnh`,video:`Video`,audio:`Âm thanh`,sound:`Âm thanh`,speech:`Giọng nói`,model:`Mô hình`,voice:`Giọng nói hoặc ID giọng nói`,cloneVoice:`Sao chép giọng tham chiếu`,cloneVoiceDescription:`Tạo lời nói này dựa trên bản ghi tham chiếu thay vì giọng đặt sẵn.`,referenceAudio:`Âm thanh tham chiếu`,referenceTranscript:`Bản chép lời tham chiếu chính xác`,referenceTranscriptPlaceholder:`Nhập chính xác nội dung được nói trong bản ghi tham chiếu…`,referenceAudioTooLarge:`Âm thanh tham chiếu phải có dung lượng {{max}} trở xuống.`,cloneConsent:`Chỉ sao chép giọng khi bạn có sự cho phép của người nói. Bản ghi được gửi đến nhà cung cấp đã chọn cho lần tạo này và Libre WebUI không lưu bản ghi.`,saveVoiceProfile:`Lưu làm giọng có thể tái sử dụng`,saveVoiceProfileDescription:`Lưu an toàn bản ghi tham chiếu và bản chép lời này. Libre WebUI gửi chúng đến nhà cung cấp đã chọn cho mỗi lô Giọng nói sử dụng giọng này.`,voiceProfileName:`Tên giọng đã lưu`,voiceProfileNamePlaceholder:`Ví dụ: Giọng của tôi`,voiceStorageConsent:`Tôi xác nhận đã được người nói cho phép sao chép và lưu giọng này. Bản tham chiếu sẽ được lưu cho đến khi tôi xóa.`,successWithSavedVoice:`Đã tạo nội dung và “{{name}}” hiện có trong cài đặt Giọng nói`,resolution:`Độ phân giải`,aspectRatio:`Tỷ lệ khung hình`,duration:`Thời lượng`,providerDefault:`Mặc định của nhà cung cấp`,generateAudio:`Tạo âm thanh cùng với video khi được hỗ trợ`,prompt:`Lời nhắc`,text:`Văn bản để đọc`,videoPlaceholder:`Mô tả cảnh, chuyển động, góc máy và ánh sáng...`,audioPlaceholder:`Nhập văn bản bạn muốn giọng nói đọc...`,soundPlaceholder:`Mô tả âm thanh, nhạc, bầu không khí hoặc phản hồi bằng giọng nói mà bạn muốn...`,generate:`Tạo`,generating:`Đang tạo… việc này có thể mất vài phút`,success:`Đã tạo phương tiện và lưu vào Imagine`,failed:`Không thể tạo phương tiện`,loadFailed:`Không thể tải nhà cung cấp phương tiện`,noModels:`Không có mô hình {{kind}} nào khả dụng. Kích hoạt nhà cung cấp tương thích và lưu thông tin xác thực của nó trước.`},mediaGallery:{itemCount:`{{count}} mục`,empty:`Chưa có phương tiện nào được tạo`,emptyHint:`Tạo hình ảnh, video hoặc đoạn giọng nói và nó sẽ hiển thị tại đây.`,filters:{all:`Tất cả`,image:`Hình ảnh`,video:`Video`,audio:`Âm thanh`}},whatsNew:{title:`Có gì mới`,releaseNotes:`Ghi chú phát hành`,cta:`Được rồi, bắt đầu thôi`},notes:{title:`Ghi chú`,new:`Ghi chú mới`,untitled:`Không có tiêu đề`,empty:`Chưa có ghi chú nào`,selectOrCreate:`Chọn một ghi chú hoặc tạo mới`,contentPlaceholder:`Viết bằng Markdown…`,saved:`Đã lưu`,saveFailed:`Không thể lưu ghi chú`,createFailed:`Không thể tạo ghi chú`,deleteConfirm:`Xóa ghi chú này?`,deleteFailed:`Không thể xóa ghi chú`},home:{active:`đang hoạt động`,continue:`Tiếp tục`,start:`Bắt đầu`,explore:`Khám phá`},palette:{empty:`Không có kết quả.`,placeholder:`Tìm chat, Work, hành động…`,toggleTheme:`Đổi giao diện`,actions:`Hành động`,chats:`Cuộc trò chuyện`,search:`Tìm kiếm`,settings:`Cài đặt`,work:`Công việc`},tabs:{actions:`Hành động thẻ`,close:`Đóng thẻ`,closeAll:`Đóng tất cả thẻ`,closeOthers:`Đóng các thẻ khác`,closeRight:`Đóng các thẻ bên phải`,home:`Trang chủ`,label:`Thẻ đang mở`,new:`Thẻ mới`,newWork:`Work mới`,chat:`Trò chuyện`,newChat:`Cuộc trò chuyện mới`,work:`Công việc`}};export{e as default};
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/authStore-Dh3beEOq.js","js/rolldown-runtime-hePW80VL.js","js/router-vendor-Ca9zqOqT.js","js/markdown-core-DHnR5Hw8.js","js/chatStore-CDeYWL_q.js","js/i18next-DgmgtwsV.js","js/utils-BM0_0iFj.js","js/utils-vendor-1zob7nK9.js","js/ui-vendor-xUzKqAXI.js","js/logger-DSXjF4ye.js","js/api-CLEmGcEh.js","js/config-DkV1ka7I.js","js/appStore-CGdhvp9P.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-Ca9zqOqT.js";import{a as r}from"./utils-vendor-1zob7nK9.js";import{i,t as a}from"./logger-DSXjF4ye.js";import{n as o,t as s}from"./config-DkV1ka7I.js";var c=a(`api`);o(),c.debug(`User agent:`,navigator.userAgent),c.debug(`Demo mode detected:`,i());var l=(e,t=!0)=>new Promise(n=>{setTimeout(()=>{n({success:t,data:e,error:t?void 0:`Demo mode: Backend not available`})},500)}),u=r.create({baseURL:s,timeout:3e5});u.interceptors.request.use(e=>{let t=localStorage.getItem(`auth-token`);return t&&(e.headers.Authorization=`Bearer ${t}`),e},e=>Promise.reject(e)),u.interceptors.response.use(e=>e,e=>{if(e.response?.status===401){c.warn(`Session expired or unauthorized, logging out...`),localStorage.removeItem(`auth-token`),t(async()=>{let{useAuthStore:e}=await import(`./authStore-Dh3beEOq.js`).then(e=>e.t);return{useAuthStore:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])).then(({useAuthStore:e})=>{e.getState().logout()});let e=window.location.protocol===`file:`;return(e?window.location.hash:window.location.pathname).includes(`/login`)||(window.location.href=e?`#/login`:`/login`),Promise.reject(Error(`Session expired`))}return e.response?.status===403&&(e.config?.url??``).startsWith(`/work`)&&e.config?.url!==`/work/access`&&t(async()=>{let{useAuthStore:e}=await import(`./authStore-Dh3beEOq.js`).then(e=>e.t);return{useAuthStore:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])).then(({useAuthStore:e})=>{e.getState().refreshWorkAccess()}),c.error(`API Error:`,e),Promise.reject(e)});var d=new Set([`snapshot`,`run_state`,`reasoning_delta`,`assistant_delta`,`tool_call`,`tool_result`,`usage`,`skill_loaded`,`error`,`done`]),f=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,p=e=>{if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e==`string`){let t=Number(e);if(Number.isFinite(t))return t;let n=Date.parse(e);if(Number.isFinite(n))return n}return Date.now()},m=(e,t,n,r,i)=>{let a=f(e);if(!a)return;let o=Number(a.id??t),s=String(a.type??n??``),c=String(a.taskId??r),l=String(a.runId??i);if(!Number.isSafeInteger(o)||o<0||!d.has(s)||c!==r||l!==i)return;let u=a.data;return{id:o,type:s,taskId:c,runId:l,timestamp:p(a.timestamp),data:f(u)||(u===void 0?{}:{content:u})}},h=(e,t,n)=>{let r,i,a=[];for(let t of e.split(`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["js/authStore-OaTuapL7.js","js/rolldown-runtime-hePW80VL.js","js/router-vendor-CbPDks39.js","js/markdown-core-BmPPZiuD.js","js/chatStore-DXGUVLXD.js","js/i18next-DgmgtwsV.js","js/utils-CuC1beTY.js","js/utils-vendor-BBa8OxtB.js","js/ui-vendor-D3Ahl1x5.js","js/logger-DSXjF4ye.js","js/api-IzobHGND.js","js/config-DPEEuTAe.js","js/appStore-DKwC2vgn.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{a as r}from"./utils-vendor-BBa8OxtB.js";import{i,t as a}from"./logger-DSXjF4ye.js";import{n as o,t as s}from"./config-DPEEuTAe.js";var c=a(`api`);o(),c.debug(`User agent:`,navigator.userAgent),c.debug(`Demo mode detected:`,i());var l=(e,t=!0)=>new Promise(n=>{setTimeout(()=>{n({success:t,data:e,error:t?void 0:`Demo mode: Backend not available`})},500)}),u=r.create({baseURL:s,timeout:3e5});u.interceptors.request.use(e=>{let t=localStorage.getItem(`auth-token`);return t&&(e.headers.Authorization=`Bearer ${t}`),e},e=>Promise.reject(e)),u.interceptors.response.use(e=>e,e=>{if(e.response?.status===401){c.warn(`Session expired or unauthorized, logging out...`),localStorage.removeItem(`auth-token`),t(async()=>{let{useAuthStore:e}=await import(`./authStore-OaTuapL7.js`).then(e=>e.t);return{useAuthStore:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])).then(({useAuthStore:e})=>{e.getState().logout()});let e=window.location.protocol===`file:`;return(e?window.location.hash:window.location.pathname).includes(`/login`)||(window.location.href=e?`#/login`:`/login`),Promise.reject(Error(`Session expired`))}return e.response?.status===403&&(e.config?.url??``).startsWith(`/work`)&&e.config?.url!==`/work/access`&&t(async()=>{let{useAuthStore:e}=await import(`./authStore-OaTuapL7.js`).then(e=>e.t);return{useAuthStore:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])).then(({useAuthStore:e})=>{e.getState().refreshWorkAccess()}),c.error(`API Error:`,e),Promise.reject(e)});var d=new Set([`snapshot`,`run_state`,`reasoning_delta`,`assistant_delta`,`tool_call`,`tool_result`,`usage`,`skill_loaded`,`error`,`done`]),f=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,p=e=>{if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e==`string`){let t=Number(e);if(Number.isFinite(t))return t;let n=Date.parse(e);if(Number.isFinite(n))return n}return Date.now()},m=(e,t,n,r,i)=>{let a=f(e);if(!a)return;let o=Number(a.id??t),s=String(a.type??n??``),c=String(a.taskId??r),l=String(a.runId??i);if(!Number.isSafeInteger(o)||o<0||!d.has(s)||c!==r||l!==i)return;let u=a.data;return{id:o,type:s,taskId:c,runId:l,timestamp:p(a.timestamp),data:f(u)||(u===void 0?{}:{content:u})}},h=(e,t,n)=>{let r,i,a=[];for(let t of e.split(`
3
3
  `)){if(!t||t.startsWith(`:`))continue;let e=t.indexOf(`:`),n=e===-1?t:t.slice(0,e),o=e===-1?``:t.slice(e+1),s=o.startsWith(` `)?o.slice(1):o;n===`id`&&(r=s),n===`event`&&(i=s),n===`data`&&a.push(s)}if(a.length===0)return;let o=a.join(`
4
4
  `);if(o===`[DONE]`)return m({id:r,type:`done`,taskId:t,runId:n,timestamp:Date.now(),data:{}},r,i,t,n);try{return m(JSON.parse(o),r,i,t,n)}catch{return}},g=class{constructor(e,t,r){n(this,`taskId`,void 0),n(this,`runId`,void 0),n(this,`onEvent`,void 0),n(this,`buffer`,``),this.taskId=e,this.runId=t,this.onEvent=r}push(e){e&&(this.buffer+=e,this.drain())}finish(e=``){if(this.buffer+=e,this.drain(),!this.buffer.trim()){this.buffer=``;return}let t=h(this.buffer.replace(/\r\n?/g,`
5
5
  `),this.taskId,this.runId);this.buffer=``,t&&this.onEvent(t)}drain(){let e=/\r?\n\r?\n/.exec(this.buffer);for(;e?.index!==void 0;){let t=this.buffer.slice(0,e.index).replace(/\r\n?/g,`
@@ -1,4 +1,4 @@
1
- import{_ as e,h as t,m as n,p as r}from"./router-vendor-Ca9zqOqT.js";var i,a=Object.defineProperty,o=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},s={};o(s,{__parsePrettierYamlConfig:()=>Ts,languages:()=>Gt,options:()=>qt,parsers:()=>Jt,printers:()=>ws});var c=(e,t)=>(n,r,...i)=>n|1&&r==null?void 0:(t.call(r)??r[e]).apply(r,i);function l(e){return this[e<0?this.length+e:e]}var u=c(`at`,function(){if(Array.isArray(this)||typeof this==`string`)return l}),d=String.prototype.replaceAll??function(e,t){return e.global?this.replace(e,t):this.split(e).join(t)},f=c(`replaceAll`,function(){if(typeof this==`string`)return d}),p=()=>{},m=`string`,h=`array`,g=`cursor`,_=`indent`,v=`align`,y=`trim`,b=`group`,x=`fill`,S=`if-break`,ee=`indent-if-break`,te=`line-suffix`,ne=`line-suffix-boundary`,re=`line`,ie=`label`,ae=`break-parent`,oe=new Set([g,_,v,y,b,x,S,ee,te,ne,re,ie,ae]);function se(e,t,n){if(!e.has(t)){let r=n(t);e.set(t,r)}return e.get(t)}function ce(e){if(typeof e==`string`)return m;if(Array.isArray(e))return h;if(!e)return;let{type:t}=e;if(oe.has(t))return t}var le=ce,ue=e=>new Intl.ListFormat(`en-US`,{type:`disjunction`}).format(e);function de(e){let t=e===null?`null`:typeof e;if(t!==`string`&&t!==`object`)return`Unexpected doc '${t}',
1
+ import{_ as e,h as t,m as n,p as r}from"./router-vendor-CbPDks39.js";var i,a=Object.defineProperty,o=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},s={};o(s,{__parsePrettierYamlConfig:()=>Ts,languages:()=>Gt,options:()=>qt,parsers:()=>Jt,printers:()=>ws});var c=(e,t)=>(n,r,...i)=>n|1&&r==null?void 0:(t.call(r)??r[e]).apply(r,i);function l(e){return this[e<0?this.length+e:e]}var u=c(`at`,function(){if(Array.isArray(this)||typeof this==`string`)return l}),d=String.prototype.replaceAll??function(e,t){return e.global?this.replace(e,t):this.split(e).join(t)},f=c(`replaceAll`,function(){if(typeof this==`string`)return d}),p=()=>{},m=`string`,h=`array`,g=`cursor`,_=`indent`,v=`align`,y=`trim`,b=`group`,x=`fill`,S=`if-break`,ee=`indent-if-break`,te=`line-suffix`,ne=`line-suffix-boundary`,re=`line`,ie=`label`,ae=`break-parent`,oe=new Set([g,_,v,y,b,x,S,ee,te,ne,re,ie,ae]);function se(e,t,n){if(!e.has(t)){let r=n(t);e.set(t,r)}return e.get(t)}function ce(e){if(typeof e==`string`)return m;if(Array.isArray(e))return h;if(!e)return;let{type:t}=e;if(oe.has(t))return t}var le=ce,ue=e=>new Intl.ListFormat(`en-US`,{type:`disjunction`}).format(e);function de(e){let t=e===null?`null`:typeof e;if(t!==`string`&&t!==`object`)return`Unexpected doc '${t}',
2
2
  Expected it to be 'string' or 'object'.`;if(le(e))throw Error(`doc is valid.`);let n=Object.prototype.toString.call(e);if(n!==`[object Object]`)return`Unexpected doc '${n}'.`;let r=ue([...oe].map(e=>`'${e}'`));return`Unexpected doc.type '${e.type}'.
3
3
  Expected it to be ${r}.`}var fe=class extends Error{constructor(e){((...e)=>(super(...e),r(this,`name`,`InvalidDocError`),this))(de(e)),this.doc=e}};function pe(e,t){if(typeof e==`string`)return t(e);let n=new Map;return r(e);function r(e){return se(n,e,i)}function i(e){switch(le(e)){case h:return t(e.map(r));case x:return t({...e,parts:e.parts.map(r)});case S:return t({...e,breakContents:r(e.breakContents),flatContents:r(e.flatContents)});case b:{let{expandedStates:n,contents:i}=e;return n?(n=n.map(r),i=n[0]):i=r(i),t({...e,contents:i,expandedStates:n})}case v:case _:case ee:case ie:case te:return t({...e,contents:r(e.contents)});case m:case g:case y:case ne:case re:case ae:return t(e);default:throw new fe(e)}}}function me(e,t=Ae){return pe(e,e=>typeof e==`string`?C(t,e.split(`
4
4
  `)):e)}var he=p,ge=p,_e=p,ve=p;function ye(e,t){return ve(e),he(t),{type:v,contents:t,n:e}}function be(e){return ye(-1/0,e)}function xe(e){return ye({type:`root`},e)}function Se(e){return ye(-1,e)}var Ce={type:ae};function we(e){return _e(e),{type:x,parts:e}}function Te(e,t={}){return he(e),ge(t.expandedStates,!0),{type:b,id:t.id,contents:e,break:!!t.shouldBreak,expandedStates:t.expandedStates}}function Ee(e,t){return Te(e[0],{...t,expandedStates:e})}function De(e,t=``,n={}){return he(e),t!==``&&he(t),{type:S,breakContents:e,flatContents:t,groupId:n.groupId}}function C(e,t){he(e),ge(t);let n=[];for(let r=0;r<t.length;r++)r!==0&&n.push(e),n.push(t[r]);return n}var Oe={type:re},ke={type:re,soft:!0},w=[{type:re,hard:!0},Ce],Ae=[{type:re,hard:!0,literal:!0},Ce];function je(e){return he(e),{type:te,contents:e}}function Me(e){return(t,n,r)=>{if(n===!1)return!1;let i=!!r?.backwards,{length:a}=t,o=n;for(;o>=0&&o<a;){let n=t.charAt(o);if(e instanceof RegExp){if(!e.test(n))return o}else if(!e.includes(n))return o;i?o--:o++}return o===-1||o===a?o:!1}}var Ne=Me(` `),Pe=e=>e===`
@@ -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:`登录失败,请检查您的凭据。`,enterBoth:`请输入用户名和密码`,githubSuccess:`GitHub 登录成功!`,githubFailed:`GitHub 认证失败`,githubVerifyFailed:`GitHub 认证验证失败`,approvalPending:`您的账户正在等待管理员批准。`,verificationFailed:`安全验证失败。请刷新页面后重试。`},signup:{title:`创建账户`,subtitle:`注册新账户`,username:`用户名`,usernamePlaceholder:`请选择用户名`,email:`电子邮箱`,emailPlaceholder:`your@email.com`,password:`密码`,passwordPlaceholder:`请选择密码`,confirmPassword:`确认密码`,confirmPasswordPlaceholder:`请再次输入密码`,createAccount:`创建账户`,creatingAccount:`创建账户中...`,hasAccount:`已有账户?`,signInHere:`点击登录`,signupSuccess:`账户创建成功!`,signupFailed:`注册失败`,tryAgain:`注册失败,请重试。`,usernameRequired:`用户名和密码为必填项`,passwordMismatch:`两次输入的密码不一致`,passwordTooShort:`密码长度至少为6个字符`,approvalPending:`已收到注册申请。需要管理员批准您的账户。`,awaitingApproval:`等待批准`,awaitingApprovalDescription:`您的账户已创建,但需要管理员激活后才能登录。`,backToSignIn:`返回登录`},logout:{button:`退出登录`,success:`已成功退出登录`},oauth:{continueWith:`使用 {{provider}} 继续`,connectingTo:`正在连接 {{provider}}...`,github:`GitHub`,huggingFace:`Hugging Face`},checkingAuth:`正在检查认证...`,welcome:`欢迎`,noEmail:`未提供邮箱`,role:`角色`,id:`ID`,userId:`用户 ID`,signInDescription:`使用 GitHub 账户登录以继续`,signInWithGitHub:`使用 GitHub 登录`,jwtActive:`JWT 认证已激活`,jwtDescription:`基于 JWT 的 GitHub OAuth 认证`,github:`GitHub`,provider:`提供商`,tagline:`你的 AI 技术栈应由你掌控。`,selfHosted:`自托管 · Apache 2.0`,highlights:{local:{title:`本地优先`,body:`你的对话和文件保留在你运行此程序的机器上。`},providers:{title:`任意提供商`,body:`通过 Ollama 使用本地模型,以及你选择添加的远程提供商。`},work:{title:`隔离工作区`,body:`为模型提供一个包含文件、终端和预览的沙盒工作区。`}}},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:`请输入密码(至少6个字符)`,confirmPlaceholder:`请确认密码`,creating:`创建中...`,createAdmin:`创建管理员`,success:`管理员账户创建成功!`,failed:`创建管理员账户失败`,fillAllFields:`请填写所有字段`,note:`这将是您 Libre WebUI 实例的主管理员账户`,approvalUnexpected:`无法激活初始管理员。请重试。`},encryptionKey:{title:`保存您的加密密钥`,subtitle:`重要:请保存此密钥`,description:`此加密密钥用于保护您的敏感数据。请妥善保存——如果需要恢复数据库,您将需要它。`,warning:`警告`,warningText:`如果您丢失此密钥且需要恢复数据库,您的加密数据(API 密钥、偏好设置)将无法恢复。`,label:`您的加密密钥`,loading:`加载中...`,copyToClipboard:`复制到剪贴板`,copied:`加密密钥已复制到剪贴板!`,copyFailed:`复制密钥到剪贴板失败`,envNote:`此密钥也保存在您的 backend/.env 文件中,名为 ENCRYPTION_KEY`,acknowledgment:`我已将加密密钥保存在安全的位置,并了解丢失它可能导致数据丢失。`,confirmRequired:`请确认您已保存加密密钥`,continue:`继续使用 Libre WebUI`}},chat:{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:`为这条消息搜索网页`},session:{new:`新对话`,work:`工作`,chat:`对话`,private:`私密`,privateMode:`私密模式`,privateDescription:`此对话不会被保存`,privateTooltip:`开始一个不会被保存的私密对话`,deleteConfirm:`确定要删除此对话吗?`,generatingTitle:`正在生成标题`,noChats:`暂无对话`,createFirst:`在上方创建您的第一个对话`,chats:`对话`,renameChat:`重命名对话`,openNewTab:`在新标签页中打开`,pinChat:`固定`,unpinChat:`取消固定`,deleteChat:`删除对话`,incognito:`隐身聊天`,archiveChat:`归档聊天`,groups:{pinned:`已固定`,today:`今天`,yesterday:`昨天`,previous7Days:`过去 7 天`,previous30Days:`过去 30 天`,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:`大语言模型可能会犯错——请核实重要信息`,images:`{{count}} 张图片`,images_plural:`{{count}} 张图片`,structuredOutput:`结构化输出`},mediaUpload:{dropImagesHere:`将图片拖放到此处或`,supportedFormats:`支持格式:JPG、PNG、GIF、WebP(每张最大10MB)`,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:`上下文限制为 {{context}}(模型训练长度为 {{trained}}),以确保仍能加载。`,saved:`聊天控制已保存`,saveFailed:`无法保存聊天控制`,params:{temperature:`温度`,topP:`Top P`,topK:`Top K`,minP:`Min P`,maxTokens:`最大 Token 数`,repeatPenalty:`重复惩罚`,seed:`种子`,contextLength:`上下文长度`}},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:`上下文中的文档`}},sidebar:{navigation:{chat:`对话`,models:`模型`,personas:`角色`,imagine:`创意`,settings:`设置`,userManagement:`用户管理`,signOut:`退出登录`,agents:`智能体`,work:`工作`,exploreLabel:`探索`,usageAnalytics:`提供商使用情况`,system:`系统`,notes:`笔记`},toggleSize:`切换侧边栏大小`,expandSidebar:`展开侧边栏`},user:{menu:{changePicture:`更换头像`,settings:`设置`,userManagement:`用户管理`,logout:`退出登录`,usageAnalytics:`提供商使用情况`,system:`系统`},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":"关于"},"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":"选择模型","updateAll":"更新所有模型","updateAllDescription":"检查更新并拉取所有已安装模型的最新版本","updateAllButton":"全部更新","updating":"正在更新模型...","currentModelInfo":"当前模型信息","name":"名称","size":"大小","family":"系列","format":"格式","status":"状态","statusStarting":"启动中...","statusComplete":"完成","statusError":"错误","bulkOperations":"批量操作","autoTitle":{"title":"自动生成标题","enable":"启用自动标题","enableDescription":"自动为新对话生成标题","taskModel":"任务模型","selectTaskModel":"选择任务模型","taskModelDescription":"用于生成对话标题的模型"},"persona":"角色","updatingModel":"正在更新 {{name}} ({{current}}/{{total}})","modelsProgress":"{{total}} 个模型中的第 {{current}} 个","specializedModels":"专用模型","visionModel":"视觉模型","selectVisionModel":"使用当前聊天模型","visionModelDescription":"当发出的聊天上下文包含图像时自动使用。请选择支持图像输入的模型。","visionModelUpdateFailed":"更新视觉模型失败:{{error}}","visionModelNoProvider":"此视觉模型没有提供商标识。请选择一个可用的模型。"},"systemMessage":{"title":"系统消息","description":"设置将用于所有新对话的自定义系统消息。","placeholder":"输入系统消息...","saved":"系统消息已保存","saveFailed":"保存系统消息失败"},"plugins":{"title":"插件","description":"管理已安装的插件","addNew":"添加新插件","upload":"上传插件","addJson":"添加 JSON","uploading":"上传中...","jsonPlaceholder":"粘贴插件 JSON 配置...","install":"安装插件","noPlugins":"未安装插件","noPluginsDescription":"添加插件以扩展功能","loading":"加载插件中...","installed":"已安装插件","active":"已激活插件","activeLabel":"已激活","inactive":"未激活","activate":"激活","deactivate":"停用","models":"模型","apiKeySet":"API 密钥已设置","apiKeyConfiguration":"API 密钥配置","apiKeyEnvAlternative":"或者设置","environmentVariable":"环境变量","apiKeyConfigured":"API 密钥已配置","apiKeyPlaceholder":"输入您的 API 密钥...","saveApiKey":"保存 API 密钥","apiKey":{"title":"API 密钥","placeholder":"输入 API 密钥","save":"保存密钥","remove":"移除密钥","configured":"API 密钥已配置","notConfigured":"需要 API 密钥","saved":"API 密钥保存成功","removed":"API 密钥已移除","saveFailed":"保存 API 密钥失败","removeFailed":"移除 API 密钥失败","enterKey":"请输入 API 密钥"},"variables":"Variables","providerConnections":"提供商连接","providerConnectionsDescription":"通过插件连接、配置和检查模型提供商。","providers":"提供商","searchProviders":"搜索提供商","noProvidersFound":"没有找到匹配的提供商。","selectProvider":"选择提供商","selectProviderDescription":"选择一个提供商以检查其连接和模型目录。","apiKeyDescription":"为 {{name}} 存储个人 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":"删除插件"},"generation":{"title":"生成选项","description":"配置 AI 如何生成响应","scopeLabel":"应用于","scopeAll":"所有模型","scopeModel":"仅 {{model}}","scopeAllHint":"除非模型有自己的设置,否则所有模型都使用这些值。","scopeModelHint":"仅为该模型保存,并优先于上面的通用值。","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":"启用文档嵌入","advancedSettings":"高级生成设置","advancedSettingsDescription":"采样、Token 限制、上下文、惩罚和停止序列"},"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":"在“想象 → 音频”中,使用已获许可的参考录音及其准确文字稿生成语音。你也可以将参考资料保存为可重复使用的声音。","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":"下载包含偏好设置、聊天文件夹、会话和消息、笔记、知识集合及提取的文档文本的便携归档。","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":"取消归档"},"archiveScopeV3":"包含偏好设置、聊天、文件夹、笔记、知识集合及提取的文档文本。不包含账户和机密、生物特征克隆语音、生成的媒体、角色和记忆,以及 Work 数据或卷。"},"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":"访问我们的网站","ollama":"Ollama","ollamaDescription":"了解更多关于 Ollama","documentation":"文档","reportIssue":"报告问题","reportIssueDescription":"错误报告和功能请求","gitlab":"GitLab镜像","gitlabDescription":"自托管GitLab仓库","documentationDescription":"指南、教程和API参考"},"version":"版本 {{version}}"},"groups":{"general":"通用","chat":"聊天","media":"语音与图像","connections":"连接"},"search":{"title":"网页搜索","description":"通过自托管的 SearXNG 实例搜索网页。启用后,聊天输入框会显示搜索开关,具有网络访问权限的 Work 任务也可以搜索。","enableLabel":"启用网页搜索","enableDescription":"为聊天和 Work 任务提供网页搜索。搜索在服务器端通过配置的实例执行。","urlLabel":"SearXNG 地址","urlDescription":"服务器可访问的 SearXNG 实例基础 URL。随附的私有部署栈提供 http://searxng:8080。","maxResultsLabel":"每次搜索结果数","maxResultsDescription":"每次回复或工具调用使用多少条结果,1-10。","maxResultsInvalid":"每次搜索结果数必须在 1 到 10 之间。","safeSearchLabel":"安全搜索","safeSearchDescription":"要求搜索引擎过滤露骨内容。","test":"测试连接","testing":"正在测试…","testOk":"搜索正常 — 返回 {{results}} 条结果","testFailed":"搜索测试失败","save":"保存","saved":"搜索设置已保存","saveFailed":"无法保存搜索设置"}}`),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:`显存`},sections:{pull:`拉取新模型`,library:`浏览模型库`,running:`运行中的模型`,local:`本地模型`,advanced:`高级操作`,huggingface:`HuggingFace Hub`},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:`刷新模型库`},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:`请选择模型并输入文本`}},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:`最近更新`}}},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:{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:`您无法删除自己的账户`,form:{title:{create:`创建用户`,edit:`编辑用户`},username:`用户名`,usernamePlaceholder:`输入用户名`,email:`邮箱`,emailPlaceholder:`输入邮箱(可选)`,password:`密码`,passwordPlaceholder:`输入密码`,passwordHint:`留空以保持当前密码`,role:`角色`,creating:`创建中...`,updating:`更新中...`,createButton:`创建用户`,updateButton:`更新用户`,createSuccess:`用户创建成功`,updateSuccess:`用户更新成功`,createFailed:`创建用户失败`,updateFailed:`更新用户失败`},approval:{title:`待审批`,description:`在允许新注册用户进入此实例之前进行审核。`,registered:`已注册`,activate:`激活账户`,reject:`拒绝注册`,approved:`{{name}} 现在可以登录了。`,failed:`无法批准该账户。`,notification:`{{count}} 个注册正在等待您的批准。`,notificationBadge:`{{count}} 个待处理的用户批准`},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 固定。`}},chatHistory:{label:`对话历史`,jumpToTurn:`跳转到第 {{index}} 项,共 {{total}} 项`},chatMessage:{you:`您`,assistant:`助手`,system:`系统`,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}} 个字符`},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:`文件大小必须小于 10MB`,uploadSuccessWithName:`文档 "{{name}}" 上传成功`,removeSuccess:`文档移除成功`,removeFailed:`移除文档失败`,removeError:`移除文档时发生错误`,clickToUpload:`点击上传`,orDragAndDrop:`或拖放文件`,fileTypesAndSize:`PDF 或 TXT 文件,最大 10MB`,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:`ID`,endpoint:`端点`,activate:`激活`,deactivate:`停用`,activePlugin:`活跃插件`,activePluginDescription:`所有聊天请求将通过此插件路由`,variables:{title:`变量`,save:`保存`,saving:`保存中...`,saved:`变量已保存`,saveFailed:`保存变量失败`,resetDefaults:`重置为默认值`,reset:`变量已重置`,sensitiveSet:`值已设置(输入新值以更改)`,resetFailed:`重置变量失败`,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`},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:`搜索已安装的模型...`,searchOllama:`搜索Ollama库...`,searchHuggingFace:`搜索HuggingFace...`,selectModel:`选择模型`,personas:`角色`,ollamaModels:`Ollama模型`,pluginModels:`插件模型`,actions:`操作`,installed:`已安装`,use:`使用`,pull:`下载`,pullRestricted:`此实例上的模型安装仅限管理员。`,adminOnlyPull:`仅管理员`,legacyProvider:`未记录提供方`,providerNotRecorded:`未记录提供方`,providerUnavailable:`提供方不可用`,reselectProvider:`重新选择提供方以固定此模型`,unavailable:`不可用`,unavailableSelections:`不可用的选择`,agentModels:`智能体`},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:{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:`正在沙箱中打开 Shell…`,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。push、pull 和拉取请求需要单独的可信凭据代理。`,newBranch:`新建本地分支`,noCommits:`还没有提交。`,noDiff:`暂无文本差异。未跟踪的文件会在暂存后显示。`,notInitialized:`Git 未初始化`,selectChange:`选择已更改的文件以查看其差异。`,selectPath:`选择 {{path}}`,stageAll:`全部暂存`,stageSelected:`暂存 {{count}} 个`,staged:`更改已暂存。`,switchBranch:`切换本地分支`,changes:`更改`,createBranch:`创建`,filterFiles:`筛选已更改的文件`,noFilterMatches:`没有与此筛选条件匹配的已更改文件。`,allChanges:`全部更改`,diffTruncated:`此差异已被截断。`,binaryFile:`二进制文件,无文本差异。`},hostWorkspace:{hint:`留空以使用隔离工作区,或将任务指向本机的一个文件夹。`,label:`工作区文件夹(可选)`,warning:`任务可以直接读写此文件夹。留空则使用隔离工作区。`}},usageAnalytics:{eyebrow:`管理`,title:`提供商使用情况`,description:`跟踪此实例上已启用插件的出站 API 调用和模型消耗。`,days:`{{count}} 天`,refresh:`刷新使用情况`,loadFailed:`无法加载提供商使用情况。`,metrics:{calls:`调用`,tokens:`Token`},cards:{calls:`API 调用`,callsDetail:`跨 {{count}} 个活跃用户`,tokens:`报告的 Token`,tokensDetail:`在 {{count}} 次调用中报告的使用情况`,success:`成功率`,successDetail:`{{count}} 次失败调用`,latency:`平均延迟`,latencyDetail:`端到端提供商耗时`},activity:{title:`随时间变化的消耗`,callsDescription:`每日对已启用插件的出站请求`,tokensDescription:`提供商报告的每日 token 总量`,chartLabel:`每日提供商 {{metric}} 图表`},models:{title:`模型消耗`,description:`此期间承载最多流量的模型。`,model:`模型`,success:`成功`,latency:`延迟`},providers:{title:`已启用插件的流量`},capabilities:{title:`能力组合`,characters:`{{count}} 个字符`,bytes:`{{count}} 字节`,images:`{{count}} 张图片`,jobs:`{{count}} 个视频任务`,inputs:`{{count}} 个输入`,reportedTokens:`{{count}} 个已报告 token`},empty:{title:`暂无提供商调用`,description:`当已启用的插件处理聊天、工作、嵌入、图像、语音、声音或视频请求后,调用将显示在此处。`},privacyNote:`使用量在服务器的出站插件边界处进行计量。Libre WebUI 存储提供商、模型、计时、状态和已报告的计数器——绝不存储提示词、响应、端点、凭据或提供商错误正文。Token 总量仅包含提供商返回使用元数据的调用。`,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:`{{used}} / {{total}}`,freeSpace:`可用空间`,freeSpaceDetail:`{{label}} · 总计 {{total}}`,containers:`运行中的容器`,containersDetail:`Docker 已知 {{total}} 个容器`,dockerUnavailable:`Docker 不可用`,unavailable:`不可用`},host:{title:`主机与运行时`,description:`操作系统、处理器和 Libre WebUI 进程详情。`,container:`容器运行时`,native:`原生运行时`,hostname:`主机名`,operatingSystem:`操作系统`,processor:`处理器`,logicalCpus:`逻辑 CPU`,loadAverage:`平均负载 · 1 / 5 / 15 分钟`,libreVersion:`Libre WebUI`,nodeVersion:`Node.js`,process:`进程`,workingDirectory:`工作目录`},memory:{title:`内存`,description:`运行时可见的系统内存和应用程序进程使用情况。`,usedOf:`已用 {{used}} / 共 {{total}}`,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 标签、挂载点、容器命令或 inspect 负载。当 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 任务。`}},mediaGeneration:{title:`生成媒体`,description:`使用已激活的媒体提供商创建视频、声音、音乐或语音。`,image:`图像`,video:`视频`,audio:`音频`,sound:`声音`,speech:`语音`,model:`模型`,voice:`语音或语音 ID`,cloneVoice:`克隆参考声音`,cloneVoiceDescription:`根据参考录音而不是预设声音生成此语音。`,referenceAudio:`参考音频`,referenceTranscript:`准确的参考文字稿`,referenceTranscriptPlaceholder:`请准确输入参考录音中说出的内容…`,referenceAudioTooLarge:`参考音频不得大于 {{max}}。`,cloneConsent:`仅在获得说话者许可后克隆其声音。该录音会发送给所选提供商以完成本次生成,Libre WebUI 不会保存录音。`,saveVoiceProfile:`保存为可重复使用的声音`,saveVoiceProfileDescription:`安全存储此参考录音及其文字稿。每当语音批次使用此声音时,Libre WebUI 都会将两者发送给所选提供商。`,voiceProfileName:`已保存声音名称`,voiceProfileNamePlaceholder:`例如:我的声音`,voiceStorageConsent:`我确认已获得说话者许可,可以克隆和存储此声音。参考资料会一直保存,直到我将其删除。`,successWithSavedVoice:`媒体已生成,“{{name}}”现已可在语音设置中使用`,resolution:`分辨率`,aspectRatio:`宽高比`,duration:`时长`,providerDefault:`提供商默认`,generateAudio:`在支持时随视频生成音频`,prompt:`提示词`,text:`要朗读的文本`,videoPlaceholder:`描述场景、动作、镜头和光线...`,audioPlaceholder:`输入您想让语音朗读的文本...`,soundPlaceholder:`描述您想要的声音、音乐、氛围或语音响应...`,generate:`生成`,generating:`正在生成…这可能需要几分钟`,success:`媒体已生成并保存到 Imagine`,failed:`生成媒体失败`,loadFailed:`加载媒体提供商失败`,noModels:`没有可用的 {{kind}} 模型。请先激活兼容的提供商并保存其凭据。`},mediaGallery:{itemCount:`{{count}} 项`,empty:`暂无生成的媒体`,emptyHint:`生成图像、视频或语音片段后,将显示在此处。`,filters:{all:`全部`,image:`图像`,video:`视频`,audio:`音频`}},whatsNew:{title:`新功能`,releaseNotes:`版本说明`,cta:`好的,开始吧`},notes:{title:`笔记`,new:`新建笔记`,untitled:`无标题`,empty:`还没有笔记`,selectOrCreate:`选择一条笔记或新建一条`,contentPlaceholder:`用 Markdown 书写…`,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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "libre-webui",
3
- "version": "0.21.3",
3
+ "version": "0.22.0",
4
4
  "description": "A local-first workspace for chat, private knowledge, artifacts, and isolated model-driven work.",
5
5
  "bin": {
6
6
  "libre-webui": "bin/cli.js"
@@ -27,9 +27,15 @@
27
27
  "build": "npm run build:frontend && npm run build:backend",
28
28
  "build:frontend": "cd frontend && npm run build",
29
29
  "build:backend": "cd backend && npm run build",
30
- "test:package": "node --test scripts/test-deprecated-dependencies.mjs && node --test scripts/test-typescript-toolchain.mjs && node --test scripts/test-helm-versioning.mjs && node --test scripts/test-helm-work.mjs && node --test scripts/test-tts-example-security.mjs && npm run test:unit --workspace=frontend && npm run build && node --test scripts/test-webpage-fetch-security.mjs && node --test scripts/test-web-search.mjs && node --test scripts/test-content-resource-limits.mjs && node --test scripts/test-registration-policy.mjs && node --test scripts/test-user-approval.mjs && node --test scripts/test-turnstile-auth.mjs && node --test scripts/test-oauth-security.mjs && node --test scripts/test-password-security.mjs && node --test scripts/test-live-deployment-security.mjs && node --test scripts/test-ollama-model-defaults.mjs && node --test scripts/test-ollama-library.mjs && node --test scripts/test-chat-context.mjs && node --test scripts/test-rag-retrieval.mjs && node --test scripts/test-chat-rest-responses.mjs && node --test scripts/test-plugin-endpoint-routing.mjs && node --test scripts/test-plugin-capability-routing.mjs && node --test scripts/test-plugin-usage-analytics.mjs && node --test scripts/test-system-diagnostics.mjs && node --test scripts/test-openrouter-attribution.mjs && node --test scripts/test-openrouter-media-routing.mjs && node --test scripts/test-chat-provider-selection.mjs && node --test scripts/test-agent-cli-chat.mjs && node --test scripts/test-codex-oauth.mjs && node --test scripts/test-provider-api-modes.mjs && node --test scripts/test-plugin-variable-overrides.mjs && node --test scripts/test-plugin-model-refresh.mjs && node --test scripts/test-tts-routing.mjs && node --test scripts/test-image-generation-routing.mjs && node --test scripts/test-work-host-workspace.mjs && node --test scripts/test-work-runtime.mjs && node --test scripts/test-work-access.mjs && node --test scripts/test-work-admin.mjs && node --test scripts/test-work-idle.mjs && node --test scripts/test-work-policies.mjs && node --test scripts/test-work-kubernetes.mjs && node --test scripts/test-work-preview-proxy.mjs && node --test scripts/test-artifact-sandbox.mjs && node --test scripts/test-work-terminal.mjs && node --test scripts/test-work-provider.mjs && node --test scripts/test-work-agent-guidance.mjs && node --test scripts/test-work-agent-loop.mjs && node --test scripts/test-work-events.mjs && node --test scripts/test-package-layout.mjs && node --test scripts/test-release-notes.mjs && node --test scripts/test-release-status.mjs && node --test scripts/test-docker-layout.mjs && node --test scripts/test-pr-quality-gates.mjs && node --test scripts/test-homebrew-publishing.mjs && node --test scripts/test-forgejo-release-mirror.mjs",
30
+ "recovery:check": "node backend/dist/cli/recoveryInventory.js",
31
+ "recovery:backup": "node backend/dist/cli/recoveryBackup.js",
32
+ "migrate:postgres": "node backend/dist/cli/migrateSqliteToPostgres.js",
33
+ "worker": "node backend/dist/worker.js",
34
+ "test:package": "node --test scripts/test-deprecated-dependencies.mjs && node --test scripts/test-typescript-toolchain.mjs && node --test scripts/test-helm-versioning.mjs && node --test scripts/test-helm-work.mjs && node --test scripts/test-tts-example-security.mjs && npm run test:unit --workspace=frontend && npm run build && node --test scripts/test-persistence-boundary.mjs scripts/test-persistence-contract.mjs scripts/test-schema-migrations.mjs scripts/test-postgres-persistence.mjs scripts/test-document-indexing-postgres.mjs && node --test scripts/test-platform-coordination.mjs scripts/test-platform-storage.mjs scripts/test-memory-reliability.mjs && npm run test:team-storage && node --test scripts/test-durable-jobs.mjs scripts/test-account-retirement.mjs scripts/test-integrated-backup.mjs scripts/test-team-backup.mjs && node --test scripts/test-health-probes.mjs scripts/test-recovery-inventory.mjs && node --test scripts/test-webpage-fetch-security.mjs && node --test scripts/test-web-search.mjs && node --test scripts/test-content-resource-limits.mjs && node --test scripts/test-registration-policy.mjs && node --test scripts/test-user-approval.mjs && node --test scripts/test-turnstile-auth.mjs && node --test scripts/test-oauth-security.mjs && node --test scripts/test-password-security.mjs && node --test scripts/test-live-deployment-security.mjs && node --test scripts/test-websocket-tickets.mjs && node --test scripts/test-capability-contracts.mjs scripts/test-global-capability-contracts.mjs && node --test scripts/test-ollama-model-defaults.mjs && node --test scripts/test-ollama-library.mjs && node --test scripts/test-huggingface-hub-routes.mjs && node --test scripts/test-chat-context.mjs && node --test scripts/test-chat-cancellation.mjs && node --test scripts/test-rag-retrieval.mjs && node --test scripts/test-chat-rest-responses.mjs && node --test scripts/test-plugin-endpoint-routing.mjs && node --test scripts/test-plugin-capability-routing.mjs && node --test scripts/test-plugin-usage-analytics.mjs && node --test scripts/test-system-diagnostics.mjs && node --test scripts/test-openrouter-attribution.mjs && node --test scripts/test-openrouter-media-routing.mjs && node --test scripts/test-chat-provider-selection.mjs && node --test scripts/test-agent-cli-chat.mjs && node --test scripts/test-codex-oauth.mjs && node --test scripts/test-provider-api-modes.mjs && node --test scripts/test-plugin-variable-overrides.mjs && node --test scripts/test-plugin-model-refresh.mjs && node --test scripts/test-stt-routing.mjs && node --test scripts/test-tts-routing.mjs && node --test scripts/test-voice-profiles-security.mjs && node --test scripts/test-image-generation-routing.mjs && node --test scripts/test-data-archive.mjs && node --test scripts/test-work-host-workspace.mjs && node --test scripts/test-work-runtime.mjs && node --test scripts/test-work-access.mjs && node --test scripts/test-work-admin.mjs && node --test scripts/test-work-idle.mjs && node --test scripts/test-work-policies.mjs && node --test scripts/test-work-kubernetes.mjs && node --test scripts/test-work-preview-proxy.mjs && node --test scripts/test-artifact-sandbox.mjs && node --test scripts/test-work-terminal.mjs && node --test scripts/test-work-provider.mjs && node --test scripts/test-work-agent-guidance.mjs && node --test scripts/test-work-agent-loop.mjs && node --test scripts/test-work-events.mjs && node --test scripts/test-package-layout.mjs && node --test scripts/test-release-notes.mjs && node --test scripts/test-release-status.mjs && node --test scripts/test-docker-layout.mjs && node --test scripts/test-pr-quality-gates.mjs scripts/test-security-workflow.mjs && node --test scripts/test-homebrew-publishing.mjs && node --test scripts/test-forgejo-release-mirror.mjs",
35
+ "test:team-storage": "node scripts/test-platform-storage-team-adapters.mjs && node scripts/test-sqlite-team-storage-migration.mjs",
36
+ "test:team-platform": "node --test scripts/test-team-platform.mjs",
31
37
  "test:e2e": "npm run e2e --workspace=frontend",
32
- "test:work": "npm run build:backend && node --test scripts/test-work-host-workspace.mjs && node --test scripts/test-work-runtime.mjs && node --test scripts/test-work-access.mjs && node --test scripts/test-work-admin.mjs && node --test scripts/test-work-idle.mjs && node --test scripts/test-work-policies.mjs && node --test scripts/test-work-kubernetes.mjs && node --test scripts/test-work-preview-proxy.mjs && node --test scripts/test-work-terminal.mjs && node --test scripts/test-work-provider.mjs && node --test scripts/test-work-agent-guidance.mjs && node --test scripts/test-work-agent-loop.mjs && node --test scripts/test-work-events.mjs",
38
+ "test:work": "npm run build:backend && node --test scripts/test-account-retirement.mjs && node --test scripts/test-work-host-workspace.mjs && node --test scripts/test-work-runtime.mjs && node --test scripts/test-work-access.mjs && node --test scripts/test-work-admin.mjs && node --test scripts/test-work-idle.mjs && node --test scripts/test-work-policies.mjs && node --test scripts/test-work-kubernetes.mjs && node --test scripts/test-work-preview-proxy.mjs && node --test scripts/test-work-terminal.mjs && node --test scripts/test-work-provider.mjs && node --test scripts/test-work-agent-guidance.mjs && node --test scripts/test-work-agent-loop.mjs && node --test scripts/test-work-events.mjs",
33
39
  "security:audit": "npm audit --audit-level=moderate",
34
40
  "release:check": "npm run format:check && npm run lint && npm run security:audit && npm run test:package && npm run npm:publish:dry-run",
35
41
  "start": "cd backend && npm start",
@@ -95,10 +101,11 @@
95
101
  "@types/react-dom": "19.2.4",
96
102
  "@typescript-eslint/eslint-plugin": "^8.51.0",
97
103
  "@typescript-eslint/parser": "^8.34.0",
104
+ "@typescript/native": "npm:typescript@^7.0.2",
98
105
  "concurrently": "^10.0.1",
99
106
  "eslint": "^9.39.4",
100
107
  "prettier": "^3.7.4",
101
- "typescript": "6.0.3"
108
+ "typescript": "npm:@typescript/typescript6@^6.0.2"
102
109
  },
103
110
  "keywords": [
104
111
  "llm",
@@ -116,6 +123,8 @@
116
123
  "author": "Libre WebUI Contributors <contact@librewebui.org>",
117
124
  "license": "Apache-2.0",
118
125
  "dependencies": {
126
+ "@aws-sdk/client-s3": "^3.1109.0",
127
+ "@aws-sdk/lib-storage": "^3.1109.0",
119
128
  "@kubernetes/client-node": "^1.4.0",
120
129
  "axios": "^1.13.2",
121
130
  "bcrypt": "^6.0.0",
@@ -129,10 +138,12 @@
129
138
  "jsonwebtoken": "^9.0.3",
130
139
  "morgan": "^1.10.0",
131
140
  "multer": "^2.2.0",
132
- "parse5": "^7.3.0",
141
+ "parse5": "^8.0.1",
133
142
  "pdfjs-dist": "^6.0.227",
143
+ "pg": "^8.23.0",
134
144
  "react": "19.2.8",
135
145
  "react-dom": "19.2.8",
146
+ "redis": "^6.2.1",
136
147
  "sanitize-filename": "^1.6.3",
137
148
  "sonner": "^2.0.7",
138
149
  "tar": "7.5.22",
@@ -215,7 +215,7 @@
215
215
  }
216
216
  },
217
217
  "stt": {
218
- "endpoint": "https://router.huggingface.co/hf-inference/models",
218
+ "endpoint": "https://router.huggingface.co/hf-inference/models/{model}",
219
219
  "model_map": [
220
220
  "openai/whisper-large-v3",
221
221
  "openai/whisper-large-v3-turbo",
@@ -229,7 +229,8 @@
229
229
  "Systran/faster-whisper-large-v3"
230
230
  ],
231
231
  "config": {
232
- "formats": ["flac", "mp3", "wav", "webm", "ogg"],
232
+ "formats": ["wav", "webm"],
233
+ "max_audio_bytes": 26214400,
233
234
  "max_duration_seconds": 300,
234
235
  "languages": [
235
236
  "en",
@@ -243,7 +244,9 @@
243
244
  "ko",
244
245
  "zh"
245
246
  ],
246
- "supports_timestamps": true
247
+ "supports_timestamps": false,
248
+ "request_mode": "raw",
249
+ "endpoint_variable": "stt_endpoint"
247
250
  }
248
251
  }
249
252
  },
@@ -261,6 +264,12 @@
261
264
  "label": "TTS API Endpoint",
262
265
  "description": "Optional TTS endpoint template. Use {model} where the model ID belongs."
263
266
  },
267
+ {
268
+ "name": "stt_endpoint",
269
+ "type": "string",
270
+ "label": "Speech-to-Text API Endpoint",
271
+ "description": "Optional transcription endpoint template. Use {model} where the model ID belongs."
272
+ },
264
273
  {
265
274
  "name": "image_endpoint",
266
275
  "type": "string",