@lobehub/lobehub 2.0.0-next.374 → 2.0.0-next.376

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 (118) hide show
  1. package/.github/workflows/claude-migration-support.yml +1 -1
  2. package/.github/workflows/revalidate-docs.yml +25 -0
  3. package/CHANGELOG.md +66 -0
  4. package/apps/desktop/src/main/controllers/LocalFileCtr.ts +7 -1
  5. package/apps/desktop/src/main/controllers/ShellCommandCtr.ts +23 -10
  6. package/apps/desktop/src/main/controllers/__tests__/LocalFileCtr.test.ts +261 -0
  7. package/apps/desktop/src/main/controllers/__tests__/ShellCommandCtr.test.ts +36 -0
  8. package/apps/desktop/src/main/core/infrastructure/BackendProxyProtocolManager.ts +2 -1
  9. package/changelog/v1.json +21 -0
  10. package/docs/development/database-schema.dbml +89 -0
  11. package/docs/self-hosting/advanced/auth/nextauth-to-betterauth.mdx +6 -0
  12. package/docs/self-hosting/advanced/auth/nextauth-to-betterauth.zh-CN.mdx +5 -0
  13. package/docs/usage/features/auth.mdx +54 -33
  14. package/docs/usage/features/auth.zh-CN.mdx +56 -33
  15. package/locales/en-US/chat.json +13 -13
  16. package/locales/en-US/common.json +24 -0
  17. package/locales/en-US/setting.json +19 -0
  18. package/locales/zh-CN/authError.json +2 -0
  19. package/locales/zh-CN/chat.json +14 -14
  20. package/locales/zh-CN/common.json +24 -0
  21. package/locales/zh-CN/setting.json +19 -0
  22. package/package.json +2 -1
  23. package/packages/builtin-tool-group-agent-builder/src/ExecutionRuntime/index.ts +31 -9
  24. package/packages/builtin-tool-group-agent-builder/src/client/Inspector/InviteAgent/index.tsx +28 -12
  25. package/packages/builtin-tool-group-agent-builder/src/client/Inspector/RemoveAgent/index.tsx +28 -12
  26. package/packages/builtin-tool-group-agent-builder/src/types.ts +8 -0
  27. package/packages/builtin-tool-local-system/src/client/Render/EditLocalFile/index.tsx +1 -11
  28. package/packages/builtin-tool-local-system/src/client/Render/ListFiles/index.tsx +6 -11
  29. package/packages/context-engine/src/engine/tools/ToolsEngine.ts +16 -10
  30. package/packages/context-engine/src/engine/tools/__tests__/ToolsEngine.test.ts +142 -0
  31. package/packages/context-engine/src/engine/tools/types.ts +6 -0
  32. package/packages/database/migrations/0074_add_fk_indexes_for_cascade_delete.sql +56 -0
  33. package/packages/database/migrations/meta/0074_snapshot.json +10901 -0
  34. package/packages/database/migrations/meta/_journal.json +7 -0
  35. package/packages/database/src/models/message.ts +84 -81
  36. package/packages/database/src/repositories/search/index.ts +330 -570
  37. package/packages/database/src/schemas/agent.ts +4 -0
  38. package/packages/database/src/schemas/chatGroup.ts +2 -0
  39. package/packages/database/src/schemas/file.ts +4 -0
  40. package/packages/database/src/schemas/generation.ts +1 -0
  41. package/packages/database/src/schemas/message.ts +16 -0
  42. package/packages/database/src/schemas/nextauth.ts +15 -8
  43. package/packages/database/src/schemas/oidc.ts +104 -68
  44. package/packages/database/src/schemas/rag.ts +4 -0
  45. package/packages/database/src/schemas/ragEvals.ts +97 -73
  46. package/packages/database/src/schemas/relations.ts +7 -0
  47. package/packages/database/src/schemas/session.ts +1 -0
  48. package/packages/database/src/schemas/topic.ts +8 -1
  49. package/packages/desktop-bridge/src/index.ts +17 -0
  50. package/scripts/_shared/checkDeprecatedAuth.js +26 -0
  51. package/src/app/(backend)/trpc/async/[trpc]/route.ts +2 -0
  52. package/src/app/(backend)/trpc/lambda/[trpc]/route.ts +2 -5
  53. package/src/app/(backend)/trpc/mobile/[trpc]/route.ts +2 -5
  54. package/src/app/(backend)/trpc/tools/[trpc]/route.ts +2 -0
  55. package/src/app/[variants]/(auth)/signup/[[...signup]]/useSignUp.tsx +7 -4
  56. package/src/app/[variants]/(main)/agent/features/Conversation/AgentWelcome/index.tsx +3 -23
  57. package/src/app/[variants]/(main)/group/features/Conversation/AgentWelcome/index.tsx +3 -23
  58. package/src/app/[variants]/(main)/resource/(home)/index.tsx +4 -1
  59. package/src/app/[variants]/(main)/resource/library/_layout/Header/LibraryHead.tsx +3 -0
  60. package/src/app/[variants]/(main)/resource/library/_layout/Header/index.tsx +2 -1
  61. package/src/app/[variants]/(main)/settings/storage/features/Advanced.tsx +19 -12
  62. package/src/app/[variants]/(main)/settings/storage/index.tsx +19 -1
  63. package/src/business/client/features/AccountDeletion/index.tsx +3 -0
  64. package/src/business/server/lambda-routers/accountDeletion.ts +3 -0
  65. package/src/components/DragUpload/index.tsx +1 -1
  66. package/src/config/routes/index.ts +9 -1
  67. package/src/features/CommandMenu/ContextCommands.tsx +10 -2
  68. package/src/features/CommandMenu/MainMenu.tsx +29 -22
  69. package/src/features/CommandMenu/SearchResults.tsx +19 -0
  70. package/src/features/CommandMenu/components/CommandInput.tsx +1 -0
  71. package/src/features/CommandMenu/index.tsx +25 -3
  72. package/src/features/CommandMenu/styles.ts +1 -0
  73. package/src/features/CommandMenu/useCommandMenu.ts +8 -2
  74. package/src/features/CommandMenu/utils/contextCommands.ts +17 -2
  75. package/src/features/CommandMenu/utils/queryParser.ts +1 -0
  76. package/src/features/Conversation/ChatItem/ChatItem.tsx +4 -7
  77. package/src/features/Conversation/ChatItem/style.ts +0 -3
  78. package/src/features/Conversation/ChatItem/type.ts +4 -1
  79. package/src/features/Conversation/Messages/Assistant/index.tsx +6 -2
  80. package/src/features/Conversation/Messages/AssistantGroup/index.tsx +8 -3
  81. package/src/features/Conversation/Messages/Supervisor/index.tsx +6 -2
  82. package/src/features/Conversation/Messages/Task/index.tsx +6 -2
  83. package/src/features/Conversation/Messages/components/useNewScreen.test.ts +331 -0
  84. package/src/features/Conversation/Messages/components/useNewScreen.ts +80 -5
  85. package/src/features/Electron/connection/Connection.tsx +20 -15
  86. package/src/features/FileViewer/index.tsx +28 -5
  87. package/src/features/ModelSwitchPanel/components/List/ListItemRenderer.tsx +10 -9
  88. package/src/features/ModelSwitchPanel/components/List/MultipleProvidersModelItem.tsx +1 -0
  89. package/src/features/ModelSwitchPanel/components/Toolbar.tsx +1 -1
  90. package/src/features/ResourceManager/components/Editor/index.tsx +7 -4
  91. package/src/features/ResourceManager/components/Explorer/Header/index.tsx +1 -1
  92. package/src/features/ResourceManager/components/Explorer/ItemDropdown/useFileItemDropdown.tsx +12 -1
  93. package/src/features/ResourceManager/components/Explorer/ListView/ListItem/index.tsx +23 -43
  94. package/src/features/ResourceManager/components/Explorer/MasonryView/MasonryFileItem/ImageFileItem.tsx +1 -0
  95. package/src/features/ResourceManager/components/Explorer/MasonryView/MasonryFileItem/index.tsx +24 -44
  96. package/src/features/ResourceManager/components/Explorer/hooks/useFileItemClick.ts +78 -0
  97. package/src/features/ResourceManager/components/Header/AddButton.tsx +0 -5
  98. package/src/features/ResourceManager/index.tsx +38 -24
  99. package/src/libs/better-auth/define-config.ts +17 -0
  100. package/src/libs/better-auth/plugins/email-whitelist.ts +4 -1
  101. package/src/libs/redis/manager.ts +5 -9
  102. package/src/libs/trpc/utils/responseMeta.test.ts +82 -0
  103. package/src/libs/trpc/utils/responseMeta.ts +41 -0
  104. package/src/locales/default/authError.ts +3 -0
  105. package/src/locales/default/chat.ts +13 -13
  106. package/src/locales/default/common.ts +82 -4
  107. package/src/locales/default/setting.ts +23 -1
  108. package/src/server/modules/AgentRuntime/redis.ts +3 -0
  109. package/src/server/routers/lambda/index.ts +2 -0
  110. package/src/server/routers/lambda/search.ts +3 -2
  111. package/src/services/chat/chat.test.ts +125 -45
  112. package/src/services/chat/index.ts +10 -14
  113. package/src/services/chat/mecha/agentConfigResolver.ts +8 -0
  114. package/src/store/chat/slices/aiChat/actions/__tests__/streamingExecutor.test.ts +29 -0
  115. package/src/store/chat/slices/aiChat/actions/streamingExecutor.ts +27 -19
  116. package/src/utils/errorResponse.ts +2 -1
  117. package/src/app/[variants]/(main)/agent/features/Conversation/AgentWelcome/AddButton.tsx +0 -37
  118. package/src/app/[variants]/(main)/group/features/Conversation/AgentWelcome/AddButton.tsx +0 -32
