UNPKG

@growthub/compiler-core

Version:

Core decomposition engine and orchestration logic for Growthub Marketing OS

1 lines 17.3 kB
{"version":3,"sources":["../src/validation.ts"],"sourcesContent":["/**\n * @growthub/compiler-core/validation\n * Pre-init validation patterns and utilities for AT-03 system\n */\n\nimport { z } from 'zod'\nimport type { DecompositionEvent } from './decomposition'\nimport type { OrchestrationRequest } from './orchestration'\nimport type { CSI, MessageMetadata } from './csi'\n\n// Pre-Init Validation Schema\nexport const PreInitValidationSchema = z.object({\n userId: z.string().uuid('Invalid user ID format'),\n threadId: z.string().uuid('Invalid thread ID format'),\n runId: z.string().uuid('Invalid run ID format').optional(),\n prompt: z.string().min(1, 'Prompt cannot be empty').max(2000, 'Prompt too long'),\n brandKitId: z.string().uuid('Invalid brand kit ID'),\n agentType: z.enum(['CONTENT_GENERATION_AGENT', 'TEXT_ANALYSIS_AGENT']),\n creativeCount: z.number().int().min(1).max(10).default(1),\n referenceImages: z.array(z.object({\n url: z.string().url('Invalid reference image URL'),\n type: z.string().min(1),\n description: z.string().min(1)\n })).max(5, 'Too many reference images').default([]),\n executionPriority: z.enum(['low', 'normal', 'high']).default('normal'),\n maxRetries: z.number().int().min(0).max(3).default(1)\n})\n\nexport type PreInitValidation = z.infer<typeof PreInitValidationSchema>\n\n// KV Lock Validation Schema \nexport const KVLockValidationSchema = z.object({\n userId: z.string().uuid(),\n threadId: z.string().uuid(),\n lockKey: z.string().min(1),\n ttl: z.number().int().positive().default(900000), // 15 minutes\n metadata: z.object({\n runId: z.string().uuid(),\n lockAcquired: z.number().int().positive(),\n processId: z.string().optional(),\n expiresAt: z.string().datetime().optional()\n })\n})\n\nexport type KVLockValidation = z.infer<typeof KVLockValidationSchema>\n\n// Authentication Validation Schema\nexport const AuthValidationSchema = z.object({\n userId: z.string().uuid(),\n hasSession: z.boolean(),\n hasToken: z.boolean(),\n isAdmin: z.boolean().default(false),\n tokenLength: z.number().int().positive().optional(),\n sessionCookieFound: z.boolean().default(false),\n jwtValid: z.boolean().default(false)\n})\n\nexport type AuthValidation = z.infer<typeof AuthValidationSchema>\n\n// Validation Result Types\nexport interface ValidationResult<T = any> {\n success: boolean\n data?: T\n errors?: ValidationError[]\n warnings?: string[]\n metadata?: {\n validatedAt: string\n validationDuration: number\n validator: string\n }\n}\n\nexport interface ValidationError {\n field: string\n message: string\n code: string\n severity: 'error' | 'warning' | 'info'\n context?: Record<string, any>\n}\n\n/**\n * Validate pre-init request data\n */\nexport function validatePreInit(data: unknown): ValidationResult<PreInitValidation> {\n const startTime = performance.now()\n \n try {\n const validatedData = PreInitValidationSchema.parse(data)\n const duration = performance.now() - startTime\n \n return {\n success: true,\n data: validatedData,\n metadata: {\n validatedAt: new Date().toISOString(),\n validationDuration: Math.round(duration),\n validator: 'PreInitValidationSchema'\n }\n }\n } catch (error) {\n const duration = performance.now() - startTime\n \n if (error instanceof z.ZodError) {\n return {\n success: false,\n errors: error.errors.map(err => ({\n field: err.path.join('.'),\n message: err.message,\n code: err.code,\n severity: 'error' as const\n })),\n metadata: {\n validatedAt: new Date().toISOString(),\n validationDuration: Math.round(duration),\n validator: 'PreInitValidationSchema'\n }\n }\n }\n \n return {\n success: false,\n errors: [{\n field: 'unknown',\n message: 'Unknown validation error',\n code: 'UNKNOWN_ERROR',\n severity: 'error'\n }]\n }\n }\n}\n\n/**\n * Validate KV lock metadata\n */\nexport function validateKVLock(data: unknown): ValidationResult<KVLockValidation> {\n const startTime = performance.now()\n \n try {\n const validatedData = KVLockValidationSchema.parse(data)\n const duration = performance.now() - startTime\n \n return {\n success: true,\n data: validatedData,\n metadata: {\n validatedAt: new Date().toISOString(),\n validationDuration: Math.round(duration),\n validator: 'KVLockValidationSchema'\n }\n }\n } catch (error) {\n const duration = performance.now() - startTime\n \n if (error instanceof z.ZodError) {\n return {\n success: false,\n errors: error.errors.map(err => ({\n field: err.path.join('.'),\n message: err.message,\n code: err.code,\n severity: 'error' as const\n })),\n metadata: {\n validatedAt: new Date().toISOString(),\n validationDuration: Math.round(duration),\n validator: 'KVLockValidationSchema'\n }\n }\n }\n \n return {\n success: false,\n errors: [{\n field: 'unknown',\n message: 'KV lock validation failed',\n code: 'KV_VALIDATION_ERROR',\n severity: 'error'\n }]\n }\n }\n}\n\n/**\n * Validate authentication state\n */\nexport function validateAuth(data: unknown): ValidationResult<AuthValidation> {\n const startTime = performance.now()\n \n try {\n const validatedData = AuthValidationSchema.parse(data)\n const duration = performance.now() - startTime\n \n const warnings: string[] = []\n \n // Add warnings for suspicious auth states\n if (!validatedData.hasSession && !validatedData.hasToken) {\n warnings.push('No session or token found - authentication may be invalid')\n }\n \n if (validatedData.hasToken && !validatedData.jwtValid) {\n warnings.push('Token present but JWT validation failed')\n }\n \n return {\n success: true,\n data: validatedData,\n warnings: warnings.length > 0 ? warnings : undefined,\n metadata: {\n validatedAt: new Date().toISOString(),\n validationDuration: Math.round(duration),\n validator: 'AuthValidationSchema'\n }\n }\n } catch (error) {\n const duration = performance.now() - startTime\n \n if (error instanceof z.ZodError) {\n return {\n success: false,\n errors: error.errors.map(err => ({\n field: err.path.join('.'),\n message: err.message,\n code: err.code,\n severity: 'error' as const\n })),\n metadata: {\n validatedAt: new Date().toISOString(),\n validationDuration: Math.round(duration),\n validator: 'AuthValidationSchema'\n }\n }\n }\n \n return {\n success: false,\n errors: [{\n field: 'auth',\n message: 'Authentication validation failed',\n code: 'AUTH_VALIDATION_ERROR',\n severity: 'error'\n }]\n }\n }\n}\n\n/**\n * Validate thread ID format\n */\nexport function validateThreadId(threadId: string): boolean {\n return z.string().uuid().safeParse(threadId).success\n}\n\n/**\n * Validate user ID format\n */\nexport function validateUserId(userId: string): boolean {\n return z.string().uuid().safeParse(userId).success\n}\n\n/**\n * Validate prompt content\n */\nexport function validatePrompt(prompt: string): ValidationResult<string> {\n try {\n const validatedPrompt = z.string()\n .min(1, 'Prompt cannot be empty')\n .max(2000, 'Prompt exceeds maximum length')\n .parse(prompt)\n \n return {\n success: true,\n data: validatedPrompt\n }\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n success: false,\n errors: error.errors.map(err => ({\n field: 'prompt',\n message: err.message,\n code: err.code,\n severity: 'error' as const\n }))\n }\n }\n \n return {\n success: false,\n errors: [{\n field: 'prompt',\n message: 'Invalid prompt format',\n code: 'PROMPT_VALIDATION_ERROR',\n severity: 'error'\n }]\n }\n }\n}\n\n/**\n * Validate reference images\n */\nexport function validateReferenceImages(images: unknown[]): ValidationResult<Array<{ url: string; type: string; description: string }>> {\n try {\n const schema = z.array(z.object({\n url: z.string().url('Invalid image URL'),\n type: z.string().min(1, 'Image type required'),\n description: z.string().min(1, 'Image description required')\n })).max(5, 'Maximum 5 reference images allowed')\n \n const validatedImages = schema.parse(images)\n \n return {\n success: true,\n data: validatedImages\n }\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n success: false,\n errors: error.errors.map(err => ({\n field: `referenceImages.${err.path.join('.')}`,\n message: err.message,\n code: err.code,\n severity: 'error' as const\n }))\n }\n }\n \n return {\n success: false,\n errors: [{\n field: 'referenceImages',\n message: 'Reference images validation failed',\n code: 'IMAGES_VALIDATION_ERROR',\n severity: 'error'\n }]\n }\n }\n}\n\n/**\n * Create validation error\n */\nexport function createValidationError(\n field: string,\n message: string,\n code: string,\n severity: ValidationError['severity'] = 'error',\n context?: Record<string, any>\n): ValidationError {\n return {\n field,\n message,\n code,\n severity,\n context\n }\n}\n\n/**\n * Combine multiple validation results\n */\nexport function combineValidationResults<T>(\n ...results: ValidationResult<T>[]\n): ValidationResult<T[]> {\n const allErrors: ValidationError[] = []\n const allWarnings: string[] = []\n const allData: T[] = []\n \n let allSuccessful = true\n \n for (const result of results) {\n if (!result.success) {\n allSuccessful = false\n if (result.errors) {\n allErrors.push(...result.errors)\n }\n } else if (result.data !== undefined) {\n allData.push(result.data)\n }\n \n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n \n return {\n success: allSuccessful,\n data: allSuccessful ? allData : undefined,\n errors: allErrors.length > 0 ? allErrors : undefined,\n warnings: allWarnings.length > 0 ? allWarnings : undefined,\n metadata: {\n validatedAt: new Date().toISOString(),\n validationDuration: 0,\n validator: 'combined'\n }\n }\n} "],"mappings":"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","names":[]}