feat: complete marketing command center with pipeline, UI, and asset generation
- Dashboard with campaign management, asset gallery, and publishing queue - 7-agent pipeline: trend scout, research, scripts, ad creative, video, copy, distribution - Campaign form with screenshot upload, goal picker, platform selection - Campaign detail view with Details/Pipeline/Assets/Chat tabs - Two-set image generation: Gemini AI (NanoBanana MCP) + Canvas Design posters - Remotion video rendering with phone.png frame and real screenshot alignment - honeyDue branding: blue #0079FF, orange #FF9400, Inter font, warm off-white - Asset cards with source badges (Gemini/Canvas/Remotion/Playwright) - Markdown/JSON render endpoint for viewing pipeline outputs as HTML - Settings page with Tavily, Gemini, Postiz, Nextdoor integration management - Claude Chat for campaign feedback loop with streaming SSE - Postiz publishing modal with scheduling - Auth with NextAuth credentials + JWT sessions - SQLite via Prisma with better-sqlite3 adapter Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
generator client {
|
||||
provider = "prisma-client"
|
||||
output = "../lib/generated/prisma"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "sqlite"
|
||||
}
|
||||
|
||||
model User {
|
||||
id String @id @default(cuid())
|
||||
email String @unique
|
||||
password String
|
||||
name String?
|
||||
createdAt DateTime @default(now())
|
||||
}
|
||||
|
||||
model Campaign {
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
status String @default("draft") // draft, running, review, approved, published
|
||||
prompt String?
|
||||
platforms String // JSON array: ["instagram","tiktok","nextdoor"]
|
||||
config String? // JSON: full campaign config from form
|
||||
outputPath String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
agentRuns AgentRun[]
|
||||
assets Asset[]
|
||||
claudeSessions ClaudeSession[]
|
||||
}
|
||||
|
||||
model AgentRun {
|
||||
id String @id @default(cuid())
|
||||
campaignId String
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
agentName String
|
||||
status String @default("pending") // pending, running, completed, failed
|
||||
startedAt DateTime?
|
||||
completedAt DateTime?
|
||||
durationMs Int?
|
||||
outputSummary String?
|
||||
outputPath String?
|
||||
tokenUsage Int?
|
||||
error String?
|
||||
assets Asset[]
|
||||
createdAt DateTime @default(now())
|
||||
}
|
||||
|
||||
model Asset {
|
||||
id String @id @default(cuid())
|
||||
campaignId String
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
agentRunId String?
|
||||
agentRun AgentRun? @relation(fields: [agentRunId], references: [id])
|
||||
type String // image, video, copy, research, script
|
||||
platform String? // instagram, tiktok, nextdoor, all
|
||||
format String? // png, mp4, json, txt, html, md
|
||||
filePath String
|
||||
fileName String
|
||||
dimensions String? // 1080x1080, 1080x1920, etc.
|
||||
metadata String? // JSON: caption, hashtags, hook text, scene plan
|
||||
status String @default("draft") // draft, approved, rejected, published
|
||||
publishedTo String? // JSON array of platforms published to
|
||||
postizPostId String?
|
||||
postizMediaId String?
|
||||
createdAt DateTime @default(now())
|
||||
}
|
||||
|
||||
model ClaudeSession {
|
||||
id String @id @default(cuid())
|
||||
campaignId String
|
||||
campaign Campaign @relation(fields: [campaignId], references: [id])
|
||||
sessionId String?
|
||||
messages String? // JSON array of conversation history
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model TrendReport {
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
filePath String
|
||||
summary String?
|
||||
createdAt DateTime @default(now())
|
||||
}
|
||||
|
||||
model Setting {
|
||||
key String @id
|
||||
value String
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
Reference in New Issue
Block a user