@lobehub/chat 1.79.7 → 1.79.9

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 (121) hide show
  1. package/.eslintrc.js +1 -0
  2. package/CHANGELOG.md +58 -0
  3. package/changelog/v1.json +18 -0
  4. package/docs/development/database-schema.dbml +119 -0
  5. package/locales/ar/models.json +12 -0
  6. package/locales/ar/oauth.json +40 -0
  7. package/locales/bg-BG/models.json +12 -0
  8. package/locales/bg-BG/oauth.json +40 -0
  9. package/locales/de-DE/models.json +12 -0
  10. package/locales/de-DE/oauth.json +40 -0
  11. package/locales/en-US/models.json +12 -0
  12. package/locales/en-US/oauth.json +40 -0
  13. package/locales/es-ES/models.json +12 -0
  14. package/locales/es-ES/oauth.json +40 -0
  15. package/locales/fa-IR/models.json +12 -0
  16. package/locales/fa-IR/oauth.json +40 -0
  17. package/locales/fr-FR/models.json +12 -0
  18. package/locales/fr-FR/oauth.json +40 -0
  19. package/locales/it-IT/models.json +12 -0
  20. package/locales/it-IT/oauth.json +40 -0
  21. package/locales/ja-JP/models.json +12 -0
  22. package/locales/ja-JP/oauth.json +40 -0
  23. package/locales/ko-KR/models.json +12 -0
  24. package/locales/ko-KR/oauth.json +40 -0
  25. package/locales/nl-NL/models.json +12 -0
  26. package/locales/nl-NL/oauth.json +40 -0
  27. package/locales/pl-PL/models.json +12 -0
  28. package/locales/pl-PL/oauth.json +40 -0
  29. package/locales/pt-BR/models.json +12 -0
  30. package/locales/pt-BR/oauth.json +40 -0
  31. package/locales/ru-RU/models.json +12 -0
  32. package/locales/ru-RU/oauth.json +40 -0
  33. package/locales/tr-TR/models.json +12 -0
  34. package/locales/tr-TR/oauth.json +40 -0
  35. package/locales/vi-VN/models.json +12 -0
  36. package/locales/vi-VN/oauth.json +40 -0
  37. package/locales/zh-CN/models.json +12 -0
  38. package/locales/zh-CN/oauth.json +40 -0
  39. package/locales/zh-TW/models.json +12 -0
  40. package/locales/zh-TW/oauth.json +40 -0
  41. package/package.json +4 -1
  42. package/scripts/generate-oidc-jwk.mjs +59 -0
  43. package/scripts/migrateServerDB/index.ts +3 -1
  44. package/src/app/(backend)/oidc/[...oidc]/route.ts +96 -0
  45. package/src/app/(backend)/oidc/consent/route.ts +131 -0
  46. package/src/app/(backend)/trpc/async/[trpc]/route.ts +1 -1
  47. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +2 -2
  48. package/src/app/(backend)/trpc/lambda/[trpc]/route.ts +2 -2
  49. package/src/app/(backend)/trpc/tools/[trpc]/route.ts +2 -2
  50. package/src/app/[variants]/(main)/files/[id]/page.tsx +1 -1
  51. package/src/app/[variants]/oauth/consent/[uid]/Client.tsx +224 -0
  52. package/src/app/[variants]/oauth/consent/[uid]/ClientError.tsx +46 -0
  53. package/src/app/[variants]/oauth/consent/[uid]/failed/page.tsx +36 -0
  54. package/src/app/[variants]/oauth/consent/[uid]/page.tsx +69 -0
  55. package/src/app/[variants]/oauth/consent/[uid]/success/page.tsx +30 -0
  56. package/src/components/Branding/ProductLogo/index.tsx +6 -1
  57. package/src/config/aiModels/openai.ts +63 -41
  58. package/src/database/client/migrations.json +27 -8
  59. package/src/database/migrations/0020_add_oidc.sql +124 -0
  60. package/src/database/migrations/meta/0020_snapshot.json +4975 -0
  61. package/src/database/migrations/meta/_journal.json +7 -0
  62. package/src/database/repositories/tableViewer/index.test.ts +1 -1
  63. package/src/database/schemas/index.ts +1 -0
  64. package/src/database/schemas/oidc.ts +158 -0
  65. package/src/database/server/models/__tests__/adapter.test.ts +499 -0
  66. package/src/envs/oidc.ts +18 -0
  67. package/src/libs/agent-runtime/azureOpenai/index.ts +4 -1
  68. package/src/libs/agent-runtime/utils/streams/protocol.ts +2 -4
  69. package/src/libs/oidc-provider/adapter.ts +541 -0
  70. package/src/libs/oidc-provider/config.ts +52 -0
  71. package/src/libs/oidc-provider/http-adapter.ts +311 -0
  72. package/src/libs/oidc-provider/interaction-policy.ts +37 -0
  73. package/src/libs/oidc-provider/provider.ts +288 -0
  74. package/src/libs/trpc/async/init.ts +1 -1
  75. package/src/{server → libs/trpc/edge}/context.ts +2 -2
  76. package/src/libs/trpc/{index.ts → edge/index.ts} +8 -8
  77. package/src/libs/trpc/{init.ts → edge/init.ts} +2 -2
  78. package/src/libs/trpc/{middleware → edge/middleware}/jwtPayload.test.ts +3 -3
  79. package/src/libs/trpc/{middleware → edge/middleware}/jwtPayload.ts +3 -2
  80. package/src/libs/trpc/lambda/context.ts +70 -0
  81. package/src/libs/trpc/lambda/index.ts +39 -1
  82. package/src/libs/trpc/lambda/init.ts +26 -0
  83. package/src/libs/trpc/lambda/middleware/index.ts +2 -0
  84. package/src/libs/trpc/{middleware → lambda/middleware}/keyVaults.ts +2 -1
  85. package/src/libs/trpc/lambda/{serverDatabase.ts → middleware/serverDatabase.ts} +2 -1
  86. package/src/libs/trpc/middleware/userAuth.test.ts +3 -3
  87. package/src/libs/trpc/middleware/userAuth.ts +1 -1
  88. package/src/libs/trpc/mock.ts +7 -0
  89. package/src/locales/default/index.ts +2 -0
  90. package/src/locales/default/oauth.ts +43 -0
  91. package/src/middleware.ts +94 -6
  92. package/src/server/routers/edge/appStatus.ts +1 -1
  93. package/src/server/routers/edge/config/index.test.ts +2 -3
  94. package/src/server/routers/edge/config/index.ts +1 -1
  95. package/src/server/routers/edge/index.ts +1 -1
  96. package/src/server/routers/edge/upload.ts +1 -1
  97. package/src/server/routers/lambda/_template.ts +2 -2
  98. package/src/server/routers/lambda/agent.ts +2 -2
  99. package/src/server/routers/lambda/aiModel.ts +2 -2
  100. package/src/server/routers/lambda/aiProvider.ts +2 -2
  101. package/src/server/routers/lambda/chunk.ts +2 -3
  102. package/src/server/routers/lambda/exporter.ts +2 -2
  103. package/src/server/routers/lambda/file.ts +2 -2
  104. package/src/server/routers/lambda/importer.ts +2 -2
  105. package/src/server/routers/lambda/index.ts +1 -1
  106. package/src/server/routers/lambda/knowledgeBase.ts +2 -2
  107. package/src/server/routers/lambda/message.ts +2 -2
  108. package/src/server/routers/lambda/plugin.ts +2 -2
  109. package/src/server/routers/lambda/ragEval.ts +2 -3
  110. package/src/server/routers/lambda/session.ts +2 -2
  111. package/src/server/routers/lambda/sessionGroup.ts +2 -2
  112. package/src/server/routers/lambda/thread.ts +2 -2
  113. package/src/server/routers/lambda/topic.ts +2 -2
  114. package/src/server/routers/lambda/user.ts +2 -2
  115. package/src/server/routers/tools/__tests__/search.test.ts +2 -2
  116. package/src/server/routers/tools/index.ts +1 -1
  117. package/src/server/routers/tools/search.ts +2 -1
  118. package/src/server/services/oidc/index.ts +64 -0
  119. package/src/server/services/oidc/oidcProvider.ts +25 -0
  120. package/src/server/mock.ts +0 -8
  121. /package/src/{server/asyncContext.ts → libs/trpc/async/context.ts} +0 -0