@@ -518,6 +518,13 @@
518
518
  "when": 1769272397744,
519
519
  "tag": "0073_add_message_group_metadata",
520
520
  "breakpoints": true
521
+ },
522
+ {
523
+ "idx": 74,
524
+ "version": "7",
525
+ "when": 1769341100106,
526
+ "tag": "0074_add_fk_indexes_for_cascade_delete",
527
+ "breakpoints": true
521
528
  }
522
529
  ],
523
530
  "version": "6"
@@ -600,20 +600,71 @@ export class MessageModel {
600
600
 
601
601
  if (result.length === 0) return [];
602
602
 
603
- // 2. Get related files
604
- const rawRelatedFileList = await this.db
605
- .select({
606
- fileType: files.fileType,
607
- id: messagesFiles.fileId,
608
- messageId: messagesFiles.messageId,
609
- name: files.name,
610
- size: files.size,
611
- url: files.url,
612
- })
613
- .from(messagesFiles)
614
- .leftJoin(files, eq(files.id, messagesFiles.fileId))
615
- .where(inArray(messagesFiles.messageId, messageIds));
603
+ // 2. Run parallel queries for better performance
604
+ const taskMessageIds = result.filter((m) => m.role === 'task').map((m) => m.id as string);
605
+
606
+ const [rawRelatedFileList, chunksList, messageQueriesList, threadData] = await Promise.all([
607
+ // 2a. Get related files
608
+ this.db
609
+ .select({
610
+ fileType: files.fileType,
611
+ id: messagesFiles.fileId,
612
+ messageId: messagesFiles.messageId,
613
+ name: files.name,
614
+ size: files.size,
615
+ url: files.url,
616
+ })
617
+ .from(messagesFiles)
618
+ .leftJoin(files, eq(files.id, messagesFiles.fileId))
619
+ .where(inArray(messagesFiles.messageId, messageIds)),
616
620
 
621
+ // 2b. Get related file chunks
622
+ this.db
623
+ .select({
624
+ fileId: files.id,
625
+ fileType: files.fileType,
626
+ fileUrl: files.url,
627
+ filename: files.name,
628
+ id: chunks.id,
629
+ messageId: messageQueryChunks.messageId,
630
+ similarity: messageQueryChunks.similarity,
631
+ text: chunks.text,
632
+ })
633
+ .from(messageQueryChunks)
634
+ .leftJoin(chunks, eq(chunks.id, messageQueryChunks.chunkId))
635
+ .leftJoin(fileChunks, eq(fileChunks.chunkId, chunks.id))
636
+ .innerJoin(files, eq(fileChunks.fileId, files.id))
637
+ .where(inArray(messageQueryChunks.messageId, messageIds)),
638
+
639
+ // 2c. Get related message queries (RAG)
640
+ this.db
641
+ .select({
642
+ id: messageQueries.id,
643
+ messageId: messageQueries.messageId,
644
+ rewriteQuery: messageQueries.rewriteQuery,
645
+ userQuery: messageQueries.userQuery,
646
+ })
647
+ .from(messageQueries)
648
+ .where(inArray(messageQueries.messageId, messageIds)),
649
+
650
+ // 2d. Get thread info for task messages
651
+ taskMessageIds.length > 0
652
+ ? this.db
653
+ .select({
654
+ metadata: threads.metadata,
655
+ sourceMessageId: threads.sourceMessageId,
656
+ status: threads.status,
657
+ threadId: threads.id,
658
+ title: threads.title,
659
+ })
660
+ .from(threads)
661
+ .where(
662
+ and(eq(threads.userId, this.userId), inArray(threads.sourceMessageId, taskMessageIds)),
663
+ )
664
+ : Promise.resolve([]),
665
+ ]);
666
+
667
+ // 3. Process file results
617
668
  const relatedFileList = await Promise.all(
618
669
  rawRelatedFileList.map(async (file) => ({
619
670
  ...file,
@@ -650,74 +701,26 @@ export class MessageModel {
650
701
  (i) => !(i.fileType || '').startsWith('image') && !(i.fileType || '').startsWith('video'),
651
702
  );
652
703
 
653
- // 3. Get related file chunks
654
- const chunksList = await this.db
655
- .select({
656
- fileId: files.id,
657
- fileType: files.fileType,
658
- fileUrl: files.url,
659
- filename: files.name,
660
- id: chunks.id,
661
- messageId: messageQueryChunks.messageId,
662
- similarity: messageQueryChunks.similarity,
663
- text: chunks.text,
664
- })
665
- .from(messageQueryChunks)
666
- .leftJoin(chunks, eq(chunks.id, messageQueryChunks.chunkId))
667
- .leftJoin(fileChunks, eq(fileChunks.chunkId, chunks.id))
668
- .innerJoin(files, eq(fileChunks.fileId, files.id))
669
- .where(inArray(messageQueryChunks.messageId, messageIds));
670
-
671
- // 4. Get related message queries (RAG)
672
- const messageQueriesList = await this.db
673
- .select({
674
- id: messageQueries.id,
675
- messageId: messageQueries.messageId,
676
- rewriteQuery: messageQueries.rewriteQuery,
677
- userQuery: messageQueries.userQuery,
678
- })
679
- .from(messageQueries)
680
- .where(inArray(messageQueries.messageId, messageIds));
681
-
682
- // 5. Get thread info for task messages
683
- const taskMessageIds = result.filter((m) => m.role === 'task').map((m) => m.id as string);
684
-
685
- let threadMap = new Map<string, TaskDetail>();
686
-
687
- if (taskMessageIds.length > 0) {
688
- const threadData = await this.db
689
- .select({
690
- metadata: threads.metadata,
691
- sourceMessageId: threads.sourceMessageId,
692
- status: threads.status,
693
- threadId: threads.id,
694
- title: threads.title,
695
- })
696
- .from(threads)
697
- .where(
698
- and(eq(threads.userId, this.userId), inArray(threads.sourceMessageId, taskMessageIds)),
699
- );
700
-
701
- threadMap = new Map(
702
- threadData.map((t) => {
703
- const metadata = t.metadata as Record<string, unknown> | null;
704
- return [
705
- t.sourceMessageId!,
706
- {
707
- clientMode: metadata?.clientMode as boolean | undefined,
708
- duration: metadata?.duration as number | undefined,
709
- status: t.status as ThreadStatus,
710
- threadId: t.threadId,
711
- title: t.title ?? undefined,
712
- totalCost: metadata?.totalCost as number | undefined,
713
- totalMessages: metadata?.totalMessages as number | undefined,
714
- totalTokens: metadata?.totalTokens as number | undefined,
715
- totalToolCalls: metadata?.totalToolCalls as number | undefined,
716
- },
717
- ];
718
- }),
719
- );
720
- }
704
+ // 4. Build thread map
705
+ const threadMap = new Map(
706
+ threadData.map((t) => {
707
+ const metadata = t.metadata as Record<string, unknown> | null;
708
+ return [
709
+ t.sourceMessageId!,
710
+ {
711
+ clientMode: metadata?.clientMode as boolean | undefined,
712
+ duration: metadata?.duration as number | undefined,
713
+ status: t.status as ThreadStatus,
714
+ threadId: t.threadId,
715
+ title: t.title ?? undefined,
716
+ totalCost: metadata?.totalCost as number | undefined,
717
+ totalMessages: metadata?.totalMessages as number | undefined,
718
+ totalTokens: metadata?.totalTokens as number | undefined,
719
+ totalToolCalls: metadata?.totalToolCalls as number | undefined,
720
+ },
721
+ ];
722
+ }),
723
+ );
721
724
 
722
725
  // 6. Transform messages to UIChatMessage format
723
726
  return result.map(