$data */ public static function fromArray(array $data): ChatSession { $collections = self::parseCollections($data['collections'] ?? '["documents"]'); $metadata = SessionMetadata::create( model: $data['model'] ?? 'claude-opus-4-5-20251101', collections: $collections, contextLimit: (int) ($data['context_limit'] ?? 5), temperature: (float) ($data['temperature'] ?? 0.7), maxTokens: (int) ($data['max_tokens'] ?? 4096) ); $session = new ChatSession( uuid: SessionUuid::fromString($data['uuid']), metadata: $metadata, id: isset($data['id']) ? (int) $data['id'] : null, sessionToken: $data['session_token'] ?? null, userId: isset($data['user_id']) ? (int) $data['user_id'] : null, personaId: isset($data['persona_id']) ? (int) $data['persona_id'] : null, title: $data['title'] ?? null, authorProfileId: isset($data['author_profile_id']) ? (int) $data['author_profile_id'] : null, systemPromptId: isset($data['system_prompt_id']) ? (int) $data['system_prompt_id'] : null, createdAt: isset($data['created_at']) ? new \DateTimeImmutable($data['created_at']) : new \DateTimeImmutable(), updatedAt: isset($data['updated_at']) ? new \DateTimeImmutable($data['updated_at']) : new \DateTimeImmutable(), lastActivity: isset($data['last_activity']) ? new \DateTimeImmutable($data['last_activity']) : new \DateTimeImmutable() ); return $session; } /** * Parse collections from JSON string or array. * * @return array */ private static function parseCollections(mixed $collections): array { if (is_string($collections)) { $decoded = json_decode($collections, true); return is_array($decoded) ? $decoded : ['documents']; } if (is_array($collections)) { return $collections; } return ['documents']; } }