@@ -5,8 +5,8 @@ import { serverDBEnv } from '@/config/db';
5
5
  import { AsyncTaskModel } from '@/database/models/asyncTask';
6
6
  import { ChunkModel } from '@/database/models/chunk';
7
7
  import { FileModel } from '@/database/models/file';
8
- import { authedProcedure, router } from '@/libs/trpc';
9
- import { serverDatabase } from '@/libs/trpc/lambda';
8
+ import { authedProcedure, router } from '@/libs/trpc/lambda';
9
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
10
10
  import { FileService } from '@/server/services/file';
11
11
  import { AsyncTaskStatus, AsyncTaskType } from '@/types/asyncTask';
12
12
  import { FileListItem, QueryFileListSchema, UploadFileSchema } from '@/types/files';
@@ -2,8 +2,8 @@ import { TRPCError } from '@trpc/server';
2
2
  import { z } from 'zod';
3
3
 
4
4
  import { DataImporterRepos } from '@/database/repositories/dataImporter';
5
- import { authedProcedure, router } from '@/libs/trpc';
6
- import { serverDatabase } from '@/libs/trpc/lambda';
5
+ import { authedProcedure, router } from '@/libs/trpc/lambda';
6
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
7
7
  import { FileService } from '@/server/services/file';
8
8
  import { ImportPgDataStructure } from '@/types/export';
