@lobehub/chat 0.162.24 → 0.163.0

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 (96) hide show
  1. package/.github/workflows/release.yml +21 -2
  2. package/.github/workflows/sync.yml +1 -1
  3. package/.github/workflows/test.yml +35 -4
  4. package/CHANGELOG.md +50 -0
  5. package/LICENSE +38 -21
  6. package/README.md +8 -8
  7. package/README.zh-CN.md +8 -8
  8. package/codecov.yml +11 -0
  9. package/docs/self-hosting/platform/zeabur.mdx +1 -1
  10. package/docs/self-hosting/platform/zeabur.zh-CN.mdx +1 -1
  11. package/drizzle.config.ts +29 -0
  12. package/next.config.mjs +3 -0
  13. package/package.json +25 -5
  14. package/scripts/migrateServerDB/index.ts +30 -0
  15. package/src/app/(main)/(mobile)/me/(home)/features/useCategory.tsx +2 -1
  16. package/src/app/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +95 -88
  17. package/src/app/(main)/chat/settings/features/HeaderContent.tsx +37 -31
  18. package/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx +11 -1
  19. package/src/app/api/middleware/auth/index.ts +1 -1
  20. package/src/app/api/webhooks/clerk/__tests__/fixtures/createUser.json +73 -0
  21. package/src/app/api/webhooks/clerk/route.ts +159 -0
  22. package/src/app/api/webhooks/clerk/validateRequest.ts +22 -0
  23. package/src/app/trpc/edge/[trpc]/route.ts +1 -1
  24. package/src/app/trpc/lambda/[trpc]/route.ts +26 -0
  25. package/src/config/auth.ts +2 -0
  26. package/src/config/db.ts +13 -1
  27. package/src/database/server/core/db.ts +44 -0
  28. package/src/database/server/core/dbForTest.ts +45 -0
  29. package/src/database/server/index.ts +1 -0
  30. package/src/database/server/migrations/0000_init.sql +439 -0
  31. package/src/database/server/migrations/0001_add_client_id.sql +9 -0
  32. package/src/database/server/migrations/0002_amusing_puma.sql +9 -0
  33. package/src/database/server/migrations/meta/0000_snapshot.json +1583 -0
  34. package/src/database/server/migrations/meta/0001_snapshot.json +1636 -0
  35. package/src/database/server/migrations/meta/0002_snapshot.json +1630 -0
  36. package/src/database/server/migrations/meta/_journal.json +27 -0
  37. package/src/database/server/models/__tests__/file.test.ts +140 -0
  38. package/src/database/server/models/__tests__/message.test.ts +847 -0
  39. package/src/database/server/models/__tests__/plugin.test.ts +172 -0
  40. package/src/database/server/models/__tests__/session.test.ts +595 -0
  41. package/src/database/server/models/__tests__/topic.test.ts +623 -0
  42. package/src/database/server/models/__tests__/user.test.ts +173 -0
  43. package/src/database/server/models/_template.ts +44 -0
  44. package/src/database/server/models/file.ts +51 -0
  45. package/src/database/server/models/message.ts +378 -0
  46. package/src/database/server/models/plugin.ts +63 -0
  47. package/src/database/server/models/session.ts +290 -0
  48. package/src/database/server/models/sessionGroup.ts +69 -0
  49. package/src/database/server/models/topic.ts +265 -0
  50. package/src/database/server/models/user.ts +138 -0
  51. package/src/database/server/modules/DataImporter/__tests__/fixtures/messages.json +1101 -0
  52. package/src/database/server/modules/DataImporter/__tests__/index.test.ts +954 -0
  53. package/src/database/server/modules/DataImporter/index.ts +333 -0
  54. package/src/database/server/schemas/_id.ts +15 -0
  55. package/src/database/server/schemas/lobechat.ts +601 -0
  56. package/src/database/server/utils/idGenerator.test.ts +39 -0
  57. package/src/database/server/utils/idGenerator.ts +26 -0
  58. package/src/features/AgentSetting/AgentModal/index.tsx +6 -7
  59. package/src/features/User/UserPanel/useMenu.tsx +43 -37
  60. package/src/libs/trpc/client.ts +52 -3
  61. package/src/server/files/s3.ts +21 -1
  62. package/src/server/keyVaultsEncrypt/index.test.ts +62 -0
  63. package/src/server/keyVaultsEncrypt/index.ts +93 -0
  64. package/src/server/mock.ts +1 -1
  65. package/src/server/routers/{index.ts → edge/index.ts} +3 -3
  66. package/src/server/routers/lambda/file.ts +49 -0
  67. package/src/server/routers/lambda/importer.ts +54 -0
  68. package/src/server/routers/lambda/index.ts +28 -0
  69. package/src/server/routers/lambda/message.ts +165 -0
  70. package/src/server/routers/lambda/plugin.ts +100 -0
  71. package/src/server/routers/lambda/session.ts +194 -0
  72. package/src/server/routers/lambda/sessionGroup.ts +77 -0
  73. package/src/server/routers/lambda/topic.ts +134 -0
  74. package/src/server/routers/lambda/user.ts +57 -0
  75. package/src/services/file/index.ts +4 -7
  76. package/src/services/file/server.ts +45 -0
  77. package/src/services/import/index.ts +4 -1
  78. package/src/services/import/server.ts +115 -0
  79. package/src/services/message/index.ts +4 -8
  80. package/src/services/message/server.ts +93 -0
  81. package/src/services/plugin/index.ts +4 -9
  82. package/src/services/plugin/server.ts +46 -0
  83. package/src/services/session/index.ts +4 -8
  84. package/src/services/session/server.ts +148 -0
  85. package/src/services/topic/index.ts +4 -9
  86. package/src/services/topic/server.ts +68 -0
  87. package/src/services/user/index.ts +4 -9
  88. package/src/services/user/server.ts +28 -0
  89. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +201 -0
  90. package/src/store/user/slices/modelList/selectors/keyVaults.ts +15 -3
  91. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +29 -1
  92. package/src/store/user/slices/modelList/selectors/modelConfig.ts +21 -1
  93. package/src/types/user/settings/keyVaults.ts +1 -1
  94. package/tests/setup-db.ts +7 -0
  95. package/vitest.config.ts +2 -1
  96. package/vitest.server.config.ts +23 -0
