125 lines
4.1 KiB
TypeScript
125 lines
4.1 KiB
TypeScript
import { sqliteTable, text, integer, index, primaryKey } from "drizzle-orm/sqlite-core"
|
|
import { ProjectTable } from "../project/project.sql"
|
|
import type { MessageV2 } from "./message-v2"
|
|
import type { SessionEntry } from "../v2/session-entry"
|
|
import type { Snapshot } from "../snapshot"
|
|
import type { Permission } from "../permission"
|
|
import type { ProjectID } from "../project/schema"
|
|
import type { SessionID, MessageID, PartID } from "./schema"
|
|
import type { WorkspaceID } from "../control-plane/schema"
|
|
import { Timestamps } from "../storage/schema.sql"
|
|
|
|
type PartData = Omit<MessageV2.Part, "id" | "sessionID" | "messageID">
|
|
type InfoData = Omit<MessageV2.Info, "id" | "sessionID">
|
|
|
|
export const SessionTable = sqliteTable(
|
|
"session",
|
|
{
|
|
id: text().$type<SessionID>().primaryKey(),
|
|
project_id: text()
|
|
.$type<ProjectID>()
|
|
.notNull()
|
|
.references(() => ProjectTable.id, { onDelete: "cascade" }),
|
|
workspace_id: text().$type<WorkspaceID>(),
|
|
parent_id: text().$type<SessionID>(),
|
|
slug: text().notNull(),
|
|
directory: text().notNull(),
|
|
path: text(),
|
|
title: text().notNull(),
|
|
version: text().notNull(),
|
|
share_url: text(),
|
|
summary_additions: integer(),
|
|
summary_deletions: integer(),
|
|
summary_files: integer(),
|
|
summary_diffs: text({ mode: "json" }).$type<Snapshot.FileDiff[]>(),
|
|
revert: text({ mode: "json" }).$type<{ messageID: MessageID; partID?: PartID; snapshot?: string; diff?: string }>(),
|
|
permission: text({ mode: "json" }).$type<Permission.Ruleset>(),
|
|
...Timestamps,
|
|
time_compacting: integer(),
|
|
time_archived: integer(),
|
|
},
|
|
(table) => [
|
|
index("session_project_idx").on(table.project_id),
|
|
index("session_workspace_idx").on(table.workspace_id),
|
|
index("session_parent_idx").on(table.parent_id),
|
|
],
|
|
)
|
|
|
|
export const MessageTable = sqliteTable(
|
|
"message",
|
|
{
|
|
id: text().$type<MessageID>().primaryKey(),
|
|
session_id: text()
|
|
.$type<SessionID>()
|
|
.notNull()
|
|
.references(() => SessionTable.id, { onDelete: "cascade" }),
|
|
...Timestamps,
|
|
data: text({ mode: "json" }).notNull().$type<InfoData>(),
|
|
},
|
|
(table) => [index("message_session_time_created_id_idx").on(table.session_id, table.time_created, table.id)],
|
|
)
|
|
|
|
export const PartTable = sqliteTable(
|
|
"part",
|
|
{
|
|
id: text().$type<PartID>().primaryKey(),
|
|
message_id: text()
|
|
.$type<MessageID>()
|
|
.notNull()
|
|
.references(() => MessageTable.id, { onDelete: "cascade" }),
|
|
session_id: text().$type<SessionID>().notNull(),
|
|
...Timestamps,
|
|
data: text({ mode: "json" }).notNull().$type<PartData>(),
|
|
},
|
|
(table) => [
|
|
index("part_message_id_id_idx").on(table.message_id, table.id),
|
|
index("part_session_idx").on(table.session_id),
|
|
],
|
|
)
|
|
|
|
export const TodoTable = sqliteTable(
|
|
"todo",
|
|
{
|
|
session_id: text()
|
|
.$type<SessionID>()
|
|
.notNull()
|
|
.references(() => SessionTable.id, { onDelete: "cascade" }),
|
|
content: text().notNull(),
|
|
status: text().notNull(),
|
|
priority: text().notNull(),
|
|
position: integer().notNull(),
|
|
...Timestamps,
|
|
},
|
|
(table) => [
|
|
primaryKey({ columns: [table.session_id, table.position] }),
|
|
index("todo_session_idx").on(table.session_id),
|
|
],
|
|
)
|
|
|
|
export const SessionEntryTable = sqliteTable(
|
|
"session_entry",
|
|
{
|
|
id: text().$type<SessionEntry.ID>().primaryKey(),
|
|
session_id: text()
|
|
.$type<SessionID>()
|
|
.notNull()
|
|
.references(() => SessionTable.id, { onDelete: "cascade" }),
|
|
type: text().$type<SessionEntry.Type>().notNull(),
|
|
...Timestamps,
|
|
data: text({ mode: "json" }).notNull().$type<Omit<SessionEntry.Entry, "type" | "id">>(),
|
|
},
|
|
(table) => [
|
|
index("session_entry_session_idx").on(table.session_id),
|
|
index("session_entry_session_type_idx").on(table.session_id, table.type),
|
|
index("session_entry_time_created_idx").on(table.time_created),
|
|
],
|
|
)
|
|
|
|
export const PermissionTable = sqliteTable("permission", {
|
|
project_id: text()
|
|
.primaryKey()
|
|
.references(() => ProjectTable.id, { onDelete: "cascade" }),
|
|
...Timestamps,
|
|
data: text({ mode: "json" }).notNull().$type<Permission.Ruleset>(),
|
|
})
|