UNPKG

@growthub/compiler-core

Version:

Core decomposition engine and orchestration logic for Growthub Marketing OS

1 lines 12.3 kB
{"version":3,"sources":["../src/csi.ts"],"sourcesContent":["/**\n * @growthub/compiler-core/csi\n * Current Step Information (CSI) tracking and coordination utilities\n */\n\nimport { z } from 'zod'\n\n// CSI Schema for validation\nexport const CSISchema = z.object({\n completedSteps: z.array(z.string()).default([]),\n currentProgress: z.number().min(0).max(100).default(0),\n totalSteps: z.number().int().positive().default(4),\n currentStep: z.string().default('pending'),\n metadata: z.record(z.any()).optional()\n})\n\nexport type CSI = z.infer<typeof CSISchema>\n\n// Thread Execution Status Types\nexport type ThreadExecutionStatus = 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED' | 'CANCELLED'\n\n// Message Metadata Schema for CSI tracking\nexport const MessageMetadataSchema = z.object({\n type: z.enum(['agent_step', 'system_message', 'user_message', 'completion']).default('agent_step'),\n step: z.string().optional(),\n status: z.enum(['pending', 'running', 'completed', 'failed', 'cancelled']).default('pending'),\n progress: z.number().min(0).max(100).default(0),\n agentType: z.string().optional(),\n toolName: z.string().optional(),\n timestamp: z.string().datetime().default(() => new Date().toISOString()),\n stepNumber: z.number().int().positive().optional(),\n totalSteps: z.number().int().positive().optional(),\n brandContext: z.string().optional(),\n referenceImages: z.number().int().min(0).optional(),\n generatedAssets: z.array(z.object({\n url: z.string(),\n type: z.string(),\n concept: z.string().optional()\n })).default([]),\n executionStats: z.object({\n apiCalls: z.number().int().min(0).optional(),\n storageBytes: z.number().int().min(0).optional(),\n executionTimeMs: z.number().int().min(0).optional()\n }).optional(),\n statusVersion: z.number().int().optional(),\n kvLockReleased: z.boolean().optional(),\n emissionTimestamp: z.string().datetime().optional()\n})\n\nexport type MessageMetadata = z.infer<typeof MessageMetadataSchema>\n\n/**\n * Create CSI with default values\n */\nexport function createCSI(\n currentStep: string = 'pending',\n totalSteps: number = 4,\n metadata?: Record<string, any>\n): CSI {\n return {\n completedSteps: [],\n currentProgress: 0,\n totalSteps,\n currentStep,\n metadata: {\n createdAt: new Date().toISOString(),\n ...metadata\n }\n }\n}\n\n/**\n * Update CSI with new step completion\n */\nexport function updateCSI(\n csi: CSI,\n completedStep: string,\n newCurrentStep: string,\n metadata?: Record<string, any>\n): CSI {\n const completedSteps = [...csi.completedSteps, completedStep]\n const progress = Math.round((completedSteps.length / csi.totalSteps) * 100)\n \n return {\n ...csi,\n completedSteps,\n currentProgress: progress,\n currentStep: newCurrentStep,\n metadata: {\n ...csi.metadata,\n ...metadata,\n updatedAt: new Date().toISOString()\n }\n }\n}\n\n/**\n * Check if CSI represents completed state\n */\nexport function isCSIComplete(csi: CSI): boolean {\n return csi.currentProgress >= 100 || \n csi.completedSteps.length >= csi.totalSteps ||\n csi.currentStep === 'completed'\n}\n\n/**\n * Extract thread execution status from message metadata\n */\nexport function extractStatusFromMetadata(metadata: MessageMetadata | null): ThreadExecutionStatus {\n if (!metadata) return 'PENDING'\n\n // Enhanced completion detection for both final_completion and enhanced_completion\n if (metadata.status === 'completed' && (\n metadata.step === 'final_completion' ||\n metadata.step === 'enhanced_completion'\n )) {\n return 'COMPLETED'\n }\n \n if (metadata.status === 'failed' || metadata.status === 'cancelled') {\n return metadata.status.toUpperCase() as ThreadExecutionStatus\n }\n \n if (metadata.status === 'running') return 'RUNNING'\n \n return 'PENDING'\n}\n\n/**\n * Create step metadata for agent tasks\n */\nexport function createStepMetadata(\n stepName: string,\n agentType: string,\n stepNumber: number,\n totalSteps: number,\n toolName: string,\n additionalMetadata: Partial<MessageMetadata> = {}\n): MessageMetadata {\n return {\n type: 'agent_step',\n step: stepName,\n status: 'pending',\n progress: Math.round((stepNumber / totalSteps) * 100),\n agentType,\n toolName,\n timestamp: new Date().toISOString(),\n stepNumber,\n totalSteps,\n generatedAssets: [],\n ...additionalMetadata\n }\n}\n\n/**\n * Analyze thread state from real-time messages\n */\nexport interface ThreadAnalysis {\n hasRunningSteps: boolean\n hasFinalCompletion: boolean\n shouldSwitchToHistorical: boolean\n shouldEnableRealtime: boolean\n executionStatus: ThreadExecutionStatus\n currentProgress: number\n completedSteps: number\n totalSteps: number\n}\n\nexport function analyzeThreadState(threadMessages: Array<{ \n step?: string\n status?: string\n progress?: number\n stepNumber?: number\n totalSteps?: number\n}>): ThreadAnalysis {\n // Check for running steps\n const hasRunningSteps = threadMessages.some(msg => \n msg.status === 'running' || msg.status === 'pending'\n )\n\n // Enhanced completion detection\n const hasFinalCompletion = threadMessages.some(msg =>\n (msg.step === 'final_completion' || msg.step === 'enhanced_completion') &&\n msg.status === 'completed'\n )\n\n // Calculate progress\n const progressValues = threadMessages\n .map(msg => msg.progress || 0)\n .filter(progress => progress > 0)\n \n const currentProgress = progressValues.length > 0 \n ? Math.max(...progressValues)\n : 0\n\n // Count completed steps\n const completedSteps = threadMessages.filter(msg => \n msg.status === 'completed'\n ).length\n\n // Get total steps\n const totalStepsValues = threadMessages\n .map(msg => msg.totalSteps)\n .filter(Boolean) as number[]\n \n const totalSteps = totalStepsValues.length > 0\n ? Math.max(...totalStepsValues)\n : 4\n\n // Determine execution status\n let executionStatus: ThreadExecutionStatus = 'PENDING'\n if (hasFinalCompletion) {\n executionStatus = 'COMPLETED'\n } else if (hasRunningSteps) {\n executionStatus = 'RUNNING'\n }\n\n return {\n hasRunningSteps,\n hasFinalCompletion,\n shouldSwitchToHistorical: hasFinalCompletion,\n shouldEnableRealtime: !hasFinalCompletion,\n executionStatus,\n currentProgress,\n completedSteps,\n totalSteps\n }\n}\n\n/**\n * Create message metadata with status versioning\n */\nexport function createVersionedMetadata(\n step: string,\n status: MessageMetadata['status'],\n progress: number,\n additionalData: Partial<MessageMetadata> = {}\n): MessageMetadata {\n return {\n type: 'agent_step',\n step,\n status,\n progress,\n timestamp: new Date().toISOString(),\n statusVersion: Date.now(),\n emissionTimestamp: new Date().toISOString(),\n generatedAssets: [],\n ...additionalData\n }\n}\n\n/**\n * Validate CSI data\n */\nexport function validateCSI(data: unknown): CSI {\n return CSISchema.parse(data)\n}\n\n/**\n * Validate message metadata\n */\nexport function validateMessageMetadata(data: unknown): MessageMetadata {\n return MessageMetadataSchema.parse(data)\n}\n\n/**\n * Merge CSI metadata safely\n */\nexport function mergeCSIMetadata(\n existing: CSI,\n updates: Partial<CSI>\n): CSI {\n return {\n ...existing,\n ...updates,\n completedSteps: updates.completedSteps || existing.completedSteps,\n metadata: {\n ...existing.metadata,\n ...updates.metadata,\n updatedAt: new Date().toISOString()\n }\n }\n}\n\n/**\n * Calculate step progress based on sequence\n */\nexport function calculateStepProgress(\n stepNumber: number,\n totalSteps: number,\n isCompleted: boolean = false\n): number {\n if (isCompleted) {\n return Math.round((stepNumber / totalSteps) * 100)\n }\n \n // If running, show progress slightly less than complete\n return Math.round(((stepNumber - 0.1) / totalSteps) * 100)\n} "],"mappings":"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","names":[]}