@wfm-cn/dsh-storage 0.0.0-stage → 0.3.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/CHANGELOG.md +23 -0
- package/LICENSE +21 -0
- package/README.md +137 -2
- package/cordis.patch.yml +3 -0
- package/lib/backends/database.js +578 -0
- package/lib/backfill.js +331 -0
- package/lib/client/index.js +79 -0
- package/lib/client/panel.js +299 -0
- package/lib/client/toast.js +66 -0
- package/lib/client.js +1 -0
- package/lib/compaction.js +108 -0
- package/lib/config.js +171 -0
- package/lib/ddl.js +323 -0
- package/lib/generated/mysql/browser.js +17 -0
- package/lib/generated/mysql/client.js +34 -0
- package/lib/generated/mysql/commonInputTypes.js +10 -0
- package/lib/generated/mysql/enums.js +10 -0
- package/lib/generated/mysql/internal/class.js +49 -0
- package/lib/generated/mysql/internal/prismaNamespace.js +146 -0
- package/lib/generated/mysql/internal/prismaNamespaceBrowser.js +117 -0
- package/lib/generated/mysql/models/AiChatHistory.js +1 -0
- package/lib/generated/mysql/models/AiMessage.js +1 -0
- package/lib/generated/mysql/models.js +1 -0
- package/lib/generated/postgresql/browser.js +17 -0
- package/lib/generated/postgresql/client.js +34 -0
- package/lib/generated/postgresql/commonInputTypes.js +10 -0
- package/lib/generated/postgresql/enums.js +10 -0
- package/lib/generated/postgresql/internal/class.js +49 -0
- package/lib/generated/postgresql/internal/prismaNamespace.js +131 -0
- package/lib/generated/postgresql/internal/prismaNamespaceBrowser.js +102 -0
- package/lib/generated/postgresql/models/AiChatHistory.js +1 -0
- package/lib/generated/postgresql/models/AiMessage.js +1 -0
- package/lib/generated/postgresql/models.js +1 -0
- package/lib/generated/sqlite/browser.js +17 -0
- package/lib/generated/sqlite/client.js +34 -0
- package/lib/generated/sqlite/commonInputTypes.js +10 -0
- package/lib/generated/sqlite/enums.js +10 -0
- package/lib/generated/sqlite/internal/class.js +49 -0
- package/lib/generated/sqlite/internal/prismaNamespace.js +128 -0
- package/lib/generated/sqlite/internal/prismaNamespaceBrowser.js +99 -0
- package/lib/generated/sqlite/models/AiChatHistory.js +1 -0
- package/lib/generated/sqlite/models/AiMessage.js +1 -0
- package/lib/generated/sqlite/models.js +1 -0
- package/lib/generated/sqlserver/browser.js +17 -0
- package/lib/generated/sqlserver/client.js +34 -0
- package/lib/generated/sqlserver/commonInputTypes.js +10 -0
- package/lib/generated/sqlserver/enums.js +10 -0
- package/lib/generated/sqlserver/internal/class.js +49 -0
- package/lib/generated/sqlserver/internal/prismaNamespace.js +119 -0
- package/lib/generated/sqlserver/internal/prismaNamespaceBrowser.js +90 -0
- package/lib/generated/sqlserver/models/AiChatHistory.js +1 -0
- package/lib/generated/sqlserver/models/AiMessage.js +1 -0
- package/lib/generated/sqlserver/models.js +1 -0
- package/lib/health.js +180 -0
- package/lib/index.js +681 -0
- package/lib/memory-tools.js +365 -0
- package/lib/notify.js +56 -0
- package/lib/projector.js +191 -0
- package/lib/status-route.js +172 -0
- package/lib/types/backends/database.d.ts +78 -0
- package/lib/types/backfill.d.ts +67 -0
- package/lib/types/client/index.d.ts +12 -0
- package/lib/types/client/panel.d.ts +79 -0
- package/lib/types/client/toast.d.ts +38 -0
- package/lib/types/compaction.d.ts +3 -0
- package/lib/types/config.d.ts +52 -0
- package/lib/types/ddl.d.ts +49 -0
- package/lib/types/generated/mysql/browser.d.ts +14 -0
- package/lib/types/generated/mysql/client.d.ts +33 -0
- package/lib/types/generated/mysql/commonInputTypes.d.ts +396 -0
- package/lib/types/generated/mysql/enums.d.ts +1 -0
- package/lib/types/generated/mysql/internal/class.d.ts +143 -0
- package/lib/types/generated/mysql/internal/prismaNamespace.d.ts +709 -0
- package/lib/types/generated/mysql/internal/prismaNamespaceBrowser.d.ts +112 -0
- package/lib/types/generated/mysql/models/AiChatHistory.d.ts +1258 -0
- package/lib/types/generated/mysql/models/AiMessage.d.ts +1359 -0
- package/lib/types/generated/mysql/models.d.ts +3 -0
- package/lib/types/generated/postgresql/browser.d.ts +14 -0
- package/lib/types/generated/postgresql/client.d.ts +33 -0
- package/lib/types/generated/postgresql/commonInputTypes.d.ts +392 -0
- package/lib/types/generated/postgresql/enums.d.ts +1 -0
- package/lib/types/generated/postgresql/internal/class.d.ts +143 -0
- package/lib/types/generated/postgresql/internal/prismaNamespace.d.ts +728 -0
- package/lib/types/generated/postgresql/internal/prismaNamespaceBrowser.d.ts +95 -0
- package/lib/types/generated/postgresql/models/AiChatHistory.d.ts +1373 -0
- package/lib/types/generated/postgresql/models/AiMessage.d.ts +1496 -0
- package/lib/types/generated/postgresql/models.d.ts +3 -0
- package/lib/types/generated/sqlite/browser.d.ts +14 -0
- package/lib/types/generated/sqlite/client.d.ts +33 -0
- package/lib/types/generated/sqlite/commonInputTypes.d.ts +373 -0
- package/lib/types/generated/sqlite/enums.d.ts +1 -0
- package/lib/types/generated/sqlite/internal/class.d.ts +143 -0
- package/lib/types/generated/sqlite/internal/prismaNamespace.d.ts +705 -0
- package/lib/types/generated/sqlite/internal/prismaNamespaceBrowser.d.ts +92 -0
- package/lib/types/generated/sqlite/models/AiChatHistory.d.ts +1371 -0
- package/lib/types/generated/sqlite/models/AiMessage.d.ts +1493 -0
- package/lib/types/generated/sqlite/models.d.ts +3 -0
- package/lib/types/generated/sqlserver/browser.d.ts +14 -0
- package/lib/types/generated/sqlserver/client.d.ts +33 -0
- package/lib/types/generated/sqlserver/commonInputTypes.d.ts +333 -0
- package/lib/types/generated/sqlserver/enums.d.ts +1 -0
- package/lib/types/generated/sqlserver/internal/class.d.ts +143 -0
- package/lib/types/generated/sqlserver/internal/prismaNamespace.d.ts +669 -0
- package/lib/types/generated/sqlserver/internal/prismaNamespaceBrowser.d.ts +80 -0
- package/lib/types/generated/sqlserver/models/AiChatHistory.d.ts +1257 -0
- package/lib/types/generated/sqlserver/models/AiMessage.d.ts +1375 -0
- package/lib/types/generated/sqlserver/models.d.ts +3 -0
- package/lib/types/health.d.ts +52 -0
- package/lib/types/index.d.ts +91 -0
- package/lib/types/memory-tools.d.ts +168 -0
- package/lib/types/notify.d.ts +35 -0
- package/lib/types/projector.d.ts +51 -0
- package/lib/types/status-route.d.ts +48 -0
- package/lib/types/types.d.ts +58 -0
- package/lib/types.js +8 -0
- package/package.json +127 -4
- package/preview.png +0 -0
- package/prisma/schema.mysql.prisma +78 -0
- package/prisma/schema.postgresql.prisma +70 -0
- package/prisma/schema.sqlite.prisma +70 -0
- package/prisma/schema.sqlserver.prisma +76 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Prisma schema for the dsh-storage database backend — MySQL variant (Prisma 7).
|
|
2
|
+
//
|
|
3
|
+
// Table layout matches the source project's ai_messages / ai_chat_histories
|
|
4
|
+
// (packages/core/prisma/schema.prisma) so existing data stays compatible:
|
|
5
|
+
// - `type` values come from the dsh session event map
|
|
6
|
+
// ('user' | 'model' | 'tool' | ...) instead of gemini-cli message roles.
|
|
7
|
+
// - `agent_id` distinguishes the main agent from subagent writers.
|
|
8
|
+
// - no user_id: tenancy is carried by session_id, not a column.
|
|
9
|
+
//
|
|
10
|
+
// The client is pre-generated at package build time (`pnpm generate`, output
|
|
11
|
+
// src/generated/mysql, compiled into lib/generated) — consumers do NOT run
|
|
12
|
+
// `prisma generate`. To create/upgrade tables, run `prisma db push` /
|
|
13
|
+
// migrations against this file; the connection URL lives in prisma.config.ts
|
|
14
|
+
// (Prisma 7 dropped datasource.url from the schema).
|
|
15
|
+
|
|
16
|
+
generator client {
|
|
17
|
+
provider = "prisma-client"
|
|
18
|
+
output = "../src/generated/mysql"
|
|
19
|
+
importFileExtension = "js"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
datasource db {
|
|
23
|
+
provider = "mysql"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/// User and assistant messages; tool results update the assistant row's tool_calls.
|
|
27
|
+
model AiMessage {
|
|
28
|
+
id String @id @default(cuid()) @db.Char(36)
|
|
29
|
+
sessionId String @map("session_id") @db.VarChar(100)
|
|
30
|
+
historyId String? @map("history_id") @db.Char(36)
|
|
31
|
+
type String @db.VarChar(50)
|
|
32
|
+
content String @db.LongText
|
|
33
|
+
thoughts Json?
|
|
34
|
+
model String? @db.VarChar(100)
|
|
35
|
+
tokens Json?
|
|
36
|
+
toolCalls Json? @map("tool_calls")
|
|
37
|
+
agentId String? @map("agent_id") @db.VarChar(100)
|
|
38
|
+
metadata Json?
|
|
39
|
+
device String? @map("device") @db.VarChar(100)
|
|
40
|
+
createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0)
|
|
41
|
+
updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @db.Timestamp(0)
|
|
42
|
+
deletedAt DateTime? @map("deleted_at") @db.Timestamp(0)
|
|
43
|
+
|
|
44
|
+
// Relations
|
|
45
|
+
history AiChatHistory? @relation(fields: [historyId], references: [id], onDelete: NoAction)
|
|
46
|
+
|
|
47
|
+
@@index([sessionId], map: "idx_session")
|
|
48
|
+
@@index([historyId], map: "idx_history")
|
|
49
|
+
@@index([createdAt], map: "idx_created")
|
|
50
|
+
@@index([deletedAt], map: "idx_deleted")
|
|
51
|
+
@@index([agentId], map: "idx_agent")
|
|
52
|
+
@@index([sessionId, agentId, type, createdAt], map: "idx_session_agent_type_created")
|
|
53
|
+
@@index([sessionId, historyId, deletedAt, type, createdAt, id], map: "idx_tool_call_lookup")
|
|
54
|
+
@@index([sessionId, deletedAt, updatedAt, id], map: "idx_archive_recovery")
|
|
55
|
+
@@map("ai_messages")
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/// Per-session rollup, maintained incrementally by the projector.
|
|
59
|
+
model AiChatHistory {
|
|
60
|
+
id String @id @default(cuid()) @db.Char(36)
|
|
61
|
+
sessionId String @map("session_id") @db.VarChar(100)
|
|
62
|
+
title String? @db.VarChar(255)
|
|
63
|
+
summary String? @db.Text
|
|
64
|
+
messageCount Int @default(0) @map("message_count")
|
|
65
|
+
totalTokens BigInt @default(0) @map("total_tokens")
|
|
66
|
+
firstMessageAt DateTime? @map("first_message_at") @db.DateTime(6)
|
|
67
|
+
lastMessageAt DateTime? @map("last_message_at") @db.DateTime(6)
|
|
68
|
+
metadata Json?
|
|
69
|
+
device String? @map("device") @db.VarChar(100)
|
|
70
|
+
deletedAt DateTime? @map("deleted_at") @db.DateTime(6)
|
|
71
|
+
|
|
72
|
+
// Relations
|
|
73
|
+
messages AiMessage[]
|
|
74
|
+
|
|
75
|
+
@@index([sessionId], map: "idx_chat_history_session")
|
|
76
|
+
@@index([deletedAt], map: "idx_chat_history_deleted")
|
|
77
|
+
@@map("ai_chat_histories")
|
|
78
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Prisma schema for the dsh-storage database backend — PostgreSQL variant (Prisma 7).
|
|
2
|
+
//
|
|
3
|
+
// Same models as schema.mysql.prisma, with PostgreSQL native types
|
|
4
|
+
// (`@db.Text` instead of `@db.LongText`, `@db.Timestamp` instead of
|
|
5
|
+
// `@db.DateTime`). Client pre-generation and table creation work as described
|
|
6
|
+
// in schema.mysql.prisma's header.
|
|
7
|
+
|
|
8
|
+
generator client {
|
|
9
|
+
provider = "prisma-client"
|
|
10
|
+
output = "../src/generated/postgresql"
|
|
11
|
+
importFileExtension = "js"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
datasource db {
|
|
15
|
+
provider = "postgresql"
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/// User and assistant messages; tool results update the assistant row's tool_calls.
|
|
19
|
+
model AiMessage {
|
|
20
|
+
id String @id @default(cuid()) @db.Char(36)
|
|
21
|
+
sessionId String @map("session_id") @db.VarChar(100)
|
|
22
|
+
historyId String? @map("history_id") @db.Char(36)
|
|
23
|
+
type String @db.VarChar(50)
|
|
24
|
+
content String @db.Text
|
|
25
|
+
thoughts Json?
|
|
26
|
+
model String? @db.VarChar(100)
|
|
27
|
+
tokens Json?
|
|
28
|
+
toolCalls Json? @map("tool_calls")
|
|
29
|
+
agentId String? @map("agent_id") @db.VarChar(100)
|
|
30
|
+
metadata Json?
|
|
31
|
+
device String? @map("device") @db.VarChar(100)
|
|
32
|
+
createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0)
|
|
33
|
+
updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @db.Timestamp(0)
|
|
34
|
+
deletedAt DateTime? @map("deleted_at") @db.Timestamp(0)
|
|
35
|
+
|
|
36
|
+
// Relations
|
|
37
|
+
history AiChatHistory? @relation(fields: [historyId], references: [id], onDelete: NoAction)
|
|
38
|
+
|
|
39
|
+
@@index([sessionId], map: "idx_session")
|
|
40
|
+
@@index([historyId], map: "idx_history")
|
|
41
|
+
@@index([createdAt], map: "idx_created")
|
|
42
|
+
@@index([deletedAt], map: "idx_deleted")
|
|
43
|
+
@@index([agentId], map: "idx_agent")
|
|
44
|
+
@@index([sessionId, agentId, type, createdAt], map: "idx_session_agent_type_created")
|
|
45
|
+
@@index([sessionId, historyId, deletedAt, type, createdAt, id], map: "idx_tool_call_lookup")
|
|
46
|
+
@@index([sessionId, deletedAt, updatedAt, id], map: "idx_archive_recovery")
|
|
47
|
+
@@map("ai_messages")
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// Per-session rollup, maintained incrementally by the projector.
|
|
51
|
+
model AiChatHistory {
|
|
52
|
+
id String @id @default(cuid()) @db.Char(36)
|
|
53
|
+
sessionId String @map("session_id") @db.VarChar(100)
|
|
54
|
+
title String? @db.VarChar(255)
|
|
55
|
+
summary String? @db.Text
|
|
56
|
+
messageCount Int @default(0) @map("message_count")
|
|
57
|
+
totalTokens BigInt @default(0) @map("total_tokens")
|
|
58
|
+
firstMessageAt DateTime? @map("first_message_at") @db.Timestamp(6)
|
|
59
|
+
lastMessageAt DateTime? @map("last_message_at") @db.Timestamp(6)
|
|
60
|
+
metadata Json?
|
|
61
|
+
device String? @map("device") @db.VarChar(100)
|
|
62
|
+
deletedAt DateTime? @map("deleted_at") @db.Timestamp(6)
|
|
63
|
+
|
|
64
|
+
// Relations
|
|
65
|
+
messages AiMessage[]
|
|
66
|
+
|
|
67
|
+
@@index([sessionId], map: "idx_chat_history_session")
|
|
68
|
+
@@index([deletedAt], map: "idx_chat_history_deleted")
|
|
69
|
+
@@map("ai_chat_histories")
|
|
70
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Prisma schema for the dsh-storage database backend — SQLite variant (Prisma 7).
|
|
2
|
+
//
|
|
3
|
+
// Same models as schema.mysql.prisma, without native type attributes
|
|
4
|
+
// (SQLite has no `@db.*` vocabulary here). Client pre-generation and table
|
|
5
|
+
// creation work as described in schema.mysql.prisma's header. Connection URL
|
|
6
|
+
// shape: file:/absolute/path/to/db.sqlite.
|
|
7
|
+
|
|
8
|
+
generator client {
|
|
9
|
+
provider = "prisma-client"
|
|
10
|
+
output = "../src/generated/sqlite"
|
|
11
|
+
importFileExtension = "js"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
datasource db {
|
|
15
|
+
provider = "sqlite"
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/// User and assistant messages; tool results update the assistant row's tool_calls.
|
|
19
|
+
model AiMessage {
|
|
20
|
+
id String @id @default(cuid())
|
|
21
|
+
sessionId String @map("session_id")
|
|
22
|
+
historyId String? @map("history_id")
|
|
23
|
+
type String
|
|
24
|
+
content String
|
|
25
|
+
thoughts Json?
|
|
26
|
+
model String?
|
|
27
|
+
tokens Json?
|
|
28
|
+
toolCalls Json? @map("tool_calls")
|
|
29
|
+
agentId String? @map("agent_id")
|
|
30
|
+
metadata Json?
|
|
31
|
+
device String?
|
|
32
|
+
createdAt DateTime @default(now()) @map("created_at")
|
|
33
|
+
updatedAt DateTime @default(now()) @updatedAt @map("updated_at")
|
|
34
|
+
deletedAt DateTime? @map("deleted_at")
|
|
35
|
+
|
|
36
|
+
// Relations
|
|
37
|
+
history AiChatHistory? @relation(fields: [historyId], references: [id], onDelete: NoAction)
|
|
38
|
+
|
|
39
|
+
@@index([sessionId], map: "idx_session")
|
|
40
|
+
@@index([historyId], map: "idx_history")
|
|
41
|
+
@@index([createdAt], map: "idx_created")
|
|
42
|
+
@@index([deletedAt], map: "idx_deleted")
|
|
43
|
+
@@index([agentId], map: "idx_agent")
|
|
44
|
+
@@index([sessionId, agentId, type, createdAt], map: "idx_session_agent_type_created")
|
|
45
|
+
@@index([sessionId, historyId, deletedAt, type, createdAt, id], map: "idx_tool_call_lookup")
|
|
46
|
+
@@index([sessionId, deletedAt, updatedAt, id], map: "idx_archive_recovery")
|
|
47
|
+
@@map("ai_messages")
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// Per-session rollup, maintained incrementally by the projector.
|
|
51
|
+
model AiChatHistory {
|
|
52
|
+
id String @id @default(cuid())
|
|
53
|
+
sessionId String @map("session_id")
|
|
54
|
+
title String?
|
|
55
|
+
summary String?
|
|
56
|
+
messageCount Int @default(0) @map("message_count")
|
|
57
|
+
totalTokens BigInt @default(0) @map("total_tokens")
|
|
58
|
+
firstMessageAt DateTime? @map("first_message_at")
|
|
59
|
+
lastMessageAt DateTime? @map("last_message_at")
|
|
60
|
+
metadata Json?
|
|
61
|
+
device String?
|
|
62
|
+
deletedAt DateTime? @map("deleted_at")
|
|
63
|
+
|
|
64
|
+
// Relations
|
|
65
|
+
messages AiMessage[]
|
|
66
|
+
|
|
67
|
+
@@index([sessionId], map: "idx_chat_history_session")
|
|
68
|
+
@@index([deletedAt], map: "idx_chat_history_deleted")
|
|
69
|
+
@@map("ai_chat_histories")
|
|
70
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Prisma schema for the dsh-storage database backend — SQL Server variant (Prisma 7).
|
|
2
|
+
//
|
|
3
|
+
// Same models as schema.mysql.prisma, with SQL Server native types. Prisma's
|
|
4
|
+
// sqlserver connector has NO Json type, so every JSON column is a plain text
|
|
5
|
+
// column here — the backend serializes them on write automatically (derived
|
|
6
|
+
// from `provider: sqlserver`; SQL Server's own ISJSON/JSON_VALUE still query
|
|
7
|
+
// the text as JSON).
|
|
8
|
+
//
|
|
9
|
+
// Connection URL shape (parsed by the backend into a node-mssql config):
|
|
10
|
+
// sqlserver://host:1433;database=dbname;user=sa;password=p;encrypt=true;trustServerCertificate=true
|
|
11
|
+
// Client pre-generation and table creation work as described in
|
|
12
|
+
// schema.mysql.prisma's header.
|
|
13
|
+
|
|
14
|
+
generator client {
|
|
15
|
+
provider = "prisma-client"
|
|
16
|
+
output = "../src/generated/sqlserver"
|
|
17
|
+
importFileExtension = "js"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
datasource db {
|
|
21
|
+
provider = "sqlserver"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/// User and assistant messages; tool results update the assistant row's tool_calls.
|
|
25
|
+
model AiMessage {
|
|
26
|
+
id String @id @default(cuid()) @db.Char(36)
|
|
27
|
+
sessionId String @map("session_id") @db.VarChar(100)
|
|
28
|
+
historyId String? @map("history_id") @db.Char(36)
|
|
29
|
+
type String @db.VarChar(50)
|
|
30
|
+
content String @db.NVarChar(Max)
|
|
31
|
+
thoughts String? @db.NVarChar(Max)
|
|
32
|
+
model String? @db.VarChar(100)
|
|
33
|
+
tokens String? @db.NVarChar(Max)
|
|
34
|
+
toolCalls String? @map("tool_calls") @db.NVarChar(Max)
|
|
35
|
+
agentId String? @map("agent_id") @db.VarChar(100)
|
|
36
|
+
metadata String? @db.NVarChar(Max)
|
|
37
|
+
device String? @map("device") @db.VarChar(100)
|
|
38
|
+
createdAt DateTime @default(now()) @map("created_at") @db.DateTime2
|
|
39
|
+
updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @db.DateTime2
|
|
40
|
+
deletedAt DateTime? @map("deleted_at") @db.DateTime2
|
|
41
|
+
|
|
42
|
+
// Relations
|
|
43
|
+
history AiChatHistory? @relation(fields: [historyId], references: [id], onDelete: NoAction)
|
|
44
|
+
|
|
45
|
+
@@index([sessionId], map: "idx_session")
|
|
46
|
+
@@index([historyId], map: "idx_history")
|
|
47
|
+
@@index([createdAt], map: "idx_created")
|
|
48
|
+
@@index([deletedAt], map: "idx_deleted")
|
|
49
|
+
@@index([agentId], map: "idx_agent")
|
|
50
|
+
@@index([sessionId, agentId, type, createdAt], map: "idx_session_agent_type_created")
|
|
51
|
+
@@index([sessionId, historyId, deletedAt, type, createdAt, id], map: "idx_tool_call_lookup")
|
|
52
|
+
@@index([sessionId, deletedAt, updatedAt, id], map: "idx_archive_recovery")
|
|
53
|
+
@@map("ai_messages")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/// Per-session rollup, maintained incrementally by the projector.
|
|
57
|
+
model AiChatHistory {
|
|
58
|
+
id String @id @default(cuid()) @db.Char(36)
|
|
59
|
+
sessionId String @map("session_id") @db.VarChar(100)
|
|
60
|
+
title String? @db.VarChar(255)
|
|
61
|
+
summary String? @db.NVarChar(Max)
|
|
62
|
+
messageCount Int @default(0) @map("message_count")
|
|
63
|
+
totalTokens BigInt @default(0) @map("total_tokens")
|
|
64
|
+
firstMessageAt DateTime? @map("first_message_at") @db.DateTime2
|
|
65
|
+
lastMessageAt DateTime? @map("last_message_at") @db.DateTime2
|
|
66
|
+
metadata String? @db.NVarChar(Max)
|
|
67
|
+
device String? @map("device") @db.VarChar(100)
|
|
68
|
+
deletedAt DateTime? @map("deleted_at") @db.DateTime2
|
|
69
|
+
|
|
70
|
+
// Relations
|
|
71
|
+
messages AiMessage[]
|
|
72
|
+
|
|
73
|
+
@@index([sessionId], map: "idx_chat_history_session")
|
|
74
|
+
@@index([deletedAt], map: "idx_chat_history_deleted")
|
|
75
|
+
@@map("ai_chat_histories")
|
|
76
|
+
}
|