package/src/config/db.ts CHANGED
@@ -1,4 +1,3 @@
1
- /* eslint-disable sort-keys-fix/sort-keys-fix , typescript-sort-keys/interface */
2
1
  import { createEnv } from '@t3-oss/env-nextjs';
3
2
  import { z } from 'zod';
4
3
 
@@ -8,8 +7,21 @@ export const getServerDBConfig = () => {
8
7
  NEXT_PUBLIC_ENABLED_SERVER_SERVICE: z.boolean(),
9
8
  },
10
9
  runtimeEnv: {
10
+ DATABASE_DRIVER: process.env.DATABASE_DRIVER || 'neon',
11
+ DATABASE_TEST_URL: process.env.DATABASE_TEST_URL,
12
+ DATABASE_URL: process.env.DATABASE_URL,
13
+
14
+ KEY_VAULTS_SECRET: process.env.KEY_VAULTS_SECRET,
15
+
11
16
  NEXT_PUBLIC_ENABLED_SERVER_SERVICE: process.env.NEXT_PUBLIC_SERVICE_MODE === 'server',
12
17
  },
18
+ server: {
19
+ DATABASE_DRIVER: z.enum(['neon', 'node']),
20
+ DATABASE_TEST_URL: z.string().optional(),
21
+ DATABASE_URL: z.string().optional(),
22
+
23
+ KEY_VAULTS_SECRET: z.string().optional(),
24
+ },
13
25
  });
14
26
  };
15
27
 