9
9
  import { ImportResultData, ImporterEntryData } from '@/types/importer';
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * This file contains the root router of Lobe Chat tRPC-backend
3
3
  */
4
- import { publicProcedure, router } from '@/libs/trpc';
4
+ import { publicProcedure, router } from '@/libs/trpc/lambda';
5
5
 
6
6
  import { agentRouter } from './agent';
7
7
  import { aiModelRouter } from './aiModel';
@@ -2,8 +2,8 @@ import { z } from 'zod';
2
2
 
3
3
  import { KnowledgeBaseModel } from '@/database/models/knowledgeBase';
4
4
  import { insertKnowledgeBasesSchema } from '@/database/schemas';
5
- import { authedProcedure, router } from '@/libs/trpc';
6
- import { serverDatabase } from '@/libs/trpc/lambda';
5
+ import { authedProcedure, router } from '@/libs/trpc/lambda';
6
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
7
7
  import { KnowledgeBaseItem } from '@/types/knowledgeBase';
8
8
 
9
9
  const knowledgeBaseProcedure = authedProcedure.use(serverDatabase).use(async (opts) => {
@@ -3,8 +3,8 @@ import { z } from 'zod';
3
3
  import { MessageModel } from '@/database/models/message';
4
4
  import { updateMessagePluginSchema } from '@/database/schemas';
5
5
  import { getServerDB } from '@/database/server';
6
- import { authedProcedure, publicProcedure, router } from '@/libs/trpc';
7
- import { serverDatabase } from '@/libs/trpc/lambda';
6
+ import { authedProcedure, publicProcedure, router } from '@/libs/trpc/lambda';
7
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
8
8
  import { FileService } from '@/server/services/file';
9
9
  import { ChatMessage } from '@/types/message';
10
10
  import { BatchTaskResult } from '@/types/service';
@@ -2,8 +2,8 @@ import { z } from 'zod';
2
2
 
3
3
  import { PluginModel } from '@/database/models/plugin';
4
4
  import { getServerDB } from '@/database/server';
5
- import { authedProcedure, publicProcedure, router } from '@/libs/trpc';
6
- import { serverDatabase } from '@/libs/trpc/lambda';
5
+ import { authedProcedure, publicProcedure, router } from '@/libs/trpc/lambda';
6
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
7
7
  import { LobeTool } from '@/types/tool';
8
8
 
9
9
  const pluginProcedure = authedProcedure.use(serverDatabase).use(async (opts) => {
@@ -13,9 +13,8 @@ import {
13
13
  EvalEvaluationModel,
14
14
  EvaluationRecordModel,
15
15
  } from '@/database/server/models/ragEval';
16
- import { authedProcedure, router } from '@/libs/trpc';
17
- import { serverDatabase } from '@/libs/trpc/lambda';
18
- import { keyVaults } from '@/libs/trpc/middleware/keyVaults';
16
+ import { authedProcedure, router } from '@/libs/trpc/lambda';
17
+ import { keyVaults, serverDatabase } from '@/libs/trpc/lambda/middleware';
19
18
  import { createAsyncServerClient } from '@/server/routers/async';
20
19
  import { FileService } from '@/server/services/file';
21
20
  import {
@@ -4,8 +4,8 @@ import { SessionModel } from '@/database/models/session';
4
4
  import { SessionGroupModel } from '@/database/models/sessionGroup';
5
5
  import { insertAgentSchema, insertSessionSchema } from '@/database/schemas';
6
6
  import { getServerDB } from '@/database/server';
7
- import { authedProcedure, publicProcedure, router } from '@/libs/trpc';
8
- import { serverDatabase } from '@/libs/trpc/lambda';
7
+ import { authedProcedure, publicProcedure, router } from '@/libs/trpc/lambda';
8
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
9
9
  import { AgentChatConfigSchema } from '@/types/agent';
10
10
  import { LobeMetaDataSchema } from '@/types/meta';
11
11
  import { BatchTaskResult } from '@/types/service';
@@ -2,8 +2,8 @@ import { z } from 'zod';
2
2
 
3
3
  import { SessionGroupModel } from '@/database/models/sessionGroup';
4
4
  import { insertSessionGroupSchema } from '@/database/schemas';
5
- import { authedProcedure, router } from '@/libs/trpc';
6
- import { serverDatabase } from '@/libs/trpc/lambda';
5
+ import { authedProcedure, router } from '@/libs/trpc/lambda';
6
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
7
7
  import { SessionGroupItem } from '@/types/session';
8
8
 
9
9
  const sessionProcedure = authedProcedure.use(serverDatabase).use(async (opts) => {
@@ -3,8 +3,8 @@ import { z } from 'zod';
3
3
  import { MessageModel } from '@/database/models/message';
4
4
  import { ThreadModel } from '@/database/models/thread';
5
5
  import { insertThreadSchema } from '@/database/schemas';
6
- import { authedProcedure, router } from '@/libs/trpc';
7
- import { serverDatabase } from '@/libs/trpc/lambda';
6
+ import { authedProcedure, router } from '@/libs/trpc/lambda';
7
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
8
8
  import { ThreadItem, createThreadSchema } from '@/types/topic/thread';
9
9
 
10
10
  const threadProcedure = authedProcedure.use(serverDatabase).use(async (opts) => {
@@ -2,8 +2,8 @@ import { z } from 'zod';
2
2
 
3
3
  import { TopicModel } from '@/database/models/topic';
4
4
  import { getServerDB } from '@/database/server';
5
- import { authedProcedure, publicProcedure, router } from '@/libs/trpc';
6
- import { serverDatabase } from '@/libs/trpc/lambda';
5
+ import { authedProcedure, publicProcedure, router } from '@/libs/trpc/lambda';
6
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
7
7
  import { BatchTaskResult } from '@/types/service';
8
8
 
9
9
  const topicProcedure = authedProcedure.use(serverDatabase).use(async (opts) => {
@@ -7,8 +7,8 @@ import { SessionModel } from '@/database/models/session';
7
7
  import { UserModel, UserNotFoundError } from '@/database/models/user';
8
8
  import { ClerkAuth } from '@/libs/clerk-auth';
9
9
  import { LobeNextAuthDbAdapter } from '@/libs/next-auth/adapter';
10
- import { authedProcedure, router } from '@/libs/trpc';
11
- import { serverDatabase } from '@/libs/trpc/lambda';
10
+ import { authedProcedure, router } from '@/libs/trpc/lambda';
11
+ import { serverDatabase } from '@/libs/trpc/lambda/middleware';
12
12
  import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt';
13
13
  import { UserService } from '@/server/services/user';
14
14
  import {
@@ -6,8 +6,8 @@ import { isServerMode } from '@/const/version';
6
6
  /**
7
7
  * This file contains the root router of your tRPC-backend
8
8
  */
9
- import { createCallerFactory } from '@/libs/trpc';
10
- import { AuthContext, createContextInner } from '@/server/context';
9
+ import { createCallerFactory } from '@/libs/trpc/lambda';
10
+ import { AuthContext, createContextInner } from '@/libs/trpc/lambda/context';
11
11
  import { SearXNGClient } from '@/server/modules/SearXNG';
12
12
 
13
13
  import { searchRouter } from '../search';
@@ -1,4 +1,4 @@
1
- import { publicProcedure, router } from '@/libs/trpc';
1
+ import { publicProcedure, router } from '@/libs/trpc/lambda';
2
2
 
3
3
  import { searchRouter } from './search';
4
4
 
@@ -5,7 +5,8 @@ import { z } from 'zod';
5
5
 
6
6
  import { toolsEnv } from '@/config/tools';
7
7
  import { isServerMode } from '@/const/version';
8
- import { authedProcedure, passwordProcedure, router } from '@/libs/trpc';
8
+ import { passwordProcedure } from '@/libs/trpc/edge';
9
+ import { authedProcedure, router } from '@/libs/trpc/lambda';
9
10
  import { SearXNGClient } from '@/server/modules/SearXNG';
10
11
  import { SEARCH_SEARXNG_NOT_CONFIG } from '@/types/tool/search';
11
12
 
@@ -0,0 +1,64 @@
1
+ import debug from 'debug';
2
+
3
+ import { createContextForInteractionDetails } from '@/libs/oidc-provider/http-adapter';
4
+ import { OIDCProvider } from '@/libs/oidc-provider/provider';
5
+
6
+ import { getOIDCProvider } from './oidcProvider';
7
+
8
+ const log = debug('lobe-oidc:service');
9
+
10
+ export class OIDCService {
11
+ private provider: OIDCProvider;
12
+
13
+ constructor(provider: OIDCProvider) {
14
+ this.provider = provider;
15
+ }
16
+ static async initialize() {
17
+ const provider = await getOIDCProvider();
18
+
19
+ return new OIDCService(provider);
20
+ }
21
+
22
+ async getInteractionDetails(uid: string) {
23
+ const { req, res } = await createContextForInteractionDetails(uid);
24
+ return this.provider.interactionDetails(req, res);
25
+ }
26
+
27
+ async getInteractionResult(uid: string, result: any) {
28
+ const { req, res } = await createContextForInteractionDetails(uid);
29
+ return this.provider.interactionResult(req, res, result);
30
+ }
31
+
32
+ async finishInteraction(uid: string, result: any) {
33
+ const { req, res } = await createContextForInteractionDetails(uid);
34
+ return this.provider.interactionFinished(req, res, result, { mergeWithLastSubmission: true });
35
+ }
36
+
37
+ async findOrCreateGrants(accountId: string, clientId: string, existingGrantId?: string) {
38
+ // 2. 查找或创建 Grant 对象
39
+ let grant;
40
+ if (existingGrantId) {
41
+ // 如果之前的交互步骤已经关联了 Grant
42
+ grant = await this.provider.Grant.find(existingGrantId);
43
+ log('Found existing grantId: %s', existingGrantId);
44
+ }
45
+
46
+ if (!grant) {
47
+ // 如果没有找到或没有 existingGrantId,则创建新的
48
+ grant = new this.provider.Grant({
49
+ accountId: accountId,
50
+ clientId: clientId,
51
+ });
52
+ log('Created new Grant for account %s and client %s', accountId, clientId);
53
+ }
54
+
55
+ return grant;
56
+ }
57
+
58
+ async getClientMetadata(clientId: string) {
59
+ const client = await this.provider.Client.find(clientId);
60
+ return client?.metadata();
61
+ }
62
+ }
63
+
64
+ export { getOIDCProvider } from './oidcProvider';
@@ -0,0 +1,25 @@
1
+ import { getDBInstance } from '@/database/core/web-server';
2
+ import { oidcEnv } from '@/envs/oidc';
3
+ import { OIDCProvider, createOIDCProvider } from '@/libs/oidc-provider/provider';
4
+
5
+ /**
6
+ * OIDC Provider 实例
7
+ */
8
+ let provider: OIDCProvider;
9
+
10
+ /**
11
+ * 获取 OIDC Provider 实例
12
+ * @returns OIDC Provider 实例
13
+ */
14
+ export const getOIDCProvider = async (): Promise<OIDCProvider> => {
15
+ if (!provider) {
16
+ if (!oidcEnv.ENABLE_OIDC) {
17
+ throw new Error('OIDC is not enabled. Set ENABLE_OIDC=1 to enable it.');
18
+ }
19
+
20
+ const db = getDBInstance();
21
+ provider = await createOIDCProvider(db);
22
+ }
23
+
24
+ return provider;
25
+ };
@@ -1,8 +0,0 @@
1
- /**
2
- * This file contains the root router of your tRPC-backend
3
- */
4
- import { createCallerFactory } from '@/libs/trpc';
5
-
6
- import { edgeRouter } from './routers/edge';
7
-
8
- export const createCaller = createCallerFactory(edgeRouter);