From 6e3387ea88e28247d20419664910bae59ac593b6 Mon Sep 17 00:00:00 2001 From: Nexus Dev Date: Wed, 1 Apr 2026 21:41:03 +0000 Subject: [PATCH] feat(23-00): DB migration and shared types for message_type - Add message_type text column to chat_messages Drizzle schema - Create SQL migration 0049_add_message_type.sql - Update _journal.json with entries for idx 47, 48, 49 - Add messageType field to ChatMessage interface - Add messageType to createMessageSchema (optional) - Add handoffSchema and Handoff type to validators/chat.ts - Re-export handoffSchema and Handoff from shared/src/index.ts --- .../src/migrations/0049_add_message_type.sql | 1 + packages/db/src/migrations/meta/_journal.json | 21 +++++++++++++++++++ packages/db/src/schema/chat_messages.ts | 1 + packages/shared/src/index.ts | 2 ++ packages/shared/src/types/chat.ts | 1 + packages/shared/src/validators/chat.ts | 12 +++++++++++ 6 files changed, 38 insertions(+) create mode 100644 packages/db/src/migrations/0049_add_message_type.sql diff --git a/packages/db/src/migrations/0049_add_message_type.sql b/packages/db/src/migrations/0049_add_message_type.sql new file mode 100644 index 00000000..7b1b33f0 --- /dev/null +++ b/packages/db/src/migrations/0049_add_message_type.sql @@ -0,0 +1 @@ +ALTER TABLE "chat_messages" ADD COLUMN "message_type" text; diff --git a/packages/db/src/migrations/meta/_journal.json b/packages/db/src/migrations/meta/_journal.json index adb00a47..73e14218 100644 --- a/packages/db/src/migrations/meta/_journal.json +++ b/packages/db/src/migrations/meta/_journal.json @@ -330,6 +330,27 @@ "when": 1774960197878, "tag": "0046_smooth_sentinels", "breakpoints": true + }, + { + "idx": 47, + "version": "7", + "when": 1775000000000, + "tag": "0047_nebulous_klaw", + "breakpoints": true + }, + { + "idx": 48, + "version": "7", + "when": 1775000001000, + "tag": "0048_add_chat_messages_updated_at", + "breakpoints": true + }, + { + "idx": 49, + "version": "7", + "when": 1775079588000, + "tag": "0049_add_message_type", + "breakpoints": true } ] } \ No newline at end of file diff --git a/packages/db/src/schema/chat_messages.ts b/packages/db/src/schema/chat_messages.ts index 0768813d..e3c79daa 100644 --- a/packages/db/src/schema/chat_messages.ts +++ b/packages/db/src/schema/chat_messages.ts @@ -10,6 +10,7 @@ export const chatMessages = pgTable( role: text("role").notNull(), content: text("content").notNull(), agentId: uuid("agent_id"), + messageType: text("message_type"), createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(), updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow(), }, diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 618c377d..34b782af 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -561,9 +561,11 @@ export { createConversationSchema, updateConversationSchema, createMessageSchema, + handoffSchema, type CreateConversation, type UpdateConversation, type CreateMessage, + type Handoff, } from "./validators/index.js"; export type { diff --git a/packages/shared/src/types/chat.ts b/packages/shared/src/types/chat.ts index a306773e..bd97469b 100644 --- a/packages/shared/src/types/chat.ts +++ b/packages/shared/src/types/chat.ts @@ -27,6 +27,7 @@ export interface ChatMessage { role: "user" | "assistant" | "system"; content: string; agentId: string | null; + messageType: string | null; createdAt: string; updatedAt: string | null; } diff --git a/packages/shared/src/validators/chat.ts b/packages/shared/src/validators/chat.ts index 7b9c99b3..b7a5a3b0 100644 --- a/packages/shared/src/validators/chat.ts +++ b/packages/shared/src/validators/chat.ts @@ -16,8 +16,20 @@ export const createMessageSchema = z.object({ role: z.enum(["user", "assistant", "system"]), content: z.string().min(1).max(100_000), agentId: z.string().uuid().optional(), + messageType: z.string().optional(), +}); + +export const handoffSchema = z.object({ + spec: z.object({ + what: z.string().min(1), + why: z.string().min(1), + constraints: z.string().optional().default(""), + success: z.string().optional().default(""), + }), + targetRole: z.enum(["pm", "engineer", "general"]), }); export type CreateConversation = z.infer; export type UpdateConversation = z.infer; export type CreateMessage = z.infer; +export type Handoff = z.infer;