Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
6948e8a
feat(seed-studio): add AI-powered experience creator with chat-first UI
sevenuphome Apr 10, 2026
eb8d9e1
docs: mark seed-studio plan as completed
sevenuphome Apr 10, 2026
080df31
feat(seed-studio): inject real Strapi video catalog into Claude prompt
sevenuphome Apr 10, 2026
14445b4
fix(seed-studio): join video_variants and video_images for real strea…
sevenuphome Apr 10, 2026
63f6ef8
feat(seed-studio): derive thumbnails from Mux URLs and use video_stil…
sevenuphome Apr 10, 2026
1deec44
fix(seed-studio): ignore stdin for claude CLI to suppress warning
sevenuphome Apr 10, 2026
1458ead
fix(seed-studio): extract keywords for search, remove stale session, …
sevenuphome Apr 10, 2026
76674dc
feat(seed-studio): add HLS video playback on play button click
sevenuphome Apr 10, 2026
4d32bc2
fix(seed-studio): lock video player to aspect-video container size
sevenuphome Apr 10, 2026
8be593f
fix(seed-studio): guard against undefined items in VideoCarouselPreview
sevenuphome Apr 10, 2026
74eff6f
Merge remote-tracking branch 'origin/main' into feat/seed-studio
sevenuphome Apr 21, 2026
d034331
feat(seed-studio): finish watch parity generator
sevenuphome Apr 23, 2026
d09b227
Merge origin/main into feat/seed-studio
sevenuphome Apr 23, 2026
f19b0e6
Merge branch 'main' into feat/seed-studio
up-tandem Apr 23, 2026
8e2b54f
chore: ignore .tmp/ local devcontainer scratch directory
sevenuphome May 5, 2026
fd342a8
feat(admin): admin AI experience drafting + editorial quality
sevenuphome May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,6 @@ todos/*.md
output/
forge.code-workspace
.worktrees

# Local devcontainer scratch (e.g., bind-mounted pgdata)
.tmp/
22 changes: 22 additions & 0 deletions apps/admin/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,25 @@ APPLE_CLIENT_SECRET=
OKTA_CLIENT_ID=
OKTA_CLIENT_SECRET=
OKTA_ISSUER=

# Unit 10+ — AI provider access for server-side drafting / embeddings.
# OpenRouter is preferred; OpenAI is the fallback.
OPENROUTER_API_KEY=
OPENAI_API_KEY=
# Optional when using OpenAI directly.
OPENAI_BASE_URL=https://api.openai.com/v1
# Optional local-only embedding provider for Experience AI video search.
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_EMBEDDING_MODEL=embeddinggemma

# AI drafting and experience embeddings use these provider keys.
OPENROUTER_API_KEY=
OPENAI_API_KEY=
OPENAI_BASE_URL=

# Optional: allow the local codex CLI fallback for Experience AI drafting
# when neither OPENROUTER_API_KEY nor OPENAI_API_KEY is set. Defaults to
# false so production environments fail fast with NOT_CONFIGURED rather
# than spawning a CLI at request time. Set to "true" on developer
# machines without an API key to keep AI drafting available locally.
EXPERIENCE_AI_ALLOW_CODEX_FALLBACK=false
3 changes: 2 additions & 1 deletion apps/admin/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
"db:migrate:dev": "prisma migrate dev",
"db:migrate:deploy": "prisma migrate deploy",
"db:studio": "prisma studio",
"refresh:core-id-mapping": "tsx src/scripts/refresh-core-id-mapping.ts"
"refresh:core-id-mapping": "tsx src/scripts/refresh-core-id-mapping.ts",
"index:local-video-embeddings": "tsx src/scripts/index-local-video-candidate-embeddings.ts"
},
"dependencies": {
"@better-auth/prisma-adapter": "1.6.2",
Expand Down
2 changes: 1 addition & 1 deletion apps/admin/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ model Video {
source SourceTier @default(CORE)
slug String @unique
label VideoLabel?
videoSource VideoSource?
videoSource VideoSource? @map("video_source")
locked Boolean @default(false)
noIndex Boolean @default(false) @map("no_index")
/// True when AI-generated metadata has been applied to this video.
Expand Down
26 changes: 26 additions & 0 deletions apps/admin/src/app/dashboard/experiences/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { RevisionStatus } from "@prisma/client"
import { notFound } from "next/navigation"
import { revalidatePath } from "next/cache"
import { ExperienceEditor } from "@/app/dashboard/experiences/experience-editor"
import { runGenerateDraftAction } from "@/app/dashboard/experiences/generate-draft-action"
import { loadVideoRows } from "@/app/dashboard/live-data"
import { requireSession } from "@/auth/session"
import { prisma } from "@/db/client"
Expand Down Expand Up @@ -484,6 +485,30 @@ export default async function ExperienceEditorPage({
return { ok: true }
}

async function generateDraftAction(input: {
prompt: string
currentTitle: string
currentMetaDescription: string
}) {
"use server"

const user = await requireSession()

return runGenerateDraftAction(
{
prisma,
user,
},
{
localeId: selectedLocale.id,
locale: selectedLocale.locale,
prompt: input.prompt,
currentTitle: input.currentTitle,
currentMetaDescription: input.currentMetaDescription,
},
)
}

return (
<div className="flex min-h-[calc(100vh-3rem)] flex-col">
<ExperienceEditor
Expand Down Expand Up @@ -519,6 +544,7 @@ export default async function ExperienceEditorPage({
publishAction={publishLocaleAction}
createLocaleAction={createLocaleAction}
restoreAction={restoreRevisionAction}
generateDraftAction={generateDraftAction}
/>
</div>
)
Expand Down
Loading
Loading