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.
- package/LICENSE +201 -0
- package/README.md +204 -0
- package/backend/dist/db.d.ts +19 -0
- package/backend/dist/db.d.ts.map +1 -0
- package/backend/dist/db.js +355 -0
- package/backend/dist/db.js.map +1 -0
- package/backend/dist/env.d.ts +2 -0
- package/backend/dist/env.d.ts.map +1 -0
- package/backend/dist/env.js +22 -0
- package/backend/dist/env.js.map +1 -0
- package/backend/dist/index.d.ts +4 -0
- package/backend/dist/index.d.ts.map +1 -0
- package/backend/dist/index.js +751 -0
- package/backend/dist/index.js.map +1 -0
- package/backend/dist/middleware/auth.d.ts +18 -0
- package/backend/dist/middleware/auth.d.ts.map +1 -0
- package/backend/dist/middleware/auth.js +98 -0
- package/backend/dist/middleware/auth.js.map +1 -0
- package/backend/dist/middleware/index.d.ts +5 -0
- package/backend/dist/middleware/index.d.ts.map +1 -0
- package/backend/dist/middleware/index.js +62 -0
- package/backend/dist/middleware/index.js.map +1 -0
- package/backend/dist/models/personaModel.d.ts +37 -0
- package/backend/dist/models/personaModel.d.ts.map +1 -0
- package/backend/dist/models/personaModel.js +269 -0
- package/backend/dist/models/personaModel.js.map +1 -0
- package/backend/dist/models/userModel.d.ts +86 -0
- package/backend/dist/models/userModel.d.ts.map +1 -0
- package/backend/dist/models/userModel.js +212 -0
- package/backend/dist/models/userModel.js.map +1 -0
- package/backend/dist/routes/auth.d.ts +3 -0
- package/backend/dist/routes/auth.d.ts.map +1 -0
- package/backend/dist/routes/auth.js +389 -0
- package/backend/dist/routes/auth.js.map +1 -0
- package/backend/dist/routes/chat.d.ts +3 -0
- package/backend/dist/routes/chat.d.ts.map +1 -0
- package/backend/dist/routes/chat.js +767 -0
- package/backend/dist/routes/chat.js.map +1 -0
- package/backend/dist/routes/documents.d.ts +3 -0
- package/backend/dist/routes/documents.d.ts.map +1 -0
- package/backend/dist/routes/documents.js +244 -0
- package/backend/dist/routes/documents.js.map +1 -0
- package/backend/dist/routes/ollama.d.ts +3 -0
- package/backend/dist/routes/ollama.d.ts.map +1 -0
- package/backend/dist/routes/ollama.js +549 -0
- package/backend/dist/routes/ollama.js.map +1 -0
- package/backend/dist/routes/personas.d.ts +3 -0
- package/backend/dist/routes/personas.d.ts.map +1 -0
- package/backend/dist/routes/personas.js +505 -0
- package/backend/dist/routes/personas.js.map +1 -0
- package/backend/dist/routes/plugins.d.ts +3 -0
- package/backend/dist/routes/plugins.d.ts.map +1 -0
- package/backend/dist/routes/plugins.js +417 -0
- package/backend/dist/routes/plugins.js.map +1 -0
- package/backend/dist/routes/preferences.d.ts +3 -0
- package/backend/dist/routes/preferences.d.ts.map +1 -0
- package/backend/dist/routes/preferences.js +303 -0
- package/backend/dist/routes/preferences.js.map +1 -0
- package/backend/dist/routes/tts.d.ts +3 -0
- package/backend/dist/routes/tts.d.ts.map +1 -0
- package/backend/dist/routes/tts.js +304 -0
- package/backend/dist/routes/tts.js.map +1 -0
- package/backend/dist/routes/users.d.ts +3 -0
- package/backend/dist/routes/users.d.ts.map +1 -0
- package/backend/dist/routes/users.js +246 -0
- package/backend/dist/routes/users.js.map +1 -0
- package/backend/dist/services/authService.d.ts +51 -0
- package/backend/dist/services/authService.d.ts.map +1 -0
- package/backend/dist/services/authService.js +153 -0
- package/backend/dist/services/authService.js.map +1 -0
- package/backend/dist/services/chatService.d.ts +52 -0
- package/backend/dist/services/chatService.d.ts.map +1 -0
- package/backend/dist/services/chatService.js +645 -0
- package/backend/dist/services/chatService.js.map +1 -0
- package/backend/dist/services/documentService.d.ts +34 -0
- package/backend/dist/services/documentService.d.ts.map +1 -0
- package/backend/dist/services/documentService.js +428 -0
- package/backend/dist/services/documentService.js.map +1 -0
- package/backend/dist/services/encryptionService.d.ts +62 -0
- package/backend/dist/services/encryptionService.d.ts.map +1 -0
- package/backend/dist/services/encryptionService.js +284 -0
- package/backend/dist/services/encryptionService.js.map +1 -0
- package/backend/dist/services/memoryService.d.ts +140 -0
- package/backend/dist/services/memoryService.d.ts.map +1 -0
- package/backend/dist/services/memoryService.js +867 -0
- package/backend/dist/services/memoryService.js.map +1 -0
- package/backend/dist/services/mutationEngineService.d.ts +49 -0
- package/backend/dist/services/mutationEngineService.d.ts.map +1 -0
- package/backend/dist/services/mutationEngineService.js +432 -0
- package/backend/dist/services/mutationEngineService.js.map +1 -0
- package/backend/dist/services/ollamaService.d.ts +55 -0
- package/backend/dist/services/ollamaService.d.ts.map +1 -0
- package/backend/dist/services/ollamaService.js +450 -0
- package/backend/dist/services/ollamaService.js.map +1 -0
- package/backend/dist/services/personaService.d.ts +67 -0
- package/backend/dist/services/personaService.d.ts.map +1 -0
- package/backend/dist/services/personaService.js +373 -0
- package/backend/dist/services/personaService.js.map +1 -0
- package/backend/dist/services/pluginService.d.ts +42 -0
- package/backend/dist/services/pluginService.d.ts.map +1 -0
- package/backend/dist/services/pluginService.js +961 -0
- package/backend/dist/services/pluginService.js.map +1 -0
- package/backend/dist/services/preferencesService.d.ts +35 -0
- package/backend/dist/services/preferencesService.d.ts.map +1 -0
- package/backend/dist/services/preferencesService.js +255 -0
- package/backend/dist/services/preferencesService.js.map +1 -0
- package/backend/dist/services/simpleGitHubOAuth.d.ts +48 -0
- package/backend/dist/services/simpleGitHubOAuth.d.ts.map +1 -0
- package/backend/dist/services/simpleGitHubOAuth.js +203 -0
- package/backend/dist/services/simpleGitHubOAuth.js.map +1 -0
- package/backend/dist/services/simpleHuggingFaceOAuth.d.ts +43 -0
- package/backend/dist/services/simpleHuggingFaceOAuth.d.ts.map +1 -0
- package/backend/dist/services/simpleHuggingFaceOAuth.js +159 -0
- package/backend/dist/services/simpleHuggingFaceOAuth.js.map +1 -0
- package/backend/dist/services/userService.d.ts +1 -0
- package/backend/dist/services/userService.d.ts.map +1 -0
- package/backend/dist/services/userService.js +18 -0
- package/backend/dist/services/userService.js.map +1 -0
- package/backend/dist/storage.d.ts +55 -0
- package/backend/dist/storage.d.ts.map +1 -0
- package/backend/dist/storage.js +741 -0
- package/backend/dist/storage.js.map +1 -0
- package/backend/dist/test-encryption.d.ts +2 -0
- package/backend/dist/test-encryption.d.ts.map +1 -0
- package/backend/dist/test-encryption.js +64 -0
- package/backend/dist/test-encryption.js.map +1 -0
- package/backend/dist/types/index.d.ts +523 -0
- package/backend/dist/types/index.d.ts.map +1 -0
- package/backend/dist/types/index.js +31 -0
- package/backend/dist/types/index.js.map +1 -0
- package/backend/dist/utils/generationUtils.d.ts +10 -0
- package/backend/dist/utils/generationUtils.d.ts.map +1 -0
- package/backend/dist/utils/generationUtils.js +49 -0
- package/backend/dist/utils/generationUtils.js.map +1 -0
- package/backend/dist/utils/hash.d.ts +29 -0
- package/backend/dist/utils/hash.d.ts.map +1 -0
- package/backend/dist/utils/hash.js +73 -0
- package/backend/dist/utils/hash.js.map +1 -0
- package/backend/dist/utils/jwt.d.ts +37 -0
- package/backend/dist/utils/jwt.d.ts.map +1 -0
- package/backend/dist/utils/jwt.js +86 -0
- package/backend/dist/utils/jwt.js.map +1 -0
- package/bin/cli.js +150 -0
- package/electron/main.js +322 -0
- package/frontend/dist/_redirects +1 -0
- package/frontend/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/frontend/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/frontend/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/frontend/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/frontend/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/frontend/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/frontend/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/frontend/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/frontend/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/frontend/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/frontend/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/frontend/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/frontend/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/frontend/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/frontend/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/frontend/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/frontend/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/frontend/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/frontend/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/frontend/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/frontend/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/frontend/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/frontend/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/frontend/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/frontend/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/frontend/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/frontend/dist/assets/index-CRQkB7Wz.js +3 -0
- package/frontend/dist/css/index-B1OjddR-.css +1 -0
- package/frontend/dist/favicon-dark.png +0 -0
- package/frontend/dist/favicon-light.png +0 -0
- package/frontend/dist/index.html +23 -0
- package/frontend/dist/js/ArtifactContainer-c_oi7XMs.js +23 -0
- package/frontend/dist/js/ArtifactDemoPage-CdfwJVXu.js +98 -0
- package/frontend/dist/js/ChatPage-CyotkmS0.js +281 -0
- package/frontend/dist/js/ModelsPage-DNaziPHc.js +2 -0
- package/frontend/dist/js/PersonasPage-DcnbJf8Q.js +13 -0
- package/frontend/dist/js/UserManagementPage-DtTf92dS.js +1 -0
- package/frontend/dist/js/markdown-vendor-D-79K2xZ.js +22 -0
- package/frontend/dist/js/react-vendor-N--QU9DW.js +8 -0
- package/frontend/dist/js/router-vendor-B-t91v39.js +3 -0
- package/frontend/dist/js/ui-vendor-VxSCY_bv.js +177 -0
- package/frontend/dist/js/utils-vendor-DNzxLBGx.js +6 -0
- package/frontend/dist/logo-dark.png +0 -0
- package/frontend/dist/logo-light.png +0 -0
- package/frontend/dist/logo.svg +14 -0
- package/package.json +128 -0
- package/plugins/anthropic.json +25 -0
- package/plugins/elevenlabs.json +58 -0
- package/plugins/gemini.json +57 -0
- package/plugins/github.json +23 -0
- package/plugins/groq.json +25 -0
- package/plugins/mistral.json +73 -0
- package/plugins/openai-tts.json +38 -0
- package/plugins/openai.json +132 -0
- package/plugins/openrouter.json +353 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { UserPublic } from '../models/userModel.js';
|
|
2
|
+
interface HuggingFaceProfile {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
fullname: string;
|
|
6
|
+
email?: string;
|
|
7
|
+
avatarUrl?: string;
|
|
8
|
+
isPro?: boolean;
|
|
9
|
+
orgs?: Array<{
|
|
10
|
+
name: string;
|
|
11
|
+
fullname: string;
|
|
12
|
+
isEnterprise: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export declare class HuggingFaceOAuthService {
|
|
16
|
+
constructor();
|
|
17
|
+
private get clientId();
|
|
18
|
+
private get clientSecret();
|
|
19
|
+
private get callbackUrl();
|
|
20
|
+
/**
|
|
21
|
+
* Check if Hugging Face OAuth is properly configured
|
|
22
|
+
*/
|
|
23
|
+
isConfigured(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Generate the authorization URL for Hugging Face OAuth
|
|
26
|
+
*/
|
|
27
|
+
getAuthUrl(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Exchange authorization code for access token
|
|
30
|
+
*/
|
|
31
|
+
exchangeCodeForToken(code: string): Promise<string | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Get user profile from Hugging Face API
|
|
34
|
+
*/
|
|
35
|
+
getUserProfile(accessToken: string): Promise<HuggingFaceProfile | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Process Hugging Face user and create/update local user
|
|
38
|
+
*/
|
|
39
|
+
processUser(profile: HuggingFaceProfile): Promise<UserPublic | null>;
|
|
40
|
+
}
|
|
41
|
+
export declare const huggingFaceOAuthService: HuggingFaceOAuthService;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=simpleHuggingFaceOAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simpleHuggingFaceOAuth.d.ts","sourceRoot":"","sources":["../../src/services/simpleHuggingFaceOAuth.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAa,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAG/D,UAAU,kBAAkB;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC,CAAC;CACJ;AAED,qBAAa,uBAAuB;;IAKlC,OAAO,KAAK,QAAQ,GAEnB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,WAAW,GAKtB;IAED;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,UAAU,IAAI,MAAM;IAoBpB;;OAEG;IACG,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4BhE;;OAEG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAuBrC;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAoD3E;AAGD,eAAO,MAAM,uBAAuB,yBAAgC,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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 { userModel } from '../models/userModel.js';
|
|
18
|
+
import * as crypto from 'crypto';
|
|
19
|
+
export class HuggingFaceOAuthService {
|
|
20
|
+
constructor() {
|
|
21
|
+
// No parameters needed - will read from environment
|
|
22
|
+
}
|
|
23
|
+
get clientId() {
|
|
24
|
+
return process.env.HUGGINGFACE_CLIENT_ID;
|
|
25
|
+
}
|
|
26
|
+
get clientSecret() {
|
|
27
|
+
return process.env.HUGGINGFACE_CLIENT_SECRET;
|
|
28
|
+
}
|
|
29
|
+
get callbackUrl() {
|
|
30
|
+
return (process.env.HUGGINGFACE_CALLBACK_URL ||
|
|
31
|
+
`${process.env.BASE_URL || 'http://localhost:3001'}/api/auth/oauth/huggingface/callback`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if Hugging Face OAuth is properly configured
|
|
35
|
+
*/
|
|
36
|
+
isConfigured() {
|
|
37
|
+
return !!(this.clientId && this.clientSecret);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Generate the authorization URL for Hugging Face OAuth
|
|
41
|
+
*/
|
|
42
|
+
getAuthUrl() {
|
|
43
|
+
if (!this.clientId) {
|
|
44
|
+
throw new Error('Hugging Face Client ID not configured. Please set the HUGGINGFACE_CLIENT_ID environment variable.');
|
|
45
|
+
}
|
|
46
|
+
const params = new URLSearchParams({
|
|
47
|
+
client_id: this.clientId,
|
|
48
|
+
redirect_uri: this.callbackUrl,
|
|
49
|
+
response_type: 'code',
|
|
50
|
+
scope: 'read-repos read-billing', // Hugging Face scopes
|
|
51
|
+
state: crypto.randomBytes(32).toString('hex'), // CSRF protection
|
|
52
|
+
});
|
|
53
|
+
const authUrl = `https://huggingface.co/oauth/authorize?${params.toString()}`;
|
|
54
|
+
console.log('🤗 Hugging Face auth URL generated:', authUrl);
|
|
55
|
+
return authUrl;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Exchange authorization code for access token
|
|
59
|
+
*/
|
|
60
|
+
async exchangeCodeForToken(code) {
|
|
61
|
+
try {
|
|
62
|
+
const response = await fetch('https://huggingface.co/oauth/token', {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers: {
|
|
65
|
+
Accept: 'application/json',
|
|
66
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
67
|
+
},
|
|
68
|
+
body: new URLSearchParams({
|
|
69
|
+
client_id: this.clientId,
|
|
70
|
+
client_secret: this.clientSecret,
|
|
71
|
+
code,
|
|
72
|
+
grant_type: 'authorization_code',
|
|
73
|
+
redirect_uri: this.callbackUrl,
|
|
74
|
+
}),
|
|
75
|
+
});
|
|
76
|
+
const data = (await response.json());
|
|
77
|
+
return data.access_token || null;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error('Hugging Face token exchange error:', error);
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get user profile from Hugging Face API
|
|
86
|
+
*/
|
|
87
|
+
async getUserProfile(accessToken) {
|
|
88
|
+
try {
|
|
89
|
+
const response = await fetch('https://huggingface.co/api/whoami-v2', {
|
|
90
|
+
headers: {
|
|
91
|
+
Authorization: `Bearer ${accessToken}`,
|
|
92
|
+
Accept: 'application/json',
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
console.error('Failed to fetch Hugging Face profile:', response.status);
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const profile = (await response.json());
|
|
100
|
+
console.log('🤗 Hugging Face profile fetched:', profile.name);
|
|
101
|
+
return profile;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('Error fetching Hugging Face profile:', error);
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Process Hugging Face user and create/update local user
|
|
110
|
+
*/
|
|
111
|
+
async processUser(profile) {
|
|
112
|
+
try {
|
|
113
|
+
// Generate a unique username based on Hugging Face username
|
|
114
|
+
let uniqueUsername = `hf_${profile.name}`;
|
|
115
|
+
// Check if username already exists and make it unique if needed
|
|
116
|
+
let counter = 1;
|
|
117
|
+
let checkUsername = uniqueUsername;
|
|
118
|
+
while (userModel.usernameExists(checkUsername)) {
|
|
119
|
+
checkUsername = `${uniqueUsername}_${counter}`;
|
|
120
|
+
counter++;
|
|
121
|
+
}
|
|
122
|
+
uniqueUsername = checkUsername;
|
|
123
|
+
// Check if user already exists by username first (Hugging Face doesn't always provide email)
|
|
124
|
+
const existingUser = userModel.getUserByUsername(`hf_${profile.name}`);
|
|
125
|
+
if (existingUser) {
|
|
126
|
+
console.log('Found existing Hugging Face user by username:', existingUser.username);
|
|
127
|
+
// Convert User to UserPublic format
|
|
128
|
+
return {
|
|
129
|
+
id: existingUser.id,
|
|
130
|
+
username: existingUser.username,
|
|
131
|
+
email: existingUser.email,
|
|
132
|
+
role: existingUser.role,
|
|
133
|
+
avatar: existingUser.avatar,
|
|
134
|
+
createdAt: new Date(existingUser.created_at).toISOString(),
|
|
135
|
+
updatedAt: new Date(existingUser.updated_at).toISOString(),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// Create new user
|
|
139
|
+
console.log('Creating new Hugging Face user:', uniqueUsername);
|
|
140
|
+
const newUser = await userModel.createUser({
|
|
141
|
+
username: uniqueUsername,
|
|
142
|
+
email: profile.email || null,
|
|
143
|
+
// Set a cryptographically secure random password since OAuth users don't use password login
|
|
144
|
+
// The password is prefixed with 'oauth:hf:' to mark this account as Hugging Face OAuth-only
|
|
145
|
+
password: 'oauth:hf:' + crypto.randomBytes(24).toString('base64'),
|
|
146
|
+
role: 'user', // Default role
|
|
147
|
+
});
|
|
148
|
+
console.log('Created new Hugging Face user:', newUser.username);
|
|
149
|
+
return newUser;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
console.error('Error creating/finding Hugging Face user:', error);
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Export singleton instance
|
|
158
|
+
export const huggingFaceOAuthService = new HuggingFaceOAuthService();
|
|
159
|
+
//# sourceMappingURL=simpleHuggingFaceOAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simpleHuggingFaceOAuth.js","sourceRoot":"","sources":["../../src/services/simpleHuggingFaceOAuth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAc,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAgBjC,MAAM,OAAO,uBAAuB;IAClC;QACE,oDAAoD;IACtD,CAAC;IAED,IAAY,QAAQ;QAClB,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC3C,CAAC;IAED,IAAY,YAAY;QACtB,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC/C,CAAC;IAED,IAAY,WAAW;QACrB,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACpC,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB,sCAAsC,CACzF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,mGAAmG,CACpG,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,aAAa,EAAE,MAAM;YACrB,KAAK,EAAE,yBAAyB,EAAE,sBAAsB;YACxD,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB;SAClE,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,0CAA0C,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,IAAY;QACrC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oCAAoC,EAAE;gBACjE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,MAAM,EAAE,kBAAkB;oBAC1B,cAAc,EAAE,mCAAmC;iBACpD;gBACD,IAAI,EAAE,IAAI,eAAe,CAAC;oBACxB,SAAS,EAAE,IAAI,CAAC,QAAS;oBACzB,aAAa,EAAE,IAAI,CAAC,YAAa;oBACjC,IAAI;oBACJ,UAAU,EAAE,oBAAoB;oBAChC,YAAY,EAAE,IAAI,CAAC,WAAW;iBAC/B,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;YACF,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,WAAmB;QAEnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;gBACnE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,WAAW,EAAE;oBACtC,MAAM,EAAE,kBAAkB;iBAC3B;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACxE,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAA2B;QAC3C,IAAI,CAAC;YACH,4DAA4D;YAC5D,IAAI,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YAE1C,gEAAgE;YAChE,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,aAAa,GAAG,cAAc,CAAC;YACnC,OAAO,SAAS,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC/C,aAAa,GAAG,GAAG,cAAc,IAAI,OAAO,EAAE,CAAC;gBAC/C,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,cAAc,GAAG,aAAa,CAAC;YAE/B,6FAA6F;YAC7F,MAAM,YAAY,GAAG,SAAS,CAAC,iBAAiB,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACvE,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CACT,+CAA+C,EAC/C,YAAY,CAAC,QAAQ,CACtB,CAAC;gBACF,oCAAoC;gBACpC,OAAO;oBACL,EAAE,EAAE,YAAY,CAAC,EAAE;oBACnB,QAAQ,EAAE,YAAY,CAAC,QAAQ;oBAC/B,KAAK,EAAE,YAAY,CAAC,KAAK;oBACzB,IAAI,EAAE,YAAY,CAAC,IAAI;oBACvB,MAAM,EAAE,YAAY,CAAC,MAAM;oBAC3B,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE;oBAC1D,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE;iBAC3D,CAAC;YACJ,CAAC;YAED,kBAAkB;YAClB,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,cAAc,CAAC,CAAC;YAE/D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC;gBACzC,QAAQ,EAAE,cAAc;gBACxB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;gBAC5B,4FAA4F;gBAC5F,4FAA4F;gBAC5F,QAAQ,EAAE,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACjE,IAAI,EAAE,MAAM,EAAE,eAAe;aAC9B,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAChE,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,uBAAuB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=userService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userService.d.ts","sourceRoot":"","sources":["../../src/services/userService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Libre WebUI
|
|
4
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at:
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
//# sourceMappingURL=userService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userService.js","sourceRoot":"","sources":["../../src/services/userService.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ChatSession, DocumentChunk, UserPreferences } from './types/index.js';
|
|
2
|
+
export interface Document {
|
|
3
|
+
id: string;
|
|
4
|
+
filename: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
content?: string;
|
|
7
|
+
fileType?: 'pdf' | 'txt';
|
|
8
|
+
size?: number;
|
|
9
|
+
sessionId?: string;
|
|
10
|
+
uploadedAt: number;
|
|
11
|
+
createdAt?: number;
|
|
12
|
+
metadata?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export interface User {
|
|
15
|
+
id: string;
|
|
16
|
+
username: string;
|
|
17
|
+
email?: string;
|
|
18
|
+
password_hash: string;
|
|
19
|
+
role: string;
|
|
20
|
+
avatar?: string | null;
|
|
21
|
+
created_at: number;
|
|
22
|
+
updated_at: number;
|
|
23
|
+
}
|
|
24
|
+
declare class StorageService {
|
|
25
|
+
private useSQLite;
|
|
26
|
+
private sessionsFile;
|
|
27
|
+
private preferencesFile;
|
|
28
|
+
private documentsFile;
|
|
29
|
+
private documentChunksFile;
|
|
30
|
+
constructor();
|
|
31
|
+
createUser(username: string, email: string | undefined, password: string, role?: string): Promise<User>;
|
|
32
|
+
getUser(userId: string): User | undefined;
|
|
33
|
+
getUserByUsername(username: string): User | undefined;
|
|
34
|
+
getAllSessions(userId?: string): ChatSession[];
|
|
35
|
+
getSession(sessionId: string, userId?: string): ChatSession | undefined;
|
|
36
|
+
saveSession(session: ChatSession, userId?: string): void;
|
|
37
|
+
deleteSession(sessionId: string, userId?: string): boolean;
|
|
38
|
+
clearAllSessions(userId?: string): number;
|
|
39
|
+
/**
|
|
40
|
+
* Safely decrypt and parse a preference value with proper error handling
|
|
41
|
+
*/
|
|
42
|
+
private safeDecryptPreference;
|
|
43
|
+
getPreferences(userId?: string): UserPreferences | null;
|
|
44
|
+
savePreferences(preferences: UserPreferences, userId?: string): void;
|
|
45
|
+
getAllDocuments(userId?: string): Document[];
|
|
46
|
+
getDocument(documentId: string, userId?: string): Document | undefined;
|
|
47
|
+
saveDocument(document: Document, userId?: string): void;
|
|
48
|
+
deleteDocument(documentId: string, userId?: string): boolean;
|
|
49
|
+
getDocumentChunks(documentId: string): DocumentChunk[];
|
|
50
|
+
saveDocumentChunks(documentId: string, chunks: DocumentChunk[]): void;
|
|
51
|
+
deleteDocumentChunks(documentId: string): boolean;
|
|
52
|
+
}
|
|
53
|
+
declare const storageService: StorageService;
|
|
54
|
+
export default storageService;
|
|
55
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQ/E,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAwDD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,cAAM,cAAc;IAClB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,aAAa,CAAgD;IACrE,OAAO,CAAC,kBAAkB,CAIxB;;IAYI,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,SAAS,GACZ,OAAO,CAAC,IAAI,CAAC;IAyChB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAgBzC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAoBrD,cAAc,CAAC,MAAM,SAAY,GAAG,WAAW,EAAE;IAkGjD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAY,GAAG,WAAW,GAAG,SAAS;IAuF1E,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAY,GAAG,IAAI;IA6F3D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAY,GAAG,OAAO;IA6B7D,gBAAgB,CAAC,MAAM,SAAY,GAAG,MAAM;IAwB5C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA8B7B,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IA4CvD,eAAe,CAAC,WAAW,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IA+DpE,eAAe,CAAC,MAAM,SAAY,GAAG,QAAQ,EAAE;IAgD/C,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,SAAY,GAAG,QAAQ,GAAG,SAAS;IAwCzE,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAY,GAAG,IAAI;IAuD1D,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,SAAY,GAAG,OAAO;IAiC/D,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE;IA6CtD,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAgErE,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;CA+BlD;AAGD,QAAA,MAAM,cAAc,gBAAuB,CAAC;AAC5C,eAAe,cAAc,CAAC"}
|