libre-webui 0.2.4

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 (233) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +204 -0
  3. package/backend/dist/db.d.ts +19 -0
  4. package/backend/dist/db.d.ts.map +1 -0
  5. package/backend/dist/db.js +355 -0
  6. package/backend/dist/db.js.map +1 -0
  7. package/backend/dist/env.d.ts +2 -0
  8. package/backend/dist/env.d.ts.map +1 -0
  9. package/backend/dist/env.js +22 -0
  10. package/backend/dist/env.js.map +1 -0
  11. package/backend/dist/index.d.ts +4 -0
  12. package/backend/dist/index.d.ts.map +1 -0
  13. package/backend/dist/index.js +751 -0
  14. package/backend/dist/index.js.map +1 -0
  15. package/backend/dist/middleware/auth.d.ts +18 -0
  16. package/backend/dist/middleware/auth.d.ts.map +1 -0
  17. package/backend/dist/middleware/auth.js +98 -0
  18. package/backend/dist/middleware/auth.js.map +1 -0
  19. package/backend/dist/middleware/index.d.ts +5 -0
  20. package/backend/dist/middleware/index.d.ts.map +1 -0
  21. package/backend/dist/middleware/index.js +62 -0
  22. package/backend/dist/middleware/index.js.map +1 -0
  23. package/backend/dist/models/personaModel.d.ts +37 -0
  24. package/backend/dist/models/personaModel.d.ts.map +1 -0
  25. package/backend/dist/models/personaModel.js +269 -0
  26. package/backend/dist/models/personaModel.js.map +1 -0
  27. package/backend/dist/models/userModel.d.ts +86 -0
  28. package/backend/dist/models/userModel.d.ts.map +1 -0
  29. package/backend/dist/models/userModel.js +212 -0
  30. package/backend/dist/models/userModel.js.map +1 -0
  31. package/backend/dist/routes/auth.d.ts +3 -0
  32. package/backend/dist/routes/auth.d.ts.map +1 -0
  33. package/backend/dist/routes/auth.js +389 -0
  34. package/backend/dist/routes/auth.js.map +1 -0
  35. package/backend/dist/routes/chat.d.ts +3 -0
  36. package/backend/dist/routes/chat.d.ts.map +1 -0
  37. package/backend/dist/routes/chat.js +767 -0
  38. package/backend/dist/routes/chat.js.map +1 -0
  39. package/backend/dist/routes/documents.d.ts +3 -0
  40. package/backend/dist/routes/documents.d.ts.map +1 -0
  41. package/backend/dist/routes/documents.js +244 -0
  42. package/backend/dist/routes/documents.js.map +1 -0
  43. package/backend/dist/routes/ollama.d.ts +3 -0
  44. package/backend/dist/routes/ollama.d.ts.map +1 -0
  45. package/backend/dist/routes/ollama.js +549 -0
  46. package/backend/dist/routes/ollama.js.map +1 -0
  47. package/backend/dist/routes/personas.d.ts +3 -0
  48. package/backend/dist/routes/personas.d.ts.map +1 -0
  49. package/backend/dist/routes/personas.js +505 -0
  50. package/backend/dist/routes/personas.js.map +1 -0
  51. package/backend/dist/routes/plugins.d.ts +3 -0
  52. package/backend/dist/routes/plugins.d.ts.map +1 -0
  53. package/backend/dist/routes/plugins.js +417 -0
  54. package/backend/dist/routes/plugins.js.map +1 -0
  55. package/backend/dist/routes/preferences.d.ts +3 -0
  56. package/backend/dist/routes/preferences.d.ts.map +1 -0
  57. package/backend/dist/routes/preferences.js +303 -0
  58. package/backend/dist/routes/preferences.js.map +1 -0
  59. package/backend/dist/routes/tts.d.ts +3 -0
  60. package/backend/dist/routes/tts.d.ts.map +1 -0
  61. package/backend/dist/routes/tts.js +304 -0
  62. package/backend/dist/routes/tts.js.map +1 -0
  63. package/backend/dist/routes/users.d.ts +3 -0
  64. package/backend/dist/routes/users.d.ts.map +1 -0
  65. package/backend/dist/routes/users.js +246 -0
  66. package/backend/dist/routes/users.js.map +1 -0
  67. package/backend/dist/services/authService.d.ts +51 -0
  68. package/backend/dist/services/authService.d.ts.map +1 -0
  69. package/backend/dist/services/authService.js +153 -0
  70. package/backend/dist/services/authService.js.map +1 -0
  71. package/backend/dist/services/chatService.d.ts +52 -0
  72. package/backend/dist/services/chatService.d.ts.map +1 -0
  73. package/backend/dist/services/chatService.js +645 -0
  74. package/backend/dist/services/chatService.js.map +1 -0
  75. package/backend/dist/services/documentService.d.ts +34 -0
  76. package/backend/dist/services/documentService.d.ts.map +1 -0
  77. package/backend/dist/services/documentService.js +428 -0
  78. package/backend/dist/services/documentService.js.map +1 -0
  79. package/backend/dist/services/encryptionService.d.ts +62 -0
  80. package/backend/dist/services/encryptionService.d.ts.map +1 -0
  81. package/backend/dist/services/encryptionService.js +284 -0
  82. package/backend/dist/services/encryptionService.js.map +1 -0
  83. package/backend/dist/services/memoryService.d.ts +140 -0
  84. package/backend/dist/services/memoryService.d.ts.map +1 -0
  85. package/backend/dist/services/memoryService.js +867 -0
  86. package/backend/dist/services/memoryService.js.map +1 -0
  87. package/backend/dist/services/mutationEngineService.d.ts +49 -0
  88. package/backend/dist/services/mutationEngineService.d.ts.map +1 -0
  89. package/backend/dist/services/mutationEngineService.js +432 -0
  90. package/backend/dist/services/mutationEngineService.js.map +1 -0
  91. package/backend/dist/services/ollamaService.d.ts +55 -0
  92. package/backend/dist/services/ollamaService.d.ts.map +1 -0
  93. package/backend/dist/services/ollamaService.js +450 -0
  94. package/backend/dist/services/ollamaService.js.map +1 -0
  95. package/backend/dist/services/personaService.d.ts +67 -0
  96. package/backend/dist/services/personaService.d.ts.map +1 -0
  97. package/backend/dist/services/personaService.js +373 -0
  98. package/backend/dist/services/personaService.js.map +1 -0
  99. package/backend/dist/services/pluginService.d.ts +42 -0
  100. package/backend/dist/services/pluginService.d.ts.map +1 -0
  101. package/backend/dist/services/pluginService.js +961 -0
  102. package/backend/dist/services/pluginService.js.map +1 -0
  103. package/backend/dist/services/preferencesService.d.ts +35 -0
  104. package/backend/dist/services/preferencesService.d.ts.map +1 -0
  105. package/backend/dist/services/preferencesService.js +255 -0
  106. package/backend/dist/services/preferencesService.js.map +1 -0
  107. package/backend/dist/services/simpleGitHubOAuth.d.ts +48 -0
  108. package/backend/dist/services/simpleGitHubOAuth.d.ts.map +1 -0
  109. package/backend/dist/services/simpleGitHubOAuth.js +203 -0
  110. package/backend/dist/services/simpleGitHubOAuth.js.map +1 -0
  111. package/backend/dist/services/simpleHuggingFaceOAuth.d.ts +43 -0
  112. package/backend/dist/services/simpleHuggingFaceOAuth.d.ts.map +1 -0
  113. package/backend/dist/services/simpleHuggingFaceOAuth.js +159 -0
  114. package/backend/dist/services/simpleHuggingFaceOAuth.js.map +1 -0
  115. package/backend/dist/services/userService.d.ts +1 -0
  116. package/backend/dist/services/userService.d.ts.map +1 -0
  117. package/backend/dist/services/userService.js +18 -0
  118. package/backend/dist/services/userService.js.map +1 -0
  119. package/backend/dist/storage.d.ts +55 -0
  120. package/backend/dist/storage.d.ts.map +1 -0
  121. package/backend/dist/storage.js +741 -0
  122. package/backend/dist/storage.js.map +1 -0
  123. package/backend/dist/test-encryption.d.ts +2 -0
  124. package/backend/dist/test-encryption.d.ts.map +1 -0
  125. package/backend/dist/test-encryption.js +64 -0
  126. package/backend/dist/test-encryption.js.map +1 -0
  127. package/backend/dist/types/index.d.ts +523 -0
  128. package/backend/dist/types/index.d.ts.map +1 -0
  129. package/backend/dist/types/index.js +31 -0
  130. package/backend/dist/types/index.js.map +1 -0
  131. package/backend/dist/utils/generationUtils.d.ts +10 -0
  132. package/backend/dist/utils/generationUtils.d.ts.map +1 -0
  133. package/backend/dist/utils/generationUtils.js +49 -0
  134. package/backend/dist/utils/generationUtils.js.map +1 -0
  135. package/backend/dist/utils/hash.d.ts +29 -0
  136. package/backend/dist/utils/hash.d.ts.map +1 -0
  137. package/backend/dist/utils/hash.js +73 -0
  138. package/backend/dist/utils/hash.js.map +1 -0
  139. package/backend/dist/utils/jwt.d.ts +37 -0
  140. package/backend/dist/utils/jwt.d.ts.map +1 -0
  141. package/backend/dist/utils/jwt.js +86 -0
  142. package/backend/dist/utils/jwt.js.map +1 -0
  143. package/bin/cli.js +150 -0
  144. package/electron/main.js +322 -0
  145. package/frontend/dist/_redirects +1 -0
  146. package/frontend/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  147. package/frontend/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  148. package/frontend/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  149. package/frontend/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  150. package/frontend/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  151. package/frontend/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  152. package/frontend/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  153. package/frontend/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  154. package/frontend/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  155. package/frontend/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  156. package/frontend/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  157. package/frontend/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  158. package/frontend/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  159. package/frontend/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  160. package/frontend/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  161. package/frontend/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  162. package/frontend/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  163. package/frontend/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  164. package/frontend/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  165. package/frontend/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  166. package/frontend/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  167. package/frontend/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  168. package/frontend/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  169. package/frontend/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  170. package/frontend/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  171. package/frontend/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  172. package/frontend/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  173. package/frontend/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  174. package/frontend/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  175. package/frontend/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  176. package/frontend/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  177. package/frontend/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  178. package/frontend/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  179. package/frontend/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  180. package/frontend/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  181. package/frontend/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  182. package/frontend/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  183. package/frontend/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  184. package/frontend/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  185. package/frontend/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  186. package/frontend/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  187. package/frontend/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  188. package/frontend/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  189. package/frontend/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  190. package/frontend/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  191. package/frontend/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  192. package/frontend/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  193. package/frontend/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  194. package/frontend/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  195. package/frontend/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  196. package/frontend/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  197. package/frontend/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  198. package/frontend/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  199. package/frontend/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  200. package/frontend/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  201. package/frontend/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  202. package/frontend/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  203. package/frontend/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  204. package/frontend/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  205. package/frontend/dist/assets/index-CRQkB7Wz.js +3 -0
  206. package/frontend/dist/css/index-B1OjddR-.css +1 -0
  207. package/frontend/dist/favicon-dark.png +0 -0
  208. package/frontend/dist/favicon-light.png +0 -0
  209. package/frontend/dist/index.html +23 -0
  210. package/frontend/dist/js/ArtifactContainer-c_oi7XMs.js +23 -0
  211. package/frontend/dist/js/ArtifactDemoPage-CdfwJVXu.js +98 -0
  212. package/frontend/dist/js/ChatPage-CyotkmS0.js +281 -0
  213. package/frontend/dist/js/ModelsPage-DNaziPHc.js +2 -0
  214. package/frontend/dist/js/PersonasPage-DcnbJf8Q.js +13 -0
  215. package/frontend/dist/js/UserManagementPage-DtTf92dS.js +1 -0
  216. package/frontend/dist/js/markdown-vendor-D-79K2xZ.js +22 -0
  217. package/frontend/dist/js/react-vendor-N--QU9DW.js +8 -0
  218. package/frontend/dist/js/router-vendor-B-t91v39.js +3 -0
  219. package/frontend/dist/js/ui-vendor-VxSCY_bv.js +177 -0
  220. package/frontend/dist/js/utils-vendor-DNzxLBGx.js +6 -0
  221. package/frontend/dist/logo-dark.png +0 -0
  222. package/frontend/dist/logo-light.png +0 -0
  223. package/frontend/dist/logo.svg +14 -0
  224. package/package.json +128 -0
  225. package/plugins/anthropic.json +25 -0
  226. package/plugins/elevenlabs.json +58 -0
  227. package/plugins/gemini.json +57 -0
  228. package/plugins/github.json +23 -0
  229. package/plugins/groq.json +25 -0
  230. package/plugins/mistral.json +73 -0
  231. package/plugins/openai-tts.json +38 -0
  232. package/plugins/openai.json +132 -0
  233. package/plugins/openrouter.json +353 -0