@@ -0,0 +1,44 @@
1
+ import { Pool as NeonPool, neonConfig } from '@neondatabase/serverless';
2
+ import { NeonDatabase, drizzle as neonDrizzle } from 'drizzle-orm/neon-serverless';
3
+ import { drizzle as nodeDrizzle } from 'drizzle-orm/node-postgres';
4
+ import { Pool as NodePool } from 'pg';
5
+ import ws from 'ws';
6
+
7
+ import { serverDBEnv } from '@/config/db';
8
+ import { isServerMode } from '@/const/version';
9
+
10
+ import * as schema from '../schemas/lobechat';
11
+
12
+ export const getDBInstance = (): NeonDatabase<typeof schema> => {
13
+ if (!isServerMode) return {} as any;
14
+
15
+ if (!serverDBEnv.KEY_VAULTS_SECRET) {
16
+ throw new Error(
17
+ ` \`KEY_VAULTS_SECRET\` is not set, please set it in your environment variables.
18
+
19
+ If you don't have it, please run \`openssl rand -base64 32\` to create one.
20
+ `,
21
+ );
22
+ }
23
+
24
+ let connectionString = serverDBEnv.DATABASE_URL;
25
+
26
+ if (!connectionString) {
27
+ throw new Error(`You are try to use database, but "DATABASE_URL" is not set correctly`);
28
+ }
29
+
30
+ if (serverDBEnv.DATABASE_DRIVER === 'node') {
31
+ const client = new NodePool({ connectionString });
32
+ return nodeDrizzle(client, { schema });
33
+ }
34
+
35
+ if (process.env.MIGRATION_DB === '1') {
36
+ // https://github.com/neondatabase/serverless/blob/main/CONFIG.md#websocketconstructor-typeof-websocket--undefined
37
+ neonConfig.webSocketConstructor = ws;
38
+ }
39
+
40
+ const client = new NeonPool({ connectionString });
41
+ return neonDrizzle(client, { schema });
42
+ };
43
+
44
+ export const serverDB = getDBInstance();
@@ -0,0 +1,45 @@
1
+ import { Pool as NeonPool, neonConfig } from '@neondatabase/serverless';
2
+ import { drizzle as neonDrizzle } from 'drizzle-orm/neon-serverless';
3
+ import * as migrator from 'drizzle-orm/neon-serverless/migrator';
4
+ import { drizzle as nodeDrizzle } from 'drizzle-orm/node-postgres';
5
+ import * as nodeMigrator from 'drizzle-orm/node-postgres/migrator';
6
+ import { join } from 'node:path';
7
+ import { Pool as NodePool } from 'pg';
8
+ import ws from 'ws';
9
+
10
+ import { serverDBEnv } from '@/config/db';
11
+
12
+ import * as schema from '../schemas/lobechat';
13
+
14
+ export const getTestDBInstance = async () => {
15
+ let connectionString = serverDBEnv.DATABASE_TEST_URL;
16
+
17
+ if (!connectionString) {
18
+ throw new Error(`You are try to use database, but "DATABASE_TEST_URL" is not set correctly`);
19
+ }
20
+
21
+ if (serverDBEnv.DATABASE_DRIVER === 'node') {
22
+ const client = new NodePool({ connectionString });
23
+
24
+ const db = nodeDrizzle(client, { schema });
25
+
26
+ await nodeMigrator.migrate(db, {
27
+ migrationsFolder: join(__dirname, '../migrations'),
28
+ });
29
+
30
+ return db;
31
+ }
32
+
33
+ // https://github.com/neondatabase/serverless/blob/main/CONFIG.md#websocketconstructor-typeof-websocket--undefined
34
+ neonConfig.webSocketConstructor = ws;
35
+
36
+ const client = new NeonPool({ connectionString });
37
+
38
+ const db = neonDrizzle(client, { schema });
39
+
40
+ await migrator.migrate(db, {
41
+ migrationsFolder: join(__dirname, '../migrations'),
42
+ });
43
+
44
+ return db;
45
+ };
@@ -0,0 +1 @@
1
+ export { serverDB } from './core/db';
@@ -0,0 +1,439 @@
1
+ CREATE TABLE IF NOT EXISTS "agents" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "slug" varchar(100),
4
+ "title" text,
5
+ "description" text,
6
+ "tags" jsonb DEFAULT '[]'::jsonb,
7
+ "avatar" text,
8
+ "background_color" text,
9
+ "plugins" jsonb DEFAULT '[]'::jsonb,
10
+ "user_id" text NOT NULL,
11
+ "chat_config" jsonb,
12
+ "few_shots" jsonb,
13
+ "model" text,
14
+ "params" jsonb DEFAULT '{}'::jsonb,
15
+ "provider" text,
16
+ "system_role" text,
17
+ "tts" jsonb,
18
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
19
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
20
+ CONSTRAINT "agents_slug_unique" UNIQUE("slug")
21
+ );
22
+ --> statement-breakpoint
23
+ CREATE TABLE IF NOT EXISTS "agents_tags" (
24
+ "agent_id" text NOT NULL,
25
+ "tag_id" integer NOT NULL,
26
+ CONSTRAINT "agents_tags_agent_id_tag_id_pk" PRIMARY KEY("agent_id","tag_id")
27
+ );
28
+ --> statement-breakpoint
29
+ CREATE TABLE IF NOT EXISTS "agents_to_sessions" (
30
+ "agent_id" text NOT NULL,
31
+ "session_id" text NOT NULL,
32
+ CONSTRAINT "agents_to_sessions_agent_id_session_id_pk" PRIMARY KEY("agent_id","session_id")
33
+ );
34
+ --> statement-breakpoint
35
+ CREATE TABLE IF NOT EXISTS "files" (
36
+ "id" text PRIMARY KEY NOT NULL,
37
+ "user_id" text NOT NULL,
38
+ "file_type" varchar(255) NOT NULL,
39
+ "name" text NOT NULL,
40
+ "size" integer NOT NULL,
41
+ "url" text NOT NULL,
42
+ "metadata" jsonb,
43
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
44
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
45
+ );
46
+ --> statement-breakpoint
47
+ CREATE TABLE IF NOT EXISTS "files_to_agents" (
48
+ "file_id" text NOT NULL,
49
+ "agent_id" text NOT NULL,
50
+ CONSTRAINT "files_to_agents_file_id_agent_id_pk" PRIMARY KEY("file_id","agent_id")
51
+ );
52
+ --> statement-breakpoint
53
+ CREATE TABLE IF NOT EXISTS "files_to_messages" (
54
+ "file_id" text NOT NULL,
55
+ "message_id" text NOT NULL,
56
+ CONSTRAINT "files_to_messages_file_id_message_id_pk" PRIMARY KEY("file_id","message_id")
57
+ );
58
+ --> statement-breakpoint
59
+ CREATE TABLE IF NOT EXISTS "files_to_sessions" (
60
+ "file_id" text NOT NULL,
61
+ "session_id" text NOT NULL,
62
+ CONSTRAINT "files_to_sessions_file_id_session_id_pk" PRIMARY KEY("file_id","session_id")
63
+ );
64
+ --> statement-breakpoint
65
+ CREATE TABLE IF NOT EXISTS "user_installed_plugins" (
66
+ "user_id" text NOT NULL,
67
+ "identifier" text NOT NULL,
68
+ "type" text NOT NULL,
69
+ "manifest" jsonb,
70
+ "settings" jsonb,
71
+ "custom_params" jsonb,
72
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
73
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
74
+ CONSTRAINT "user_installed_plugins_user_id_identifier_pk" PRIMARY KEY("user_id","identifier")
75
+ );
76
+ --> statement-breakpoint
77
+ CREATE TABLE IF NOT EXISTS "market" (
78
+ "id" serial PRIMARY KEY NOT NULL,
79
+ "agent_id" text,
80
+ "plugin_id" integer,
81
+ "type" text NOT NULL,
82
+ "view" integer DEFAULT 0,
83
+ "like" integer DEFAULT 0,
84
+ "used" integer DEFAULT 0,
85
+ "user_id" text NOT NULL,
86
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
87
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
88
+ );
89
+ --> statement-breakpoint
90
+ CREATE TABLE IF NOT EXISTS "message_plugins" (
91
+ "id" text PRIMARY KEY NOT NULL,
92
+ "tool_call_id" text,
93
+ "type" text DEFAULT 'default',
94
+ "api_name" text,
95
+ "arguments" text,
96
+ "identifier" text,
97
+ "state" jsonb,
98
+ "error" jsonb
99
+ );
100
+ --> statement-breakpoint
101
+ CREATE TABLE IF NOT EXISTS "message_tts" (
102
+ "id" text PRIMARY KEY NOT NULL,
103
+ "content_md5" text,
104
+ "file_id" text,
105
+ "voice" text
106
+ );
107
+ --> statement-breakpoint
108
+ CREATE TABLE IF NOT EXISTS "message_translates" (
109
+ "id" text PRIMARY KEY NOT NULL,
110
+ "content" text,
111
+ "from" text,
112
+ "to" text
113
+ );
114
+ --> statement-breakpoint
115
+ CREATE TABLE IF NOT EXISTS "messages" (
116
+ "id" text PRIMARY KEY NOT NULL,
117
+ "role" text NOT NULL,
118
+ "content" text,
119
+ "model" text,
120
+ "provider" text,
121
+ "favorite" boolean DEFAULT false,
122
+ "error" jsonb,
123
+ "tools" jsonb,
124
+ "trace_id" text,
125
+ "observation_id" text,
126
+ "user_id" text NOT NULL,
127
+ "session_id" text,
128
+ "topic_id" text,
129
+ "parent_id" text,
130
+ "quota_id" text,
131
+ "agent_id" text,
132
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
133
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
134
+ );
135
+ --> statement-breakpoint
136
+ CREATE TABLE IF NOT EXISTS "plugins" (
137
+ "id" serial PRIMARY KEY NOT NULL,
138
+ "identifier" text NOT NULL,
139
+ "title" text NOT NULL,
140
+ "description" text,
141
+ "avatar" text,
142
+ "author" text,
143
+ "manifest" text NOT NULL,
144
+ "locale" text NOT NULL,
145
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
146
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
147
+ CONSTRAINT "plugins_identifier_unique" UNIQUE("identifier")
148
+ );
149
+ --> statement-breakpoint
150
+ CREATE TABLE IF NOT EXISTS "plugins_tags" (
151
+ "plugin_id" integer NOT NULL,
152
+ "tag_id" integer NOT NULL,
153
+ CONSTRAINT "plugins_tags_plugin_id_tag_id_pk" PRIMARY KEY("plugin_id","tag_id")
154
+ );
155
+ --> statement-breakpoint
156
+ CREATE TABLE IF NOT EXISTS "session_groups" (
157
+ "id" text PRIMARY KEY NOT NULL,
158
+ "name" text NOT NULL,
159
+ "sort" integer,
160
+ "user_id" text NOT NULL,
161
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
162
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
163
+ );
164
+ --> statement-breakpoint
165
+ CREATE TABLE IF NOT EXISTS "sessions" (
166
+ "id" text PRIMARY KEY NOT NULL,
167
+ "slug" varchar(100) NOT NULL,
168
+ "title" text,
169
+ "description" text,
170
+ "avatar" text,
171
+ "background_color" text,
172
+ "type" text DEFAULT 'agent',
173
+ "user_id" text NOT NULL,
174
+ "group_id" text,
175
+ "pinned" boolean DEFAULT false,
176
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
177
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
178
+ );
179
+ --> statement-breakpoint
180
+ CREATE TABLE IF NOT EXISTS "tags" (
181
+ "id" serial PRIMARY KEY NOT NULL,
182
+ "slug" text NOT NULL,
183
+ "name" text,
184
+ "user_id" text NOT NULL,
185
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
186
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
187
+ CONSTRAINT "tags_slug_unique" UNIQUE("slug")
188
+ );
189
+ --> statement-breakpoint
190
+ CREATE TABLE IF NOT EXISTS "topics" (
191
+ "id" text PRIMARY KEY NOT NULL,
192
+ "session_id" text,
193
+ "user_id" text NOT NULL,
194
+ "favorite" boolean DEFAULT false,
195
+ "title" text,
196
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
197
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
198
+ );
199
+ --> statement-breakpoint
200
+ CREATE TABLE IF NOT EXISTS "user_settings" (
201
+ "id" text PRIMARY KEY NOT NULL,
202
+ "tts" jsonb,
203
+ "key_vaults" text,
204
+ "general" jsonb,
205
+ "language_model" jsonb,
206
+ "system_agent" jsonb,
207
+ "default_agent" jsonb,
208
+ "tool" jsonb
209
+ );
210
+ --> statement-breakpoint
211
+ CREATE TABLE IF NOT EXISTS "users" (
212
+ "id" text PRIMARY KEY NOT NULL,
213
+ "username" text,
214
+ "email" text,
215
+ "avatar" text,
216
+ "phone" text,
217
+ "first_name" text,
218
+ "last_name" text,
219
+ "is_onboarded" boolean DEFAULT false,
220
+ "clerk_created_at" timestamp with time zone,
221
+ "preference" jsonb DEFAULT '{"guide":{"moveSettingsToAvatar":true,"topic":true},"telemetry":null,"useCmdEnterToSend":false}'::jsonb,
222
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
223
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
224
+ "key" text,
225
+ CONSTRAINT "users_username_unique" UNIQUE("username")
226
+ );
227
+ --> statement-breakpoint
228
+ DO $$ BEGIN
229
+ ALTER TABLE "agents" ADD CONSTRAINT "agents_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
230
+ EXCEPTION
231
+ WHEN duplicate_object THEN null;
232
+ END $$;
233
+ --> statement-breakpoint
234
+ DO $$ BEGIN
235
+ ALTER TABLE "agents_tags" ADD CONSTRAINT "agents_tags_agent_id_agents_id_fk" FOREIGN KEY ("agent_id") REFERENCES "public"."agents"("id") ON DELETE cascade ON UPDATE no action;
236
+ EXCEPTION
237
+ WHEN duplicate_object THEN null;
238
+ END $$;
239
+ --> statement-breakpoint
240
+ DO $$ BEGIN
241
+ ALTER TABLE "agents_tags" ADD CONSTRAINT "agents_tags_tag_id_tags_id_fk" FOREIGN KEY ("tag_id") REFERENCES "public"."tags"("id") ON DELETE cascade ON UPDATE no action;
242
+ EXCEPTION
243
+ WHEN duplicate_object THEN null;
244
+ END $$;
245
+ --> statement-breakpoint
246
+ DO $$ BEGIN
247
+ ALTER TABLE "agents_to_sessions" ADD CONSTRAINT "agents_to_sessions_agent_id_agents_id_fk" FOREIGN KEY ("agent_id") REFERENCES "public"."agents"("id") ON DELETE cascade ON UPDATE no action;
248
+ EXCEPTION
249
+ WHEN duplicate_object THEN null;
250
+ END $$;
251
+ --> statement-breakpoint
252
+ DO $$ BEGIN
253
+ ALTER TABLE "agents_to_sessions" ADD CONSTRAINT "agents_to_sessions_session_id_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."sessions"("id") ON DELETE cascade ON UPDATE no action;
254
+ EXCEPTION
255
+ WHEN duplicate_object THEN null;
256
+ END $$;
257
+ --> statement-breakpoint
258
+ DO $$ BEGIN
259
+ ALTER TABLE "files" ADD CONSTRAINT "files_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
260
+ EXCEPTION
261
+ WHEN duplicate_object THEN null;
262
+ END $$;
263
+ --> statement-breakpoint
264
+ DO $$ BEGIN
265
+ ALTER TABLE "files_to_agents" ADD CONSTRAINT "files_to_agents_file_id_files_id_fk" FOREIGN KEY ("file_id") REFERENCES "public"."files"("id") ON DELETE cascade ON UPDATE no action;
266
+ EXCEPTION
267
+ WHEN duplicate_object THEN null;
268
+ END $$;
269
+ --> statement-breakpoint
270
+ DO $$ BEGIN
271
+ ALTER TABLE "files_to_agents" ADD CONSTRAINT "files_to_agents_agent_id_agents_id_fk" FOREIGN KEY ("agent_id") REFERENCES "public"."agents"("id") ON DELETE cascade ON UPDATE no action;
272
+ EXCEPTION
273
+ WHEN duplicate_object THEN null;
274
+ END $$;
275
+ --> statement-breakpoint
276
+ DO $$ BEGIN
277
+ ALTER TABLE "files_to_messages" ADD CONSTRAINT "files_to_messages_file_id_files_id_fk" FOREIGN KEY ("file_id") REFERENCES "public"."files"("id") ON DELETE cascade ON UPDATE no action;
278
+ EXCEPTION
279
+ WHEN duplicate_object THEN null;
280
+ END $$;
281
+ --> statement-breakpoint
282
+ DO $$ BEGIN
283
+ ALTER TABLE "files_to_messages" ADD CONSTRAINT "files_to_messages_message_id_messages_id_fk" FOREIGN KEY ("message_id") REFERENCES "public"."messages"("id") ON DELETE cascade ON UPDATE no action;
284
+ EXCEPTION
285
+ WHEN duplicate_object THEN null;
286
+ END $$;
287
+ --> statement-breakpoint
288
+ DO $$ BEGIN
289
+ ALTER TABLE "files_to_sessions" ADD CONSTRAINT "files_to_sessions_file_id_files_id_fk" FOREIGN KEY ("file_id") REFERENCES "public"."files"("id") ON DELETE cascade ON UPDATE no action;
290
+ EXCEPTION
291
+ WHEN duplicate_object THEN null;
292
+ END $$;
293
+ --> statement-breakpoint
294
+ DO $$ BEGIN
295
+ ALTER TABLE "files_to_sessions" ADD CONSTRAINT "files_to_sessions_session_id_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."sessions"("id") ON DELETE cascade ON UPDATE no action;
296
+ EXCEPTION
297
+ WHEN duplicate_object THEN null;
298
+ END $$;
299
+ --> statement-breakpoint
300
+ DO $$ BEGIN
301
+ ALTER TABLE "user_installed_plugins" ADD CONSTRAINT "user_installed_plugins_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
302
+ EXCEPTION
303
+ WHEN duplicate_object THEN null;
304
+ END $$;
305
+ --> statement-breakpoint
306
+ DO $$ BEGIN
307
+ ALTER TABLE "market" ADD CONSTRAINT "market_agent_id_agents_id_fk" FOREIGN KEY ("agent_id") REFERENCES "public"."agents"("id") ON DELETE cascade ON UPDATE no action;
308
+ EXCEPTION
309
+ WHEN duplicate_object THEN null;
310
+ END $$;
311
+ --> statement-breakpoint
312
+ DO $$ BEGIN
313
+ ALTER TABLE "market" ADD CONSTRAINT "market_plugin_id_plugins_id_fk" FOREIGN KEY ("plugin_id") REFERENCES "public"."plugins"("id") ON DELETE cascade ON UPDATE no action;
314
+ EXCEPTION
315
+ WHEN duplicate_object THEN null;
316
+ END $$;
317
+ --> statement-breakpoint
318
+ DO $$ BEGIN
319
+ ALTER TABLE "market" ADD CONSTRAINT "market_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
320
+ EXCEPTION
321
+ WHEN duplicate_object THEN null;
322
+ END $$;
323
+ --> statement-breakpoint
324
+ DO $$ BEGIN
325
+ ALTER TABLE "message_plugins" ADD CONSTRAINT "message_plugins_id_messages_id_fk" FOREIGN KEY ("id") REFERENCES "public"."messages"("id") ON DELETE cascade ON UPDATE no action;
326
+ EXCEPTION
327
+ WHEN duplicate_object THEN null;
328
+ END $$;
329
+ --> statement-breakpoint
330
+ DO $$ BEGIN
331
+ ALTER TABLE "message_tts" ADD CONSTRAINT "message_tts_id_messages_id_fk" FOREIGN KEY ("id") REFERENCES "public"."messages"("id") ON DELETE cascade ON UPDATE no action;
332
+ EXCEPTION
333
+ WHEN duplicate_object THEN null;
334
+ END $$;
335
+ --> statement-breakpoint
336
+ DO $$ BEGIN
337
+ ALTER TABLE "message_tts" ADD CONSTRAINT "message_tts_file_id_files_id_fk" FOREIGN KEY ("file_id") REFERENCES "public"."files"("id") ON DELETE cascade ON UPDATE no action;
338
+ EXCEPTION
339
+ WHEN duplicate_object THEN null;
340
+ END $$;
341
+ --> statement-breakpoint
342
+ DO $$ BEGIN
343
+ ALTER TABLE "message_translates" ADD CONSTRAINT "message_translates_id_messages_id_fk" FOREIGN KEY ("id") REFERENCES "public"."messages"("id") ON DELETE cascade ON UPDATE no action;
344
+ EXCEPTION
345
+ WHEN duplicate_object THEN null;
346
+ END $$;
347
+ --> statement-breakpoint
348
+ DO $$ BEGIN
349
+ ALTER TABLE "messages" ADD CONSTRAINT "messages_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
350
+ EXCEPTION
351
+ WHEN duplicate_object THEN null;
352
+ END $$;
353
+ --> statement-breakpoint
354
+ DO $$ BEGIN
355
+ ALTER TABLE "messages" ADD CONSTRAINT "messages_session_id_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."sessions"("id") ON DELETE cascade ON UPDATE no action;
356
+ EXCEPTION
357
+ WHEN duplicate_object THEN null;
358
+ END $$;
359
+ --> statement-breakpoint
360
+ DO $$ BEGIN
361
+ ALTER TABLE "messages" ADD CONSTRAINT "messages_topic_id_topics_id_fk" FOREIGN KEY ("topic_id") REFERENCES "public"."topics"("id") ON DELETE cascade ON UPDATE no action;
362
+ EXCEPTION
363
+ WHEN duplicate_object THEN null;
364
+ END $$;
365
+ --> statement-breakpoint
366
+ DO $$ BEGIN
367
+ ALTER TABLE "messages" ADD CONSTRAINT "messages_parent_id_messages_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."messages"("id") ON DELETE set null ON UPDATE no action;
368
+ EXCEPTION
369
+ WHEN duplicate_object THEN null;
370
+ END $$;
371
+ --> statement-breakpoint
372
+ DO $$ BEGIN
373
+ ALTER TABLE "messages" ADD CONSTRAINT "messages_quota_id_messages_id_fk" FOREIGN KEY ("quota_id") REFERENCES "public"."messages"("id") ON DELETE set null ON UPDATE no action;
374
+ EXCEPTION
375
+ WHEN duplicate_object THEN null;
376
+ END $$;
377
+ --> statement-breakpoint
378
+ DO $$ BEGIN
379
+ ALTER TABLE "messages" ADD CONSTRAINT "messages_agent_id_agents_id_fk" FOREIGN KEY ("agent_id") REFERENCES "public"."agents"("id") ON DELETE set null ON UPDATE no action;
380
+ EXCEPTION
381
+ WHEN duplicate_object THEN null;
382
+ END $$;
383
+ --> statement-breakpoint
384
+ DO $$ BEGIN
385
+ ALTER TABLE "plugins_tags" ADD CONSTRAINT "plugins_tags_plugin_id_plugins_id_fk" FOREIGN KEY ("plugin_id") REFERENCES "public"."plugins"("id") ON DELETE cascade ON UPDATE no action;
386
+ EXCEPTION
387
+ WHEN duplicate_object THEN null;
388
+ END $$;
389
+ --> statement-breakpoint
390
+ DO $$ BEGIN
391
+ ALTER TABLE "plugins_tags" ADD CONSTRAINT "plugins_tags_tag_id_tags_id_fk" FOREIGN KEY ("tag_id") REFERENCES "public"."tags"("id") ON DELETE cascade ON UPDATE no action;
392
+ EXCEPTION
393
+ WHEN duplicate_object THEN null;
394
+ END $$;
395
+ --> statement-breakpoint
396
+ DO $$ BEGIN
397
+ ALTER TABLE "session_groups" ADD CONSTRAINT "session_groups_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
398
+ EXCEPTION
399
+ WHEN duplicate_object THEN null;
400
+ END $$;
401
+ --> statement-breakpoint
402
+ DO $$ BEGIN
403
+ ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
404
+ EXCEPTION
405
+ WHEN duplicate_object THEN null;
406
+ END $$;
407
+ --> statement-breakpoint
408
+ DO $$ BEGIN
409
+ ALTER TABLE "sessions" ADD CONSTRAINT "sessions_group_id_session_groups_id_fk" FOREIGN KEY ("group_id") REFERENCES "public"."session_groups"("id") ON DELETE set null ON UPDATE no action;
410
+ EXCEPTION
411
+ WHEN duplicate_object THEN null;
412
+ END $$;
413
+ --> statement-breakpoint
414
+ DO $$ BEGIN
415
+ ALTER TABLE "tags" ADD CONSTRAINT "tags_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
416
+ EXCEPTION
417
+ WHEN duplicate_object THEN null;
418
+ END $$;
419
+ --> statement-breakpoint
420
+ DO $$ BEGIN
421
+ ALTER TABLE "topics" ADD CONSTRAINT "topics_session_id_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."sessions"("id") ON DELETE cascade ON UPDATE no action;
422
+ EXCEPTION
423
+ WHEN duplicate_object THEN null;
424
+ END $$;
425
+ --> statement-breakpoint
426
+ DO $$ BEGIN
427
+ ALTER TABLE "topics" ADD CONSTRAINT "topics_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
428
+ EXCEPTION
429
+ WHEN duplicate_object THEN null;
430
+ END $$;
431
+ --> statement-breakpoint
432
+ DO $$ BEGIN
433
+ ALTER TABLE "user_settings" ADD CONSTRAINT "user_settings_id_users_id_fk" FOREIGN KEY ("id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
434
+ EXCEPTION
435
+ WHEN duplicate_object THEN null;
436
+ END $$;
437
+ --> statement-breakpoint
438
+ CREATE INDEX IF NOT EXISTS "messages_created_at_idx" ON "messages" ("created_at");--> statement-breakpoint
439
+ CREATE UNIQUE INDEX IF NOT EXISTS "slug_user_id_unique" ON "sessions" ("slug","user_id");
@@ -0,0 +1,9 @@
1
+ ALTER TABLE "messages" ADD COLUMN "client_id" text;--> statement-breakpoint
2
+ ALTER TABLE "session_groups" ADD COLUMN "client_id" text;--> statement-breakpoint
3
+ ALTER TABLE "sessions" ADD COLUMN "client_id" text;--> statement-breakpoint
4
+ ALTER TABLE "topics" ADD COLUMN "client_id" text;--> statement-breakpoint
5
+ CREATE INDEX IF NOT EXISTS "messages_client_id_idx" ON "messages" ("client_id");--> statement-breakpoint
6
+ ALTER TABLE "messages" ADD CONSTRAINT "messages_client_id_unique" UNIQUE("client_id");--> statement-breakpoint
7
+ ALTER TABLE "session_groups" ADD CONSTRAINT "session_groups_client_id_unique" UNIQUE("client_id");--> statement-breakpoint
8
+ ALTER TABLE "sessions" ADD CONSTRAINT "sessions_client_id_unique" UNIQUE("client_id");--> statement-breakpoint
9
+ ALTER TABLE "topics" ADD CONSTRAINT "topics_client_id_unique" UNIQUE("client_id");
@@ -0,0 +1,9 @@
1
+ ALTER TABLE "messages" DROP CONSTRAINT "messages_client_id_unique";--> statement-breakpoint
2
+ ALTER TABLE "session_groups" DROP CONSTRAINT "session_groups_client_id_unique";--> statement-breakpoint
3
+ ALTER TABLE "sessions" DROP CONSTRAINT "sessions_client_id_unique";--> statement-breakpoint
4
+ ALTER TABLE "topics" DROP CONSTRAINT "topics_client_id_unique";--> statement-breakpoint
5
+ DROP INDEX IF EXISTS "messages_client_id_idx";--> statement-breakpoint
6
+ CREATE UNIQUE INDEX IF NOT EXISTS "message_client_id_user_unique" ON "messages" ("client_id","user_id");--> statement-breakpoint
7
+ ALTER TABLE "session_groups" ADD CONSTRAINT "session_group_client_id_user_unique" UNIQUE("client_id","user_id");--> statement-breakpoint
8
+ ALTER TABLE "sessions" ADD CONSTRAINT "sessions_client_id_user_id_unique" UNIQUE("client_id","user_id");--> statement-breakpoint
9
+ ALTER TABLE "topics" ADD CONSTRAINT "topic_client_id_user_id_unique" UNIQUE("client_id","user_id");