@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
@@ -1135,4 +1135,146 @@ describe('ToolsEngine', () => {
1135
1135
  expect(result).toHaveLength(2);
1136
1136
  });
1137
1137
  });
1138
+
1139
+ describe('skipDefaultTools', () => {
1140
+ it('should not include default tools when skipDefaultTools is true in generateTools', () => {
1141
+ const engine = new ToolsEngine({
1142
+ manifestSchemas: [mockWebBrowsingManifest, mockDalleManifest],
1143
+ defaultToolIds: ['lobe-web-browsing'],
1144
+ enableChecker: () => true,
1145
+ functionCallChecker: () => true,
1146
+ });
1147
+
1148
+ const result = engine.generateTools({
1149
+ toolIds: ['dalle'],
1150
+ model: 'gpt-4',
1151
+ provider: 'openai',
1152
+ skipDefaultTools: true,
1153
+ });
1154
+
1155
+ // Should only include dalle, not the default lobe-web-browsing
1156
+ expect(result).toHaveLength(1);
1157
+ expect(result![0].function.name).toBe('dalle____generateImage____builtin');
1158
+ });
1159
+
1160
+ it('should not include default tools when skipDefaultTools is true in generateToolsDetailed', () => {
1161
+ const engine = new ToolsEngine({
1162
+ manifestSchemas: [mockWebBrowsingManifest, mockDalleManifest],
1163
+ defaultToolIds: ['lobe-web-browsing'],
1164
+ enableChecker: () => true,
1165
+ functionCallChecker: () => true,
1166
+ });
1167
+
1168
+ const result = engine.generateToolsDetailed({
1169
+ toolIds: ['dalle'],
1170
+ model: 'gpt-4',
1171
+ provider: 'openai',
1172
+ skipDefaultTools: true,
1173
+ });
1174
+
1175
+ // Should only include dalle, not the default lobe-web-browsing
1176
+ expect(result.tools).toHaveLength(1);
1177
+ expect(result.enabledToolIds).toEqual(['dalle']);
1178
+ expect(result.enabledManifests).toHaveLength(1);
1179
+ expect(result.enabledManifests[0].identifier).toBe('dalle');
1180
+ });
1181
+
1182
+ it('should return undefined when skipDefaultTools is true and toolIds is empty', () => {
1183
+ const engine = new ToolsEngine({
1184
+ manifestSchemas: [mockWebBrowsingManifest, mockDalleManifest],
1185
+ defaultToolIds: ['lobe-web-browsing', 'dalle'],
1186
+ enableChecker: () => true,
1187
+ functionCallChecker: () => true,
1188
+ });
1189
+
1190
+ const result = engine.generateTools({
1191
+ toolIds: [],
1192
+ model: 'gpt-4',
1193
+ provider: 'openai',
1194
+ skipDefaultTools: true,
1195
+ });
1196
+
1197
+ // Should return undefined when no tools are available
1198
+ expect(result).toBeUndefined();
1199
+ });
1200
+
1201
+ it('should return empty results when skipDefaultTools is true and toolIds is empty in generateToolsDetailed', () => {
1202
+ const engine = new ToolsEngine({
1203
+ manifestSchemas: [mockWebBrowsingManifest, mockDalleManifest],
1204
+ defaultToolIds: ['lobe-web-browsing', 'dalle'],
1205
+ enableChecker: () => true,
1206
+ functionCallChecker: () => true,
1207
+ });
1208
+
1209
+ const result = engine.generateToolsDetailed({
1210
+ toolIds: [],
1211
+ model: 'gpt-4',
1212
+ provider: 'openai',
1213
+ skipDefaultTools: true,
1214
+ });
1215
+
1216
+ // Should return empty results
1217
+ expect(result.tools).toBeUndefined();
1218
+ expect(result.enabledToolIds).toEqual([]);
1219
+ expect(result.enabledManifests).toHaveLength(0);
1220
+ });
1221
+
1222
+ it('should include default tools when skipDefaultTools is false', () => {
1223
+ const engine = new ToolsEngine({
1224
+ manifestSchemas: [mockWebBrowsingManifest, mockDalleManifest],
1225
+ defaultToolIds: ['lobe-web-browsing'],
1226
+ enableChecker: () => true,
1227
+ functionCallChecker: () => true,
1228
+ });
1229
+
1230
+ const result = engine.generateTools({
1231
+ toolIds: ['dalle'],
1232
+ model: 'gpt-4',
1233
+ provider: 'openai',
1234
+ skipDefaultTools: false,
1235
+ });
1236
+
1237
+ // Should include both dalle and the default lobe-web-browsing
1238
+ expect(result).toHaveLength(2);
1239
+ });
1240
+
1241
+ it('should include default tools when skipDefaultTools is undefined (default behavior)', () => {
1242
+ const engine = new ToolsEngine({
1243
+ manifestSchemas: [mockWebBrowsingManifest, mockDalleManifest],
1244
+ defaultToolIds: ['lobe-web-browsing'],
1245
+ enableChecker: () => true,
1246
+ functionCallChecker: () => true,
1247
+ });
1248
+
1249
+ const result = engine.generateTools({
1250
+ toolIds: ['dalle'],
1251
+ model: 'gpt-4',
1252
+ provider: 'openai',
1253
+ // skipDefaultTools not specified
1254
+ });
1255
+
1256
+ // Should include both dalle and the default lobe-web-browsing
1257
+ expect(result).toHaveLength(2);
1258
+ });
1259
+
1260
+ it('should work correctly with empty defaultToolIds', () => {
1261
+ const engine = new ToolsEngine({
1262
+ manifestSchemas: [mockWebBrowsingManifest, mockDalleManifest],
1263
+ defaultToolIds: [],
1264
+ enableChecker: () => true,
1265
+ functionCallChecker: () => true,
1266
+ });
1267
+
1268
+ const result = engine.generateTools({
1269
+ toolIds: ['dalle'],
1270
+ model: 'gpt-4',
1271
+ provider: 'openai',
1272
+ skipDefaultTools: true,
1273
+ });
1274
+
1275
+ // Should only include dalle
1276
+ expect(result).toHaveLength(1);
1277
+ expect(result![0].function.name).toBe('dalle____generateImage____builtin');
1278
+ });
1279
+ });
1138
1280
  });
