refactor: normalize script_builder_messages into separate table

Extract JSONB messages array from script_builder_sessions into a proper
script_builder_messages table with individual columns for role, content,
script, tokens, etc. Migration handles data migration from JSONB to rows.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Michael Chihlas
2026-03-21 21:06:58 -04:00
parent 0b261ee21a
commit b801f6cac5
9 changed files with 290 additions and 61 deletions

View File

@@ -66,7 +66,7 @@ export default function ScriptBuilderPage() {
const userMessage: ScriptBuilderMessage = {
role: 'user',
content,
timestamp: new Date().toISOString(),
created_at: new Date().toISOString(),
}
setMessages((prev) => [...prev, userMessage])
setIsLoading(true)
@@ -88,7 +88,7 @@ export default function ScriptBuilderPage() {
script: response.script,
script_filename: response.script_filename,
line_count: response.line_count,
timestamp: response.timestamp,
created_at: response.timestamp,
}
setMessages((prev) => [...prev, assistantMessage])
} catch (err) {
@@ -96,7 +96,7 @@ export default function ScriptBuilderPage() {
const errorMessage: ScriptBuilderMessage = {
role: 'assistant',
content: `An error occurred: ${err instanceof Error ? err.message : 'Failed to generate response. Please try again.'}`,
timestamp: new Date().toISOString(),
created_at: new Date().toISOString(),
}
setMessages((prev) => [...prev, errorMessage])
} finally {

View File

@@ -56,11 +56,11 @@ export interface ScriptBuilderContent {
script_language?: string
}
export function isScriptGenerationAction(content: Record<string, unknown>): content is ScriptGenerationContent {
export function isScriptGenerationAction(content: Record<string, unknown>): content is Record<string, unknown> & ScriptGenerationContent {
return content.action_type === 'script_generation'
}
export function isScriptBuilderAction(content: Record<string, unknown>): content is ScriptBuilderContent {
export function isScriptBuilderAction(content: Record<string, unknown>): content is Record<string, unknown> & ScriptBuilderContent {
return content.action_type === 'open_script_builder'
}

View File

@@ -22,12 +22,15 @@ export interface ScriptBuilderSessionDetail {
}
export interface ScriptBuilderMessage {
id?: string
role: 'user' | 'assistant'
content: string
script?: string | null
script_filename?: string | null
line_count?: number | null
timestamp: string
input_tokens?: number | null
output_tokens?: number | null
created_at: string
}
export interface ScriptBuilderMessageResponse {