@@ -0,0 +1,417 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import express from 'express';
18
+ import multer from 'multer';
19
+ import path from 'path';
20
+ import fs from 'fs';
21
+ import rateLimit from 'express-rate-limit';
22
+ import pluginService from '../services/pluginService.js';
23
+ import { getErrorMessage, } from '../types/index.js';
24
+ const router = express.Router();
25
+ // Rate limiting for plugin operations
26
+ const pluginRateLimit = rateLimit({
27
+ windowMs: 15 * 60 * 1000, // 15 minutes
28
+ max: 100, // Limit each IP to 100 requests per windowMs
29
+ message: {
30
+ success: false,
31
+ error: 'Too many plugin requests from this IP, please try again later.',
32
+ },
33
+ });
34
+ // More restrictive rate limiting for upload operations
35
+ const uploadRateLimit = rateLimit({
36
+ windowMs: 15 * 60 * 1000, // 15 minutes
37
+ max: 10, // Limit each IP to 10 uploads per windowMs
38
+ message: {
39
+ success: false,
40
+ error: 'Too many upload requests from this IP, please try again later.',
41
+ },
42
+ });
43
+ // Helper function to safely clean up uploaded files
44
+ const safeCleanupFile = (filePath, tempDir) => {
45
+ try {
46
+ const resolvedPath = path.resolve(filePath);
47
+ const resolvedTempDir = path.resolve(tempDir);
48
+ // Ensure the file is within the temp directory
49
+ if (resolvedPath.startsWith(resolvedTempDir) &&
50
+ fs.existsSync(resolvedPath)) {
51
+ fs.unlinkSync(resolvedPath);
52
+ }
53
+ }
54
+ catch (error) {
55
+ console.error('Failed to cleanup file:', error);
56
+ }
57
+ };
58
+ // Configure multer for file uploads
59
+ const upload = multer({
60
+ dest: 'temp/',
61
+ fileFilter: (req, file, cb) => {
62
+ const allowedTypes = ['.json', '.zip'];
63
+ const fileExt = path.extname(file.originalname).toLowerCase();
64
+ if (allowedTypes.includes(fileExt)) {
65
+ cb(null, true);
66
+ }
67
+ else {
68
+ cb(new Error('Only .json and .zip files are allowed'));
69
+ }
70
+ },
71
+ limits: {
72
+ fileSize: 10 * 1024 * 1024, // 10MB limit
73
+ },
74
+ });
75
+ // Get all plugins
76
+ router.get('/', async (req, res) => {
77
+ try {
78
+ const plugins = pluginService.getAllPlugins();
79
+ res.json({
80
+ success: true,
81
+ data: plugins,
82
+ });
83
+ }
84
+ catch (error) {
85
+ res.status(500).json({
86
+ success: false,
87
+ error: getErrorMessage(error, 'Failed to load plugins'),
88
+ });
89
+ }
90
+ });
91
+ // Get active plugins
92
+ router.get('/active', async (req, res) => {
93
+ try {
94
+ const activePlugins = pluginService.getActivePlugins();
95
+ res.json({
96
+ success: true,
97
+ data: activePlugins,
98
+ });
99
+ }
100
+ catch (error) {
101
+ res.status(500).json({
102
+ success: false,
103
+ error: getErrorMessage(error, 'Failed to get active plugins'),
104
+ });
105
+ }
106
+ });
107
+ // Get active plugin (alternative route)
108
+ router.get('/active/current', async (req, res) => {
109
+ try {
110
+ const activePlugin = pluginService.getActivePlugin();
111
+ res.json({
112
+ success: true,
113
+ data: activePlugin,
114
+ });
115
+ }
116
+ catch (error) {
117
+ res.status(500).json({
118
+ success: false,
119
+ error: getErrorMessage(error, 'Failed to get active plugin'),
120
+ });
121
+ }
122
+ });
123
+ // Get plugin status
124
+ router.get('/status/all', async (req, res) => {
125
+ try {
126
+ const status = pluginService.getPluginStatus();
127
+ res.json({
128
+ success: true,
129
+ data: status,
130
+ });
131
+ }
132
+ catch (error) {
133
+ res.status(500).json({
134
+ success: false,
135
+ error: getErrorMessage(error, 'Failed to get plugin status'),
136
+ });
137
+ }
138
+ });
139
+ // Get a specific plugin
140
+ router.get('/:id', async (req, res) => {
141
+ try {
142
+ const { id } = req.params;
143
+ const plugin = pluginService.getPlugin(id);
144
+ if (!plugin) {
145
+ res.status(404).json({
146
+ success: false,
147
+ error: 'Plugin not found',
148
+ });
149
+ return;
150
+ }
151
+ res.json({
152
+ success: true,
153
+ data: plugin,
154
+ });
155
+ }
156
+ catch (error) {
157
+ res.status(500).json({
158
+ success: false,
159
+ error: getErrorMessage(error, 'Failed to get plugin'),
160
+ });
161
+ }
162
+ });
163
+ // Upload and install a plugin
164
+ router.post('/upload', uploadRateLimit, upload.single('plugin'), async (req, res) => {
165
+ const tempDir = path.resolve('temp/');
166
+ try {
167
+ if (!req.file) {
168
+ res.status(400).json({
169
+ success: false,
170
+ error: 'No file uploaded',
171
+ });
172
+ return;
173
+ }
174
+ // Validate file path is within temp directory
175
+ const resolvedFilePath = path.resolve(req.file.path);
176
+ if (!resolvedFilePath.startsWith(tempDir)) {
177
+ safeCleanupFile(req.file.path, tempDir);
178
+ res.status(400).json({
179
+ success: false,
180
+ error: 'Invalid file path',
181
+ });
182
+ return;
183
+ }
184
+ const fileExt = path.extname(req.file.originalname).toLowerCase();
185
+ let pluginData;
186
+ if (fileExt === '.json') {
187
+ // Handle JSON file with safe path handling
188
+ const fileContent = fs.readFileSync(resolvedFilePath, 'utf8');
189
+ pluginData = JSON.parse(fileContent);
190
+ }
191
+ else if (fileExt === '.zip') {
192
+ // Handle ZIP file (for future extension)
193
+ safeCleanupFile(req.file.path, tempDir);
194
+ res.status(400).json({
195
+ success: false,
196
+ error: 'ZIP file support is not implemented yet',
197
+ });
198
+ return;
199
+ }
200
+ else {
201
+ // Clean up invalid file type
202
+ safeCleanupFile(req.file.path, tempDir);
203
+ res.status(400).json({
204
+ success: false,
205
+ error: 'Unsupported file type',
206
+ });
207
+ return;
208
+ }
209
+ // Clean up uploaded file after reading
210
+ safeCleanupFile(req.file.path, tempDir);
211
+ // Install the plugin
212
+ const plugin = pluginService.importPlugin(pluginData);
213
+ res.json({
214
+ success: true,
215
+ data: plugin,
216
+ });
217
+ }
218
+ catch (error) {
219
+ // Clean up uploaded file if it exists
220
+ if (req.file) {
221
+ safeCleanupFile(req.file.path, tempDir);
222
+ }
223
+ const errorMessage = getErrorMessage(error, 'Failed to upload plugin');
224
+ if (errorMessage.includes('already exists')) {
225
+ res.status(409).json({
226
+ success: false,
227
+ error: errorMessage,
228
+ });
229
+ }
230
+ else if (errorMessage.includes('Invalid')) {
231
+ res.status(400).json({
232
+ success: false,
233
+ error: errorMessage,
234
+ });
235
+ }
236
+ else {
237
+ res.status(500).json({
238
+ success: false,
239
+ error: errorMessage,
240
+ });
241
+ }
242
+ }
243
+ });
244
+ // Install plugin from JSON data (alternative to file upload)
245
+ router.post('/install', pluginRateLimit, async (req, res) => {
246
+ try {
247
+ const pluginData = req.body;
248
+ const plugin = pluginService.installPlugin(pluginData);
249
+ res.json({
250
+ success: true,
251
+ data: plugin,
252
+ });
253
+ }
254
+ catch (error) {
255
+ const errorMessage = getErrorMessage(error, 'Failed to install plugin');
256
+ if (errorMessage.includes('already exists')) {
257
+ res.status(409).json({
258
+ success: false,
259
+ error: errorMessage,
260
+ });
261
+ }
262
+ else if (errorMessage.includes('Invalid')) {
263
+ res.status(400).json({
264
+ success: false,
265
+ error: errorMessage,
266
+ });
267
+ }
268
+ else {
269
+ res.status(500).json({
270
+ success: false,
271
+ error: errorMessage,
272
+ });
273
+ }
274
+ }
275
+ });
276
+ // Update a plugin
277
+ router.put('/:id', async (req, res) => {
278
+ try {
279
+ const { id } = req.params;
280
+ const updates = req.body;
281
+ // Ensure the ID matches
282
+ if (updates.id && updates.id !== id) {
283
+ res.status(400).json({
284
+ success: false,
285
+ error: 'Plugin ID in body does not match URL parameter',
286
+ });
287
+ return;
288
+ }
289
+ updates.id = id;
290
+ const plugin = pluginService.installPlugin(updates);
291
+ res.json({
292
+ success: true,
293
+ data: plugin,
294
+ });
295
+ }
296
+ catch (error) {
297
+ res.status(500).json({
298
+ success: false,
299
+ error: getErrorMessage(error, 'Failed to update plugin'),
300
+ });
301
+ }
302
+ });
303
+ // Delete a plugin
304
+ router.delete('/:id', pluginRateLimit, async (req, res) => {
305
+ try {
306
+ const { id } = req.params;
307
+ const success = pluginService.deletePlugin(id);
308
+ if (!success) {
309
+ res.status(404).json({
310
+ success: false,
311
+ error: 'Plugin not found',
312
+ });
313
+ return;
314
+ }
315
+ res.json({
316
+ success: true,
317
+ data: true,
318
+ });
319
+ }
320
+ catch (error) {
321
+ res.status(500).json({
322
+ success: false,
323
+ error: getErrorMessage(error, 'Failed to delete plugin'),
324
+ });
325
+ }
326
+ });
327
+ // Activate a plugin
328
+ router.post('/activate/:id', pluginRateLimit, async (req, res) => {
329
+ try {
330
+ const { id } = req.params;
331
+ const success = pluginService.activatePlugin(id);
332
+ res.json({
333
+ success: true,
334
+ data: success,
335
+ });
336
+ }
337
+ catch (error) {
338
+ const errorMessage = getErrorMessage(error, 'Failed to activate plugin');
339
+ if (errorMessage.includes('not found')) {
340
+ res.status(404).json({
341
+ success: false,
342
+ error: errorMessage,
343
+ });
344
+ }
345
+ else {
346
+ res.status(500).json({
347
+ success: false,
348
+ error: errorMessage,
349
+ });
350
+ }
351
+ }
352
+ });
353
+ // Deactivate a specific plugin
354
+ router.post('/deactivate/:id', pluginRateLimit, async (req, res) => {
355
+ try {
356
+ const { id } = req.params;
357
+ const success = pluginService.deactivatePlugin(id);
358
+ res.json({
359
+ success: true,
360
+ data: success,
361
+ });
362
+ }
363
+ catch (error) {
364
+ res.status(500).json({
365
+ success: false,
366
+ error: getErrorMessage(error, 'Failed to deactivate plugin'),
367
+ });
368
+ }
369
+ });
370
+ // Deactivate all plugins (legacy)
371
+ router.post('/deactivate', pluginRateLimit, async (req, res) => {
372
+ try {
373
+ const success = pluginService.deactivatePlugin();
374
+ res.json({
375
+ success: true,
376
+ data: success,
377
+ });
378
+ }
379
+ catch (error) {
380
+ res.status(500).json({
381
+ success: false,
382
+ error: getErrorMessage(error, 'Failed to deactivate plugin'),
383
+ });
384
+ }
385
+ });
386
+ // Export plugin
387
+ router.get('/:id/export', async (req, res) => {
388
+ try {
389
+ const { id } = req.params;
390
+ const plugin = pluginService.exportPlugin(id);
391
+ if (!plugin) {
392
+ res.status(404).json({
393
+ success: false,
394
+ error: 'Plugin not found',
395
+ });
396
+ return;
397
+ }
398
+ // Remove runtime properties for export
399
+ const exportData = {
400
+ ...plugin,
401
+ active: undefined,
402
+ created_at: undefined,
403
+ updated_at: undefined,
404
+ };
405
+ res.setHeader('Content-Type', 'application/json');
406
+ res.setHeader('Content-Disposition', `attachment; filename="${id}.json"`);
407
+ res.send(JSON.stringify(exportData, null, 2));
408
+ }
409
+ catch (error) {
410
+ res.status(500).json({
411
+ success: false,
412
+ error: getErrorMessage(error, 'Failed to export plugin'),
413
+ });
414
+ }
415
+ });
416
+ export default router;
417
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/routes/plugins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=preferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../../src/routes/preferences.ts"],"names":[],"mappings":"AA2BA,QAAA,MAAM,MAAM,4CAAmB,CAAC;AAmYhC,eAAe,MAAM,CAAC"}