import React, { useEffect, useMemo, useRef, useState } from "react"; import { AlertTriangle, Archive, AudioLines, Bell, Bot, BookOpen, Building2, CheckCircle2, Clapperboard, Coins, Copy, ChevronRight, Download, FileJson2, Film, FolderKanban, Gauge, HardDrive, Images, KeyRound, Layers3, Link2, ListChecks, ListPlus, LogOut, Mail, Menu, Mic2, Network, Palette, Plus, Play, RadioTower, RefreshCw, Save, Scale, Search, Settings2, ShieldCheck, Sparkles, TimerReset, UserPlus, Users, Volume2, Wand2, XCircle } from "lucide-react"; import { adapters, marketBenchmarks, workflowTemplates } from "./data/sampleProject"; import { createProjectShell, emptyProject } from "./data/projectShell"; import { ScenePreview } from "./components/ScenePreview"; import { AdminAuditPage, AdminModelsPage, AdminOverviewPage, AdminPolicyCenterPage, AdminStyleKitsPage, AdminQueuePage, AdminUsagePage, AccountSecurityPage, CreatorHomePage, IdentityCenterPage, LoginPage, NotificationBell, NotificationCenterPage, TaskCenterPage, RegisterPage, SystemSettingsPage, SystemUsersPage } from "./components/EnterprisePages"; import { DeliveryPortalPage } from "./components/DeliveryPortalPage"; import { AssetLibraryPage, BatchProductionPage, ProjectAssistantPage, VoiceStudioPage } from "./components/CreatorSuitePages"; import { KnowledgeLibraryPage } from "./components/KnowledgeLibraryPage"; import { CastingBoardPage, DeliveryAccessPage, DeliveryOpsPage, DirectorProductionPage, GenerationQueuePage, ProjectFactoryPage, QaReviewPage, ScriptProductionPage, SeriesBiblePage } from "./components/ProductionPages"; import { addProjectMember, changeProjectLifecycle, completeMfaEnrollment, createJob, createOrganization, createProject, createWorkspace, fetchAuthSession, fetchPlatformContext, fetchProject, getAuthSession, getClientContext, inviteMember, login, loginWithMfa, logout, redeemSsoTicket, resendOrganizationInvitation, revokeOrganizationInvitation, searchPlatform, startMfaEnrollment, updateOrganization, updateOrganizationMember, updateOrganizationRolePolicy, updateProject, updateProjectMember, updateWorkspace, updateWorkspaceMember } from "./lib/api"; import { buildAllExports, buildModelRequest, downloadJson } from "./lib/exporters"; import { projectQa } from "./lib/qa"; import { getPlatformSummary, platformData } from "./platform/platformData"; const tabs = [ { id: "overview", label: "生产总控", icon: RadioTower }, { id: "factory", label: "项目工厂", icon: Layers3 }, { id: "script", label: "剧本拆解", icon: BookOpen }, { id: "casting", label: "资产选角", icon: ShieldCheck }, { id: "director", label: "导演工作台", icon: Clapperboard }, { id: "jobs", label: "生成队列", icon: Wand2 }, { id: "modelops", label: "模型中台", icon: Network }, { id: "qa", label: "审片中心", icon: ListChecks }, { id: "compliance", label: "成本合规", icon: Scale }, { id: "export", label: "交付运营", icon: Download }, { id: "admin", label: "平台管理", icon: KeyRound } ]; const navigationGroups = [ { label: "创作套件", items: [ { id: "creator-home", label: "我的工作台", icon: RadioTower }, { id: "tasks", label: "协作任务", icon: ListChecks, requiredPermission: "task:view" }, { id: "assistant", label: "项目 AI 助手", icon: Bot }, { id: "knowledge", label: "内容知识库", icon: FileJson2, requiredPermission: "script:read" }, { id: "asset-library", label: "资产库", icon: Images, requiredAnyPermissions: ["asset:edit", "voice:edit", "compliance:manage"] }, { id: "voice-studio", label: "声音与字幕", icon: AudioLines, requiredPermission: "voice:edit" }, { id: "batch-production", label: "批量生产", icon: ListPlus, requiredPermission: "job:create" } ] }, { label: "账户", items: [ { id: "account", label: "账号与安全", icon: KeyRound }, { id: "notifications", label: "通知中心", icon: Bell } ] }, { label: "生产流水线", items: [ { id: "overview", label: "生产总控", icon: RadioTower, requiredPermission: "usage:view" }, { id: "factory", label: "项目工厂", icon: Layers3, requiredPermission: "project:create" }, { id: "script", label: "剧本拆解", icon: BookOpen, requiredPermission: "script:edit" }, { id: "casting", label: "资产与选角", icon: ShieldCheck, requiredAnyPermissions: ["asset:edit", "compliance:manage"] }, { id: "director", label: "导演工作台", icon: Clapperboard, requiredPermission: "job:create" }, { id: "jobs", label: "生成任务", icon: Wand2, requiredPermission: "job:create" }, { id: "bible", label: "系列 Bible", icon: BookOpen, requiredPermission: "script:edit" }, { id: "locks", label: "连续性锁", icon: ShieldCheck, requiredAnyPermissions: ["asset:edit", "compliance:manage"] }, { id: "shots", label: "镜头清单", icon: Clapperboard, requiredPermission: "job:create" }, { id: "modelops", label: "模型中台", icon: Network, requiredAnyPermissions: ["model:manage", "model:approve"] }, { id: "qa", label: "审片中心", icon: ListChecks, requiredPermission: "qa:review" }, { id: "compliance", label: "成本合规", icon: Scale, requiredPermission: "usage:view" }, { id: "export", label: "交付运营", icon: Download, requiredPermission: "delivery:view" }, { id: "delivery-portal", label: "客户交付门户", icon: Link2, requiredPermission: "delivery:view" } ] }, { label: "管理员后台", items: [ { id: "admin-overview", label: "管理概览", icon: Gauge, requiredPermission: "usage:view" }, { id: "admin-organizations", label: "组织与工作区", icon: Building2, requiredPermission: "organization:manage" }, { id: "admin-members", label: "用户与权限", icon: Users, requiredPermission: "organization:members:invite" }, { id: "admin-policies", label: "组织策略", icon: ShieldCheck, requiredAnyPermissions: ["policy:read", "policy:manage", "organization:manage"] }, { id: "admin-style-kits", label: "风格标准", icon: Palette, requiredAnyPermissions: ["style:read", "style:manage"] }, { id: "admin-models", label: "模型与 Runner", icon: Network, requiredAnyPermissions: ["model:manage", "model:approve"] }, { id: "admin-queue", label: "队列与任务", icon: Wand2, requiredPermission: "queue:manage" }, { id: "admin-usage", label: "用量与成本", icon: Coins, requiredPermission: "usage:view" }, { id: "admin-audit", label: "审计与合规", icon: ListChecks, requiredPermission: "audit:view" } ] }, { label: "系统设置", items: [ { id: "system-overview", label: "系统总览", icon: Settings2, requiredPermission: "system:settings:view" }, { id: "system-identity", label: "企业身份", icon: KeyRound, requiredPermission: "system:settings:view" }, { id: "system-users", label: "全局用户目录", icon: Users, requiredPermission: "system:settings:view" }, { id: "system-generation", label: "生成策略", icon: ShieldCheck, requiredPermission: "system:settings:view" }, { id: "system-storage", label: "存储与队列", icon: HardDrive, requiredPermission: "system:settings:view" }, { id: "system-notifications", label: "通知与 API", icon: Mail, requiredPermission: "system:settings:view" }, { id: "system-features", label: "功能开关", icon: Sparkles, requiredPermission: "feature_flag:manage" } ] } ]; const navigationTabIds = new Set(navigationGroups.flatMap((group) => group.items.map((item) => item.id))); function tabFromLocation() { if (typeof window === "undefined") return "creator-home"; const candidate = window.location.hash.replace(/^#/, ""); return navigationTabIds.has(candidate) ? candidate : "creator-home"; } function inviteTokenFromLocation() { if (typeof window === "undefined") return ""; return new URLSearchParams(window.location.search).get("invite") || ""; } function portalTokenFromLocation() { if (typeof window === "undefined") return ""; const match = window.location.pathname.match(/^\/portal\/([^/]+)\/?$/); return match ? decodeURIComponent(match[1]) : ""; } function ssoTicketFromLocation() { if (typeof window === "undefined") return ""; return new URLSearchParams(window.location.search).get("sso_ticket") || ""; } function ssoErrorFromLocation() { if (typeof window === "undefined") return ""; const params = new URLSearchParams(window.location.search); const code = params.get("sso_error"); if (!code) return ""; return params.get("sso_error_description") || `企业 SSO 登录失败:${code}`; } function normalizeAdapter(adapter) { return { ...adapter, kind: adapter.kind || adapter.protocol || "http-json", baseUrl: adapter.baseUrl || adapter.endpoint || "", enabled: adapter.enabled ?? (adapter.status === "ready"), status: adapter.status || (adapter.enabled ? "ready" : "planned"), costMode: adapter.costMode || adapter.cost_mode || "local", approvalRequired: adapter.approvalRequired ?? Boolean(adapter.approval_required), capability: adapter.capability || adapter.capabilities || [] }; } function adapterCatalogForContext(platformContext) { const registry = platformContext?.platform?.adapterCatalog || platformContext?.platform?.modelRegistry; if (Array.isArray(registry) && registry.length) return registry.map(normalizeAdapter); return adapters.map(normalizeAdapter); } function preferredAdapterId(catalog, requestedId) { if (requestedId && catalog.some((adapter) => adapter.id === requestedId)) return requestedId; const imageAdapter = catalog.find((adapter) => (adapter.capability || []).some((item) => /image-to-video|i2v|video/i.test(item))); return imageAdapter?.id || catalog.find((adapter) => adapter.status === "ready")?.id || catalog[0]?.id || "owned-model-platform"; } function StatusPill({ tone = "neutral", children }) { return {children}; } function SectionTitle({ icon: Icon, title, action }) { return (

{title}

{action}
); } function Metric({ label, value, icon: Icon }) { return (
{label} {value}
); } function ProgressBar({ value, tone = "ok" }) { return (
); } function Cockpit({ project, qaResults, setActiveTab, setActiveShotId, platformContext, canCreateJob, canApproveDelivery }) { const platform = platformContext?.platform || platformData; const platformSummary = platformContext?.summary || getPlatformSummary(); const organization = platform.organization || platformData.workspace; const plan = platform.billing || platform.plan; const totalDuration = project.shots.reduce((sum, shot) => sum + shot.durationSec, 0); const blockedItems = project.pipeline.filter((item) => item.status === "blocked").length; return (

LOCAL AI DRAMA OPS

{project.series.title} · {project.episode.title}

{organization.name || "私有化内容组织"}:把剧本、资产、模型、队列、审片、成本、合规和交付纳入同一个私有生产系统。

{canCreateJob && } {canApproveDelivery && }
商用准备度 {project.production.commercialReadiness}%

{plan ? `${plan.plan_name || plan.name} · ${plan.seat_limit || plan.seats} seats · ${plan.storage_gb || plan.storageGb}GB storage · 外部云连接需显式审批。` : "当前角色无计费数据查看权限。"}

生产流水线

{blockedItems ? `${blockedItems} 个阻塞` : "运行中"}
{project.pipeline.map((item) => { const target = item.id === "script" ? "script" : item.id === "assets" ? "casting" : item.id === "qa" ? "qa" : item.id === "edit" ? "export" : "jobs"; return ( );})}

镜头生产状态

{project.shots.length} shots / {totalDuration}s
{project.shots.map((shot) => { const qa = qaResults.find((item) => item.shotId === shot.id); return ( ); })}

生成队列

local-only
任务 镜头 适配器 成本策略 状态
{project.productionJobs.map((job) => ( ))}

QA 证据

需要真实产物回填
{project.qaEvidence.map((item) => (
{item.result === "pass" ? : }
{item.label}

{item.evidence}

))}

交付物

{project.deliverables.filter((item) => item.status === "ready").length}/{project.deliverables.length}
{project.deliverables.map((item) => (
{item.name} {item.path} {item.status}
))}

市面商业平台对标

已转成本地版工作流
{(platform.researchMatrix || platformSummary.researchMatrix || []).map((item) => (
{item.category} {item.commercialNeed}

{item.localBuild}

))}
); } function ProjectFactory({ setActiveTab, platformContext }) { const platform = platformContext?.platform || platformData; const projects = platform.projects || platformData.projects; return (

商业项目入口

{["原创 AI 漫剧", "小说解说漫", "动态漫拆层", "仿真人短剧审慎模式", "平台 Agent 流水线"].map((name) => ( ))}

项目资产空间

{platformData.assetStorage.buckets.map((bucket) => (
{bucket.label} {bucket.fileCount} files {bucket.policy}
))}

项目列表

项目类型阶段准备度风险更新
{projects.map((project) => ( ))}
); } function ScriptStudio({ project, canEditAssets }) { return (

长文本导入

{project.scriptStudio.sourceType} · {project.scriptStudio.importLimit}