@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.
- package/.github/workflows/release.yml +21 -2
- package/.github/workflows/sync.yml +1 -1
- package/.github/workflows/test.yml +35 -4
- package/CHANGELOG.md +50 -0
- package/LICENSE +38 -21
- package/README.md +8 -8
- package/README.zh-CN.md +8 -8
- package/codecov.yml +11 -0
- package/docs/self-hosting/platform/zeabur.mdx +1 -1
- package/docs/self-hosting/platform/zeabur.zh-CN.mdx +1 -1
- package/drizzle.config.ts +29 -0
- package/next.config.mjs +3 -0
- package/package.json +25 -5
- package/scripts/migrateServerDB/index.ts +30 -0
- package/src/app/(main)/(mobile)/me/(home)/features/useCategory.tsx +2 -1
- package/src/app/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +95 -88
- package/src/app/(main)/chat/settings/features/HeaderContent.tsx +37 -31
- package/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx +11 -1
- package/src/app/api/middleware/auth/index.ts +1 -1
- package/src/app/api/webhooks/clerk/__tests__/fixtures/createUser.json +73 -0
- package/src/app/api/webhooks/clerk/route.ts +159 -0
- package/src/app/api/webhooks/clerk/validateRequest.ts +22 -0
- package/src/app/trpc/edge/[trpc]/route.ts +1 -1
- package/src/app/trpc/lambda/[trpc]/route.ts +26 -0
- package/src/config/auth.ts +2 -0
- package/src/config/db.ts +13 -1
- package/src/database/server/core/db.ts +44 -0
- package/src/database/server/core/dbForTest.ts +45 -0
- package/src/database/server/index.ts +1 -0
- package/src/database/server/migrations/0000_init.sql +439 -0
- package/src/database/server/migrations/0001_add_client_id.sql +9 -0
- package/src/database/server/migrations/0002_amusing_puma.sql +9 -0
- package/src/database/server/migrations/meta/0000_snapshot.json +1583 -0
- package/src/database/server/migrations/meta/0001_snapshot.json +1636 -0
- package/src/database/server/migrations/meta/0002_snapshot.json +1630 -0
- package/src/database/server/migrations/meta/_journal.json +27 -0
- package/src/database/server/models/__tests__/file.test.ts +140 -0
- package/src/database/server/models/__tests__/message.test.ts +847 -0
- package/src/database/server/models/__tests__/plugin.test.ts +172 -0
- package/src/database/server/models/__tests__/session.test.ts +595 -0
- package/src/database/server/models/__tests__/topic.test.ts +623 -0
- package/src/database/server/models/__tests__/user.test.ts +173 -0
- package/src/database/server/models/_template.ts +44 -0
- package/src/database/server/models/file.ts +51 -0
- package/src/database/server/models/message.ts +378 -0
- package/src/database/server/models/plugin.ts +63 -0
- package/src/database/server/models/session.ts +290 -0
- package/src/database/server/models/sessionGroup.ts +69 -0
- package/src/database/server/models/topic.ts +265 -0
- package/src/database/server/models/user.ts +138 -0
- package/src/database/server/modules/DataImporter/__tests__/fixtures/messages.json +1101 -0
- package/src/database/server/modules/DataImporter/__tests__/index.test.ts +954 -0
- package/src/database/server/modules/DataImporter/index.ts +333 -0
- package/src/database/server/schemas/_id.ts +15 -0
- package/src/database/server/schemas/lobechat.ts +601 -0
- package/src/database/server/utils/idGenerator.test.ts +39 -0
- package/src/database/server/utils/idGenerator.ts +26 -0
- package/src/features/AgentSetting/AgentModal/index.tsx +6 -7
- package/src/features/User/UserPanel/useMenu.tsx +43 -37
- package/src/libs/trpc/client.ts +52 -3
- package/src/server/files/s3.ts +21 -1
- package/src/server/keyVaultsEncrypt/index.test.ts +62 -0
- package/src/server/keyVaultsEncrypt/index.ts +93 -0
- package/src/server/mock.ts +1 -1
- package/src/server/routers/{index.ts → edge/index.ts} +3 -3
- package/src/server/routers/lambda/file.ts +49 -0
- package/src/server/routers/lambda/importer.ts +54 -0
- package/src/server/routers/lambda/index.ts +28 -0
- package/src/server/routers/lambda/message.ts +165 -0
- package/src/server/routers/lambda/plugin.ts +100 -0
- package/src/server/routers/lambda/session.ts +194 -0
- package/src/server/routers/lambda/sessionGroup.ts +77 -0
- package/src/server/routers/lambda/topic.ts +134 -0
- package/src/server/routers/lambda/user.ts +57 -0
- package/src/services/file/index.ts +4 -7
- package/src/services/file/server.ts +45 -0
- package/src/services/import/index.ts +4 -1
- package/src/services/import/server.ts +115 -0
- package/src/services/message/index.ts +4 -8
- package/src/services/message/server.ts +93 -0
- package/src/services/plugin/index.ts +4 -9
- package/src/services/plugin/server.ts +46 -0
- package/src/services/session/index.ts +4 -8
- package/src/services/session/server.ts +148 -0
- package/src/services/topic/index.ts +4 -9
- package/src/services/topic/server.ts +68 -0
- package/src/services/user/index.ts +4 -9
- package/src/services/user/server.ts +28 -0
- package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +201 -0
- package/src/store/user/slices/modelList/selectors/keyVaults.ts +15 -3
- package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +29 -1
- package/src/store/user/slices/modelList/selectors/modelConfig.ts +21 -1
- package/src/types/user/settings/keyVaults.ts +1 -1
- package/tests/setup-db.ts +7 -0
- package/vitest.config.ts +2 -1
- 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");
|