@@ -72,6 +72,12 @@ export interface GenerateToolsParams {
72
72
  model: string;
73
73
  /** Provider name */
74
74
  provider: string;
75
+ /**
76
+ * Whether to skip merging default tools.
77
+ * When true, only the explicitly provided toolIds will be used.
78
+ * Useful for broadcast scenarios where tools should be completely disabled.
79
+ */
80
+ skipDefaultTools?: boolean;
75
81
  /** List of tool IDs to enable */
76
82
  toolIds?: string[];
77
83
  }
@@ -0,0 +1,56 @@
1
+ CREATE INDEX IF NOT EXISTS "agents_files_file_id_idx" ON "agents_files" USING btree ("file_id");--> statement-breakpoint
2
+ CREATE INDEX IF NOT EXISTS "agents_files_user_id_idx" ON "agents_files" USING btree ("user_id");--> statement-breakpoint
3
+ CREATE INDEX IF NOT EXISTS "agents_knowledge_bases_knowledge_base_id_idx" ON "agents_knowledge_bases" USING btree ("knowledge_base_id");--> statement-breakpoint
4
+ CREATE INDEX IF NOT EXISTS "agents_knowledge_bases_user_id_idx" ON "agents_knowledge_bases" USING btree ("user_id");--> statement-breakpoint
5
+ CREATE INDEX IF NOT EXISTS "chat_groups_user_id_idx" ON "chat_groups" USING btree ("user_id");--> statement-breakpoint
6
+ CREATE INDEX IF NOT EXISTS "chat_groups_agents_user_id_idx" ON "chat_groups_agents" USING btree ("user_id");--> statement-breakpoint
7
+ CREATE INDEX IF NOT EXISTS "files_chunk_task_id_idx" ON "files" USING btree ("chunk_task_id");--> statement-breakpoint
8
+ CREATE INDEX IF NOT EXISTS "files_embedding_task_id_idx" ON "files" USING btree ("embedding_task_id");--> statement-breakpoint
9
+ CREATE INDEX IF NOT EXISTS "knowledge_base_files_user_id_idx" ON "knowledge_base_files" USING btree ("user_id");--> statement-breakpoint
10
+ CREATE INDEX IF NOT EXISTS "knowledge_base_files_file_id_idx" ON "knowledge_base_files" USING btree ("file_id");--> statement-breakpoint
11
+ CREATE INDEX IF NOT EXISTS "generations_file_id_idx" ON "generations" USING btree ("file_id");--> statement-breakpoint
12
+ CREATE INDEX IF NOT EXISTS "message_chunks_user_id_idx" ON "message_chunks" USING btree ("user_id");--> statement-breakpoint
13
+ CREATE INDEX IF NOT EXISTS "message_chunks_message_id_idx" ON "message_chunks" USING btree ("message_id");--> statement-breakpoint
14
+ CREATE INDEX IF NOT EXISTS "message_groups_user_id_idx" ON "message_groups" USING btree ("user_id");--> statement-breakpoint
15
+ CREATE INDEX IF NOT EXISTS "message_groups_parent_group_id_idx" ON "message_groups" USING btree ("parent_group_id");--> statement-breakpoint
16
+ CREATE INDEX IF NOT EXISTS "message_groups_parent_message_id_idx" ON "message_groups" USING btree ("parent_message_id");--> statement-breakpoint
17
+ CREATE INDEX IF NOT EXISTS "message_plugins_user_id_idx" ON "message_plugins" USING btree ("user_id");--> statement-breakpoint
18
+ CREATE INDEX IF NOT EXISTS "message_queries_user_id_idx" ON "message_queries" USING btree ("user_id");--> statement-breakpoint
19
+ CREATE INDEX IF NOT EXISTS "message_queries_message_id_idx" ON "message_queries" USING btree ("message_id");--> statement-breakpoint
20
+ CREATE INDEX IF NOT EXISTS "message_queries_embeddings_id_idx" ON "message_queries" USING btree ("embeddings_id");--> statement-breakpoint
21
+ CREATE INDEX IF NOT EXISTS "message_query_chunks_user_id_idx" ON "message_query_chunks" USING btree ("user_id");--> statement-breakpoint
22
+ CREATE INDEX IF NOT EXISTS "message_query_chunks_message_id_idx" ON "message_query_chunks" USING btree ("id");--> statement-breakpoint
23
+ CREATE INDEX IF NOT EXISTS "message_query_chunks_query_id_idx" ON "message_query_chunks" USING btree ("query_id");--> statement-breakpoint
24
+ CREATE INDEX IF NOT EXISTS "message_tts_user_id_idx" ON "message_tts" USING btree ("user_id");--> statement-breakpoint
25
+ CREATE INDEX IF NOT EXISTS "message_translates_user_id_idx" ON "message_translates" USING btree ("user_id");--> statement-breakpoint
26
+ CREATE INDEX IF NOT EXISTS "messages_files_user_id_idx" ON "messages_files" USING btree ("user_id");--> statement-breakpoint
27
+ CREATE INDEX IF NOT EXISTS "messages_files_message_id_idx" ON "messages_files" USING btree ("message_id");--> statement-breakpoint
28
+ CREATE INDEX IF NOT EXISTS "nextauth_accounts_user_id_idx" ON "nextauth_accounts" USING btree ("user_id");--> statement-breakpoint
29
+ CREATE INDEX IF NOT EXISTS "nextauth_sessions_user_id_idx" ON "nextauth_sessions" USING btree ("user_id");--> statement-breakpoint
30
+ CREATE INDEX IF NOT EXISTS "oidc_access_tokens_user_id_idx" ON "oidc_access_tokens" USING btree ("user_id");--> statement-breakpoint
31
+ CREATE INDEX IF NOT EXISTS "oidc_authorization_codes_user_id_idx" ON "oidc_authorization_codes" USING btree ("user_id");--> statement-breakpoint
32
+ CREATE INDEX IF NOT EXISTS "oidc_device_codes_user_id_idx" ON "oidc_device_codes" USING btree ("user_id");--> statement-breakpoint
33
+ CREATE INDEX IF NOT EXISTS "oidc_grants_user_id_idx" ON "oidc_grants" USING btree ("user_id");--> statement-breakpoint
34
+ CREATE INDEX IF NOT EXISTS "oidc_refresh_tokens_user_id_idx" ON "oidc_refresh_tokens" USING btree ("user_id");--> statement-breakpoint
35
+ CREATE INDEX IF NOT EXISTS "oidc_sessions_user_id_idx" ON "oidc_sessions" USING btree ("user_id");--> statement-breakpoint
36
+ CREATE INDEX IF NOT EXISTS "document_chunks_user_id_idx" ON "document_chunks" USING btree ("user_id");--> statement-breakpoint
37
+ CREATE INDEX IF NOT EXISTS "unstructured_chunks_user_id_idx" ON "unstructured_chunks" USING btree ("user_id");--> statement-breakpoint
38
+ CREATE INDEX IF NOT EXISTS "unstructured_chunks_composite_id_idx" ON "unstructured_chunks" USING btree ("composite_id");--> statement-breakpoint
39
+ CREATE INDEX IF NOT EXISTS "unstructured_chunks_file_id_idx" ON "unstructured_chunks" USING btree ("file_id");--> statement-breakpoint
40
+ CREATE INDEX IF NOT EXISTS "rag_eval_dataset_records_user_id_idx" ON "rag_eval_dataset_records" USING btree ("user_id");--> statement-breakpoint
41
+ CREATE INDEX IF NOT EXISTS "rag_eval_datasets_user_id_idx" ON "rag_eval_datasets" USING btree ("user_id");--> statement-breakpoint
42
+ CREATE INDEX IF NOT EXISTS "rag_eval_evaluations_user_id_idx" ON "rag_eval_evaluations" USING btree ("user_id");--> statement-breakpoint
43
+ CREATE INDEX IF NOT EXISTS "rag_eval_evaluation_records_user_id_idx" ON "rag_eval_evaluation_records" USING btree ("user_id");--> statement-breakpoint
44
+ CREATE INDEX IF NOT EXISTS "agents_to_sessions_user_id_idx" ON "agents_to_sessions" USING btree ("user_id");--> statement-breakpoint
45
+ CREATE INDEX IF NOT EXISTS "file_chunks_user_id_idx" ON "file_chunks" USING btree ("user_id");--> statement-breakpoint
46
+ CREATE INDEX IF NOT EXISTS "file_chunks_file_id_idx" ON "file_chunks" USING btree ("file_id");--> statement-breakpoint
47
+ CREATE INDEX IF NOT EXISTS "file_chunks_chunk_id_idx" ON "file_chunks" USING btree ("chunk_id");--> statement-breakpoint
48
+ CREATE INDEX IF NOT EXISTS "files_to_sessions_user_id_idx" ON "files_to_sessions" USING btree ("user_id");--> statement-breakpoint
49
+ CREATE INDEX IF NOT EXISTS "files_to_sessions_file_id_idx" ON "files_to_sessions" USING btree ("file_id");--> statement-breakpoint
50
+ CREATE INDEX IF NOT EXISTS "files_to_sessions_session_id_idx" ON "files_to_sessions" USING btree ("session_id");--> statement-breakpoint
51
+ CREATE INDEX IF NOT EXISTS "session_groups_user_id_idx" ON "session_groups" USING btree ("user_id");--> statement-breakpoint
52
+ CREATE INDEX IF NOT EXISTS "threads_user_id_idx" ON "threads" USING btree ("user_id");--> statement-breakpoint
53
+ CREATE INDEX IF NOT EXISTS "threads_parent_thread_id_idx" ON "threads" USING btree ("parent_thread_id");--> statement-breakpoint
54
+ CREATE INDEX IF NOT EXISTS "topic_documents_user_id_idx" ON "topic_documents" USING btree ("user_id");--> statement-breakpoint
55
+ CREATE INDEX IF NOT EXISTS "topic_documents_topic_id_idx" ON "topic_documents" USING btree ("topic_id");--> statement-breakpoint
56
+ CREATE INDEX IF NOT EXISTS "topic_documents_document_id_idx" ON "topic_documents" USING btree ("document_id");